/* ** Rings: Multiple Lua States ** $Id: rings.c,v 1.24 2008/06/30 17:52:31 carregal Exp $ ** See Copyright Notice in license.html */ #include #include #include "squirrel.h" #include #include #include #include #include /* ** Copies values from State src to State dst. */ static SQRESULT copy_values_between_vms (HSQUIRRELVM dst, HSQUIRRELVM src, int argc, int argIdx) { SQRESULT _rc_; sq_reservestack(dst, argc + 20); argc += argIdx; //we will work with argc args starting at argIdx for (; argIdx < argc; argIdx++) { switch (sq_gettype(src, argIdx)) { case OT_INTEGER: SQ_GET_INTEGER(src, argIdx, vint); sq_pushinteger(dst, vint); break; case OT_FLOAT: SQ_GET_FLOAT(src, argIdx, vfloat); sq_pushfloat (dst, vfloat); break; case OT_BOOL: SQ_GET_BOOL(src, argIdx, vbool); sq_pushbool (dst, vbool); break; case OT_STRING: { SQ_GET_STRING(src, argIdx, vstr) sq_pushstring (dst, vstr, vstr_size); break; } case OT_ARRAY:{ SQInteger size = sq_getsize(src, argIdx); sq_newarray(dst, size); for(SQInteger i=0; i= 0){ if(retval){ if(copy_values_between_vms(v, self, 1, sq_gettop(self)) == SQ_OK) result = 1; } else result = SQ_OK; } else sq_throwerror(v, sq_getlasterror_str(self)); sq_settop(self, top); return result; } static SQRESULT sq_slave_vm_loadfile(HSQUIRRELVM v){ SQ_FUNC_VARS(v); GET_sq_slave_vm_INSTANCE(v, 1); SQ_GET_STRING(v, 2, func_name); SQ_GET_STRING(v, 3, file_name); SQ_OPT_BOOL(v, 4, printerror, false); SQInteger top = sq_gettop(self); SQRESULT result = SQ_ERROR; sq_pushroottable(self); sq_pushstring(self, func_name, func_name_size); if(sqstd_loadfile(self, file_name, printerror) >= 0){ result = sq_newslot(self, -3, SQFalse); } sq_settop(self, top); return result; } static SQRESULT sq_slave_vm_compilestring(HSQUIRRELVM v){ SQ_FUNC_VARS(v); GET_sq_slave_vm_INSTANCE(v, 1); SQ_GET_STRING(v, 2, func_name); SQ_GET_STRING(v, 3, str_script); SQ_OPT_BOOL(v, 4, printerror, false); SQInteger top = sq_gettop(self); SQRESULT result = SQ_ERROR; sq_pushroottable(self); sq_pushstring(self, func_name, func_name_size); if(sq_compilebuffer(self, str_script, str_script_size, func_name, printerror) >= 0){ result = sq_newslot(self, -3, SQFalse); } sq_settop(self, top); return result; } #ifdef __cplusplus extern "C" { #endif SQRESULT sqstd_register_sq_slave_vm(HSQUIRRELVM v) { const SQChar get_set_validation_mask[] = _SC("x s|n|p s|n|b|a|t|p|o"); sq_pushstring(v,sq_slave_vm_TAG, -1); sq_newclass(v, SQFalse); sq_settypetag(v,-1,(void*)sq_slave_vm_TAG); sq_insertfunc(v, _SC("constructor"), sq_slave_vm_constructor, -1, _SC("xi"), SQFalse); sq_insertfunc(v, _SC("_tostring"), sq_slave_vm__tostring, 1, _SC("x"), SQFalse); sq_insertfunc(v, _SC("close"), sq_slave_vm_close, 1, _SC("x"), SQFalse); sq_insertfunc(v, _SC("set"), sq_slave_vm_set, 3, get_set_validation_mask, SQFalse); sq_insertfunc(v, _SC("_set"), sq_slave_vm_set, 3, get_set_validation_mask, SQFalse); sq_insertfunc(v, _SC("get"), sq_slave_vm_get, -2, get_set_validation_mask, SQFalse); sq_insertfunc(v, _SC("_get"), sq_slave_vm_get, -2, get_set_validation_mask, SQFalse); sq_insertfunc(v, _SC("dofile"), sq_slave_vm_dofile, -2, _SC("xsbb"), SQFalse); sq_insertfunc(v, _SC("loadfile"), sq_slave_vm_loadfile, -3, _SC("xssb"), SQFalse); sq_insertfunc(v, _SC("compilestring"), sq_slave_vm_compilestring, -3, _SC("xssb"), SQFalse); sq_insertfunc(v, _SC("call"), sq_slave_vm_call, -3, _SC("xbs"), SQFalse); sq_newslot(v,-3,SQTrue); //push sq_slave_vm class return 0; } #ifdef __cplusplus } #endif