Skip to content

Commit ec60442

Browse files
[[ RefactorSyntax ]] MCAdd::exec updated
1 parent 9bbaa4d commit ec60442

File tree

2 files changed

+64
-45
lines changed

2 files changed

+64
-45
lines changed

engine/src/cmds.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1581,7 +1581,7 @@ class MCAdd : public MCStatement
15811581
}
15821582
virtual ~MCAdd();
15831583
virtual Parse_stat parse(MCScriptPoint &);
1584-
virtual Exec_stat exec(MCExecPoint &);
1584+
virtual void exec_ctxt(MCExecContext &ctxt);
15851585
virtual void compile(MCSyntaxFactoryRef);
15861586
};
15871587

engine/src/cmdsm.cpp

Lines changed: 63 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4056
inline 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

256275
void MCAdd::compile(MCSyntaxFactoryRef ctxt)

0 commit comments

Comments
 (0)