diff --git a/Engine/source/console/astNodes.cpp b/Engine/source/console/astNodes.cpp index c95a45cae..c45d13667 100644 --- a/Engine/source/console/astNodes.cpp +++ b/Engine/source/console/astNodes.cpp @@ -1304,12 +1304,13 @@ U32 InternalSlotAccessNode::compile(CodeStream& codeStream, U32 ip, TypeReq type ip = objectExpr->compile(codeStream, ip, TypeReqString); codeStream.emit(OP_SETCUROBJECT); + // we pop the stack as we will override the current object with the internal object + codeStream.emit(OP_POP_STK); + ip = slotExpr->compile(codeStream, ip, TypeReqString); codeStream.emit(OP_SETCUROBJECT_INTERNAL); codeStream.emit(recurse); - codeStream.emit(OP_POP_STK); - return codeStream.tell(); } diff --git a/Engine/source/console/compiledEval.cpp b/Engine/source/console/compiledEval.cpp index f3c432fcb..e9b4d2f61 100644 --- a/Engine/source/console/compiledEval.cpp +++ b/Engine/source/console/compiledEval.cpp @@ -1614,6 +1614,11 @@ ConsoleValue CodeBlock::exec(U32 ip, const char* functionName, Namespace* thisNa stack[_STK].setInt(0); } } + else + { + Con::errorf(ConsoleLogEntry::Script, "%s: Attempt to use ->, but the group object wasn't found.", getFileLine(ip - 2)); + stack[_STK].setInt(0); + } break; case OP_SETCUROBJECT_NEW: diff --git a/Engine/source/console/test/ScriptTest.cpp b/Engine/source/console/test/ScriptTest.cpp index 6a8d2ae12..f0aeb57bd 100644 --- a/Engine/source/console/test/ScriptTest.cpp +++ b/Engine/source/console/test/ScriptTest.cpp @@ -544,7 +544,7 @@ TEST(Script, Basic_SimObject) TEST(Script, Internal_Name) { ConsoleValue value = RunScript(R"( - function SimObject::_internalCall(%this) + function TheFirstInner::_internalCall(%this) { return 5; } @@ -552,7 +552,7 @@ TEST(Script, Internal_Name) function a() { %grp = new SimGroup(); - %obj = new SimObject() + %obj = new SimObject(TheFirstInner) { internalName = "Yay"; }; @@ -568,6 +568,43 @@ TEST(Script, Internal_Name) )"); ASSERT_EQ(value.getInt(), 5); + + ConsoleValue recursiveValue = RunScript(R"( + function SimGroup::doTheInternalCall(%this) + { + return %this-->Yeah._internalCall2(); + } + + function TheAnotherObject::_internalCall2(%this) + { + return %this.property; + } + + function a() + { + %grp = new SimGroup(); + %obj = new SimGroup() + { + internalName = "Yay2"; + + new SimObject(TheAnotherObject) + { + internalName = "Yeah"; + property = 12; + }; + }; + %grp.add(%obj); + + %val = %grp.doTheInternalCall(); + + %grp.delete(); + + return %val; + } + return a(); + )"); + + ASSERT_EQ(recursiveValue.getInt(), 12); } TEST(Script, Basic_Package)