Fallback if IScriptInstanceHelper::Get/Set are not implemented

This commit is contained in:
samisalreadytaken 2025-07-01 20:09:45 +03:00
parent 985ebc0dbb
commit 69b68fa2ac

View File

@ -1603,9 +1603,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;
@ -1634,12 +1646,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;
}
@ -2515,6 +2540,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);
@ -2522,6 +2549,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);