Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit d70eb3c

Browse files
author
runrevali
committed
[[ Bug 14044 ]] Refactor do ... in caller
1 parent 041406c commit d70eb3c

File tree

4 files changed

+42
-14
lines changed

4 files changed

+42
-14
lines changed

docs/notes/bugfix-14044.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Do ... in caller doesn't work in LC 7

engine/src/cmds.cpp

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -496,12 +496,12 @@ void MCDo::exec_ctxt(MCExecContext& ctxt)
496496
return stat;
497497
#endif /* MCDo */
498498

499+
MCAutoStringRef t_script;
500+
if (!ctxt . EvalExprAsStringRef(source, EE_DO_BADEXP, &t_script))
501+
return;
502+
499503
if (browser)
500504
{
501-
MCAutoStringRef t_script;
502-
if (!ctxt . EvalExprAsStringRef(source, EE_DO_BADEXP, &t_script))
503-
return;
504-
505505
MCLegacyExecDoInBrowser(ctxt, *t_script);
506506
return;
507507
}
@@ -512,27 +512,22 @@ void MCDo::exec_ctxt(MCExecContext& ctxt)
512512
if (!ctxt . EvalExprAsStringRef(alternatelang, EE_DO_BADLANG, &t_language))
513513
return;
514514

515-
MCAutoStringRef t_script;
516-
if (!ctxt . EvalExprAsStringRef(source, EE_DO_BADEXP, &t_script))
517-
return;
518-
519515
MCScriptingExecDoAsAlternateLanguage(ctxt, *t_script, *t_language);
520516
return;
521517
}
522518

523519
if (debug)
524520
{
525-
MCAutoStringRef t_script;
526-
if (!ctxt . EvalExprAsStringRef(source, EE_DO_BADEXP, &t_script))
527-
return;
528-
529521
MCDebuggingExecDebugDo(ctxt, *t_script, line, pos);
530522
return;
531523
}
532524

533-
MCAutoStringRef t_script;
534-
if (!ctxt . EvalExprAsStringRef(source, EE_DO_BADEXP, &t_script))
525+
// AL-2014-11-17: [[ Bug 14044 ]] Do in caller not implemented
526+
if (caller)
527+
{
528+
MCEngineExecDoInCaller(ctxt, *t_script, line, pos);
535529
return;
530+
}
536531

537532
MCEngineExecDo(ctxt, *t_script, line, pos);
538533
}

engine/src/exec-engine.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ MC_EXEC_DEFINE_EXEC_METHOD(Engine, Get, 1)
8484
MC_EXEC_DEFINE_EXEC_METHOD(Engine, PutIntoVariable, 3)
8585
MC_EXEC_DEFINE_EXEC_METHOD(Engine, PutOutput, 2)
8686
MC_EXEC_DEFINE_EXEC_METHOD(Engine, Do, 3)
87+
MC_EXEC_DEFINE_EXEC_METHOD(Engine, DoInCaller, 3)
8788
MC_EXEC_DEFINE_EXEC_METHOD(Engine, InsertScriptOfObjectInto, 2)
8889
MC_EXEC_DEFINE_EXEC_METHOD(Engine, Quit, 1)
8990
MC_EXEC_DEFINE_EXEC_METHOD(Engine, CancelMessage, 1)
@@ -844,6 +845,35 @@ void MCEngineExecDo(MCExecContext& ctxt, MCStringRef p_script, int p_line, int p
844845
MCnexecutioncontexts--;
845846
}
846847

848+
void MCEngineExecDoInCaller(MCExecContext& ctxt, MCStringRef p_script, int p_line, int p_pos)
849+
{
850+
Boolean added = False;
851+
if (MCnexecutioncontexts < MAX_CONTEXTS)
852+
{
853+
ctxt.SetLineAndPos(p_line, p_pos);
854+
MCexecutioncontexts[MCnexecutioncontexts++] = &ctxt;
855+
added = True;
856+
}
857+
858+
if (MCnexecutioncontexts < 2)
859+
{
860+
if (added)
861+
MCnexecutioncontexts--;
862+
ctxt . LegacyThrow(EE_DO_NOCALLER);
863+
return;
864+
}
865+
866+
MCExecContext *caller = MCexecutioncontexts[MCnexecutioncontexts - 2];
867+
868+
if (caller -> GetHandler() != nil)
869+
caller -> GetHandler() -> doscript(*caller, p_script, p_line, p_pos);
870+
else
871+
caller -> GetHandlerList() -> doscript(*caller, p_script, p_line, p_pos);
872+
873+
if (added)
874+
MCnexecutioncontexts--;
875+
}
876+
847877
////////////////////////////////////////////////////////////////////////////////
848878

849879
void MCEngineExecQuit(MCExecContext& ctxt, integer_t p_retcode)

engine/src/exec.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3637,6 +3637,7 @@ extern MCExecMethodInfo *kMCEngineExecGetMethodInfo;
36373637
extern MCExecMethodInfo *kMCEngineExecPutIntoVariableMethodInfo;
36383638
extern MCExecMethodInfo *kMCEngineExecPutOutputMethodInfo;
36393639
extern MCExecMethodInfo *kMCEngineExecDoMethodInfo;
3640+
extern MCExecMethodInfo *kMCEngineExecDoInCallerMethodInfo;
36403641
extern MCExecMethodInfo *kMCEngineExecInsertScriptOfObjectIntoMethodInfo;
36413642
extern MCExecMethodInfo *kMCEngineExecQuitMethodInfo;
36423643
extern MCExecMethodInfo *kMCEngineExecCancelMessageMethodInfo;
@@ -3759,6 +3760,7 @@ void MCEngineExecPutOutput(MCExecContext& ctxt, MCStringRef value);
37593760
void MCEngineExecPutOutputUnicode(MCExecContext& ctxt, MCDataRef value);
37603761

37613762
void MCEngineExecDo(MCExecContext& ctxt, MCStringRef p_script, int p_line, int p_pos);
3763+
void MCEngineExecDoInCaller(MCExecContext& ctxt, MCStringRef p_script, int p_line, int p_pos);
37623764
void MCEngineExecInsertScriptOfObjectInto(MCExecContext& ctxt, MCObject *p_script, bool p_in_front);
37633765
void MCEngineExecQuit(MCExecContext& ctxt, integer_t p_retcode);
37643766

0 commit comments

Comments
 (0)