Skip to content

Commit 0eea788

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

File tree

2 files changed

+59
-45
lines changed

2 files changed

+59
-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: 58 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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

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

256270
void MCAdd::compile(MCSyntaxFactoryRef ctxt)

0 commit comments

Comments
 (0)