Merge pull request #441 from samisalreadytaken/vscript-getset-fallback

Fallback if IScriptInstanceHelper::Get/Set are not implemented
This commit is contained in:
Blixibon 2025-07-24 10:07:52 -05:00 committed by GitHub
commit 793d8df44e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1649,9 +1649,21 @@ SQInteger get_stub(HSQUIRRELVM vm)
sq_retval = 1;
}
else
{
// Fallback
// Extra stack variables don't need to be popped, they are cleaned up on exit
sq_pushroottable(vm);
sq_push(vm, -2);
if ( SQ_SUCCEEDED( sq_rawget(vm, -2) ) )
{
sq_retval = 1;
}
else
{
sq_retval = sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
}
}
var.Free();
return sq_retval;
@ -1683,12 +1695,25 @@ SQInteger set_stub(HSQUIRRELVM vm)
classInstanceData->desc->pHelper &&
classInstanceData->desc->pHelper->Set(classInstanceData->instance, key, var)
))
{
// Fallback
sq_pushroottable(vm);
sq_push(vm, -3);
sq_push(vm, -3);
if ( SQ_SUCCEEDED( sq_rawset(vm, -3) ) )
{
// rawset doesn't return correctly, pop env to return val
sq_pop(vm, 1);
sq_retval = 1;
}
else
{
sq_retval = sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
}
}
var.Free();
sq_pop(vm, 1);
return sq_retval;
}
@ -2564,6 +2589,8 @@ bool SquirrelVM::RegisterClass(ScriptClassDesc_t* pClassDesc)
sq_newclosure(vm_, tostring_stub, 0);
sq_newslot(vm_, -3, SQFalse);
if ( pClassDesc->pHelper )
{
sq_pushstring(vm_, "_get", -1);
sq_newclosure(vm_, get_stub, 0);
sq_newslot(vm_, -3, SQFalse);
@ -2571,6 +2598,7 @@ bool SquirrelVM::RegisterClass(ScriptClassDesc_t* pClassDesc)
sq_pushstring(vm_, "_set", -1);
sq_newclosure(vm_, set_stub, 0);
sq_newslot(vm_, -3, SQFalse);
}
sq_pushstring(vm_, "IsValid", -1);
sq_newclosure(vm_, IsValid_stub, 0);