/** * squirrel から吉里吉里オブジェクトを取得 */ bool TJSObject::getVariant(HSQUIRRELVM v, SQInteger idx, tTJSVariant *variant) { if (sq_gettype(v, idx) == OT_CLASS) { if (idx < 0) { idx = sq_gettop(v) + 1 + idx; } bool ret = false; // クラス属性からオブジェクト情報を引き出す sq_pushnull(v); if (SQ_SUCCEEDED(sq_getattributes(v, idx))) { sq_pushstring(v, tjsClassAttrName, -1); if (SQ_SUCCEEDED(sq_get(v,-2))) { if (SQ_SUCCEEDED(sq_getvariant(v,-1, variant))) { ret = true; } sq_pop(v,1); } sq_pop(v,1); } else { // XXX sq_pop(v,1); } return ret; } else if (sq_gettype(v, idx) == OT_INSTANCE) { TJSObject *obj = SQClassType<TJSObject>::getInstance(v, idx); if (obj && obj->instance.AsObjectClosureNoAddRef().IsValid(0, NULL, NULL, NULL) == TJS_S_TRUE) { *variant = obj->instance; return true; } } return false; }
SquirrelObject SquirrelObject::GetAttributes(const SQChar *key) { SquirrelObject ret; int top = sq_gettop(m_Vm.GetVMPtr()); sq_pushobject(m_Vm.GetVMPtr(),_o); if(key) sq_pushstring(m_Vm.GetVMPtr(),key,-1); else sq_pushnull(m_Vm.GetVMPtr()); if(SQ_SUCCEEDED(sq_getattributes(m_Vm.GetVMPtr(),-2))) { ret.AttachToStackObject(-1); } sq_settop(m_Vm.GetVMPtr(),top); return ret; }
/** * クラスの登録 * @param HSQUIRRELVM v */ SQRESULT TJSObject::createTJSClass(HSQUIRRELVM v) { SQInteger top = sq_gettop(v); if (top < 2) { return sq_throwerror(v, _SC("invalid param")); } // クラスを生成 sq_pushobject(v, SQClassType<TJSObject>::ClassObject()); sq_newclass(v, true); // 継承する // メンバ登録 const tjs_char *tjsClassName = NULL; tTJSVariant tjsClassObj; for (SQInteger i=top; i>1; i--) { if ((tjsClassName = sqobject::getString(v,i))) { TVPExecuteExpression(tjsClassName, &tjsClassObj); if (tjsClassObj.Type() == tvtObject && TJS_SUCCEEDED(tjsClassObj.AsObjectClosureNoAddRef().IsInstanceOf(0,NULL,NULL,L"Class",NULL))) { MemberRegister *r = new MemberRegister(v, tjsClassObj); tTJSVariantClosure closure(r); tjsClassObj.AsObjectClosureNoAddRef().EnumMembers(TJS_IGNOREPROP, &closure, NULL); r->Release(); } } } if (tjsClassName) { // コンストラクタ登録 sq_pushstring(v, _SC("constructor"), -1); sq_pushvariant(v, tjsClassObj); sq_newclosure(v, tjsConstructor, 1); sq_createslot(v, -3); // クラス属性に tjsクラスを登録 sq_pushnull(v); sq_newtable(v); if (SQ_SUCCEEDED(sq_setattributes(v,-3))) { sq_pop(v,1); sq_pushnull(v); if (SQ_SUCCEEDED(sq_getattributes(v, -2))) { sq_pushstring(v, tjsClassAttrName, -1); sq_pushvariant(v, tjsClassObj); if (SQ_SUCCEEDED(sq_createslot(v, -3))) { sq_pop(v,1); } else { sq_pop(v,2); } } else { // XXX sq_pop(v,1); } } else { // XXX sq_pop(v,2); } // TJS機能メソッドを登録 sq_pushstring(v, _SC("tjsIsValid"), -1); sq_newclosure(v, TJSObject::tjsIsValid, 0); sq_createslot(v, -3); sq_pushstring(v, _SC("tjsOverride"), -1); sq_newclosure(v, TJSObject::tjsOverride, 0); sq_setparamscheck(v, -2, _SC(".sc")); sq_createslot(v, -3); } return 1; }
static SQInteger class_getattributes(HSQUIRRELVM v) { return SQ_SUCCEEDED(sq_getattributes(v,-2))?1:SQ_ERROR; }