Skip to content

Commit 0c66038

Browse files
[[ ExecValue-ization ]] ExecValue brought to more places where converting to a value ref is not necessary
1 parent b0761b0 commit 0c66038

9 files changed

Lines changed: 243 additions & 69 deletions

File tree

engine/src/chunk.cpp

Lines changed: 122 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3211,15 +3211,18 @@ Exec_stat MCChunk::eval(MCExecPoint &ep)
32113211

32123212
void MCChunk::eval_ctxt(MCExecContext &ctxt, MCExecValue &r_text)
32133213
{
3214-
MCAutoValueRef t_text;
3214+
MCExecValue t_text;
3215+
MCAutoValueRef t_valueref;
3216+
bool t_exec_expr = false;
32153217

32163218
if (source != NULL && url == NULL && stack == NULL && background == NULL && card == NULL
32173219
&& group == NULL && object == NULL)
32183220
{
32193221
if (desttype != DT_OWNER)
32203222
{
3221-
if (!ctxt . EvalExprAsValueRef(source, EE_CHUNK_CANTGETSOURCE, &t_text))
3223+
if (!ctxt . EvaluateExpression(source, EE_CHUNK_CANTGETSOURCE, t_text))
32223224
return;
3225+
t_exec_expr = true;
32233226
}
32243227
else
32253228
{
@@ -3233,13 +3236,14 @@ void MCChunk::eval_ctxt(MCExecContext &ctxt, MCExecValue &r_text)
32333236
return;
32343237
}
32353238

3236-
MCEngineEvalOwner(ctxt, t_object, (MCStringRef&)&t_text);
3239+
MCEngineEvalOwner(ctxt, t_object, (MCStringRef&)&t_valueref);
32373240
}
32383241
}
32393242
else if (destvar != NULL)
32403243
{
3241-
if (!ctxt . EvalExprAsValueRef(destvar, EE_CHUNK_CANTGETDEST, &t_text))
3244+
if (!ctxt . EvaluateExpression(destvar, EE_CHUNK_CANTGETDEST, t_text))
32423245
return;
3246+
t_exec_expr = true;
32433247
}
32443248
else
32453249
{
@@ -3264,72 +3268,81 @@ void MCChunk::eval_ctxt(MCExecContext &ctxt, MCExecValue &r_text)
32643268
ctxt . LegacyThrow(EE_CHUNK_CANTFINDOBJECT);
32653269
return;
32663270
}
3267-
t_text = *t_url_output;
3271+
t_valueref = *t_url_output;
32683272
}
32693273
else
32703274
{
32713275
switch (function)
32723276
{
32733277
case F_CLICK_CHUNK:
3274-
MCInterfaceEvalClickChunk(ctxt, (MCStringRef&)&t_text);
3278+
MCInterfaceEvalClickChunk(ctxt, (MCStringRef&)&t_valueref);
32753279
break;
32763280
case F_CLICK_CHAR_CHUNK:
3277-
MCInterfaceEvalClickCharChunk(ctxt, (MCStringRef&)&t_text);
3281+
MCInterfaceEvalClickCharChunk(ctxt, (MCStringRef&)&t_valueref);
32783282
break;
32793283
case F_CLICK_LINE:
3280-
MCInterfaceEvalClickLine(ctxt, (MCStringRef&)&t_text);
3284+
MCInterfaceEvalClickLine(ctxt, (MCStringRef&)&t_valueref);
32813285
break;
32823286
case F_CLICK_TEXT:
3283-
MCInterfaceEvalClickText(ctxt, (MCStringRef&)&t_text);
3287+
MCInterfaceEvalClickText(ctxt, (MCStringRef&)&t_valueref);
32843288
break;
32853289
case F_SELECTED_CHUNK:
3286-
MCInterfaceEvalSelectedChunk(ctxt, (MCStringRef&)&t_text);
3290+
MCInterfaceEvalSelectedChunk(ctxt, (MCStringRef&)&t_valueref);
32873291
break;
32883292
case F_SELECTED_LINE:
3289-
MCInterfaceEvalSelectedLine(ctxt, (MCStringRef&)&t_text);
3293+
MCInterfaceEvalSelectedLine(ctxt, (MCStringRef&)&t_valueref);
32903294
break;
32913295
case F_SELECTED_TEXT:
3292-
MCInterfaceEvalSelectedText(ctxt, (MCStringRef&)&t_text);
3296+
MCInterfaceEvalSelectedText(ctxt, (MCStringRef&)&t_valueref);
32933297
break;
32943298
case F_FOUND_CHUNK:
3295-
MCInterfaceEvalFoundChunk(ctxt, (MCStringRef&)&t_text);
3299+
MCInterfaceEvalFoundChunk(ctxt, (MCStringRef&)&t_valueref);
32963300
break;
32973301
case F_FOUND_LINE:
3298-
MCInterfaceEvalFoundLine(ctxt, (MCStringRef&)&t_text);
3302+
MCInterfaceEvalFoundLine(ctxt, (MCStringRef&)&t_valueref);
32993303
break;
33003304
case F_FOUND_TEXT:
3301-
MCInterfaceEvalFoundText(ctxt, (MCStringRef&)&t_text);
3305+
MCInterfaceEvalFoundText(ctxt, (MCStringRef&)&t_valueref);
33023306
break;
33033307
case F_MOUSE_CHUNK:
3304-
MCInterfaceEvalMouseChunk(ctxt, (MCStringRef&)&t_text);
3308+
MCInterfaceEvalMouseChunk(ctxt, (MCStringRef&)&t_valueref);
33053309
break;
33063310
case F_MOUSE_LINE:
3307-
MCInterfaceEvalMouseLine(ctxt, (MCStringRef&)&t_text);
3311+
MCInterfaceEvalMouseLine(ctxt, (MCStringRef&)&t_valueref);
33083312
break;
33093313
case F_MOUSE_CHAR_CHUNK:
3310-
MCInterfaceEvalMouseCharChunk(ctxt, (MCStringRef&)&t_text);
3314+
MCInterfaceEvalMouseCharChunk(ctxt, (MCStringRef&)&t_valueref);
33113315
break;
33123316
case F_MOUSE_TEXT:
3313-
MCInterfaceEvalMouseText(ctxt, (MCStringRef&)&t_text);
3317+
MCInterfaceEvalMouseText(ctxt, (MCStringRef&)&t_valueref);
33143318
break;
33153319
default:
33163320
MCMarkedText t_mark;
33173321
MCInterfaceMarkContainer(ctxt, t_object, t_mark);
3318-
MCStringsEvalTextChunk(ctxt, t_mark, (MCStringRef&)&t_text);
3322+
MCStringsEvalTextChunk(ctxt, t_mark, (MCStringRef&)&t_valueref);
33193323
MCValueRelease(t_mark . text);
33203324
break;
33213325
}
33223326
}
33233327
}
33243328

3325-
if (*t_text != nil)
3329+
if (*t_valueref != nil || t_exec_expr)
33263330
{
33273331
if (cline != nil || paragraph != nil || sentence != nil || item != nil || trueword != nil || word != nil
33283332
|| token != nil || character != nil || codepoint != nil || codeunit != nil || byte != nil)
33293333
{
33303334
// Must be a string ref
33313335
MCAutoStringRef t_text_str;
3332-
if (!ctxt . ConvertToString(*t_text, &t_text_str))
3336+
bool t_success = true;
3337+
if (t_exec_expr)
3338+
{
3339+
MCExecTypeConvertAndReleaseAlways(ctxt, t_text . type, &t_text, kMCExecValueTypeStringRef, &(&t_text_str));
3340+
t_success = !ctxt . HasError();
3341+
}
3342+
else
3343+
t_success = ctxt . ConvertToString(*t_valueref, &t_text_str);
3344+
3345+
if (!t_success)
33333346
{
33343347
ctxt.Throw();
33353348
return;
@@ -3342,22 +3355,22 @@ void MCChunk::eval_ctxt(MCExecContext &ctxt, MCExecValue &r_text)
33423355
mark(ctxt, false, false, t_new_mark);
33433356

33443357
if (byte == nil)
3345-
MCStringsEvalTextChunk(ctxt, t_new_mark, r_text . stringref_value);
3358+
MCStringsEvalTextChunk(ctxt, t_new_mark, r_text . stringref_value), r_text . type = kMCExecValueTypeStringRef;
33463359
else
3347-
MCStringsEvalByteChunk(ctxt, t_new_mark, r_text . dataref_value);
3360+
MCStringsEvalByteChunk(ctxt, t_new_mark, r_text . dataref_value), r_text . type = kMCExecValueTypeDataRef;
33483361

33493362
MCValueRelease(t_new_mark . text);
33503363
}
33513364
else
3352-
r_text . valueref_value = MCValueRetain(*t_text);
3365+
{
3366+
if (t_exec_expr)
3367+
r_text = t_text;
3368+
else
3369+
MCExecTypeSetValueRef(r_text, MCValueRetain(*t_valueref));
3370+
}
33533371
}
33543372
else
3355-
r_text . stringref_value = MCValueRetain(kMCEmptyString);
3356-
3357-
if (!ctxt . HasError())
3358-
{
3359-
r_text . type = kMCExecValueTypeValueRef;
3360-
}
3373+
MCExecTypeSetValueRef(r_text, MCValueRetain(kMCEmptyString));
33613374
}
33623375

33633376
#ifdef LEGACY_EXEC
@@ -3705,6 +3718,84 @@ bool MCChunk::set(MCExecContext &ctxt, Preposition_type p_type, MCValueRef p_val
37053718
return false;
37063719
}
37073720

3721+
bool MCChunk::set(MCExecContext &ctxt, Preposition_type p_type, MCExecValue p_value, bool p_unicode)
3722+
{
3723+
if (destvar != nil)
3724+
{
3725+
MCAutoValueRef t_valueref;
3726+
MCExecTypeConvertAndReleaseAlways(ctxt, p_value . type, &p_value, kMCExecValueTypeValueRef, &(&t_valueref));
3727+
MCVariableChunkPtr t_var_chunk;
3728+
if (!evalvarchunk(ctxt, false, true, t_var_chunk))
3729+
return false;
3730+
3731+
MCEngineExecPutIntoVariable(ctxt, *t_valueref, p_type, t_var_chunk);
3732+
// MCEngineExecPutIntoVariable(ctxt, p_value, p_type, t_var_chunk);
3733+
MCValueRelease(t_var_chunk . mark . text);
3734+
}
3735+
else if (isurlchunk())
3736+
{
3737+
MCAutoValueRef t_valueref;
3738+
MCExecTypeConvertAndReleaseAlways(ctxt, p_value . type, &p_value, kMCExecValueTypeValueRef, &(&t_valueref));
3739+
MCUrlChunkPtr t_url_chunk;
3740+
t_url_chunk . url = nil;
3741+
if (!evalurlchunk(ctxt, false, true, t_url_chunk))
3742+
return false;
3743+
3744+
MCNetworkExecPutIntoUrl(ctxt, *t_valueref, p_type, t_url_chunk);
3745+
3746+
MCValueRelease(t_url_chunk . url);
3747+
MCValueRelease(t_url_chunk . mark . text);
3748+
}
3749+
else
3750+
{
3751+
MCObjectChunkPtr t_obj_chunk;
3752+
if (!evalobjectchunk(ctxt, false, true, t_obj_chunk))
3753+
return false;
3754+
3755+
if (p_unicode)
3756+
{
3757+
if (t_obj_chunk . object -> gettype() != CT_FIELD)
3758+
{
3759+
ctxt . LegacyThrow(EE_CHUNK_CANTSETUNICODEDEST);
3760+
MCValueRelease(t_obj_chunk . mark . text);
3761+
return false;
3762+
}
3763+
3764+
MCAutoDataRef t_data;
3765+
MCExecTypeConvertAndReleaseAlways(ctxt, p_value . type, &p_value, kMCExecValueTypeDataRef, &(&t_data));
3766+
if (ctxt . HasError())
3767+
{
3768+
ctxt . LegacyThrow(EE_CHUNK_CANTSETUNICODEDEST);
3769+
MCValueRelease(t_obj_chunk . mark . text);
3770+
return false;
3771+
}
3772+
MCInterfaceExecPutUnicodeIntoField(ctxt, *t_data, p_type, t_obj_chunk);
3773+
}
3774+
else if (t_obj_chunk . object -> gettype() == CT_FIELD)
3775+
{
3776+
MCAutoStringRef t_string;
3777+
MCExecTypeConvertAndReleaseAlways(ctxt, p_value . type, &p_value, kMCExecValueTypeStringRef, &(&t_string));
3778+
if (ctxt . HasError())
3779+
{
3780+
ctxt . LegacyThrow(EE_CHUNK_CANTSETDEST);
3781+
MCValueRelease(t_obj_chunk . mark . text);
3782+
return false;
3783+
}
3784+
3785+
MCInterfaceExecPutIntoField(ctxt, *t_string, p_type, t_obj_chunk);
3786+
}
3787+
else
3788+
MCInterfaceExecPutIntoObject(ctxt, p_value, p_type, t_obj_chunk);
3789+
3790+
MCValueRelease(t_obj_chunk . mark . text);
3791+
}
3792+
3793+
if (!ctxt . HasError())
3794+
return true;
3795+
3796+
return false;
3797+
}
3798+
37083799
#ifdef LEGACY_EXEC
37093800
Exec_stat MCChunk::setunicode(MCExecPoint& ep, Preposition_type p_prep)
37103801
{

engine/src/chunk.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ class MCChunk : public MCExpression
149149
Exec_stat set(MCExecPoint& ep, Preposition_type p_type, MCValueRef p_text, bool p_unicode = false);
150150
#endif
151151
bool set(MCExecContext& ctxt, Preposition_type p_type, MCValueRef p_value, bool p_unicode = false);
152+
bool set(MCExecContext& ctxt, Preposition_type p_type, MCExecValue p_value, bool p_unicode = false);
152153

153154
#ifdef LEGACY_EXEC
154155
Exec_stat gets(MCExecPoint &);

engine/src/cmds.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,29 +1374,36 @@ void MCPut::exec_ctxt(MCExecContext& ctxt)
13741374
#endif /* MCPut */
13751375

13761376

1377-
MCAutoValueRef t_value;
1378-
if (!ctxt . EvalExprAsValueRef(source, EE_PUT_BADEXP, &t_value))
1377+
MCExecValue t_value;
1378+
if (!ctxt . EvaluateExpression(source, EE_PUT_BADEXP, t_value))
13791379
return;
13801380

13811381
if (dest != nil)
13821382
{
1383-
dest -> set(ctxt, prep, *t_value, is_unicode);
1383+
// MCAutoValueRef t_valueref;
1384+
// MCExecTypeConvertAndReleaseAlways(ctxt, t_value . type, &t_value, kMCExecValueTypeValueRef, &(&t_valueref));
1385+
// dest -> set(ctxt, prep, *t_valueref, is_unicode);
1386+
dest -> set(ctxt, prep, t_value, is_unicode);
13841387
}
13851388
else
1386-
{
1389+
{
1390+
if (ctxt . HasError())
1391+
return;
1392+
13871393
MCAutoValueRef t_val;
13881394
if (is_unicode && (prep == PT_UNDEFINED || prep == PT_CONTENT || prep == PT_MARKUP))
13891395
{
1390-
if (!ctxt . ConvertToData(*t_value, (MCDataRef&)&t_val))
1396+
MCExecTypeConvertAndReleaseAlways(ctxt, t_value . type, &t_value, kMCExecValueTypeDataRef, &(&t_val));
1397+
if (ctxt . HasError())
13911398
{
13921399
ctxt . LegacyThrow(EE_CHUNK_CANTSETDEST);
13931400
return;
13941401
}
13951402
}
13961403
else
13971404
{
1398-
if (!ctxt . ConvertToString(*t_value, (MCStringRef&)&t_val))
1399-
1405+
MCExecTypeConvertAndReleaseAlways(ctxt, t_value . type, &t_value, kMCExecValueTypeStringRef, &(&t_val));
1406+
if (ctxt . HasError())
14001407
{
14011408
ctxt . LegacyThrow(EE_CHUNK_CANTSETDEST);
14021409
return;

engine/src/cmdsm.cpp

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,7 @@ void MCAdd::exec_ctxt(MCExecContext &ctxt)
256256
}
257257
else
258258
{
259-
MCAutoValueRef t_value;
260-
MCExecTypeConvertAndReleaseAlways(ctxt, t_result . type, &t_result, kMCExecValueTypeValueRef, &(&t_value));
261-
if (!ctxt . HasError() && dest->set(ctxt, PT_INTO, *t_value))
259+
if (dest->set(ctxt, PT_INTO, t_result))
262260
return;
263261
ctxt . LegacyThrow(EE_ADD_CANTSET);
264262
}
@@ -501,9 +499,7 @@ void MCDivide::exec_ctxt(MCExecContext &ctxt)
501499
}
502500
else
503501
{
504-
MCAutoValueRef t_value;
505-
MCExecTypeConvertAndReleaseAlways(ctxt, t_result . type, &t_result, kMCExecValueTypeValueRef, &(&t_value));
506-
if (!ctxt . HasError() && dest->set(ctxt, PT_INTO, *t_value))
502+
if (dest->set(ctxt, PT_INTO, t_result))
507503
return;
508504

509505
ctxt . LegacyThrow(EE_DIVIDE_CANTSET);
@@ -744,11 +740,8 @@ void MCMultiply::exec_ctxt(MCExecContext &ctxt)
744740
ctxt . Throw();
745741
}
746742
else
747-
{
748-
MCAutoValueRef t_value;
749-
MCExecTypeConvertAndReleaseAlways(ctxt, t_result . type, &t_result, kMCExecValueTypeValueRef, &(&t_value));
750-
751-
if (!ctxt . HasError() && dest->set(ctxt, PT_INTO, *t_value))
743+
{
744+
if (dest->set(ctxt, PT_INTO, t_result))
752745
return;
753746

754747
ctxt . LegacyThrow(EE_MULTIPLY_CANTSET);
@@ -973,10 +966,7 @@ void MCSubtract::exec_ctxt(MCExecContext &ctxt)
973966
}
974967
else
975968
{
976-
MCAutoValueRef t_value;
977-
MCExecTypeConvertAndReleaseAlways(ctxt, t_result . type, &t_result, kMCExecValueTypeValueRef, &(&t_value));
978-
979-
if (!ctxt . HasError() && dest->set(ctxt, PT_INTO, *t_value))
969+
if (dest->set(ctxt, PT_INTO, t_result))
980970
return;
981971

982972
ctxt . LegacyThrow(EE_SUBTRACT_CANTSET);

0 commit comments

Comments
 (0)