Skip to content

Commit ba3a107

Browse files
committed
[[ Bug 16033 ]] Ensure empty is only converted to 0 when it used to be
1 parent 3744d5c commit ba3a107

File tree

7 files changed

+53
-12
lines changed

7 files changed

+53
-12
lines changed

docs/notes/bugfix-16033.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Empty converted to 0 in object id chunk expression

engine/src/chunk.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,7 +1060,7 @@ void MCChunk::getoptionalobj(MCExecContext& ctxt, MCObjectPtr &r_object, Boolean
10601060
case CT_ID:
10611061
{
10621062
uint4 t_id;
1063-
if (!ctxt . EvalExprAsUInt(stack -> startpos, EE_CHUNK_BADSTACKEXP, t_id))
1063+
if (!ctxt . EvalExprAsStrictUInt(stack -> startpos, EE_CHUNK_BADSTACKEXP, t_id))
10641064
return;
10651065

10661066
MCInterfaceEvalStackOfStackById(ctxt, t_object, t_id, t_object);
@@ -1089,7 +1089,7 @@ void MCChunk::getoptionalobj(MCExecContext& ctxt, MCObjectPtr &r_object, Boolean
10891089
case CT_ID:
10901090
{
10911091
uint4 t_id;
1092-
if (!ctxt . EvalExprAsUInt(stack -> next -> startpos, EE_CHUNK_BADSTACKEXP, t_id))
1092+
if (!ctxt . EvalExprAsStrictUInt(stack -> next -> startpos, EE_CHUNK_BADSTACKEXP, t_id))
10931093
return;
10941094

10951095
MCInterfaceEvalSubstackOfStackById(ctxt, t_object, t_id, t_object);
@@ -1118,7 +1118,7 @@ void MCChunk::getoptionalobj(MCExecContext& ctxt, MCObjectPtr &r_object, Boolean
11181118
case CT_ID:
11191119
{
11201120
uint4 t_id;
1121-
if (!ctxt . EvalExprAsUInt(object -> startpos, EE_CHUNK_BADOBJECTEXP, t_id))
1121+
if (!ctxt . EvalExprAsStrictUInt(object -> startpos, EE_CHUNK_BADOBJECTEXP, t_id))
11221122
return;
11231123

11241124
if (object -> otype == CT_AUDIO_CLIP)
@@ -1166,7 +1166,7 @@ void MCChunk::getoptionalobj(MCExecContext& ctxt, MCObjectPtr &r_object, Boolean
11661166
case CT_ID:
11671167
{
11681168
uint4 t_id;
1169-
if (!ctxt . EvalExprAsUInt(background -> startpos, EE_CHUNK_BADBACKGROUNDEXP, t_id))
1169+
if (!ctxt . EvalExprAsStrictUInt(background -> startpos, EE_CHUNK_BADBACKGROUNDEXP, t_id))
11701170
return;
11711171

11721172
if (card == nil)
@@ -1210,7 +1210,7 @@ void MCChunk::getoptionalobj(MCExecContext& ctxt, MCObjectPtr &r_object, Boolean
12101210
case CT_ID:
12111211
{
12121212
uint4 t_id;
1213-
if (!ctxt . EvalExprAsUInt(card -> startpos, EE_CHUNK_BADCARDEXP, t_id))
1213+
if (!ctxt . EvalExprAsStrictUInt(card -> startpos, EE_CHUNK_BADCARDEXP, t_id))
12141214
return;
12151215

12161216
if (background != nil)
@@ -1264,7 +1264,7 @@ void MCChunk::getoptionalobj(MCExecContext& ctxt, MCObjectPtr &r_object, Boolean
12641264
case CT_ID:
12651265
{
12661266
uint4 t_id;
1267-
if (!ctxt . EvalExprAsUInt(tgptr -> startpos, EE_CHUNK_BADBACKGROUNDEXP, t_id))
1267+
if (!ctxt . EvalExprAsStrictUInt(tgptr -> startpos, EE_CHUNK_BADBACKGROUNDEXP, t_id))
12681268
return;
12691269

12701270
// MW-2011-08-09: [[ Groups ]] If there was an explicit stack reference,
@@ -1338,7 +1338,7 @@ void MCChunk::getoptionalobj(MCExecContext& ctxt, MCObjectPtr &r_object, Boolean
13381338
case CT_ID:
13391339
{
13401340
uint4 t_id;
1341-
if (!ctxt . EvalExprAsUInt(toptr -> startpos, EE_CHUNK_BADOBJECTEXP, t_id))
1341+
if (!ctxt . EvalExprAsStrictUInt(toptr -> startpos, EE_CHUNK_BADOBJECTEXP, t_id))
13421342
return;
13431343

13441344
// If we are in stack override mode, then search the stack *after*

engine/src/cmdss.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ void MCGo::exec_ctxt(MCExecContext &ctxt)
10131013
else if (stack -> etype == CT_ID)
10141014
{
10151015
uinteger_t t_stack_id;
1016-
if (!ctxt . EvalExprAsUInt(stack -> startpos, EE_GO_BADSTACKEXP, t_stack_id))
1016+
if (!ctxt . EvalExprAsStrictUInt(stack -> startpos, EE_GO_BADSTACKEXP, t_stack_id))
10171017
return;
10181018

10191019
sptr = MCdefaultstackptr->findstackid(t_stack_id);
@@ -1034,7 +1034,7 @@ void MCGo::exec_ctxt(MCExecContext &ctxt)
10341034
case CT_ID:
10351035
{
10361036
uinteger_t t_stack_id;
1037-
if (!ctxt . EvalExprAsUInt(stack -> next -> startpos, EE_CHUNK_BADSTACKEXP, t_stack_id))
1037+
if (!ctxt . EvalExprAsStrictUInt(stack -> next -> startpos, EE_CHUNK_BADSTACKEXP, t_stack_id))
10381038
return;
10391039

10401040
sptr = sptr -> findsubstackid(t_stack_id);

engine/src/exec.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,42 @@ static bool EvalExprAs(MCExecContext* self, MCExpression *p_expr, Exec_errors p_
922922
return false;
923923
}
924924

925+
template <typename T>
926+
static bool EvalExprAsStrictNumber(MCExecContext* self, MCExpression *p_expr, Exec_errors p_error, MCExecValueType p_type, T& r_value)
927+
{
928+
MCAssert(p_expr != nil);
929+
930+
// SN-2014-04-08 [[ NumberExpectation ]] Ensure we get a number when it's possible instead of a ValueRef
931+
MCExecValue t_value;
932+
Boolean t_number_expected = self -> GetNumberExpected();
933+
self -> SetNumberExpected(True);
934+
935+
p_expr -> eval_ctxt(*self, t_value);
936+
937+
if (MCExecTypeIsValueRef(t_value . type) && MCValueIsEmpty(t_value . valueref_value))
938+
{
939+
self -> LegacyThrow(p_error);
940+
941+
return false;
942+
}
943+
944+
self -> SetNumberExpected(t_number_expected);
945+
946+
if (!self -> HasError())
947+
MCExecTypeConvertAndReleaseAlways(*self, t_value . type, &t_value, p_type, &r_value);
948+
949+
if (!self -> HasError())
950+
return true;
951+
952+
self -> LegacyThrow(p_error);
953+
954+
return false;
955+
}
956+
957+
bool MCExecContext::EvalExprAsStrictUInt(MCExpression *p_expr, Exec_errors p_error, uinteger_t& r_value) { return EvalExprAsStrictNumber(this, p_expr, p_error, kMCExecValueTypeUInt, r_value); }
958+
959+
bool MCExecContext::EvalExprAsStrictInt(MCExpression *p_expr, Exec_errors p_error, integer_t& r_value) { return EvalExprAsStrictNumber(this, p_expr, p_error, kMCExecValueTypeInt, r_value); }
960+
925961
template <typename T>
926962
static bool EvalExprAsNumber(MCExecContext* self, MCExpression *p_expr, Exec_errors p_error, MCExecValueType p_type, T& r_value)
927963
{

engine/src/exec.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,6 +1754,10 @@ class MCExecContext
17541754
void TryToEvalExprAsArrayRef(MCExpression *p_expr, Exec_errors p_error, MCArrayRef& r_value);
17551755
void TryToEvalOptionalExprAsColor(MCExpression *p_expr, MCColor *p_default, Exec_errors p_error, MCColor *&r_value);
17561756

1757+
bool EvalExprAsStrictUInt(MCExpression *p_expr, Exec_errors p_error, uinteger_t& r_value);
1758+
1759+
bool EvalExprAsStrictInt(MCExpression *p_expr, Exec_errors p_error, integer_t& r_value);
1760+
17571761
private:
17581762
#ifdef LEGACY_EXEC
17591763
MCExecPoint& m_ep;

engine/src/funcs.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2246,7 +2246,7 @@ void MCFontStyles::eval_ctxt(MCExecContext &ctxt, MCExecValue &r_value)
22462246
if (!ctxt . EvalExprAsStringRef(fontname, EE_FONTSTYLES_BADFONTNAME, &t_fontname))
22472247
return;
22482248
uinteger_t fsize;
2249-
if (!ctxt . EvalExprAsUInt(fontsize, EE_FONTSTYLES_BADFONTSIZE, fsize))
2249+
if (!ctxt . EvalExprAsStrictUInt(fontsize, EE_FONTSTYLES_BADFONTSIZE, fsize))
22502250
return;
22512251

22522252
MCTextEvalFontStyles(ctxt, *t_fontname, fsize, r_value . stringref_value);

engine/src/ide.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,10 +319,10 @@ bool MCIdeScriptAction::eval_target_range(MCExecContext& ctxt, MCExpression *p_s
319319
int4 t_end = 0;
320320
MCField *t_target = nil;
321321

322-
t_success = ctxt . EvalExprAsInt(p_start, EE_OBJECT_NAN, t_start);
322+
t_success = ctxt . EvalExprAsStrictInt(p_start, EE_OBJECT_NAN, t_start);
323323

324324
if (t_success)
325-
t_success = ctxt . EvalExprAsInt(p_end, EE_OBJECT_NAN, t_end);
325+
t_success = ctxt . EvalExprAsStrictInt(p_end, EE_OBJECT_NAN, t_end);
326326

327327
if (t_success)
328328
t_success = eval_target(ctxt, p_target, t_target);

0 commit comments

Comments
 (0)