Пример #1
0
/**
 * 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;
}
Пример #2
0
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;
}
Пример #3
0
/**
 * クラスの登録
 * @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;
}
Пример #4
0
static SQInteger class_getattributes(HSQUIRRELVM v)
{
	return SQ_SUCCEEDED(sq_getattributes(v,-2))?1:SQ_ERROR;
}