]> git.saurik.com Git - cycript.git/commitdiff
GNUstep does not export object_getClass *sigh* :(.
authorJay Freeman (saurik) <saurik@saurik.com>
Mon, 9 Nov 2015 09:41:39 +0000 (09:41 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Mon, 9 Nov 2015 09:41:39 +0000 (09:41 +0000)
Execute.cpp
JavaScript.hpp
ObjectiveC/Library.mm

index 1c7b833ab560cc69e37c08b9a665ef2a7edc00d3..deaeedaa5322b0f1fad752ab14e2b0e204230b14 100644 (file)
@@ -261,6 +261,10 @@ JSObjectRef CYMakeStruct(JSContextRef context, void *data, sig::Type *type, ffi_
 }
 
 static void *CYCastSymbol(const char *name) {
+    for (CYHook *hook : GetHooks())
+        if (hook->CastSymbol != NULL)
+            if (void *value = (*hook->CastSymbol)(name))
+                return value;
     return dlsym(RTLD_DEFAULT, name);
 }
 
index e4af17bf8074ad09f2a2acfe7cb9bdf81a0e8935..0a3c431e0ddb31000ae1628a289e6ad2189ec1cc 100644 (file)
@@ -131,6 +131,8 @@ struct CYHook {
 
     bool (*PoolFFI)(CYPool *, JSContextRef, sig::Type *, ffi_type *, void *, JSValueRef);
     JSValueRef (*FromFFI)(JSContextRef, sig::Type *, ffi_type *, void *, bool, JSObjectRef);
+
+    void *(*CastSymbol)(const char *);
 };
 
 struct CYRegisterHook {
index bd2946a9c052381817660462d89c5111c772e64a..e012757499ee43565219928c2509f96f8f5e2fb0 100644 (file)
@@ -2336,11 +2336,14 @@ JSValueRef CYSendMessage(CYPool &pool, JSContextRef context, id self, Class _cla
         imp = NULL;
 
         CYPoolTry {
-            NSMethodSignature *method([self methodSignatureForSelector:_cmd]);
-            if (method == nil)
-                throw CYJSError(context, "unrecognized selector %s sent to object %p", sel_getName(_cmd), self);
-            type = CYPoolCString(pool, context, [method _typeString]);
+            if (NSMethodSignature *method = [self methodSignatureForSelector:_cmd])
+                type = CYPoolCString(pool, context, [method _typeString]);
+            else
+                type = NULL;
         } CYPoolCatch(NULL)
+
+        if (type == NULL)
+            throw CYJSError(context, "unrecognized selector %s sent to object %p", sel_getName(_cmd), self);
     }
 
     void *setup[2];
@@ -2961,6 +2964,15 @@ void CYObjectiveC_SetupContext(JSContextRef context) { CYPoolTry {
     CYSetPrototype(context, CYCastJSObject(context, CYGetProperty(context, Selector, prototype_s)), Function_prototype);
 } CYPoolCatch() }
 
+static void *CYObjectiveC_CastSymbol(const char *name) {
+    if (false);
+#ifdef __GNU_LIBOBJC__
+    else if (strcmp(name, "object_getClass") == 0)
+        return reinterpret_cast<void *>(&object_getClass);
+#endif
+    return NULL;
+}
+
 static CYHook CYObjectiveCHook = {
     &CYObjectiveC_ExecuteStart,
     &CYObjectiveC_ExecuteEnd,
@@ -2969,6 +2981,7 @@ static CYHook CYObjectiveCHook = {
     &CYObjectiveC_SetupContext,
     &CYObjectiveC_PoolFFI,
     &CYObjectiveC_FromFFI,
+    &CYObjectiveC_CastSymbol,
 };
 
 CYRegisterHook CYObjectiveC(&CYObjectiveCHook);