]> git.saurik.com Git - cycript.git/blobdiff - Execute.cpp
Instance's toPointer() should return as CFTypeRef.
[cycript.git] / Execute.cpp
index b8120752299d823abe0f8de5e282cd9cf1164366..18bdce662cd135149d142b17d4a561e6f482f472 100644 (file)
@@ -198,6 +198,7 @@ JSStringRef constructor_s;
 JSStringRef cy_s;
 JSStringRef cyi_s;
 JSStringRef cyt_s;
+JSStringRef cyt__s;
 JSStringRef length_s;
 JSStringRef message_s;
 JSStringRef name_s;
@@ -671,6 +672,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;
@@ -856,31 +875,39 @@ void Function::PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *
     _assert(false);
 }
 
+// XXX: this code is getting worse, not better :/
+
 #define CYFromFFI_(Type_) \
 template <> \
 JSValueRef Primitive<Type_>::FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const { \
     JSValueRef value(CYCastJSValue(context, *reinterpret_cast<Type_ *>(data))); \
     JSObjectRef typed(_jsccall(JSObjectCallAsConstructor, context, CYGetCachedObject(context, CYJSString("Number")), 1, &value)); \
-    CYSetProperty(context, typed, cyt_s, CYMakeType(context, *this), kJSPropertyAttributeDontEnum); \
+    CYSetProperty(context, typed, cyt__s, CYMakeType(context, *this), kJSPropertyAttributeDontEnum); \
     return typed; \
 }
 
+#define CYFromFFI_2(Type_) \
+template <> \
+JSValueRef Primitive<Type_>::FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const { \
+    return CYCastJSValue(context, *reinterpret_cast<Type_ *>(data)); \
+}
+
 CYFromFFI_(wchar_t)
 CYFromFFI_(float)
 CYFromFFI_(double)
 CYFromFFI_(long double)
 
-CYFromFFI_(signed char)
-CYFromFFI_(signed int)
+CYFromFFI_2(signed char)
+CYFromFFI_2(signed int)
 CYFromFFI_(signed long int)
 CYFromFFI_(signed long long int)
-CYFromFFI_(signed short int)
+CYFromFFI_2(signed short int)
 
-CYFromFFI_(unsigned char)
-CYFromFFI_(unsigned int)
+CYFromFFI_2(unsigned char)
+CYFromFFI_2(unsigned int)
 CYFromFFI_(unsigned long int)
 CYFromFFI_(unsigned long long int)
-CYFromFFI_(unsigned short int)
+CYFromFFI_2(unsigned short int)
 
 #ifdef __SIZEOF_INT128__
 CYFromFFI_(signed __int128)
@@ -1255,7 +1282,10 @@ static sig::Type *CYGetType(CYPool &pool, JSContextRef context, JSValueRef value
     if (JSValueIsNull(context, value))
         return &PointerToVoid_;
     JSObjectRef object(CYCastJSObject(context, value));
-    JSObjectRef type(CYCastJSObject(context, CYGetProperty(context, object, cyt_s)));
+    JSValueRef check(CYGetProperty(context, object, cyt_s));
+    if (JSValueIsUndefined(context, check))
+        CYThrow("could not infer type of argument '%s'", CYPoolCString(pool, context, value));
+    JSObjectRef type(CYCastJSObject(context, check));
     _assert(JSValueIsObjectOfClass(context, type, CYPrivate<Type_privateData>::Class_));
     Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(type)));
     return internal->type_;
@@ -1989,9 +2019,10 @@ static JSStaticValue Struct_staticValues[2] = {
     {NULL, NULL, NULL, 0}
 };
 
-static JSStaticFunction Functor_staticFunctions[4] = {
+static JSStaticFunction Functor_staticFunctions[5] = {
     {"$cya", &Functor_callAsFunction_$cya, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
     {"toCYON", &Functor_callAsFunction_toCYON, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
+    {"toPointer", &Functor_callAsFunction_$cya, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
     {"valueOf", &Functor_callAsFunction_valueOf, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
     {NULL, NULL, 0}
 };
@@ -2131,6 +2162,7 @@ void CYInitializeDynamic() {
     JSClassDefinition definition;
 
     definition = kJSClassDefinitionEmpty;
+    definition.attributes = kJSClassAttributeNoAutomaticPrototype;
     definition.className = "All";
     definition.staticFunctions = All_staticFunctions;
     definition.hasProperty = &All_hasProperty;
@@ -2139,6 +2171,7 @@ void CYInitializeDynamic() {
     All_ = JSClassCreate(&definition);
 
     definition = kJSClassDefinitionEmpty;
+    definition.attributes = kJSClassAttributeNoAutomaticPrototype;
     definition.className = "Context";
     definition.finalize = &CYFinalize;
     CYPrivate<Context>::Class_ = JSClassCreate(&definition);
@@ -2213,6 +2246,7 @@ void CYInitializeDynamic() {
     cy_s = JSStringCreateWithUTF8CString("$cy");
     cyi_s = JSStringCreateWithUTF8CString("$cyi");
     cyt_s = JSStringCreateWithUTF8CString("$cyt");
+    cyt__s = JSStringCreateWithUTF8CString("$cyt_");
     length_s = JSStringCreateWithUTF8CString("length");
     message_s = JSStringCreateWithUTF8CString("message");
     name_s = JSStringCreateWithUTF8CString("name");