📄 js_object.h
字号:
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 5, params, &rval);
if (result != JS_TRUE) return false;
retValue = JScriptValue(cx, rval);
return true;
}
static CL_JSObject *tempFromHandle(JSObject *obj);
static CL_JSObject *permanentFromHandle(JSObject *obj);
//! Overrideables:
public:
virtual JSBool onConvert(JSContext *cx, JSObject *obj, JSType type, jsval *vp);
virtual void onFinalize(JSContext *cx, JSObject *obj);
virtual CL_JSValue onConstruct(CL_JSContext *context, CL_JSArguments &args);
//! Implementation:
public:
CL_JSObject(JSObject *obj, bool temp);
MemberFuncCall findMemberFunc(JSContext *cx);
JSClass jsClass;
JSObject *jsObject;
bool temp;
std::map<JSFunction *, MemberFuncCall> functionMap;
std::vector<MemberFuncPropertyGetter> getters;
std::vector<MemberFuncPropertySetter> setters;
std::vector<void *> vars;
static CL_JSObject *getThis(JSContext *cx, JSObject *obj);
static std::map<JSObject*, CL_JSObject *> tempMap;
static std::map<JSObject*, CL_JSObject *> permanentMap;
// JSClass, Mandatory non-null function pointer members.
private:
static JSBool convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp);
static void finalize(JSContext *cx, JSObject *obj);
static JSBool getter(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
static JSBool setter(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
template<class GetType, class SetType>
class Property_1
{
public:
static JSBool getter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
int index = CL_JSValue(context, id);
GetType(CL_JSObject::*getter)() = (GetType(CL_JSObject::*)()) self->getters[index];
try
{
*vp = CL_JSValue(context, (*self.*getter)());
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
static JSBool setter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
int index = CL_JSValue(context, id);
void(CL_JSObject::*setter)(SetType) = (void(CL_JSObject::*)(SetType)) self->setters[index];
try
{
(*self.*setter)(CL_JSValue(context, *vp));
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
template<class VarType>
class Property_ptr
{
public:
static JSBool getter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
int index = CL_JSValue(context, id);
VarType *ptr = (VarType *) self->vars[index];
try
{
*vp = CL_JSValue(context, *ptr);
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
static JSBool setter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
int index = CL_JSValue(context, id);
VarType *ptr = (VarType *) self->vars[index];
try
{
*ptr = CL_JSValue(context, *vp);
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
template<class VarType>
class Property_obj
{
public:
static JSBool getter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
int index = CL_JSValue(context, id);
VarType *ptr = (VarType *) self->vars[index];
try
{
*vp = CL_JSValue(context, ptr);
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
static JSBool setter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
return JS_FALSE; // read only property.
}
};
template<class VarType>
class Property_objPtr
{
public:
static JSBool getter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
int index = CL_JSValue(context, id);
VarType *ptr = (VarType *) self->vars[index];
try
{
*vp = CL_JSValue(context, *ptr);
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
static JSBool setter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
int index = CL_JSValue(context, id);
VarType *ptr = (VarType *) self->vars[index];
try
{
VarType dyncast = dynamic_cast<VarType>((CL_JSObject *) CL_JSValue(context, *vp));
if (dyncast == 0) throw CL_JSError();
*ptr = dyncast;
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
// JSClass, Optionally non-null members.
public:
static JSBool call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
template<class RetVal, class Param1>
class Call_1
{
public:
static JSBool call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
CL_JSArguments args(context, argc, argv);
RetVal(CL_JSObject::*func)(Param1) = (RetVal(CL_JSObject::*)(Param1)) self->findMemberFunc(cx);
try
{
*rval = CL_JSValue(context, (*self.*func)(args[0]));
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
template<class RetVal, class Param1, class Param2>
class Call_2
{
public:
static JSBool call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
CL_JSArguments args(context, argc, argv);
RetVal(CL_JSObject::*func)(Param1, Param2) = (RetVal(CL_JSObject::*)(Param1, Param2)) self->findMemberFunc(cx);
try
{
*rval = CL_JSValue(context, (*self.*func)(args[0], args[1]));
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
template<class RetVal, class Param1, class Param2, class Param3>
class Call_3
{
public:
static JSBool call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
CL_JSArguments args(context, argc, argv);
RetVal(CL_JSObject::*func)(Param1, Param2, Param3) = (RetVal(CL_JSObject::*)(Param1, Param2, Param3)) self->findMemberFunc(cx);
try
{
*rval = CL_JSValue(context, (*self.*func)(args[0], args[1], args[2]));
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
template<class RetVal, class Param1, class Param2, class Param3, class Param4>
class Call_4
{
public:
static JSBool call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
CL_JSArguments args(context, argc, argv);
RetVal(CL_JSObject::*func)(Param1, Param2, Param3, Param4) = (RetVal(CL_JSObject::*)(Param1, Param2, Param3, Param4)) self->findMemberFunc(cx);
try
{
*rval = CL_JSValue(context, (*self.*func)(args[0], args[1], args[2], args[3]));
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
template<class RetVal, class Param1, class Param2, class Param3, class Param4, class Param5>
class Call_5
{
public:
static JSBool call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
CL_JSArguments args(context, argc, argv);
RetVal(CL_JSObject::*func)(Param1, Param2, Param3, Param4, Param5) = (RetVal(CL_JSObject::*)(Param1, Param2, Param3, Param4, Param5)) self->findMemberFunc(cx);
try
{
*rval = CL_JSValue(context, (*self.*func)(args[0], args[1], args[2], args[3], args[4]));
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
template<class Param1>
class Call_v1
{
public:
static JSBool call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
CL_JSArguments args(context, argc, argv);
void(CL_JSObject::*func)(Param1) = (void(CL_JSObject::*)(Param1)) self->findMemberFunc(cx);
try
{
(*self.*func)(args[0]);
*rval = CL_JSValue(context);
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
template<class Param1, class Param2>
class Call_v2
{
public:
static JSBool call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
CL_JSArguments args(context, argc, argv);
void(CL_JSObject::*func)(Param1, Param2) = (void(CL_JSObject::*)(Param1, Param2)) self->findMemberFunc(cx);
try
{
(*self.*func)(args[0], args[1]);
*rval = CL_JSValue(context);
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
template<class Param1, class Param2, class Param3>
class Call_v3
{
public:
static JSBool call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
CL_JSArguments args(context, argc, argv);
void(CL_JSObject::*func)(Param1, Param2, Param3) = (void(CL_JSObject::*)(Param1, Param2, Param3)) self->findMemberFunc(cx);
try
{
(*self.*func)(args[0], args[1], args[2]);
*rval = CL_JSValue(context);
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
template<class Param1, class Param2, class Param3, class Param4>
class Call_v4
{
public:
static JSBool call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
CL_JSArguments args(context, argc, argv);
void(CL_JSObject::*func)(Param1, Param2, Param3, Param4) = (void(CL_JSObject::*)(Param1, Param2, Param3, Param4)) self->findMemberFunc(cx);
try
{
(*self.*func)(args[0], args[1], args[2], args[3]);
*rval = CL_JSValue(context);
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
template<class Param1, class Param2, class Param3, class Param4, class Param5>
class Call_v5
{
public:
static JSBool call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
CL_JSObject *self = getThis(cx, obj);
CL_JSContext *context = CL_JSContext::tempFromHandle(cx);
CL_JSArguments args(context, argc, argv);
void(CL_JSObject::*func)(Param1, Param2, Param3, Param4, Param5) = (void(CL_JSObject::*)(Param1, Param2, Param3, Param4, Param5)) self->findMemberFunc(cx);
try
{
(*self.*func)(args[0], args[1], args[2], args[3], args[4]);
*rval = CL_JSValue(context);
return JS_TRUE;
}
catch (CL_JSError &)
{
return JS_FALSE;
}
}
};
static JSBool construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -