]> git.saurik.com Git - cycript.git/commitdiff
Bridge any toPointer to id as a cast (for Cydget).
authorJay Freeman (saurik) <saurik@saurik.com>
Mon, 11 Jan 2016 19:33:05 +0000 (11:33 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Mon, 11 Jan 2016 19:33:05 +0000 (11:33 -0800)
Execute.cpp
JavaScript.hpp
ObjectiveC/Library.mm

index b2397d8e6561c9be36e01bb85cfd16178e6f2fed..5669730ddb35c6ae2751a9cd3da3c8d765b2b923 100644 (file)
@@ -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<Pointer>::Class_)) {
+        Pointer *internal(reinterpret_cast<Pointer *>(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;
index fcefd7bcf78b75048e739ff24cd9bb28ea4c8f69..64dcbace747a36b799f855f58fa30b95a481d987 100644 (file)
@@ -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 <typename Type_>
+_finline Type_ CYCastPointerEx(JSContextRef context, JSObjectRef value) {
+    return reinterpret_cast<Type_>(CYCastPointerEx_(context, value));
+}
+
 void *CYCastPointer_(JSContextRef context, JSValueRef value, bool *guess = NULL);
 
 template <typename Type_>
index eed19e388247cff44f020bc193686be86ff95224..d0d824f7c6d7f3d810a90db58998893bb9f3b00b 100644 (file)
@@ -642,6 +642,9 @@ NSObject *CYCastNSObject(CYPool *pool, JSContextRef context, JSObjectRef object)
         return internal->value_;
     }
 
+    if (NSObject *pointer = CYCastPointerEx<NSObject *>(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]);