Skip to content

Commit 0674f8b

Browse files
[[ FasterNumber ]] Avoid the creation of a container in maths commands, when the destination isn't an array
1 parent 6351145 commit 0674f8b

2 files changed

Lines changed: 85 additions & 47 deletions

File tree

engine/src/cmdsm.cpp

Lines changed: 83 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -203,20 +203,24 @@ void MCAdd::exec_ctxt(MCExecContext &ctxt)
203203
MCAutoPointer<MCContainer> t_dst_container;
204204
if (destvar != nil)
205205
{
206-
if (!destvar -> evalcontainer(ctxt, &t_dst_container))
206+
bool t_success;
207+
if (destvar -> needsContainer())
208+
t_success = destvar -> evalcontainer(ctxt, &t_dst_container)
209+
&& t_dst_container -> eval_ctxt(ctxt, t_dst);
210+
else
207211
{
208-
ctxt . LegacyThrow(EE_ADD_BADDEST);
209-
MCExecTypeRelease(t_src);
210-
ctxt . SetNumberExpected(t_old_expectation);
211-
return;
212-
}
213-
214-
if (!t_dst_container -> eval_ctxt(ctxt, t_dst))
212+
destvar -> eval_ctxt(ctxt, t_dst);
213+
t_success = !ctxt . HasError();
214+
}
215+
216+
if (!t_success)
215217
{
218+
ctxt . LegacyThrow(EE_ADD_BADDEST);
216219
MCExecTypeRelease(t_src);
217220
ctxt . SetNumberExpected(t_old_expectation);
218221
return;
219222
}
223+
220224
}
221225
else
222226
{
@@ -265,9 +269,14 @@ void MCAdd::exec_ctxt(MCExecContext &ctxt)
265269
{
266270
if (destvar != nil)
267271
{
268-
if (t_dst_container -> give_value(ctxt, t_result))
269-
return;
270-
ctxt . Throw();
272+
bool t_success;
273+
if (destvar -> needsContainer())
274+
t_success = t_dst_container -> give_value(ctxt, t_result);
275+
else
276+
t_success = destvar -> give_value(ctxt, t_result);
277+
278+
if (!t_success)
279+
ctxt . Throw();
271280
}
272281
else
273282
{
@@ -461,16 +470,19 @@ void MCDivide::exec_ctxt(MCExecContext &ctxt)
461470
MCAutoPointer<MCContainer> t_dst_container;
462471
if (destvar != nil)
463472
{
464-
if (!destvar -> evalcontainer(ctxt, &t_dst_container))
465-
{
466-
ctxt . LegacyThrow(EE_DIVIDE_BADDEST);
467-
MCExecTypeRelease(t_src);
468-
ctxt . SetNumberExpected(t_old_expectation);
469-
return;
470-
}
471-
472-
if (!t_dst_container -> eval_ctxt(ctxt, t_dst))
473+
bool t_success;
474+
if (destvar -> needsContainer())
475+
t_success = destvar -> evalcontainer(ctxt, &t_dst_container)
476+
&& t_dst_container -> eval_ctxt(ctxt, t_dst);
477+
else
473478
{
479+
destvar -> eval_ctxt(ctxt, t_dst);
480+
t_success = !ctxt.HasError();
481+
}
482+
483+
if (!t_success)
484+
{
485+
ctxt . LegacyThrow(EE_DIVIDE_BADDEST);
474486
MCExecTypeRelease(t_src);
475487
ctxt . SetNumberExpected(t_old_expectation);
476488
return;
@@ -523,9 +535,15 @@ void MCDivide::exec_ctxt(MCExecContext &ctxt)
523535
{
524536
if (destvar != nil)
525537
{
526-
if (t_dst_container -> give_value(ctxt, t_result))
527-
return;
528-
ctxt . Throw();
538+
bool t_success;
539+
540+
if (destvar -> needsContainer())
541+
t_success = t_dst_container -> give_value(ctxt, t_result);
542+
else
543+
t_success = destvar -> give_value(ctxt, t_result);
544+
545+
if (!t_success)
546+
ctxt . Throw();
529547
}
530548
else
531549
{
@@ -717,16 +735,19 @@ void MCMultiply::exec_ctxt(MCExecContext &ctxt)
717735
MCAutoPointer<MCContainer> t_dst_container;
718736
if (destvar != nil)
719737
{
720-
if (!destvar -> evalcontainer(ctxt, &t_dst_container))
721-
{
722-
ctxt . LegacyThrow(EE_MULTIPLY_BADDEST);
723-
MCExecTypeRelease(t_src);
724-
ctxt . SetNumberExpected(t_old_expectation);
725-
return;
726-
}
727-
728-
if (!t_dst_container -> eval_ctxt(ctxt, t_dst))
738+
bool t_success;
739+
if (destvar -> needsContainer())
740+
t_success = destvar -> evalcontainer(ctxt, &t_dst_container)
741+
&& t_dst_container -> eval_ctxt(ctxt, t_dst);
742+
else
729743
{
744+
destvar -> eval_ctxt(ctxt, t_dst);
745+
t_success = !ctxt . HasError();
746+
}
747+
748+
if (!t_success)
749+
{
750+
ctxt . LegacyThrow(EE_MULTIPLY_BADDEST);
730751
MCExecTypeRelease(t_src);
731752
ctxt . SetNumberExpected(t_old_expectation);
732753
return;
@@ -779,9 +800,15 @@ void MCMultiply::exec_ctxt(MCExecContext &ctxt)
779800
{
780801
if (destvar != nil)
781802
{
782-
if (t_dst_container -> give_value(ctxt, t_result))
783-
return;
784-
ctxt . Throw();
803+
bool t_success;
804+
805+
if (destvar -> needsContainer())
806+
t_success = t_dst_container -> give_value(ctxt, t_result);
807+
else
808+
t_success = destvar -> give_value(ctxt, t_result);
809+
810+
if (!t_success)
811+
ctxt . Throw();
785812
}
786813
else
787814
{
@@ -956,16 +983,19 @@ void MCSubtract::exec_ctxt(MCExecContext &ctxt)
956983
MCAutoPointer<MCContainer> t_dst_container;
957984
if (destvar != nil)
958985
{
959-
if (!destvar -> evalcontainer(ctxt, &t_dst_container))
960-
{
961-
ctxt . LegacyThrow(EE_SUBTRACT_BADDEST);
962-
MCExecTypeRelease(t_src);
963-
ctxt . SetNumberExpected(t_old_expectation);
964-
return;
965-
}
966-
967-
if (!t_dst_container -> eval_ctxt(ctxt, t_dst))
986+
bool t_success;
987+
if (destvar -> needsContainer())
988+
t_success = destvar -> evalcontainer(ctxt, &t_dst_container)
989+
&& t_dst_container -> eval_ctxt(ctxt, t_dst);
990+
else
991+
{
992+
destvar -> eval_ctxt(ctxt, t_dst);
993+
t_success = !ctxt . HasError();
994+
}
995+
996+
if (!t_success)
968997
{
998+
ctxt . LegacyThrow(EE_SUBTRACT_BADDEST);
969999
MCExecTypeRelease(t_src);
9701000
ctxt . SetNumberExpected(t_old_expectation);
9711001
return;
@@ -1018,9 +1048,15 @@ void MCSubtract::exec_ctxt(MCExecContext &ctxt)
10181048
{
10191049
if (destvar != nil)
10201050
{
1021-
if (t_dst_container -> give_value(ctxt, t_result))
1022-
return;
1023-
ctxt . Throw();
1051+
bool t_success;
1052+
1053+
if (destvar -> needsContainer())
1054+
t_success = t_dst_container -> give_value(ctxt, t_result);
1055+
else
1056+
t_success = destvar -> give_value(ctxt, t_result);
1057+
1058+
if (!t_success)
1059+
ctxt . Throw();
10241060
}
10251061
else
10261062
{

engine/src/variable.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,8 @@ class MCVarref : public MCExpression
931931
virtual Exec_stat eval(MCExecPoint &);
932932
#endif
933933

934+
bool needsContainer(void) const {return dimensions != 0;}
935+
934936
void eval_ctxt(MCExecContext &ctxt, MCExecValue &r_value);
935937
#ifdef LEGACY_EXEC
936938
virtual Exec_stat evalcontainer(MCExecPoint& ep, MCContainer*& r_container);

0 commit comments

Comments
 (0)