@@ -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