31 #define PASS_BY_VALUE_IN_NATIVE_WRAPPER(T) \ 32 template <> struct ScriptInterface::MaybeRef<T> \ 47 #undef PASS_BY_VALUE_IN_NATIVE_WRAPPER 58 #undef NUMBERED_LIST_TAIL_MAYBE_REF 59 #undef NUMBERED_LIST_BALANCED_MAYBE_REF 60 #define NUMBERED_LIST_TAIL_MAYBE_REF(z, i, data) , typename ScriptInterface::MaybeRef<data##i>::Type 61 #define NUMBERED_LIST_BALANCED_MAYBE_REF(z, i, data) BOOST_PP_COMMA_IF(i) typename ScriptInterface::MaybeRef<data##i>::Type 72 template<
typename F,
typename... Ts>
73 static void call(JSContext* cx, JS::MutableHandleValue rval,
F fptr, Ts... params)
83 template<
typename F,
typename... Ts>
84 static void call(JSContext* cx, JS::MutableHandleValue
UNUSED(rval), F fptr, Ts... params)
92 template <
typename R,
typename TC>
95 template<
typename F,
typename... Ts>
96 static void call(JSContext* cx, JS::MutableHandleValue rval, TC* c, F fptr, Ts... params)
98 ScriptInterface::AssignOrToJSValUnrooted<R>(cx, rval, (c->*fptr)(params...));
102 template <
typename TC>
105 template<
typename F,
typename... Ts>
106 static void call(JSContext*
UNUSED(cx), JS::MutableHandleValue
UNUSED(rval), TC* c, F fptr, Ts... params)
108 (c->*fptr)(params...);
113 #define OVERLOADS(z, i, data) \ 114 template <typename R, TYPENAME_T0_HEAD(z,i) R (*fptr) ( ScriptInterface::CxPrivate* T0_TAIL_MAYBE_REF(z,i) )> \ 115 bool ScriptInterface::call(JSContext* cx, uint argc, jsval* vp) \ 117 JS::CallArgs args = JS::CallArgsFromVp(argc, vp); \ 118 JSAutoRequest rq(cx); \ 119 BOOST_PP_REPEAT_##z (i, CONVERT_ARG, ~) \ 120 JS::RootedValue rval(cx); \ 121 ScriptInterface_NativeWrapper<R>::template call<R( ScriptInterface::CxPrivate* T0_TAIL_MAYBE_REF(z,i)) T0_TAIL(z,i)>(cx, &rval, fptr A0_TAIL(z,i)); \ 122 args.rval().set(rval); \ 123 return !ScriptInterface::IsExceptionPending(cx); \ 129 #define OVERLOADS(z, i, data) \ 130 template <typename R, TYPENAME_T0_HEAD(z,i) JSClass* CLS, typename TC, R (TC::*fptr) ( T0_MAYBE_REF(z,i) )> \ 131 bool ScriptInterface::callMethod(JSContext* cx, uint argc, jsval* vp) \ 133 JS::CallArgs args = JS::CallArgsFromVp(argc, vp); \ 134 JSAutoRequest rq(cx); \ 135 JS::RootedObject thisObj(cx, JS_THIS_OBJECT(cx, vp)); \ 136 if (ScriptInterface::GetClass(thisObj) != CLS) return false; \ 137 TC* c = static_cast<TC*>(ScriptInterface::GetPrivate(thisObj)); \ 138 if (! c) return false; \ 139 BOOST_PP_REPEAT_##z (i, CONVERT_ARG, ~) \ 140 JS::RootedValue rval(cx); \ 141 ScriptInterface_NativeMethodWrapper<R, TC>::template call<R (TC::*)(T0_MAYBE_REF(z,i)) T0_TAIL(z,i)>(cx, &rval, c, fptr A0_TAIL(z,i)); \ 142 args.rval().set(rval); \ 143 return !ScriptInterface::IsExceptionPending(cx); \ 149 #define OVERLOADS(z, i, data) \ 150 template <typename R, TYPENAME_T0_HEAD(z,i) JSClass* CLS, typename TC, R (TC::*fptr) ( T0_MAYBE_REF(z,i) ) const> \ 151 bool ScriptInterface::callMethodConst(JSContext* cx, uint argc, jsval* vp) \ 153 JS::CallArgs args = JS::CallArgsFromVp(argc, vp); \ 154 JSAutoRequest rq(cx); \ 155 JS::RootedObject thisObj(cx, JS_THIS_OBJECT(cx, vp)); \ 156 if (ScriptInterface::GetClass(thisObj) != CLS) return false; \ 157 TC* c = static_cast<TC*>(ScriptInterface::GetPrivate(thisObj)); \ 158 if (! c) return false; \ 159 BOOST_PP_REPEAT_##z (i, CONVERT_ARG, ~) \ 160 JS::RootedValue rval(cx); \ 161 ScriptInterface_NativeMethodWrapper<R, TC>::template call<R (TC::*)(T0_MAYBE_REF(z,i)) const T0_TAIL(z,i)>(cx, &rval, c, fptr A0_TAIL(z,i)); \ 162 args.rval().set(rval); \ 163 return !ScriptInterface::IsExceptionPending(cx); \ 168 template<
int i,
typename T,
typename... Ts>
172 AssignOrToJSValHelper<i+1>(cx, argv, params...);
175 template<
int i,
typename... Ts>
182 template<
typename R,
typename... Ts>
186 JSAutoRequest rq(cx);
187 JS::RootedValue jsRet(cx);
188 JS::AutoValueVector argv(cx);
189 argv.resize(
sizeof...(Ts));
190 AssignOrToJSValHelper<0>(cx, argv, params...);
197 template<
typename R,
typename... Ts>
201 JSAutoRequest rq(cx);
202 JS::MutableHandle<R> jsRet(ret);
203 JS::AutoValueVector argv(cx);
204 argv.resize(
sizeof...(Ts));
205 AssignOrToJSValHelper<0>(cx, argv, params...);
209 template<
typename R,
typename... Ts>
213 JSAutoRequest rq(cx);
214 JS::AutoValueVector argv(cx);
215 argv.resize(
sizeof...(Ts));
216 AssignOrToJSValHelper<0>(cx, argv, params...);
221 template<
typename... Ts>
225 JSAutoRequest rq(cx);
226 JS::RootedValue jsRet(cx);
227 JS::AutoValueVector argv(cx);
228 argv.resize(
sizeof...(Ts));
229 AssignOrToJSValHelper<0>(cx, argv, params...);
234 #undef NUMBERED_LIST_HEAD 235 #undef NUMBERED_LIST_TAIL 236 #undef NUMBERED_LIST_TAIL_MAYBE_REF 237 #undef NUMBERED_LIST_BALANCED 238 #undef NUMBERED_LIST_BALANCED_MAYBE_REF 240 #undef TYPENAME_T0_HEAD 244 #undef T0_TAIL_MAYBE_REF static void call(JSContext *cx, JS::MutableHandleValue rval, TC *c, F fptr, Ts...params)
Definition: NativeWrapperDefns.h:96
A simple fixed-point number class.
Definition: Fixed.h:115
static const u8 F
Definition: cache.cpp:370
#define UNUSED(param)
mark a function parameter as unused and avoid the corresponding compiler warning. ...
Definition: code_annotation.h:38
const T & Type
Definition: NativeWrapperDefns.h:28
bool CallFunction(JS::HandleValue val, const char *name, R &ret, const Ts &...params) const
Definition: NativeWrapperDefns.h:183
#define SCRIPT_INTERFACE_MAX_ARGS
Definition: ScriptInterface.h:50
Definition: NativeWrapperDefns.h:93
Definition: NativeWrapperDefns.h:26
static void AssignOrToJSVal(JSContext *cx, JS::MutableHandleValue handle, const T &a)
Converts |a| if needed and assigns it to |handle|.
Definition: ScriptInterface.h:443
bool CallFunctionVoid(JS::HandleValue val, const char *name, const Ts &...params) const
Definition: NativeWrapperDefns.h:222
bool CallFunction_(JS::HandleValue val, const char *name, JS::HandleValueArray argv, JS::MutableHandleValue ret) const
Definition: ScriptInterface.cpp:565
unsigned char uint8_t
Definition: wposix_types.h:51
static CxPrivate * GetScriptInterfaceAndCBData(JSContext *cx)
Definition: ScriptInterface.cpp:431
static void call(JSContext *cx, JS::MutableHandleValue rval, F fptr, Ts...params)
Definition: NativeWrapperDefns.h:84
Definition: NativeWrapperDefns.h:70
#define T(string_literal)
Definition: secure_crt.cpp:76
static void call(JSContext *cx, JS::MutableHandleValue rval, F fptr, Ts...params)
Definition: NativeWrapperDefns.h:73
unsigned int uint32_t
Definition: wposix_types.h:53
static void AssignOrToJSValHelper(JSContext *cx, JS::AutoValueVector &argv, const T &a, const Ts &...params)
Definition: NativeWrapperDefns.h:169
#define PASS_BY_VALUE_IN_NATIVE_WRAPPER(T)
Definition: NativeWrapperDefns.h:31
static bool FromJSVal(JSContext *cx, const JS::HandleValue val, T &ret)
Convert a jsval to a C++ type.
unsigned short uint16_t
Definition: wposix_types.h:52
#define cassert(expr)
Compile-time assertion.
Definition: code_annotation.h:197
static void call(JSContext *cx, JS::MutableHandleValue rval, TC *c, F fptr, Ts...params)
Definition: NativeWrapperDefns.h:106
#define OVERLOADS(z, i, data)
Definition: NativeWrapperDefns.h:149
JSContext * GetContext() const
Definition: ScriptInterface.cpp:497