@@ -35,6 +35,22 @@ along with LiveCode. If not see <http://www.gnu.org/licenses/>. */
3535
3636#include < float.h>
3737
38+ // //////////////////////////////////////////////////////////////////////
39+
40+ bool valueref_tona (MCExecContext &ctxt, MCValueRef p_value, MCValueRef &r_value)
41+ {
42+ if (!MCValueIsArray (p_value))
43+ {
44+ MCAutoNumberRef t_number;
45+ if (!ctxt . ConvertToNumber (p_value, &t_number))
46+ return false ;
47+
48+ r_value = MCValueRetain ((MCValueRef)*t_number);
49+ }
50+
51+ return true ;
52+ }
53+
3854//
3955
4056inline bool MCMathOpCommandComputeOverlap (MCExpression *p_source, MCExpression *p_dest, MCVarref *p_destvar)
@@ -100,7 +116,7 @@ Parse_stat MCAdd::parse(MCScriptPoint &sp)
100116
101117// MW-2007-07-03: [[ Bug 5123 ]] - Strict array checking modification
102118// Here the source can be an array or number so we use 'tona'.
103- Exec_stat MCAdd::exec (MCExecPoint &ep )
119+ void MCAdd::exec_ctxt (MCExecContext &ctxt )
104120{
105121#ifdef /* MCAdd */ LEGACY_EXEC
106122 MCVariable *t_dst_var;
@@ -175,61 +191,63 @@ Exec_stat MCAdd::exec(MCExecPoint &ep)
175191
176192 return ES_NORMAL;
177193#endif /* MCAdd */
178- MCAutoValueRef t_src;
179- if (source->eval (ep) != ES_NORMAL || ep.tona () != ES_NORMAL)
180- {
181- MCeerror->add (EE_ADD_BADSOURCE, line, pos);
182- return ES_ERROR;
183- }
184- /* UNCHECKED */ ep . copyasvalueref (&t_src);
194+
195+ MCAutoValueRef t_src;
196+ MCAutoValueRef t_src_as_number;
197+ if (!ctxt . EvalExprAsValueRef (source, EE_ADD_BADSOURCE, &t_src))
198+ return ;
199+
200+ if (!valueref_tona (ctxt, *t_src, &t_src_as_number))
201+ {
202+ ctxt . LegacyThrow (EE_ADD_BADSOURCE);
203+ return ;
204+ }
185205
186206 MCAutoValueRef t_dst;
187- MCAutoPointer<MCContainer> t_dst_container;
207+ MCAutoValueRef t_dst_as_number;
208+ MCAutoPointer<MCContainer> t_dst_container;
188209 if (destvar != nil)
189210 {
190- if (destvar -> evalcontainer (ep , &t_dst_container) != ES_NORMAL )
191- {
192- MCeerror-> add (EE_ADD_BADDEST, line, pos );
193- return ES_ERROR ;
211+ if (! destvar -> evalcontainer (ctxt , &t_dst_container))
212+ {
213+ ctxt . LegacyThrow (EE_ADD_BADDEST );
214+ return ;
194215 }
195216
196- if (t_dst_container -> eval (ep) != ES_NORMAL || ep.tona () != ES_NORMAL)
197- return ES_ERROR;
198-
199- /* UNCHECKED */ ep . copyasvalueref (&t_dst);
217+ if (!t_dst_container -> eval (ctxt, &t_dst))
218+ return ;
200219 }
201220 else
202- {
203- if (dest->eval (ep) != ES_NORMAL || ep.tona () != ES_NORMAL)
204- {
205- MCeerror->add (EE_ADD_BADDEST, line, pos);
206- return ES_ERROR;
207- }
208-
209- /* UNCHECKED */ ep . copyasvalueref (&t_dst);
210- }
211-
212- MCExecContext ctxt (ep);
213-
221+ {
222+ if (!ctxt . EvalExprAsValueRef (dest, EE_ADD_BADDEST, &t_dst))
223+ return ;
224+ }
225+
226+ if (!valueref_tona (ctxt, *t_dst, &t_dst_as_number))
227+ {
228+ ctxt . LegacyThrow (EE_ADD_BADDEST);
229+ return ;
230+ }
231+
214232 MCAutoValueRef t_result;
215- if (MCValueGetTypeCode (*t_src) == kMCValueTypeCodeArray )
233+ if (MCValueIsArray (*t_src_as_number) )
216234 {
217- if (MCValueGetTypeCode (*t_dst) == kMCValueTypeCodeArray )
218- MCMathExecAddArrayToArray (ctxt, (MCArrayRef)*t_src , (MCArrayRef)*t_dst , (MCArrayRef&)&t_result);
235+ if (MCValueIsArray (*t_dst_as_number) )
236+ MCMathExecAddArrayToArray (ctxt, (MCArrayRef)*t_src_as_number , (MCArrayRef)*t_dst_as_number , (MCArrayRef&)&t_result);
219237 else
220238 {
221- MCeerror-> add (EE_ADD_MISMATCH, line, pos );
222- return ES_ERROR ;
239+ ctxt . LegacyThrow (EE_ADD_MISMATCH );
240+ return ;
223241 }
224242 }
225243 else
226244 {
227- if (MCValueGetTypeCode (*t_dst) == kMCValueTypeCodeArray )
228- MCMathExecAddNumberToArray (ctxt, MCNumberFetchAsReal ((MCNumberRef)*t_src ), (MCArrayRef)*t_dst , (MCArrayRef&)&t_result);
245+ if (MCValueIsArray (*t_dst_as_number) )
246+ MCMathExecAddNumberToArray (ctxt, MCNumberFetchAsReal ((MCNumberRef)*t_src_as_number ), (MCArrayRef)*t_dst_as_number , (MCArrayRef&)&t_result);
229247 else
230248 {
231249 double t_real_result;
232- MCMathExecAddNumberToNumber (ctxt, MCNumberFetchAsReal ((MCNumberRef)*t_src ), MCNumberFetchAsReal ((MCNumberRef)*t_dst ), t_real_result);
250+ MCMathExecAddNumberToNumber (ctxt, MCNumberFetchAsReal ((MCNumberRef)*t_src_as_number ), MCNumberFetchAsReal ((MCNumberRef)*t_dst_as_number ), t_real_result);
233251 /* UNCHECKED */ MCNumberCreateWithReal (t_real_result, (MCNumberRef&)t_result);
234252 }
235253 }
@@ -239,18 +257,19 @@ Exec_stat MCAdd::exec(MCExecPoint &ep)
239257 if (destvar != nil)
240258 {
241259 if (t_dst_container -> set_valueref (*t_result))
242- return ES_NORMAL ;
260+ return ;
243261 ctxt . Throw ();
244262 }
245263 else
246264 {
247- if (dest->set (ep, PT_INTO, *t_result) == ES_NORMAL)
248- return ES_NORMAL;
249- ctxt . LegacyThrow (EE_ADD_CANTSET);
250- }
251- }
265+ dest->set (ctxt, PT_INTO, *t_result);
252266
253- return ctxt . Catch (line, pos);
267+ if (!ctxt . HasError ())
268+ return ;
269+
270+ ctxt . LegacyThrow (EE_ADD_CANTSET);
271+ }
272+ }
254273}
255274
256275void MCAdd::compile (MCSyntaxFactoryRef ctxt)
0 commit comments