diff options
author | Matthias Benkard <code@mail.matthias.benkard.de> | 2008-02-03 15:53:31 +0100 |
---|---|---|
committer | Matthias Benkard <code@mail.matthias.benkard.de> | 2008-02-03 15:53:31 +0100 |
commit | eda523e8135febb9005ade74c9bf2c135b2da4db (patch) | |
tree | 095e5bca40606e9f63860b89ee3eaf6fb1da9955 /Objective-C | |
parent | c87c8aebcd991256c12c974e3134369d1911ad5f (diff) |
Objective-C layer: Make use of the Objective-C 2.0 runtime.
darcs-hash:a8a8f84ba4a1476120750c7b11c08c2088fa3da6
Diffstat (limited to 'Objective-C')
-rw-r--r-- | Objective-C/PyObjC/objc-runtime-compat.h | 1 | ||||
-rw-r--r-- | Objective-C/libobjcl.m | 35 |
2 files changed, 15 insertions, 21 deletions
diff --git a/Objective-C/PyObjC/objc-runtime-compat.h b/Objective-C/PyObjC/objc-runtime-compat.h index 39c697e..b548755 100644 --- a/Objective-C/PyObjC/objc-runtime-compat.h +++ b/Objective-C/PyObjC/objc-runtime-compat.h @@ -25,6 +25,7 @@ * the preclass_* functions, not the regular ones because it isn't possible * to emulate the entire ObjC 2.0 API on Tiger. */ +#include "pyobjc.h" #include <objc/objc-runtime.h> #include <objc/Protocol.h> diff --git a/Objective-C/libobjcl.m b/Objective-C/libobjcl.m index 5161a52..53fbaaf 100644 --- a/Objective-C/libobjcl.m +++ b/Objective-C/libobjcl.m @@ -49,6 +49,10 @@ objcl_initialise_runtime (void) userInfo: nil]; [objcl_oom_exception retain]; } + +#ifdef __NEXT_RUNTIME__ + PyObjC_SetupRuntimeCompat (); +#endif } @@ -96,18 +100,7 @@ objcl_invoke_with_types (int argc, NS_DURING { -#ifdef __NEXT_RUNTIME__ - if (objcl_object_is_class (receiver)) - method = class_getClassMethod (receiver, method_selector)->method_imp; - else - method = class_getInstanceMethod ([receiver class], method_selector)->method_imp; -#else - method = objc_msg_lookup (receiver, method_selector); - /* Alternatively: - method = [receiver methodForSelector: method_selector]; - */ -#endif - + method = objcl_get_method_implementation (receiver, method_selector); if (method == NULL) [[NSException exceptionWithName: @"MLKNoApplicableMethod" reason: @"Tried to call a non-existent method." @@ -145,7 +138,7 @@ Class objcl_find_class (const char *class_name) { #ifdef __NEXT_RUNTIME__ - return objc_lookUpClass (class_name); + return objc_getClass (class_name); #else return objc_lookup_class (class_name); #endif @@ -239,12 +232,14 @@ objcl_get_method_implementation (id object, { #ifdef __NEXT_RUNTIME__ if (objcl_object_is_class (object)) - { - return class_getClassMethod (object, selector)->method_imp; - } + return method_getImplementation (class_getClassMethod (object, selector)); else { - return class_getInstanceMethod ([object class], selector)->method_imp; +#ifdef __OBJC2__ + return class_getMethodImplementation ([object class], selector); +#else + return method_getImplementation (class_getInstanceMethod ([object class], selector)); +#endif } #else return objc_msg_lookup (object, selector); @@ -268,8 +263,7 @@ BOOL objcl_object_is_meta_class (id obj) { #ifdef __NEXT_RUNTIME__ - /* FIXME: What to do here? */ - return objcl_object_get_meta_class (obj) == obj; + return objcl_object_is_class (obj) && class_isMetaClass (obj); #else /* return CLS_ISMETA (ptr); */ if (objcl_object_is_class (obj)) @@ -284,8 +278,7 @@ Class objcl_object_get_class (id obj) { #ifdef __NEXT_RUNTIME__ - /* XXX? return obj->isa; */ - return [obj class]; + return object_getClass (obj); #else return object_get_class (obj); #endif |