📄 js_object.h
字号:
/* $Id: js_object.h,v 1.7 2004/01/02 15:42:44 mbn Exp $
**
** ClanLib Game SDK
** Copyright (C) 2003 The ClanLib Team
** For a total list of contributers see the file CREDITS.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
//! clanJavaScript="Framework"
//! header=javascript.h
#ifndef header_js_object
#define header_js_object
#if _MSC_VER > 1000
#pragma once
#endif
#include "js_config.h"
#include "js_value.h"
#include "js_arguments.h"
#include <string>
#include <map>
#include <vector>
//: JavaScript Object class.
//- !group=JavaScript/Framework!
//- !header=javascript.h!
class CL_JSObject
{
//! Construction:
public:
CL_JSObject(const char *name = "Anonymous");
~CL_JSObject();
//! Attributes:
public:
typedef CL_JSValue (CL_JSObject::*MemberFuncCall)(
CL_JSContext *context, CL_JSArguments &args);
typedef CL_JSValue (CL_JSObject::*MemberFuncPropertyGetter)(CL_JSContext *cx);
typedef void (CL_JSObject::*MemberFuncPropertySetter)(const CL_JSValue &value);
const JSClass &getClass() const { return jsClass; }
JSClass &getClass() { return jsClass; }
const JSObject *getObject() const { return jsObject; }
JSObject *getObject() { return jsObject; }
//! Operations:
public:
void newObject(JSContext *cx, JSObject *proto = 0, JSObject *parent = 0);
void defineObject(JSContext *cx, JSObject *obj, const char *name, JSObject *proto, uintN flags);
void initStandardClasses(JSContext *cx);
void initClass(
JSContext *cx, JSObject *obj, JSObject *parent,
JSNative constructor, uintN nargs,
JSPropertySpec *ps,
JSFunctionSpec *fs,
JSPropertySpec *staticPs,
JSFunctionSpec *staticFs);
template<class Class>
void defineFunction(
JSContext *cx, const char *name,
CL_JSValue(Class::*func)(CL_JSContext *cx, CL_JSArguments &args),
int argc)
{
JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, call, argc, 0);
functionMap[jsFunc] = (MemberFuncCall) func;
}
template<class Class, class RetVal, class Param1>
void defineFunction_1(
JSContext *cx, const char *name,
RetVal(Class::*func)(Param1))
{
JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
ptrCall = CL_JSObject::Call_1<RetVal, Param1>::call;
JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 1, 0);
functionMap[jsFunc] = (MemberFuncCall) func;
}
template<class Class, class RetVal, class Param1, class Param2>
void defineFunction_2(
JSContext *cx, const char *name,
RetVal(Class::*func)(Param1, Param2))
{
JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
ptrCall = CL_JSObject::Call_2<RetVal, Param1, Param2>::call;
JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 2, 0);
functionMap[jsFunc] = (MemberFuncCall) func;
}
template<class Class, class RetVal, class Param1, class Param2, class Param3>
void defineFunction_3(
JSContext *cx, const char *name,
RetVal(Class::*func)(Param1, Param2, Param3))
{
JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
ptrCall = CL_JSObject::Call_3<RetVal, Param1, Param2, Param3>::call;
JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 3, 0);
functionMap[jsFunc] = (MemberFuncCall) func;
}
template<class Class, class RetVal, class Param1, class Param2, class Param3, class Param4>
void defineFunction_4(
JSContext *cx, const char *name,
RetVal(Class::*func)(Param1, Param2, Param3, Param4))
{
JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
ptrCall = CL_JSObject::Call_4<RetVal, Param1, Param2, Param3, Param4>::call;
JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 4, 0);
functionMap[jsFunc] = (MemberFuncCall) func;
}
template<class Class, class RetVal, class Param1, class Param2, class Param3, class Param4, class Param5>
void defineFunction_5(
JSContext *cx, const char *name,
RetVal(Class::*func)(Param1, Param2, Param3, Param4, Param5))
{
JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
ptrCall = CL_JSObject::Call_5<RetVal, Param1, Param2, Param3, Param4, Param5>::call;
JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 5, 0);
functionMap[jsFunc] = (MemberFuncCall) func;
}
template<class Class, class Param1>
void defineFunction_v1(
JSContext *cx, const char *name,
void(Class::*func)(Param1))
{
JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
ptrCall = CL_JSObject::Call_v1<Param1>::call;
JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 1, 0);
functionMap[jsFunc] = (MemberFuncCall) func;
}
template<class Class, class Param1, class Param2>
void defineFunction_v2(
JSContext *cx, const char *name,
void(Class::*func)(Param1, Param2))
{
JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
ptrCall = CL_JSObject::Call_v2<Param1, Param2>::call;
JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 2, 0);
functionMap[jsFunc] = (MemberFuncCall) func;
}
template<class Class, class Param1, class Param2, class Param3>
void defineFunction_v3(
JSContext *cx, const char *name,
void(Class::*func)(Param1, Param2, Param3))
{
JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
ptrCall = CL_JSObject::Call_v3<Param1, Param2, Param3>::call;
JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 3, 0);
functionMap[jsFunc] = (MemberFuncCall) func;
}
template<class Class, class Param1, class Param2, class Param3, class Param4>
void defineFunction_v4(
JSContext *cx, const char *name,
void(Class::*func)(Param1, Param2, Param3, Param4))
{
JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
ptrCall = CL_JSObject::Call_v4<Param1, Param2, Param3, Param4>::call;
JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 4, 0);
functionMap[jsFunc] = (MemberFuncCall) func;
}
template<class Class, class Param1, class Param2, class Param3, class Param4, class Param5>
void defineFunction_5(
JSContext *cx, const char *name,
void(Class::*func)(Param1, Param2, Param3, Param4, Param5))
{
JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
ptrCall = CL_JSObject::Call_v5<Param1, Param2, Param3, Param4, Param5>::call;
JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 5, 0);
functionMap[jsFunc] = (MemberFuncCall) func;
}
void defineProperty(
JSContext *cx,
const char *name,
const CL_JSValue &value,
int flags = 0)
{
JSBool result = JS_DefineProperty(cx, jsObject, name, value, 0, 0, flags);
}
template<class Class>
void defineProperty(
JSContext *cx,
const char *name,
CL_JSValue(Class::*getter)(CL_JSContext *cx),
void(Class::*setter)(const CL_JSValue &value),
int flags = 0)
{
int tinyid = getters.size();
getters.push_back((MemberFuncPropertyGetter) getter);
setters.push_back((MemberFuncPropertySetter) setter);
JS_DefinePropertyWithTinyId(
cx, jsObject, name, tinyid, JSVAL_NULL, CL_JSObject::getter, CL_JSObject::setter, flags);
}
template<class Class, class GetType, class SetType>
void defineProperty_1(
JSContext *cx,
const char *name,
GetType(Class::*getter)(),
void(Class::*setter)(SetType),
int flags = 0)
{
int tinyid = getters.size();
getters.push_back((MemberFuncPropertyGetter) getter);
setters.push_back((MemberFuncPropertySetter) setter);
JS_DefinePropertyWithTinyId(
cx, jsObject, name, tinyid, JSVAL_NULL,
Property_1<GetType, SetType>::getter,
Property_1<GetType, SetType>::setter,
flags);
}
template<class VarType>
void defineProperty_ptr(
JSContext *cx,
const char *name,
VarType *varPtr,
int flags = 0)
{
int tinyid = vars.size();
vars.push_back(varPtr);
JS_DefinePropertyWithTinyId(
cx, jsObject, name, tinyid, JSVAL_NULL,
Property_ptr<VarType>::getter,
Property_ptr<VarType>::setter,
flags);
}
template<class VarType>
void defineProperty_obj(
JSContext *cx,
const char *name,
VarType *varPtr,
int flags = 0)
{
int tinyid = vars.size();
vars.push_back(varPtr);
JS_DefinePropertyWithTinyId(
cx, jsObject, name, tinyid, JSVAL_NULL,
Property_obj<VarType>::getter,
Property_obj<VarType>::setter,
flags);
}
template<class VarType>
void defineProperty_objPtr(
JSContext *cx,
const char *name,
VarType *varPtr,
int flags = 0)
{
int tinyid = vars.size();
vars.push_back(varPtr);
JS_DefinePropertyWithTinyId(
cx, jsObject, name, tinyid, JSVAL_NULL,
Property_objPtr<VarType>::getter,
Property_objPtr<VarType>::setter,
flags);
}
bool call_v0(JScriptContext *cx, const char *funcName)
{
jsval rval;
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 0, 0, &rval);
return result == JS_TRUE;
}
template <class ReturnType>
bool call_0(JScriptContext *cx, const char *funcName, ReturnType &retValue)
{
jsval rval;
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 0, 0, &rval);
if (result != JS_TRUE) return false;
retValue = JScriptValue(cx, rval);
return true;
}
template <class Param1>
bool call_v1(JScriptContext *cx, const char *funcName, Param1 param1)
{
jsval params[1];
params[0] = JScriptValue(cx, param1).getJsval();
jsval rval;
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 1, params, &rval);
return result == JS_TRUE;
}
template <class Param1, class ReturnType>
bool call_1(JScriptContext *cx, const char *funcName, Param1 param1, ReturnType &retValue)
{
jsval params[1];
params[0] = JScriptValue(cx, param1).getJsval();
jsval rval;
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 1, params, &rval);
if (result != JS_TRUE) return false;
retValue = JScriptValue(cx, rval);
return true;
}
template <class Param1, class Param2>
bool call_v2(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2)
{
jsval params[2];
params[0] = JScriptValue(cx, param1).getJsval();
params[1] = JScriptValue(cx, param2).getJsval();
jsval rval;
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 2, params, &rval);
return result == JS_TRUE;
}
template <class Param1, class Param2, class ReturnType>
bool call_2(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, ReturnType &retValue)
{
jsval params[2];
params[0] = JScriptValue(cx, param1).getJsval();
params[1] = JScriptValue(cx, param2).getJsval();
jsval rval;
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 2, params, &rval);
if (result != JS_TRUE) return false;
retValue = JScriptValue(cx, rval);
return true;
}
template <class Param1, class Param2, class Param3>
bool call_v3(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3)
{
jsval params[3];
params[0] = JScriptValue(cx, param1).getJsval();
params[1] = JScriptValue(cx, param2).getJsval();
params[2] = JScriptValue(cx, param3).getJsval();
jsval rval;
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 3, params, &rval);
return result == JS_TRUE;
}
template <class Param1, class Param2, class Param3, class ReturnType>
bool call_3(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3, ReturnType &retValue)
{
jsval params[3];
params[0] = JScriptValue(cx, param1).getJsval();
params[1] = JScriptValue(cx, param2).getJsval();
params[2] = JScriptValue(cx, param3).getJsval();
jsval rval;
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 3, params, &rval);
if (result != JS_TRUE) return false;
retValue = JScriptValue(cx, rval);
return true;
}
template <class Param1, class Param2, class Param3, class Param4>
bool call_v4(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3, Param4 param4)
{
jsval params[4];
params[0] = JScriptValue(cx, param1).getJsval();
params[1] = JScriptValue(cx, param2).getJsval();
params[2] = JScriptValue(cx, param3).getJsval();
params[3] = JScriptValue(cx, param4).getJsval();
jsval rval;
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 4, params, &rval);
return result == JS_TRUE;
}
template <class Param1, class Param2, class Param3, class Param4, class ReturnType>
bool call_4(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3, Param4 param4, ReturnType &retValue)
{
jsval params[4];
params[0] = JScriptValue(cx, param1).getJsval();
params[1] = JScriptValue(cx, param2).getJsval();
params[2] = JScriptValue(cx, param3).getJsval();
params[3] = JScriptValue(cx, param4).getJsval();
jsval rval;
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 4, params, &rval);
if (result != JS_TRUE) return false;
retValue = JScriptValue(cx, rval);
return true;
}
template <class Param1, class Param2, class Param3, class Param4, class Param5>
bool call_v5(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5)
{
jsval params[5];
params[0] = JScriptValue(cx, param1).getJsval();
params[1] = JScriptValue(cx, param2).getJsval();
params[2] = JScriptValue(cx, param3).getJsval();
params[3] = JScriptValue(cx, param4).getJsval();
params[4] = JScriptValue(cx, param5).getJsval();
jsval rval;
JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 5, params, &rval);
return result == JS_TRUE;
}
template <class Param1, class Param2, class Param3, class Param4, class Param5, class ReturnType>
bool call_5(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, ReturnType &retValue)
{
jsval params[5];
params[0] = JScriptValue(cx, param1).getJsval();
params[1] = JScriptValue(cx, param2).getJsval();
params[2] = JScriptValue(cx, param3).getJsval();
params[3] = JScriptValue(cx, param4).getJsval();
params[4] = JScriptValue(cx, param5).getJsval();
jsval rval;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -