Fix bugs with internalName accessor

This commit is contained in:
Jeff Hutchinson 2021-08-17 20:52:59 -04:00
parent 838395840d
commit 98a2fa0f33
3 changed files with 47 additions and 4 deletions

View file

@ -1304,12 +1304,13 @@ U32 InternalSlotAccessNode::compile(CodeStream& codeStream, U32 ip, TypeReq type
ip = objectExpr->compile(codeStream, ip, TypeReqString); ip = objectExpr->compile(codeStream, ip, TypeReqString);
codeStream.emit(OP_SETCUROBJECT); 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); ip = slotExpr->compile(codeStream, ip, TypeReqString);
codeStream.emit(OP_SETCUROBJECT_INTERNAL); codeStream.emit(OP_SETCUROBJECT_INTERNAL);
codeStream.emit(recurse); codeStream.emit(recurse);
codeStream.emit(OP_POP_STK);
return codeStream.tell(); return codeStream.tell();
} }

View file

@ -1614,6 +1614,11 @@ ConsoleValue CodeBlock::exec(U32 ip, const char* functionName, Namespace* thisNa
stack[_STK].setInt(0); 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; break;
case OP_SETCUROBJECT_NEW: case OP_SETCUROBJECT_NEW:

View file

@ -544,7 +544,7 @@ TEST(Script, Basic_SimObject)
TEST(Script, Internal_Name) TEST(Script, Internal_Name)
{ {
ConsoleValue value = RunScript(R"( ConsoleValue value = RunScript(R"(
function SimObject::_internalCall(%this) function TheFirstInner::_internalCall(%this)
{ {
return 5; return 5;
} }
@ -552,7 +552,7 @@ TEST(Script, Internal_Name)
function a() function a()
{ {
%grp = new SimGroup(); %grp = new SimGroup();
%obj = new SimObject() %obj = new SimObject(TheFirstInner)
{ {
internalName = "Yay"; internalName = "Yay";
}; };
@ -568,6 +568,43 @@ TEST(Script, Internal_Name)
)"); )");
ASSERT_EQ(value.getInt(), 5); 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) TEST(Script, Basic_Package)