aboutsummaryrefslogtreecommitdiff
path: root/libobjc/objc
diff options
context:
space:
mode:
authorNicola Pero <nicola.pero@meta-innovation.com>2010-10-10 17:43:07 +0000
committerNicola Pero <nicola@gcc.gnu.org>2010-10-10 17:43:07 +0000
commite4d508663e3f14ba9b976f45808b1398a534bf2c (patch)
tree31297c7b7c90562ff7778443d3b2187fc4b64092 /libobjc/objc
parente9acb3234d6fe8d8fbbc3f6d94cc2cda45d4b11b (diff)
downloadgcc-e4d508663e3f14ba9b976f45808b1398a534bf2c.zip
gcc-e4d508663e3f14ba9b976f45808b1398a534bf2c.tar.gz
gcc-e4d508663e3f14ba9b976f45808b1398a534bf2c.tar.bz2
In libobjc/: 2010-10-10 Nicola Pero <nicola.pero@meta-innovation.com>
In libobjc/: 2010-10-10 Nicola Pero <nicola.pero@meta-innovation.com> * objc/objc-api.h: Define Method, Method_t, Category and Category_t. Prevent including this file at the same time as objc/runtime.h. Updated comments. * objc/deprecated/struct_objc_method.h: Do not define Method, Method_t. * objc/deprecated/struct_objc_category.h: Do not define Category, Category_t. * objc-private/module-abi-8.h: New file containing a copy of all the structure definitions. Not used yet. * objc/encoding.h (objc_aligned_size): Removed duplicate declaration. Updated comments. * objc/runtime.h: Added Ivar, objc_property_t, Property, Method, Category, struct objc_method_description, _C_ID and similar, _C_CONST and similar and _F_CONST and similar. Added objc_sizeof_type, objc_alignof_type, objc_aligned_size, objc_promoted_size, objc_skip_type_qualifier, objc_skip_typespec, objc_skip_offset, objc_skip_argspec, objc_get_type_qualifiers, struct objc_struct_layout, objc_layout_structure, objc_layout_structure_next_member, objc_layout_finish_structure, objc_layout_structure_get_info. Prevent including this file at the same time as objc/objc-api.h. From-SVN: r165256
Diffstat (limited to 'libobjc/objc')
-rw-r--r--libobjc/objc/deprecated/struct_objc_category.h4
-rw-r--r--libobjc/objc/deprecated/struct_objc_method.h5
-rw-r--r--libobjc/objc/encoding.h10
-rw-r--r--libobjc/objc/objc-api.h17
-rw-r--r--libobjc/objc/runtime.h201
5 files changed, 222 insertions, 15 deletions
diff --git a/libobjc/objc/deprecated/struct_objc_category.h b/libobjc/objc/deprecated/struct_objc_category.h
index 2b7a74b..6de3980 100644
--- a/libobjc/objc/deprecated/struct_objc_category.h
+++ b/libobjc/objc/deprecated/struct_objc_category.h
@@ -2,7 +2,7 @@
** The compiler generates one of these structures for each category. A class
** may have many categories and contain both instance and factory methods.
*/
-typedef struct objc_category {
+struct objc_category {
const char* category_name; /* Name of the category. Name
contained in the () of the
category definition. */
@@ -18,4 +18,4 @@ typedef struct objc_category {
class methods defined. */
struct objc_protocol_list *protocols; /* List of Protocols
conformed to */
-} Category, *Category_t;
+};
diff --git a/libobjc/objc/deprecated/struct_objc_method.h b/libobjc/objc/deprecated/struct_objc_method.h
index 10a3b3b..af83c07 100644
--- a/libobjc/objc/deprecated/struct_objc_method.h
+++ b/libobjc/objc/deprecated/struct_objc_method.h
@@ -6,7 +6,7 @@
** and categories can break them across modules. To handle this problem is a
** singly linked list of methods.
*/
-typedef struct objc_method {
+struct objc_method {
SEL method_name; /* This variable is the method's
name. It is a char*.
The unique integer passed to
@@ -18,4 +18,5 @@ typedef struct objc_method {
debuggers. */
IMP method_imp; /* Address of the method in the
executable. */
-} Method, *Method_t;
+};
+
diff --git a/libobjc/objc/encoding.h b/libobjc/objc/encoding.h
index 177ef72..523b129 100644
--- a/libobjc/objc/encoding.h
+++ b/libobjc/objc/encoding.h
@@ -28,6 +28,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#ifndef __encoding_INCLUDE_GNU
#define __encoding_INCLUDE_GNU
+/* This file is to be used with the "traditional" GNU Objective-C
+ Runtime API (the one declared in objc/objc-api.h). If you are
+ using the "modern" GNU Objective-C Runtime API, then the useful
+ functions from this file are declared in objc/runtime.h.
+*/
+
#include "objc-api.h"
#include <ctype.h>
@@ -35,6 +41,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
extern "C" {
#endif /* __cplusplus */
+/* The following are used in encode strings to describe some
+ qualifiers of method and ivar types. */
#define _C_CONST 'r'
#define _C_IN 'n'
#define _C_INOUT 'N'
@@ -44,6 +52,7 @@ extern "C" {
#define _C_ONEWAY 'V'
#define _C_GCINVISIBLE '|'
+/* The same when used as flags. */
#define _F_CONST 0x01
#define _F_IN 0x01
#define _F_OUT 0x02
@@ -53,7 +62,6 @@ extern "C" {
#define _F_ONEWAY 0x10
#define _F_GCINVISIBLE 0x20
-int objc_aligned_size (const char *type);
int objc_sizeof_type (const char *type);
int objc_alignof_type (const char *type);
int objc_aligned_size (const char *type);
diff --git a/libobjc/objc/objc-api.h b/libobjc/objc/objc-api.h
index fb60d591..eced869 100644
--- a/libobjc/objc/objc-api.h
+++ b/libobjc/objc/objc-api.h
@@ -41,11 +41,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
Objective-C Runtime API) or objc/runtime.h (to use the modern GNU
Objective-C Runtime API), but not both.
*/
-/*
#ifdef __objc_runtime_INCLUDE_GNU
# error You can not include both objc/objc-api.h and objc/runtime.h. Include objc/objc-api.h for the traditional GNU Objective-C Runtime API and objc/runtime.h for the modern one.
#endif
-*/
#include "objc.h"
#ifndef GNU_LIBOBJC_COMPILING_LIBOBJC_ITSELF
@@ -71,7 +69,8 @@ struct objc_method_description
char *types; /* type encoding */
};
-/* Filer types used to describe Ivars and Methods. */
+/* The following are used in encode strings to describe the type of
+ Ivars and Methods. */
#define _C_ID '@'
#define _C_CLASS '#'
#define _C_SEL ':'
@@ -103,12 +102,10 @@ struct objc_method_description
#define _C_VECTOR '!'
#define _C_COMPLEX 'j'
-/* The following one is never generated by the compiler. You can
- treat it as equivalent to "*".
-*/
+/* _C_ATOM is never generated by the compiler. You can treat it as
+ equivalent to "*". */
#define _C_ATOM '%'
-
#include "deprecated/objc_error.h"
#include "deprecated/struct_objc_static_instances.h"
@@ -117,6 +114,8 @@ struct objc_method_description
#include "deprecated/struct_objc_ivar.h"
#include "deprecated/struct_objc_ivar_list.h"
#include "deprecated/struct_objc_method.h"
+typedef struct objc_method Method, *Method_t;
+
#include "deprecated/struct_objc_method_list.h"
#include "deprecated/struct_objc_protocol_list.h"
@@ -169,9 +168,11 @@ struct objc_method_description
#include "deprecated/struct_objc_category.h"
+typedef struct objc_category Category, *Category_t;
+
/* We include message.h for compatibility with the old objc-api.h
which included the declarations currently in message.h. The
- Apple/NeXT runtime does not do this and only include message.h in
+ Apple/NeXT runtime does not do this and only includes message.h in
objc-runtime.h. It does not matter that much since most of the
definitions in message.h are runtime-specific. */
#include "message.h"
diff --git a/libobjc/objc/runtime.h b/libobjc/objc/runtime.h
index c46fe67..6f25ec8 100644
--- a/libobjc/objc/runtime.h
+++ b/libobjc/objc/runtime.h
@@ -41,16 +41,112 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
Objective-C Runtime API) or objc/runtime.h (to use the modern GNU
Objective-C Runtime API), but not both.
*/
-/*
#ifdef __objc_api_INCLUDE_GNU
# error You can not include both objc/objc-api.h and objc/runtime.h. Include objc/objc-api.h for the traditional GNU Objective-C Runtime API and objc/runtime.h for the modern one.
#endif
-*/
/* TODO: This file is incomplete. */
#include "objc.h"
+/* An 'Ivar' represents an instance variable. It holds information
+ about the name, type and offset of the instance variable. */
+typedef struct objc_ivar *Ivar;
+
+/* A 'Property' represents a property. It holds information about the
+ name of the property, and its attributes.
+
+ Compatibility Note: the Apple/NeXT runtime defines this as
+ objc_property_t, so we define it that way as well, but obviously
+ Property is the right name. */
+typedef struct objc_property *Property;
+typedef struct objc_property *objc_property_t;
+
+/* A 'Method' represents a method. It holds information about the
+ name, types and the IMP of the method. */
+typedef struct objc_method *Method;
+
+/* A 'Category' represents a category. It holds information about the
+ name of the category, the class it belongs to, and the methods,
+ protocols and such like provided by the category. */
+typedef struct objc_category *Category;
+
+/* 'Protocol' is defined in objc/objc.h (which is included by this
+ file). */
+
+/* Method descriptor returned by introspective Object methods. At the
+ moment, this is really just the first part of the more complete
+ objc_method structure used internally by the runtime. (PS: In the
+ GNU Objective-C Runtime, selectors already include a type, so an
+ objc_method_description does not add much to a SEL. But in other
+ runtimes, that is not the case, which is why
+ objc_method_description exists). */
+struct objc_method_description
+{
+ SEL name; /* Selector (name and signature) */
+ char *types; /* Type encoding */
+};
+
+/* The following are used in encode strings to describe the type of
+ Ivars and Methods. */
+#define _C_ID '@'
+#define _C_CLASS '#'
+#define _C_SEL ':'
+#define _C_CHR 'c'
+#define _C_UCHR 'C'
+#define _C_SHT 's'
+#define _C_USHT 'S'
+#define _C_INT 'i'
+#define _C_UINT 'I'
+#define _C_LNG 'l'
+#define _C_ULNG 'L'
+#define _C_LNG_LNG 'q'
+#define _C_ULNG_LNG 'Q'
+#define _C_FLT 'f'
+#define _C_DBL 'd'
+#define _C_LNG_DBL 'D'
+#define _C_BFLD 'b'
+#define _C_BOOL 'B'
+#define _C_VOID 'v'
+#define _C_UNDEF '?'
+#define _C_PTR '^'
+#define _C_CHARPTR '*'
+#define _C_ARY_B '['
+#define _C_ARY_E ']'
+#define _C_UNION_B '('
+#define _C_UNION_E ')'
+#define _C_STRUCT_B '{'
+#define _C_STRUCT_E '}'
+#define _C_VECTOR '!'
+#define _C_COMPLEX 'j'
+
+/* _C_ATOM is never generated by the compiler. You can treat it as
+ equivalent to "*". */
+#define _C_ATOM '%'
+
+/* The following are used in encode strings to describe some
+ qualifiers of method and ivar types. */
+#define _C_CONST 'r'
+#define _C_IN 'n'
+#define _C_INOUT 'N'
+#define _C_OUT 'o'
+#define _C_BYCOPY 'O'
+#define _C_BYREF 'R'
+#define _C_ONEWAY 'V'
+#define _C_GCINVISIBLE '|'
+
+/* The same when used as flags. */
+#define _F_CONST 0x01
+#define _F_IN 0x01
+#define _F_OUT 0x02
+#define _F_INOUT 0x03
+#define _F_BYCOPY 0x04
+#define _F_BYREF 0x08
+#define _F_ONEWAY 0x10
+#define _F_GCINVISIBLE 0x20
+
+/* TODO: Add all the functions in the API. */
+
/* 'objc_enumerationMutation()' is called when a collection is
mutated while being "fast enumerated". That is a hard error, and
objc_enumerationMutation is called to deal with it. 'collection'
@@ -102,4 +198,105 @@ struct __objcFastEnumerationState
};
*/
+
+/* Traditional GNU Objective-C Runtime functions that are currently
+ used to implement method forwarding.
+*/
+
+/* Return the size of a variable which has the specified 'type'
+ encoding. */
+int objc_sizeof_type (const char *type);
+
+/* Return the align of a variable which has the specified 'type'
+ encoding. */
+int objc_alignof_type (const char *type);
+
+/* Return the aligned size of a variable which has the specified
+ 'type' encoding. The aligned size is the size rounded up to the
+ nearest alignment. */
+int objc_aligned_size (const char *type);
+
+/* Return the promoted size of a variable which has the specified
+ 'type' encoding. This is the size rounded up to the nearest
+ integral of the wordsize, taken to be the size of a void *. */
+int objc_promoted_size (const char *type);
+
+
+/* The following functions are used when parsing the type encoding of
+ methods, to skip over parts that are ignored. They take as
+ argument a pointer to a location inside the type encoding of a
+ method (which is a string) and return a new pointer, pointing to a
+ new location inside the string after having skipped the unwanted
+ information. */
+
+/* Skip some type qualifiers (_C_CONST, _C_IN, etc). These may
+ eventually precede typespecs occurring in method prototype
+ encodings. */
+const char *objc_skip_type_qualifiers (const char *type);
+
+/* Skip one typespec element (_C_CLASS, _C_SEL, etc). If the typespec
+ is prepended by type qualifiers, these are skipped as well. */
+const char *objc_skip_typespec (const char *type);
+
+/* Skip an offset. */
+const char *objc_skip_offset (const char *type);
+
+/* Skip an argument specification (ie, skipping a typespec, which may
+ include qualifiers, and an offset too). */
+const char *objc_skip_argspec (const char *type);
+
+/* Read type qualifiers (_C_CONST, _C_IN, etc) from string 'type'
+ (stopping at the first non-type qualifier found) and return an
+ unsigned int which is the logical OR of all the corresponding flags
+ (_F_CONST, _F_IN etc). */
+unsigned objc_get_type_qualifiers (const char *type);
+
+
+/* Note that the following functions work for very simple structures,
+ but get easily confused by more complicated ones (for example,
+ containing vectors). A better solution is required.
+*/
+
+/* The following three functions can be used to determine how a
+ structure is laid out by the compiler. For example:
+
+ struct objc_struct_layout layout;
+ int i;
+
+ objc_layout_structure (type, &layout);
+ while (objc_layout_structure_next_member (&layout))
+ {
+ int position, align;
+ const char *type;
+
+ objc_layout_structure_get_info (&layout, &position, &align, &type);
+ printf ("element %d has offset %d, alignment %d\n",
+ i++, position, align);
+ }
+
+ These functions are used by objc_sizeof_type and objc_alignof_type
+ functions to compute the size and alignment of structures. The
+ previous method of computing the size and alignment of a structure
+ was not working on some architectures, particulary on AIX, and in
+ the presence of bitfields inside the structure. */
+struct objc_struct_layout
+{
+ const char *original_type;
+ const char *type;
+ const char *prev_type;
+ unsigned int record_size;
+ unsigned int record_align;
+};
+
+void objc_layout_structure (const char *type,
+ struct objc_struct_layout *layout);
+BOOL objc_layout_structure_next_member (struct objc_struct_layout *layout);
+void objc_layout_finish_structure (struct objc_struct_layout *layout,
+ unsigned int *size,
+ unsigned int *align);
+void objc_layout_structure_get_info (struct objc_struct_layout *layout,
+ unsigned int *offset,
+ unsigned int *align,
+ const char **type);
+
#endif