void SquirrelThread::initThread(HSQUIRRELVM parentVm) { m_oldTop = -1; m_parentVm = parentVm; createThread(); // create a local environment for the m_thread HSQOBJECT env; sq_resetobject(&env); sq_newtable(m_thread); // store the object in env if(sq_getstackobj(m_thread, -1, &env) < 0) { return; } sq_addref(m_thread, &env); sq_pop(m_thread, 1); // remove env from stack // set old roottable as delegate on env sq_pushobject(m_thread, env); // push env sq_pushroottable(m_thread); // [env, root] sq_setdelegate(m_thread, -2); // env.set_delegate(root) sq_pop(m_thread, 1); // pop env // set env as new roottable sq_pushobject(m_thread, env); sq_setroottable(m_thread); sq_release(m_thread, &env); }
static SQInteger base_setroottable(HSQUIRRELVM v) { SQObjectPtr &o=stack_get(v,2); if(SQ_FAILED(sq_setroottable(v))) return SQ_ERROR; v->Push(o); return 1; }
void SquirrelVM::Cleanup() { //cleans the root table sq_pushnull(_VM); sq_setroottable(_VM); }