Skip to content

Commit 69b68fa

Browse files
Fallback if IScriptInstanceHelper::Get/Set are not implemented
1 parent 985ebc0 commit 69b68fa

1 file changed

Lines changed: 37 additions & 9 deletions

File tree

sp/src/vscript/vscript_squirrel.cpp

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1604,7 +1604,19 @@ SQInteger get_stub(HSQUIRRELVM vm)
16041604
}
16051605
else
16061606
{
1607-
sq_retval = sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
1607+
// Fallback
1608+
// Extra stack variables don't need to be popped, they are cleaned up on exit
1609+
sq_pushroottable(vm);
1610+
sq_push(vm, -2);
1611+
1612+
if ( SQ_SUCCEEDED( sq_rawget(vm, -2) ) )
1613+
{
1614+
sq_retval = 1;
1615+
}
1616+
else
1617+
{
1618+
sq_retval = sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
1619+
}
16081620
}
16091621

16101622
var.Free();
@@ -1635,11 +1647,24 @@ SQInteger set_stub(HSQUIRRELVM vm)
16351647
classInstanceData->desc->pHelper->Set(classInstanceData->instance, key, var)
16361648
))
16371649
{
1638-
sq_retval = sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
1650+
// Fallback
1651+
sq_pushroottable(vm);
1652+
sq_push(vm, -3);
1653+
sq_push(vm, -3);
1654+
1655+
if ( SQ_SUCCEEDED( sq_rawset(vm, -3) ) )
1656+
{
1657+
// rawset doesn't return correctly, pop env to return val
1658+
sq_pop(vm, 1);
1659+
sq_retval = 1;
1660+
}
1661+
else
1662+
{
1663+
sq_retval = sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
1664+
}
16391665
}
16401666

16411667
var.Free();
1642-
sq_pop(vm, 1);
16431668
return sq_retval;
16441669
}
16451670

@@ -2515,13 +2540,16 @@ bool SquirrelVM::RegisterClass(ScriptClassDesc_t* pClassDesc)
25152540
sq_newclosure(vm_, tostring_stub, 0);
25162541
sq_newslot(vm_, -3, SQFalse);
25172542

2518-
sq_pushstring(vm_, "_get", -1);
2519-
sq_newclosure(vm_, get_stub, 0);
2520-
sq_newslot(vm_, -3, SQFalse);
2543+
if ( pClassDesc->pHelper )
2544+
{
2545+
sq_pushstring(vm_, "_get", -1);
2546+
sq_newclosure(vm_, get_stub, 0);
2547+
sq_newslot(vm_, -3, SQFalse);
25212548

2522-
sq_pushstring(vm_, "_set", -1);
2523-
sq_newclosure(vm_, set_stub, 0);
2524-
sq_newslot(vm_, -3, SQFalse);
2549+
sq_pushstring(vm_, "_set", -1);
2550+
sq_newclosure(vm_, set_stub, 0);
2551+
sq_newslot(vm_, -3, SQFalse);
2552+
}
25252553

25262554
sq_pushstring(vm_, "IsValid", -1);
25272555
sq_newclosure(vm_, IsValid_stub, 0);

0 commit comments

Comments
 (0)