@@ -35,6 +35,25 @@ 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, Exec_errors p_error, 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+ {
47+ ctxt . LegacyThrow (p_error);
48+ return false ;
49+ }
50+
51+ r_value = MCValueRetain ((MCValueRef)*t_number);
52+ }
53+
54+ return true ;
55+ }
56+
3857//
3958
4059inline bool MCMathOpCommandComputeOverlap (MCExpression *p_source, MCExpression *p_dest, MCVarref *p_destvar)
@@ -100,7 +119,7 @@ Parse_stat MCAdd::parse(MCScriptPoint &sp)
100119
101120// MW-2007-07-03: [[ Bug 5123 ]] - Strict array checking modification
102121// Here the source can be an array or number so we use 'tona'.
103- Exec_stat MCAdd::exec (MCExecPoint &ep )
122+ void MCAdd::exec_ctxt (MCExecContext &ctxt )
104123{
105124#ifdef /* MCAdd */ LEGACY_EXEC
106125 MCVariable *t_dst_var;
@@ -175,61 +194,55 @@ Exec_stat MCAdd::exec(MCExecPoint &ep)
175194
176195 return ES_NORMAL;
177196#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);
197+
198+ MCAutoValueRef t_src;
199+ MCAutoValueRef t_src_as_number;
200+ if (!ctxt . EvalExprAsValueRef (source, EE_ADD_BADSOURCE, &t_src)
201+ || !valueref_tona (ctxt, EE_ADD_BADSOURCE, *t_src, &t_src_as_number))
202+ return ;
185203
186204 MCAutoValueRef t_dst;
187- MCAutoPointer<MCContainer> t_dst_container;
205+ MCAutoValueRef t_dst_as_number;
206+ MCAutoPointer<MCContainer> t_dst_container;
188207 if (destvar != nil)
189208 {
190- if (destvar -> evalcontainer (ep , &t_dst_container) != ES_NORMAL )
191- {
192- MCeerror-> add (EE_ADD_BADDEST, line, pos );
193- return ES_ERROR ;
209+ if (! destvar -> evalcontainer (ctxt , &t_dst_container))
210+ {
211+ ctxt . LegacyThrow (EE_ADD_BADDEST );
212+ return ;
194213 }
195214
196- if (t_dst_container -> eval (ep) != ES_NORMAL || ep.tona () != ES_NORMAL)
197- return ES_ERROR;
198-
199- /* UNCHECKED */ ep . copyasvalueref (&t_dst);
215+ if (!t_dst_container -> eval (ctxt, &t_dst))
216+ return ;
200217 }
201218 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-
219+ {
220+ if (!ctxt . EvalExprAsValueRef (dest, EE_ADD_BADDEST, &t_dst))
221+ return ;
222+ }
223+
224+ if (!valueref_tona (ctxt, EE_ADD_BADDEST, *t_dst, &t_dst_as_number))
225+ return ;
226+
214227 MCAutoValueRef t_result;
215- if (MCValueGetTypeCode (*t_src) == kMCValueTypeCodeArray )
228+ if (MCValueIsArray (*t_src_as_number) )
216229 {
217- if (MCValueGetTypeCode (*t_dst) == kMCValueTypeCodeArray )
218- MCMathExecAddArrayToArray (ctxt, (MCArrayRef)*t_src , (MCArrayRef)*t_dst , (MCArrayRef&)&t_result);
230+ if (MCValueIsArray (*t_dst_as_number) )
231+ MCMathExecAddArrayToArray (ctxt, (MCArrayRef)*t_src_as_number , (MCArrayRef)*t_dst_as_number , (MCArrayRef&)&t_result);
219232 else
220233 {
221- MCeerror-> add (EE_ADD_MISMATCH, line, pos );
222- return ES_ERROR ;
234+ ctxt . LegacyThrow (EE_ADD_MISMATCH );
235+ return ;
223236 }
224237 }
225238 else
226239 {
227- if (MCValueGetTypeCode (*t_dst) == kMCValueTypeCodeArray )
228- MCMathExecAddNumberToArray (ctxt, MCNumberFetchAsReal ((MCNumberRef)*t_src ), (MCArrayRef)*t_dst , (MCArrayRef&)&t_result);
240+ if (MCValueIsArray (*t_dst_as_number) )
241+ MCMathExecAddNumberToArray (ctxt, MCNumberFetchAsReal ((MCNumberRef)*t_src_as_number ), (MCArrayRef)*t_dst_as_number , (MCArrayRef&)&t_result);
229242 else
230243 {
231244 double t_real_result;
232- MCMathExecAddNumberToNumber (ctxt, MCNumberFetchAsReal ((MCNumberRef)*t_src ), MCNumberFetchAsReal ((MCNumberRef)*t_dst ), t_real_result);
245+ MCMathExecAddNumberToNumber (ctxt, MCNumberFetchAsReal ((MCNumberRef)*t_src_as_number ), MCNumberFetchAsReal ((MCNumberRef)*t_dst_as_number ), t_real_result);
233246 /* UNCHECKED */ MCNumberCreateWithReal (t_real_result, (MCNumberRef&)t_result);
234247 }
235248 }
@@ -239,18 +252,19 @@ Exec_stat MCAdd::exec(MCExecPoint &ep)
239252 if (destvar != nil)
240253 {
241254 if (t_dst_container -> set_valueref (*t_result))
242- return ES_NORMAL ;
255+ return ;
243256 ctxt . Throw ();
244257 }
245258 else
246259 {
247- if (dest->set (ep, PT_INTO, *t_result) == ES_NORMAL)
248- return ES_NORMAL;
249- ctxt . LegacyThrow (EE_ADD_CANTSET);
250- }
251- }
260+ dest->set (ctxt, PT_INTO, *t_result);
252261
253- return ctxt . Catch (line, pos);
262+ if (!ctxt . HasError ())
263+ return ;
264+
265+ ctxt . LegacyThrow (EE_ADD_CANTSET);
266+ }
267+ }
254268}
255269
256270void MCAdd::compile (MCSyntaxFactoryRef ctxt)
0 commit comments