Comments
Patch
===================================================================
@@ -1,3 +1,7 @@
+2010-10-15 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ * objc.dg/gnu-api-2-property.m: New.
+
2010-10-15 Xinliang David Li <davidxl@google.com>
* g++.dg/uninit-pred-3_a.C: New test.
===================================================================
@@ -0,0 +1,65 @@
+/* Test the Modern GNU Objective-C Runtime API.
+
+ This is test 'property', covering all functions starting with 'property'. */
+
+/* { dg-do run } */
+/* { dg-skip-if "" { *-*-* } { "-fnext-runtime" } { "" } } */
+
+/* To get the modern GNU Objective-C Runtime API, you include
+ objc/runtime.h. */
+#include <objc/runtime.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+@interface MyRootClass
+{ Class isa; }
++ alloc;
+- init;
+@end
+
+@implementation MyRootClass
++ alloc { return class_createInstance (self, 0); }
+- init { return self; }
+@end
+
+@protocol MyProtocol
+- (id) variable;
+@end
+
+@protocol MySecondProtocol
+- (id) setVariable: (id)value;
+@end
+
+@interface MySubClass : MyRootClass <MyProtocol>
+{ id variable_ivar; }
+- (void) setVariable: (id)value;
+- (id) variable;
+@end
+
+@implementation MySubClass
+- (void) setVariable: (id)value { variable_ivar = value; }
+- (id) variable { return variable_ivar; }
+@end
+
+
+int main(int argc, void **args)
+{
+ /* Functions are tested in alphabetical order. */
+
+ /* TODO: Test new ABI (when available). */
+ printf ("Testing property_getAttributes () ...\n");
+ {
+ if (property_getAttributes (NULL) != NULL)
+ abort ();
+ }
+
+ /* TODO: Test new ABI (when available). */
+ printf ("Testing property_getName () ...\n");
+ {
+ if (property_getName (NULL) != NULL)
+ abort ();
+ }
+
+ return 0;
+}
This adds the missing property functions (actually, placeholders for them, since they need a new ABI to work). Committed to trunk. Thanks In libobjc/: 2010-10-15 Nicola Pero <nicola.pero@meta-innovation.com> * objc/runtime.h (class_copyPropertyList): New. (class_getProperty): New. (property_getAttributes): New. (property_getName): New. * ivars.c (class_copyPropertyList): New. (class_getProperty): New. (property_getAttributes): New. (property_getName): New. In gcc/testsuite/: 2010-10-15 Nicola Pero <nicola.pero@meta-innovation.com> * objc.dg/gnu-api-2-property.m: New. Index: ChangeLog =================================================================== --- ChangeLog (revision 165525) +++ ChangeLog (working copy) @@ -1,4 +1,15 @@ 2010-10-15 Nicola Pero <nicola.pero@meta-innovation.com> + + * objc/runtime.h (class_copyPropertyList): New. + (class_getProperty): New. + (property_getAttributes): New. + (property_getName): New. + * ivars.c (class_copyPropertyList): New. + (class_getProperty): New. + (property_getAttributes): New. + (property_getName): New. + +2010-10-15 Nicola Pero <nicola.pero@meta-innovation.com> * objc-private/runtime.h (__objc_update_classes_with_methods): New. * class.c (__objc_update_classes_with_methods): New. Index: ivars.c =================================================================== --- ivars.c (revision 165524) +++ ivars.c (working copy) @@ -228,3 +228,56 @@ struct objc_ivar ** class_copyIvarList (Class clas return returnValue; } + +const char * +property_getName (struct objc_property * property __attribute__ ((__unused__))) +{ + if (property == NULL) + return NULL; + + /* TODO: New ABI. */ + /* The current ABI does not have any information on properties. */ + return NULL; +} + +const char * +property_getAttributes (struct objc_property * property __attribute__ ((__unused__))) +{ + if (property == NULL) + return NULL; + + /* TODO: New ABI. */ + /* The current ABI does not have any information on properties. */ + return NULL; +} + +struct objc_property * +class_getProperty (Class class_ __attribute__ ((__unused__)), + const char *propertyName __attribute__ ((__unused__))) +{ + if (class_ == NULL || propertyName == NULL) + return NULL; + + /* TODO: New ABI. */ + /* The current ABI does not have any information on class properties. */ + return NULL; +} + +struct objc_property ** +class_copyPropertyList (Class class_ __attribute__ ((__unused__)), + unsigned int *numberOfReturnedProperties __attribute__ ((__unused__))) +{ + if (class_ == Nil) + { + if (numberOfReturnedProperties) + *numberOfReturnedProperties = 0; + return NULL; + } + + /* TODO: New ABI. */ + /* The current ABI does not have any information on class properties. */ + if (numberOfReturnedProperties) + *numberOfReturnedProperties = 0; + + return NULL; +} Index: objc/runtime.h =================================================================== --- objc/runtime.h (revision 165525) +++ objc/runtime.h (working copy) @@ -305,7 +305,38 @@ objc_EXPORT const char * ivar_getTypeEncoding (Iva will be filled with the number of instance variables returned. */ objc_EXPORT Ivar * class_copyIvarList (Class class_, unsigned int *numberOfReturnedIvars); +/* Return the name of the property. Return NULL if 'property' is + NULL. */ +objc_EXPORT const char * property_getName (Property property); +/* Return the attributes of the property as a string. Return NULL if + 'property' is NULL. */ +objc_EXPORT const char * property_getAttributes (Property property); + +/* Return the property with name 'propertyName' of the class 'class_'. + This function returns NULL if the required property can not be + found. Return NULL if 'class_' or 'propertyName' is NULL. + + Note that the traditional ABI does not store the list of properties + of a class in a compiled module, so the traditional ABI will always + return NULL. */ +objc_EXPORT Property class_getProperty (Class class_, const char *propertyName); + +/* Return all the properties of the class. The return value + of the function is a pointer to an area, allocated with malloc(), + that contains all the properties of the class. It does not + include properties of superclasses. The list is terminated + by NULL. Optionally, if you pass a non-NULL + 'numberOfReturnedIvars' pointer, the unsigned int that it points to + will be filled with the number of properties returned. + + Note that the traditional ABI does not store the list of properties + of a class in a compiled module, so the traditional ABI will always + return an empty list. */ +objc_EXPORT Property * class_copyPropertyList +(Class class_, unsigned int *numberOfReturnedProperties); + + /** Implementation: the following functions are in class.c. */ /* Compatibility Note: The Apple/NeXT runtime does not have @@ -422,7 +453,28 @@ objc_EXPORT void class_setVersion (Class class_, i for all classes). */ objc_EXPORT size_t class_getInstanceSize (Class class_); +/* Change the implementation of the method. It also searches all + classes for any class implementing the method, and replaces the + existing implementation with the new one. For that to work, + 'method' must be a method returned by class_getInstanceMethod() or + class_getClassMethod() as the matching is done by comparing the + pointers; in that case, only the implementation in the class is + modified. Return the previous implementation that has been + replaced. If method or implementation is NULL, do nothing and + return NULL. */ +objc_EXPORT IMP +method_setImplementation (Method method, IMP implementation); +/* Swap the implementation of two methods in a single, atomic + operation. This is equivalent to getting the implementation of + each method and then calling method_setImplementation() on the + other one. For this to work, the two methods must have been + returned by class_getInstanceMethod() or class_getClassMethod(). + If 'method_a' or 'method_b' is NULL, do nothing. */ +objc_EXPORT void +method_exchangeImplementations (Method method_a, Method method_b); + + /** Implementation: the following functions are in sendmsg.c. */ /* Return the instance method with selector 'selector' of class @@ -545,27 +597,7 @@ objc_EXPORT void method_getReturnType (Method meth objc_EXPORT void method_getArgumentType (Method method, unsigned int argumentNumber, char *returnValue, size_t returnValueSize); -/* Change the implementation of the method. It also searches all - classes for any class implementing the method, and replaces the - existing implementation with the new one. For that to work, - 'method' must be a method returned by class_getInstanceMethod() or - class_getClassMethod() as the matching is done by comparing the - pointers; in that case, only the implementation in the class is - modified. Return the previous implementation that has been - replaced. If method or implementation is NULL, do nothing and - return NULL. */ -objc_EXPORT IMP -method_setImplementation (Method method, IMP implementation); -/* Swap the implementation of two methods in a single, atomic - operation. This is equivalent to getting the implementation of - each method and then calling method_setImplementation() on the - other one. For this to work, the two methods must have been - returned by class_getInstanceMethod() or class_getClassMethod(). - If 'method_a' or 'method_b' is NULL, do nothing. */ -objc_EXPORT void -method_exchangeImplementations (Method method_a, Method method_b); - /** Implementation: the following functions are in protocols.c. */ /* Return the protocol with name 'name', or nil if it the protocol is