diff --git a/src/control/C4Control.cpp b/src/control/C4Control.cpp index 8f101c62b..fda326e65 100644 --- a/src/control/C4Control.cpp +++ b/src/control/C4Control.cpp @@ -234,18 +234,16 @@ void C4ControlScript::Execute() const if (!Game.Parameters.AllowDebug) return; // execute - C4Object *pObj = NULL; + C4PropList *pPropList = NULL; C4AulScript *pScript; if (iTargetObj == SCOPE_Console) - pScript = &::GameScript; + pPropList = ::GameScript.GetPropList(); else if (iTargetObj == SCOPE_Global) - pScript = &::ScriptEngine; - else if ((pObj = ::Objects.SafeObjectPointer(iTargetObj))) - pScript = &(pObj->Def->Script); - else + pPropList = ::ScriptEngine.GetPropList(); + else if (!(pPropList = ::Objects.SafeObjectPointer(iTargetObj))) // default: Fallback to global context - pScript = &::ScriptEngine; - C4Value rVal(pScript->DirectExec(pObj, szScript, "console script", false, fUseVarsFromCallerContext ? AulExec.GetContext(AulExec.GetContextDepth()-1) : NULL)); + pPropList = ::ScriptEngine.GetPropList(); + C4Value rVal(AulExec.DirectExec(pPropList, szScript, "console script", false, fUseVarsFromCallerContext ? AulExec.GetContext(AulExec.GetContextDepth()-1) : NULL)); #ifndef NOAULDEBUG C4AulDebug* pDebug; if ( (pDebug = C4AulDebug::GetDebugger()) ) @@ -255,10 +253,7 @@ void C4ControlScript::Execute() const #endif // show messages // print script - if (pObj) - LogF("-> %s::%s", pObj->Def->GetName(), szScript); - else - LogF("-> %s", szScript); + LogF("-> %s::%s", pPropList->GetName(), szScript); // print result if (!LocalControl()) { @@ -331,7 +326,7 @@ void C4ControlMsgBoardCmd::Execute() const } // Run script - C4Value rv(::ScriptEngine.DirectExec(nullptr, script.getData(), "message board command")); + C4Value rv(::AulExec.DirectExec(::ScriptEngine.GetPropList(), script.getData(), "message board command")); #ifndef NOAULDEBUG C4AulDebug* pDebug = C4AulDebug::GetDebugger(); if (pDebug) diff --git a/src/object/C4Object.cpp b/src/object/C4Object.cpp index 7634e3c0c..f901df5f3 100644 --- a/src/object/C4Object.cpp +++ b/src/object/C4Object.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -2564,7 +2565,7 @@ bool C4Object::MenuCommand(const char *szCommand) { // Native script execution if (!Def || !Status) return false; - return !! Def->Script.DirectExec(this, szCommand, "MenuCommand"); + return !! ::AulExec.DirectExec(this, szCommand, "MenuCommand"); } C4Object *C4Object::ComposeContents(C4ID id) diff --git a/src/object/C4ObjectMenu.cpp b/src/object/C4ObjectMenu.cpp index b7a6dcea9..ca6ab3fc2 100644 --- a/src/object/C4ObjectMenu.cpp +++ b/src/object/C4ObjectMenu.cpp @@ -29,7 +29,7 @@ #include "C4Game.h" #include "C4PlayerList.h" #include "C4GameObjects.h" - +#include "C4AulExec.h" // ----------------------------------------------------------- // C4ObjectMenu @@ -304,7 +304,7 @@ bool C4ObjectMenu::MenuCommand(const char *szCommand, bool fIsCloseCommand) case CB_Scenario: // Object menu with scenario script callback - ::GameScript.DirectExec(NULL, szCommand, "MenuCommand"); + ::AulExec.DirectExec(NULL, szCommand, "MenuCommand"); break; case CB_None: diff --git a/src/script/C4Aul.h b/src/script/C4Aul.h index 6b5633522..0c1adda6f 100644 --- a/src/script/C4Aul.h +++ b/src/script/C4Aul.h @@ -148,7 +148,6 @@ public: virtual C4PropListStatic * GetPropList() { return 0; } virtual C4ScriptHost * GetScriptHost() { return 0; } - C4Value DirectExec(C4Object *pObj, const char *szScript, const char *szContext, bool fPassErrors = false, C4AulScriptContext* context = NULL); // directly parse uncompiled script (WARG! CYCLES!) virtual void ResetProfilerTimes(); // zero all profiler times of owned functions virtual void CollectProfilerTimes(class C4AulProfiler &rProfiler); diff --git a/src/script/C4AulExec.cpp b/src/script/C4AulExec.cpp index f77a539ac..e47600f71 100644 --- a/src/script/C4AulExec.cpp +++ b/src/script/C4AulExec.cpp @@ -1025,28 +1025,33 @@ void C4AulProfiler::Show() // done! } -C4Value C4AulScript::DirectExec(C4Object *pObj, const char *szScript, const char *szContext, bool fPassErrors, C4AulScriptContext* context) +C4Value C4AulExec::DirectExec(C4PropList *p, const char *szScript, const char *szContext, bool fPassErrors, C4AulScriptContext* context) { #ifdef DEBUGREC_SCRIPT if (Config.General.DebugRec) { AddDbgRec(RCT_DirectExec, szScript, strlen(szScript)+1); - int32_t iObjNumber = pObj ? pObj->Number : -1; + int32_t iObjNumber = p && p->GetPropListNumbered() ? p->GetPropListNumbered()->Number : -1; AddDbgRec(RCT_DirectExec, &iObjNumber, sizeof(int32_t)); } #endif // profiler - AulExec.StartDirectExec(); + StartDirectExec(); + C4AulScript * script = &::GameScript; + if (p == ::ScriptEngine.GetPropList()) + script = &::ScriptEngine; + else if (p && p->GetDef()) + script = &p->GetDef()->Script; // Add a new function - C4AulScriptFunc *pFunc = new C4AulScriptFunc(GetPropList(), GetScriptHost(), 0, szScript); + C4AulScriptFunc *pFunc = new C4AulScriptFunc(script->GetPropList(), script->GetScriptHost(), 0, szScript); // Parse function try { pFunc->ParseFn(context); - C4Value vRetVal(AulExec.Exec(pFunc, pObj, NULL, fPassErrors)); + C4Value vRetVal(Exec(pFunc, p, NULL, fPassErrors)); delete pFunc; pFunc = 0; // profiler - AulExec.StopDirectExec(); + StopDirectExec(); return vRetVal; } catch (C4AulError &ex) diff --git a/src/script/C4AulExec.h b/src/script/C4AulExec.h index f0f3bf613..0b0359c34 100644 --- a/src/script/C4AulExec.h +++ b/src/script/C4AulExec.h @@ -76,6 +76,7 @@ private: public: C4Value Exec(C4AulScriptFunc *pSFunc, C4PropList * p, C4Value pPars[], bool fPassErrors); C4Value Exec(C4AulBCC *pCPos, bool fPassErrors); + C4Value DirectExec(C4PropList *p, const char *szScript, const char *szContext, bool fPassErrors = false, C4AulScriptContext* context = NULL); void StartTrace(); void StartProfiling(C4AulScript *pScript); // resets profling times and starts recording the times diff --git a/src/script/C4Script.cpp b/src/script/C4Script.cpp index 7ea6e3abf..16b4857c4 100644 --- a/src/script/C4Script.cpp +++ b/src/script/C4Script.cpp @@ -581,13 +581,7 @@ static Nillable FnGetChar(C4PropList * _this, C4String *pString, long iInd static C4Value Fneval(C4PropList * _this, C4String *strScript) { - // execute script in the same object - if (Object(_this)) - return Object(_this)->Def->Script.DirectExec(Object(_this), FnStringPar(strScript), "eval", true); - else if (_this && _this->GetDef()) - return _this->GetDef()->Script.DirectExec(0, FnStringPar(strScript), "eval", true); - else - return ::GameScript.DirectExec(0, FnStringPar(strScript), "eval", true); + return ::AulExec.DirectExec(_this, FnStringPar(strScript), "eval", true); } static bool FnLocateFunc(C4PropList * _this, C4String *funcname, C4PropList * p) diff --git a/tests/DirectExecTest.cpp b/tests/DirectExecTest.cpp index f5b9f75fc..3cb450121 100644 --- a/tests/DirectExecTest.cpp +++ b/tests/DirectExecTest.cpp @@ -15,16 +15,14 @@ #include #include "script/C4Aul.h" +#include "script/C4AulExec.h" #include TEST(DirectExecTest, SanityTests) { - C4AulScript * pScript = new C4AulScript(); - ASSERT_TRUE(pScript); - C4Value rVal(pScript->DirectExec(nullptr, "5*8", "unit test script", false, nullptr)); + C4Value rVal(AulExec.DirectExec(nullptr, "5*8", "unit test script", false, nullptr)); EXPECT_EQ(rVal, C4Value(5*8)); - delete pScript; } template diff --git a/tests/aul/AulTest.cpp b/tests/aul/AulTest.cpp index f00d16b01..d9835805b 100644 --- a/tests/aul/AulTest.cpp +++ b/tests/aul/AulTest.cpp @@ -121,4 +121,6 @@ TEST_F(AulTest, Locals) TEST_F(AulTest, Eval) { EXPECT_EQ(C4VInt(42), RunExpr("eval(\"42\")")); + EXPECT_EQ(C4VInt(42), RunCode("local i = 42; func Main() { return eval(\"this.i\"); }", false)); + EXPECT_EQ(C4VInt(42), RunCode("local i; func Main() { eval(\"this.i = 42\"); return i; }", false)); }