@@ -3211,15 +3211,18 @@ Exec_stat MCChunk::eval(MCExecPoint &ep)
32113211
32123212void 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
37093800Exec_stat MCChunk::setunicode (MCExecPoint& ep, Preposition_type p_prep)
37103801{
0 commit comments