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; sq_retval = 1;
} }
else 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); sq_retval = sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
} }
}
var.Free(); var.Free();
return sq_retval; return sq_retval;
@ -1634,12 +1646,25 @@ SQInteger set_stub(HSQUIRRELVM vm)
classInstanceData->desc->pHelper && classInstanceData->desc->pHelper &&
classInstanceData->desc->pHelper->Set(classInstanceData->instance, key, var) 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); sq_retval = sqstd_throwerrorf(vm, "the index '%.50s' does not exist", key);
} }
}
var.Free(); var.Free();
sq_pop(vm, 1);
return sq_retval; return sq_retval;
} }
@ -2515,6 +2540,8 @@ bool SquirrelVM::RegisterClass(ScriptClassDesc_t* pClassDesc)
sq_newclosure(vm_, tostring_stub, 0); sq_newclosure(vm_, tostring_stub, 0);
sq_newslot(vm_, -3, SQFalse); sq_newslot(vm_, -3, SQFalse);
if ( pClassDesc->pHelper )
{
sq_pushstring(vm_, "_get", -1); sq_pushstring(vm_, "_get", -1);
sq_newclosure(vm_, get_stub, 0); sq_newclosure(vm_, get_stub, 0);
sq_newslot(vm_, -3, SQFalse); sq_newslot(vm_, -3, SQFalse);
@ -2522,6 +2549,7 @@ bool SquirrelVM::RegisterClass(ScriptClassDesc_t* pClassDesc)
sq_pushstring(vm_, "_set", -1); sq_pushstring(vm_, "_set", -1);
sq_newclosure(vm_, set_stub, 0); sq_newclosure(vm_, set_stub, 0);
sq_newslot(vm_, -3, SQFalse); sq_newslot(vm_, -3, SQFalse);
}
sq_pushstring(vm_, "IsValid", -1); sq_pushstring(vm_, "IsValid", -1);
sq_newclosure(vm_, IsValid_stub, 0); sq_newclosure(vm_, IsValid_stub, 0);