void EventListener::ProcessEvent(Rocket::Core::Event& event) { HSQUIRRELVM vm = Module::instance().getScriptInterface().getSquirrelVM(); if (!mScript.IsCompiled()) { } mScript.Compile(vm, false); GlobalUtility gutil(vm, m_pElement->GetOwnerDocument(), m_pElement, &event); SQInteger i = sq_gettop(vm); SQRESULT sqr; gutil.Set(); Module::instance().getScriptInterface().PushDocumentTable(vm, m_pElement->GetOwnerDocument()); sqr = sq_bindenv(vm, i); ROCKETSQUIRREL_ASSERT(SQ_SUCCEEDED(sqr)); sq_pushroottable(vm); mScript.Run(vm); gutil.Restore(); sq_pop(vm, i); return; }
/** * TJSオブジェクトのオーバライド処理 * 引数1 オブジェクト * 引数2 名前 * 引数3 値。省略時は squirrel インスタンスから名前で参照 */ SQRESULT TJSObject::tjsOverride(HSQUIRRELVM v) { SQRESULT result; tTJSVariant instance; if (getVariant(v,1,&instance) && instance.Type() == tvtObject) { tTJSVariant value; const SQChar *methodName = sqobject::getString(v,2); int n = sq_gettop(v); if (n >= 3) { // 引数で明示指定されている if (SQ_FAILED(result = sq_getvariant(v, 3, &value))) { return result; } } else { // 自己オブジェクトから名前で検索して登録 sq_push(v, 1); sq_pushstring(v, methodName, -1); if (SQ_FAILED(result = sq_get(v, -2))) { sq_pop(v, 1); //self return result; } else { SQObjectType type = sq_gettype(v, -1); if (type == OT_CLOSURE || type == OT_NATIVECLOSURE) { // クロージャの場合は bindenv しておく sq_push(v, 1); if (SQ_FAILED(result = sq_bindenv(v, -2))) { sq_pop(v, 2); // func, self return result; } else { sq_remove(v, -2); // original func } } if (SQ_FAILED(result = sq_getvariant(v, -1, &value))) { // value sq_pop(v, 1); //self return result; } sq_pop(v, 1); // self } } tjs_error error; if (TJS_SUCCEEDED(error = instance.AsObjectClosureNoAddRef().PropSet(TJS_MEMBERENSURE, methodName, NULL, &value, NULL))) { return SQ_OK; } else { return ERROR_KRKR(v, error); } } return ERROR_BADINSTANCE(v); }
static SQInteger closure_bindenv(HSQUIRRELVM v) { if(SQ_FAILED(sq_bindenv(v,1))) return SQ_ERROR; return 1; }