]> git.saurik.com Git - cycript.git/commitdiff
Setting to .messages should only affect that Class.
authorJay Freeman (saurik) <saurik@saurik.com>
Thu, 23 Jan 2014 20:41:10 +0000 (12:41 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Thu, 23 Jan 2014 21:16:49 +0000 (13:16 -0800)
ObjectiveC/Library.mm

index 7ac3bb08e7380e7b6e3a2d4aeec217ced7f58c96..00ea5dfcf5f30ef80391395f680aac242e34fb1a 100644 (file)
@@ -1648,11 +1648,8 @@ static bool Messages_setProperty(JSContextRef context, JSObjectRef object, JSStr
 
     CYPool pool;
     const char *name(CYPoolCString(pool, context, property));
-
     SEL sel(sel_registerName(name));
 
-    objc_method *method(class_getInstanceMethod(_class, sel));
-
     const char *type;
     IMP imp;
 
@@ -1661,10 +1658,30 @@ static bool Messages_setProperty(JSContextRef context, JSObjectRef object, JSStr
         type = sig::Unparse(pool, &message->signature_);
         imp = reinterpret_cast<IMP>(message->GetValue());
     } else {
+        objc_method *method(class_getInstanceMethod(_class, sel));
         type = CYPoolTypeEncoding(pool, context, sel, method);
         imp = CYMakeMessage(context, value, type);
     }
 
+    objc_method *method(NULL);
+#if OBJC_API_VERSION >= 2
+    unsigned int size;
+    objc_method **methods(class_copyMethodList(_class, &size));
+    for (size_t i(0); i != size; ++i)
+        if (sel_isEqual(method_getName(methods[i]), sel)) {
+            method = methods[i];
+            break;
+        }
+    free(methods);
+#else
+    for (objc_method_list *methods(_class->methods); methods != NULL; methods = methods->method_next)
+        for (int i(0); i != methods->method_count; ++i)
+            if (sel_isEqual(method_getName(&methods->method_list[i]), sel)) {
+                method = &methods->method_list[i];
+                break;
+            }
+#endif
+
     if (method != NULL)
         method_setImplementation(method, imp);
     else {