From: Jay Freeman (saurik) Date: Mon, 11 Jan 2016 19:33:05 +0000 (-0800) Subject: Bridge any toPointer to id as a cast (for Cydget). X-Git-Tag: v0.9.590~1 X-Git-Url: https://git.saurik.com/cycript.git/commitdiff_plain/efce3bc9fef18190cea1aff33d8ab3f1fa6e8381 Bridge any toPointer to id as a cast (for Cydget). --- diff --git a/Execute.cpp b/Execute.cpp index b2397d8..5669730 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -671,6 +671,24 @@ bool CYGetOffset(CYPool &pool, JSContextRef context, JSStringRef value, ssize_t return CYGetOffset(CYPoolCString(pool, context, value), index); } +// XXX: this is a horrible back added for CFType +void *CYCastPointerEx_(JSContextRef context, JSObjectRef value) { + JSObjectRef object((JSObjectRef) value); + if (JSValueIsObjectOfClass(context, value, CYPrivate::Class_)) { + Pointer *internal(reinterpret_cast(JSObjectGetPrivate(object))); + return internal->value_; + } + + JSValueRef toPointer(CYGetProperty(context, object, toPointer_s)); + if (CYIsCallable(context, toPointer)) { + JSValueRef value(CYCallAsFunction(context, (JSObjectRef) toPointer, object, 0, NULL)); + _assert(value != NULL); + return CYCastPointer_(context, value); + } + + return NULL; +} + void *CYCastPointer_(JSContextRef context, JSValueRef value, bool *guess) { if (value == NULL) return NULL; diff --git a/JavaScript.hpp b/JavaScript.hpp index fcefd7b..64dcbac 100644 --- a/JavaScript.hpp +++ b/JavaScript.hpp @@ -115,6 +115,13 @@ JSObjectRef CYCastJSObject(JSContextRef context, JSValueRef value); JSValueRef CYJSUndefined(JSContextRef context); JSValueRef CYJSNull(JSContextRef context); +void *CYCastPointerEx_(JSContextRef context, JSObjectRef value); + +template +_finline Type_ CYCastPointerEx(JSContextRef context, JSObjectRef value) { + return reinterpret_cast(CYCastPointerEx_(context, value)); +} + void *CYCastPointer_(JSContextRef context, JSValueRef value, bool *guess = NULL); template diff --git a/ObjectiveC/Library.mm b/ObjectiveC/Library.mm index eed19e3..d0d824f 100644 --- a/ObjectiveC/Library.mm +++ b/ObjectiveC/Library.mm @@ -642,6 +642,9 @@ NSObject *CYCastNSObject(CYPool *pool, JSContextRef context, JSObjectRef object) return internal->value_; } + if (NSObject *pointer = CYCastPointerEx(context, object)) + return pointer; + bool array(CYJSValueIsInstanceOfCachedConstructor(context, object, Array_s)); id value(array ? [CYJSArray alloc] : [CYJSObject alloc]); return CYPoolRelease(pool, [value initWithJSObject:object inContext:context]);