15 #ifndef SHAKA_EMBEDDED_MAPPING_JS_WRAPPERS_H_ 16 #define SHAKA_EMBEDDED_MAPPING_JS_WRAPPERS_H_ 18 #include <glog/logging.h> 31 #elif defined(USING_JSC) 32 # include <JavaScriptCore/JavaScriptCore.h> 45 struct RefTypeTraits<JSStringRef> {
46 static constexpr
const bool AcquireWithRaw =
false;
48 static JSStringRef Duplicate(JSStringRef arg) {
54 static void Release(JSStringRef arg) {
60 struct RefTypeTraits<JSValueRef> {
61 static constexpr
const bool AcquireWithRaw =
true;
63 static JSValueRef Duplicate(JSValueRef arg) {
69 static void Release(JSValueRef arg) {
75 struct RefTypeTraits<JSObjectRef> : RefTypeTraits<JSValueRef> {
76 static JSObjectRef Duplicate(JSObjectRef arg) {
101 #if defined(USING_V8) 102 template <
typename T>
103 using Handle = v8::Local<T>;
104 template <
typename T>
105 using LocalVar = v8::Local<T>;
106 template <
typename T>
107 using ReturnVal = v8::Local<T>;
108 template <
typename T>
111 template <
typename U = T>
112 explicit Global(v8::Local<U> val) : val_(
GetIsolate(), val) {}
114 template <
typename U = T>
115 operator v8::Local<U>()
const {
118 operator bool()
const {
119 return !val_.IsEmpty();
122 template <
typename U = T>
123 Global& operator=(v8::Local<U> other) {
127 Global& operator=(std::nullptr_t) {
132 template <
typename U = T>
134 return val_ == other;
141 using JsValue = v8::Value;
142 using JsObject = v8::Object;
146 using JsMap = v8::Map;
153 using CallbackArguments = v8::FunctionCallbackInfo<v8::Value>;
154 #elif defined(USING_JSC) 155 template <
typename T>
156 using Handle = util::CFRef<T>;
157 template <
typename T>
158 using LocalVar = Handle<T>;
159 template <
typename T>
160 using ReturnVal = Handle<T>;
161 template <
typename T>
162 using Global = Handle<T>;
164 using JsValue = JSValueRef;
165 using JsObject = JSObjectRef;
166 using JsString = JSStringRef;
167 using JsFunction = JSObjectRef;
168 using JsPromise = JSObjectRef;
169 using JsMap = JSObjectRef;
171 class CallbackArguments {
173 CallbackArguments(
const JSValueRef* args,
size_t count, JSObjectRef callee,
174 JSObjectRef thisv, JSValueRef* except);
175 ~CallbackArguments();
177 size_t length()
const {
180 JSObjectRef callee()
const {
183 JSObjectRef thisv()
const {
186 ReturnVal<JSValueRef> ret()
const {
190 ReturnVal<JsValue> operator[](
size_t i)
const;
192 void SetReturn(Handle<JsValue> ret)
const;
193 void SetException(Handle<JsValue> except)
const;
198 mutable JSValueRef* except_;
199 mutable Handle<JsValue> ret_;
200 const JSObjectRef callee_;
201 const JSObjectRef this_;
202 const JSValueRef* args_;
210 #if defined(USING_V8) 211 return arguments.Length();
212 #elif defined(USING_JSC) 213 return arguments.length();
227 ReturnVal<JsValue>
GetMemberRaw(Handle<JsObject>
object,
228 const std::string&
name,
229 LocalVar<JsValue>* exception =
nullptr);
233 LocalVar<JsValue>* exception =
nullptr);
236 void SetMemberRaw(Handle<JsObject>
object,
const std::string& name,
237 Handle<JsValue> value);
240 void SetArrayIndexRaw(Handle<JsObject>
object,
size_t i, Handle<JsValue> value);
244 Handle<JsFunction> getter,
245 Handle<JsFunction> setter);
260 LocalVar<JsValue>* argv,
261 LocalVar<JsValue>* result_or_except);
275 bool InvokeMethod(Handle<JsFunction> method, Handle<JsObject> that,
int argc,
276 LocalVar<JsValue>* argv, LocalVar<JsValue>* result_or_except);
319 bool RunScript(
const std::string& path,
const uint8_t* data,
size_t data_size);
338 ReturnVal<JsValue>
JsNull();
353 void SetMapValue(Handle<JsMap> map, Handle<JsValue> key, Handle<JsValue> value);
362 bool IsObject(Handle<JsValue> value);
381 template <
typename Dest>
384 return source.As<Dest>();
386 static_assert(std::is_same<Dest, JsValue>::value,
387 "Should use other specializations");
394 inline ReturnVal<JsObject> UnsafeJsCast<JsObject>(Handle<JsValue>
source) {
404 template <
typename T>
409 #if defined(USING_JSC) 411 inline ReturnVal<JsValue> RawToJsValue<JsString>(Handle<JsString>
source) {
419 #if defined(USING_V8) 422 #elif defined(USING_JSC) 424 LocalVar<JsValue> length(
GetMemberRaw(value,
"length"));
425 CHECK(length && JSValueIsNumber(ctx, length));
426 return static_cast<size_t>(JSValueToNumber(ctx, length,
nullptr));
444 #endif // SHAKA_EMBEDDED_MAPPING_JS_WRAPPERS_H_ void SetArrayIndexRaw(Handle< JsObject > object, size_t i, Handle< JsValue > value)
ReturnVal< JsValue > ParseJsonString(const std::string &json)
ReturnVal< JsObject > CreateObject()
ReturnVal< JsValue > JsUndefined()
bool IsObject(Handle< JsValue > value)
bool IsNullOrUndefined(Handle< JsValue > value)
std::vector< std::string > GetMemberNames(Handle< JsObject > object)
ReturnVal< JsValue > JsNull()
ReturnVal< JsValue > GetArrayIndexRaw(Handle< JsObject > object, size_t index, LocalVar< JsValue > *exception=nullptr)
size_t ArgumentCount(const CallbackArguments &arguments)
bool InvokeMethod(Handle< JsFunction > method, Handle< JsObject > that, int argc, LocalVar< JsValue > *argv, LocalVar< JsValue > *result_or_except)
bool operator==(const optional< A > &lhs, const optional< B > &rhs)
BackingObject * GetInternalPointer(Handle< JsValue > value)
ReturnVal< Dest > UnsafeJsCast(Handle< JsValue > source)
bool BooleanFromValue(Handle< JsValue > value)
bool IsDerivedFrom(BackingObject *ptr, const std::string &name)
ReturnVal< JsObject > CreateArray(size_t length)
ReturnVal< JsValue > RawToJsValue(Handle< T > source)
bool RunScript(const std::string &path)
proto::ValueType GetValueType(Handle< JsValue > value)
double NumberFromValue(Handle< JsValue > value)
ReturnVal< JsMap > CreateMap()
void SetMemberRaw(Handle< JsObject > object, const std::string &name, Handle< JsValue > value)
void SetMapValue(Handle< JsMap > map, Handle< JsValue > key, Handle< JsValue > value)
std::string ConvertToString(Handle< JsValue > value)
JSContextRef GetContext()
ReturnVal< JsValue > WrapPointer(void *ptr)
size_t ArrayLength(Handle< JsObject > value)
ReturnVal< JsString > JsStringFromUtf8(const std::string &str)
bool InvokeConstructor(Handle< JsFunction > ctor, int argc, LocalVar< JsValue > *argv, LocalVar< JsValue > *result_or_except)
v8::Isolate * GetIsolate()
ReturnVal< JsValue > GetMemberRaw(Handle< JsObject > object, const std::string &name, LocalVar< JsValue > *exception=nullptr)
void * MaybeUnwrapPointer(Handle< JsValue > value)
bool IsBuiltInObject(Handle< JsObject > object)
void SetGenericPropertyRaw(Handle< JsObject > object, const std::string &name, Handle< JsFunction > getter, Handle< JsFunction > setter)