From 2b1c9594666c525586f1956c064d60ea2e7a0a3b Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Sun, 20 Dec 2015 01:52:22 -0800 Subject: [PATCH] Implement toPointer for CString, Pointer, Functor. --- Execute.cpp | 71 +++++++++++++++++++++++++++++++++++++++----------- JavaScript.hpp | 6 ++--- 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/Execute.cpp b/Execute.cpp index 1f40626..340a7fa 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -605,7 +605,7 @@ static bool CYGetOffset(CYPool &pool, JSContextRef context, JSStringRef value, s return CYGetOffset(CYPoolCString(pool, context, value), index); } -void *CYCastPointer_(JSContextRef context, JSValueRef value) { +void *CYCastPointer_(JSContextRef context, JSValueRef value, bool *guess) { if (value == NULL) return NULL; else switch (JSValueGetType(context, value)) { @@ -613,10 +613,6 @@ void *CYCastPointer_(JSContextRef context, JSValueRef value) { return NULL; case kJSTypeObject: { JSObjectRef object((JSObjectRef) value); - if (JSValueIsObjectOfClass(context, value, CString_)) { - CString *internal(reinterpret_cast(JSObjectGetPrivate(object))); - return internal->value_; - } if (JSValueIsObjectOfClass(context, value, Pointer_)) { Pointer *internal(reinterpret_cast(JSObjectGetPrivate(object))); return internal->value_; @@ -625,13 +621,21 @@ void *CYCastPointer_(JSContextRef context, JSValueRef value) { if (CYIsCallable(context, toPointer)) { JSValueRef value(CYCallAsFunction(context, (JSObjectRef) toPointer, object, 0, NULL)); _assert(value != NULL); - return CYCastPointer_(context, value); + return CYCastPointer_(context, value, guess); } } default: + if (guess != NULL) + *guess = true; + case kJSTypeNumber: double number(CYCastDouble(context, value)); - if (std::isnan(number)) + if (!std::isnan(number)) + return reinterpret_cast(static_cast(static_cast(number))); + if (guess == NULL) throw CYJSError(context, "cannot convert value to pointer"); - return reinterpret_cast(static_cast(static_cast(number))); + else { + *guess = true; + return NULL; + } } } @@ -684,10 +688,12 @@ void CYPoolFFI(CYPool *pool, JSContextRef context, sig::Type *type, ffi_type *ff *reinterpret_cast(data) = CYCastPointer(context, value); break; - case sig::string_P: - _assert(pool != NULL); - *reinterpret_cast(data) = CYPoolCString(*pool, context, value); - break; + case sig::string_P: { + bool guess(false); + *reinterpret_cast(data) = CYCastPointer(context, value, &guess); + if (guess && pool != NULL) + *reinterpret_cast(data) = CYPoolCString(*pool, context, value); + } break; case sig::struct_P: { uint8_t *base(reinterpret_cast(data)); @@ -1490,6 +1496,38 @@ static JSObjectRef Functor_new(JSContextRef context, JSObjectRef object, size_t return CYMakeFunctor(context, arguments[0], signature); } CYCatch(NULL) } +static JSValueRef CString_callAsFunction_toPointer(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { + CString *internal(reinterpret_cast(JSObjectGetPrivate(_this))); + + sig::Type type; + type.name = NULL; + type.flags = 0; + + type.primitive = sig::char_P; + type.data.data.type = NULL; + type.data.data.size = 0; + + return CYMakePointer(context, internal->value_, _not(size_t), &type, NULL, NULL); +} CYCatch(NULL) } + +static JSValueRef Functor_callAsFunction_toPointer(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { + CYPool pool; + cy::Functor *internal(reinterpret_cast(JSObjectGetPrivate(_this))); + + sig::Type type; + type.name = NULL; + type.flags = 0; + + type.primitive = sig::function_P; + sig::Copy(pool, type.data.signature, internal->signature_); + + return CYMakePointer(context, internal->value_, _not(size_t), &type, NULL, NULL); +} CYCatch(NULL) } + +static JSValueRef Pointer_callAsFunction_toPointer(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { + return _this; +} CYCatch(NULL) } + static JSValueRef CYValue_callAsFunction_valueOf(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { CYValue *internal(reinterpret_cast(JSObjectGetPrivate(_this))); return CYCastJSValue(context, reinterpret_cast(internal->value_)); @@ -1624,9 +1662,10 @@ static JSValueRef Type_callAsFunction_toJSON(JSContextRef context, JSObjectRef o return Type_callAsFunction_toString(context, object, _this, count, arguments, exception); } -static JSStaticFunction CString_staticFunctions[5] = { +static JSStaticFunction CString_staticFunctions[6] = { {"toCYON", &CString_callAsFunction_toCYON, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, {"toJSON", &CYValue_callAsFunction_toJSON, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, + {"toPointer", &CString_callAsFunction_toPointer, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, {"toString", &CString_callAsFunction_toString, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, {"valueOf", &CString_callAsFunction_toString, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, {NULL, NULL, 0} @@ -1638,9 +1677,10 @@ static JSStaticValue CString_staticValues[3] = { {NULL, NULL, NULL, 0} }; -static JSStaticFunction Pointer_staticFunctions[4] = { +static JSStaticFunction Pointer_staticFunctions[5] = { {"toCYON", &Pointer_callAsFunction_toCYON, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, {"toJSON", &CYValue_callAsFunction_toJSON, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, + {"toPointer", &Pointer_callAsFunction_toPointer, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, {"valueOf", &CYValue_callAsFunction_valueOf, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, {NULL, NULL, 0} }; @@ -1655,9 +1695,10 @@ static JSStaticFunction Struct_staticFunctions[2] = { {NULL, NULL, 0} }; -static JSStaticFunction Functor_staticFunctions[4] = { +static JSStaticFunction Functor_staticFunctions[5] = { {"toCYON", &CYValue_callAsFunction_toCYON, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, {"toJSON", &CYValue_callAsFunction_toJSON, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, + {"toPointer", &Functor_callAsFunction_toPointer, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, {"valueOf", &CYValue_callAsFunction_valueOf, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, {NULL, NULL, 0} }; diff --git a/JavaScript.hpp b/JavaScript.hpp index 87689b5..ebc2bac 100644 --- a/JavaScript.hpp +++ b/JavaScript.hpp @@ -103,11 +103,11 @@ JSObjectRef CYCastJSObject(JSContextRef context, JSValueRef value); JSValueRef CYJSUndefined(JSContextRef context); JSValueRef CYJSNull(JSContextRef context); -void *CYCastPointer_(JSContextRef context, JSValueRef value); +void *CYCastPointer_(JSContextRef context, JSValueRef value, bool *guess = NULL); template -_finline Type_ CYCastPointer(JSContextRef context, JSValueRef value) { - return reinterpret_cast(CYCastPointer_(context, value)); +_finline Type_ CYCastPointer(JSContextRef context, JSValueRef value, bool *guess = NULL) { + return reinterpret_cast(CYCastPointer_(context, value, guess)); } void CYPoolFFI(CYPool *pool, JSContextRef context, sig::Type *type, ffi_type *ffi, void *data, JSValueRef value); -- 2.49.0