⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 js_object.h

📁 这是一款2d游戏引擎
💻 H
📖 第 1 页 / 共 2 页
字号:
		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 + -