]> git.saurik.com Git - cycript.git/blobdiff - Library.mm
Fixed some type errors that changing the return types to fix the gcc compiler issue...
[cycript.git] / Library.mm
index bb76f49f477305723a77b992d474f3b2fa63e780..973f4412cbea1dd962972e6621dff7867f8c311b 100644 (file)
@@ -38,6 +38,8 @@
 /* }}} */
 
 #include <substrate.h>
+#include <dlfcn.h>
+
 #include "cycript.hpp"
 
 #include "sig/parse.hpp"
     } \
 }
 
+#ifndef __APPLE__
+#define class_getSuperclass GSObjCSuper
+#define object_getClass GSObjCClass
+#endif
+
 void CYThrow(JSContextRef context, JSValueRef value);
 
 const char *CYPoolCCYON(apr_pool_t *pool, JSContextRef context, JSValueRef value, JSValueRef *exception);
@@ -440,7 +447,7 @@ struct Instance :
 
     static JSObjectRef Make(JSContextRef context, id object, Flags flags = None) {
         JSObjectRef value(JSObjectMake(context, Instance_, new Instance(object, flags)));
-        JSObjectSetPrototype(context, value, CYGetClassPrototype(context, object == nil ? nil : object_getClass(object)));
+        JSObjectSetPrototype(context, value, CYGetClassPrototype(context, object_getClass(object)));
         return value;
     }
 
@@ -1428,7 +1435,7 @@ Type_ CYPoolRelease(apr_pool_t *pool, Type_ object) {
     return (Type_) CYPoolRelease_(pool, (id) object);
 }
 
-id CYCastNSObject_(apr_pool_t *pool, JSContextRef context, JSObjectRef object) {
+NSObject *CYCastNSObject_(apr_pool_t *pool, JSContextRef context, JSObjectRef object) {
     JSValueRef exception(NULL);
     bool array(JSValueIsInstanceOfConstructor(context, object, Array_, &exception));
     CYThrow(context, exception);
@@ -1436,7 +1443,7 @@ id CYCastNSObject_(apr_pool_t *pool, JSContextRef context, JSObjectRef object) {
     return CYPoolRelease(pool, [value initWithJSObject:object inContext:context]);
 }
 
-id CYCastNSObject(apr_pool_t *pool, JSContextRef context, JSObjectRef object) {
+NSObject *CYCastNSObject(apr_pool_t *pool, JSContextRef context, JSObjectRef object) {
     if (!JSValueIsObjectOfClass(context, object, Instance_))
         return CYCastNSObject_(pool, context, object);
     else {
@@ -1496,7 +1503,7 @@ id CYNSObject(apr_pool_t *pool, JSContextRef context, JSValueRef value, bool cas
             object = (id) (CYCastBool(context, value) ? kCFBooleanTrue : kCFBooleanFalse);
             copy = false;
 #else
-            object = [[NSNumber alloc] initWithBoolean:value];
+            object = [[NSNumber alloc] initWithBool:CYCastBool(context, value)];
             copy = true;
 #endif
         break;
@@ -1530,7 +1537,7 @@ id CYNSObject(apr_pool_t *pool, JSContextRef context, JSValueRef value, bool cas
         return [object retain];
 }
 
-id CYCastNSObject(apr_pool_t *pool, JSContextRef context, JSValueRef value) {
+NSObject *CYCastNSObject(apr_pool_t *pool, JSContextRef context, JSValueRef value) {
     return CYNSObject(pool, context, value, true);
 }
 
@@ -1754,9 +1761,9 @@ NSString *CYCopyNSCYON(id value) {
         Class _class(object_getClass(value));
         SEL sel(@selector(cy$toCYON));
 
-        if (Method toCYON = class_getInstanceMethod(_class, sel))
+        if (objc_method *toCYON = class_getInstanceMethod(_class, sel))
             string = reinterpret_cast<NSString *(*)(id, SEL)>(method_getImplementation(toCYON))(value, sel);
-        else if (Method methodSignatureForSelector = class_getInstanceMethod(_class, @selector(methodSignatureForSelector:))) {
+        else if (objc_method *methodSignatureForSelector = class_getInstanceMethod(_class, @selector(methodSignatureForSelector:))) {
             if (reinterpret_cast<NSMethodSignature *(*)(id, SEL, SEL)>(method_getImplementation(methodSignatureForSelector))(value, @selector(methodSignatureForSelector:), sel) != nil)
                 string = [value cy$toCYON];
             else goto fail;
@@ -2083,7 +2090,7 @@ static JSValueRef CYFromFFI(JSContextRef context, sig::Type *type, ffi_type *ffi
 }
 
 static bool CYImplements(id object, Class _class, SEL selector, bool devoid) {
-    if (Method method = class_getInstanceMethod(_class, selector)) {
+    if (objc_method *method = class_getInstanceMethod(_class, selector)) {
         if (!devoid)
             return true;
         char type[16];
@@ -2096,7 +2103,7 @@ static bool CYImplements(id object, Class _class, SEL selector, bool devoid) {
     return false;
 }
 
-static const char *CYPoolTypeEncoding(apr_pool_t *pool, Class _class, SEL sel, Method method) {
+static const char *CYPoolTypeEncoding(apr_pool_t *pool, Class _class, SEL sel, objc_method *method) {
     if (method != NULL)
         return method_getTypeEncoding(method);
     else if (NSString *type = [[Bridge_ objectAtIndex:1] objectForKey:CYCastNSString(pool, sel_getName(sel))])
@@ -2210,7 +2217,7 @@ static JSValueRef Messages_getProperty(JSContextRef context, JSObjectRef object,
     const char *name(CYPoolCString(pool, property));
 
     if (SEL sel = sel_getUid(name))
-        if (Method method = class_getInstanceMethod(_class, sel))
+        if (objc_method *method = class_getInstanceMethod(_class, sel))
             return CYMakeMessage(context, sel, method_getImplementation(method), method_getTypeEncoding(method));
 
     return NULL;
@@ -2225,7 +2232,7 @@ static bool Messages_setProperty(JSContextRef context, JSObjectRef object, JSStr
 
     SEL sel(sel_registerName(name));
 
-    Method method(class_getInstanceMethod(_class, sel));
+    objc_method *method(class_getInstanceMethod(_class, sel));
 
     const char *type;
     IMP imp;
@@ -2256,7 +2263,7 @@ static bool Messages_deleteProperty(JSContextRef context, JSObjectRef object, JS
     const char *name(CYPoolCString(pool, property));
 
     if (SEL sel = sel_getUid(name))
-        if (Method method = class_getInstanceMethod(_class, sel)) {
+        if (objc_method *method = class_getInstanceMethod(_class, sel)) {
             objc_method_list list = {NULL, 1, {method}};
             class_removeMethods(_class, &list);
             return true;
@@ -2271,7 +2278,7 @@ static void Messages_getPropertyNames(JSContextRef context, JSObjectRef object,
     Class _class(internal->GetValue());
 
     unsigned int size;
-    Method *data(class_copyMethodList(_class, &size));
+    objc_method **data(class_copyMethodList(_class, &size));
     for (size_t i(0); i != size; ++i)
         JSPropertyNameAccumulatorAddName(names, CYJSString(sel_getName(method_getName(data[i]))));
     free(data);
@@ -2359,7 +2366,7 @@ static bool Instance_setProperty(JSContextRef context, JSObjectRef object, JSStr
 
     CYTry {
         NSString *name(CYCastNSString(pool, property));
-        NSString *data(CYCastNSObject(pool, context, value));
+        NSObject *data(CYCastNSObject(pool, context, value));
 
         CYPoolTry {
             if ([self cy$setProperty:name to:data])
@@ -2928,7 +2935,7 @@ JSValueRef CYSendMessage(apr_pool_t *pool, JSContextRef context, id self, SEL _c
     const char *type;
 
     Class _class(object_getClass(self));
-    if (Method method = class_getInstanceMethod(_class, _cmd))
+    if (objc_method *method = class_getInstanceMethod(_class, _cmd))
         type = method_getTypeEncoding(method);
     else {
         CYTry {
@@ -3021,7 +3028,10 @@ static JSValueRef objc_registerClassPair_(JSContextRef context, JSObjectRef obje
         if (count != 1)
             @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"incorrect number of arguments to objc_registerClassPair" userInfo:nil];
         CYPool pool;
-        Class _class(CYCastNSObject(pool, context, arguments[0]));
+        NSObject *value(CYCastNSObject(pool, context, arguments[0]));
+        if (value == NULL || !CYIsClass(value))
+            @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"incorrect number of arguments to objc_registerClassPair" userInfo:nil];
+        Class _class((Class) value);
         $objc_registerClassPair(_class);
         return CYJSUndefined(context);
     } CYCatch
@@ -3315,11 +3325,20 @@ static JSValueRef Selector_callAsFunction_type(JSContextRef context, JSObjectRef
             @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"incorrect number of arguments to Selector.type" userInfo:nil];
         CYPool pool;
         Selector_privateData *internal(reinterpret_cast<Selector_privateData *>(JSObjectGetPrivate(_this)));
-        Class _class(CYCastNSObject(pool, context, arguments[0]));
-        SEL sel(internal->GetValue());
-        Method method(class_getInstanceMethod(_class, sel));
-        const char *type(CYPoolTypeEncoding(pool, _class, sel, method));
-        return type == NULL ? CYJSNull(context) : CYCastJSValue(context, CYJSString(type));
+        NSObject *value(CYCastNSObject(pool, context, arguments[0]));
+        if (value == NULL) lookup:
+            // XXX: do a lookup of some kind
+            return CYJSNull(context);
+        else if (!CYIsClass(value))
+            @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Selector.type takes a Class" userInfo:nil];
+        else {
+            Class _class((Class) value);
+            SEL sel(internal->GetValue());
+            if (objc_method *method = class_getInstanceMethod(_class, sel)) {
+                const char *type(CYPoolTypeEncoding(pool, _class, sel, method));
+                return type == NULL ? CYJSNull(context) : CYCastJSValue(context, CYJSString(type));
+            } else goto lookup;
+        }
     } CYCatch
 }