diff --git a/gcc/objc/Object.h b/gcc/objc/Object.h index 2f096fc7909..1b2b25204ca 100644 --- a/gcc/objc/Object.h +++ b/gcc/objc/Object.h @@ -26,7 +26,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __object_INCLUDE_GNU #define __object_INCLUDE_GNU -#include +#include "objc/objc.h" /* * All classes are derived from Object. As such, diff --git a/gcc/objc/Protocol.h b/gcc/objc/Protocol.h index 1b26bcb33b6..6a38b4838c0 100644 --- a/gcc/objc/Protocol.h +++ b/gcc/objc/Protocol.h @@ -26,7 +26,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __Protocol_INCLUDE_GNU #define __Protocol_INCLUDE_GNU -#include +#include "objc/Object.h" @interface Protocol : Object { diff --git a/gcc/objc/archive.c b/gcc/objc/archive.c index 486ff7ee530..d3d4d6014d4 100644 --- a/gcc/objc/archive.c +++ b/gcc/objc/archive.c @@ -30,7 +30,6 @@ You should have received a copy of the GNU General Public License along with */ #include "runtime.h" -#include #define __objc_fatal(format, args...) \ { fprintf(stderr, "archining: "); \ diff --git a/gcc/objc/hash.c b/gcc/objc/hash.c index 8c0de99a867..7189c1d5bc8 100644 --- a/gcc/objc/hash.c +++ b/gcc/objc/hash.c @@ -25,8 +25,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "assert.h" -#include -#include +#include "objc/hash.h" +#include "objc/objc.h" #include "runtime.h" /* for DEBUG_PRINTF */ diff --git a/gcc/objc/misc.c b/gcc/objc/misc.c index 53adc82fa99..b4e08a50bb0 100644 --- a/gcc/objc/misc.c +++ b/gcc/objc/misc.c @@ -26,9 +26,6 @@ You should have received a copy of the GNU General Public License along with #include "runtime.h" -void* malloc(size_t); -void* realloc(void*, size_t); - void objc_error(id object, const char* fmt, va_list); void (*_objc_error)(id, const char*, va_list) = objc_error; @@ -53,7 +50,7 @@ objc_fatal(const char* msg) void* __objc_xmalloc(size_t size) { - void* res = malloc(size); + void* res = (void*) malloc(size); if(!res) objc_fatal("Virtual memory exhausted\n"); return res; @@ -62,7 +59,7 @@ __objc_xmalloc(size_t size) void* __objc_xrealloc(void* mem, size_t size) { - void* res = realloc(mem, size); + void* res = (void*) realloc(mem, size); if(!res) objc_fatal("Virtual memory exhausted\n"); return res; diff --git a/gcc/objc/objc-api.h b/gcc/objc/objc-api.h index e8b6c8af27c..f5162cd5100 100644 --- a/gcc/objc/objc-api.h +++ b/gcc/objc/objc-api.h @@ -26,8 +26,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __objc_api_INCLUDE_GNU #define __objc_api_INCLUDE_GNU -#include -#include +#include "objc/objc.h" +#include "objc/hash.h" + static const ARGSIZE = 96; /* for `method_get_argsize()' */ @@ -234,5 +235,99 @@ object_is_meta_class(id object) return CLS_ISMETA((Class_t)object); } +/* Archiving stuff */ + +typedef int (*objc_typed_read_func)(void*, char*, int); +typedef int (*objc_typed_write_func)(void*, const char*, int); +typedef int (*objc_typed_flush_func)(void*); +typedef int (*objc_typed_eof_func)(void*); + +#define OBJC_READONLY 0x01 +#define OBJC_WRITEONLY 0x02 + +#define OBJC_MANAGED_STREAM 0x01 +#define OBJC_FILE_STREAM 0x02 +#define OBJC_MEMORY_STREAM 0x04 + +#define OBJC_TYPED_STREAM_VERSION 0x01 + +struct objc_typed_stream { + void* physical; + cache_ptr object_table; /* read/written objects */ + cache_ptr stream_table; /* other read/written but shared things.. */ + cache_ptr class_table; /* class version mapping */ + cache_ptr object_refs; /* forward references */ + int mode; /* OBJC_READONLY or OBJC_WRITEONLY */ + int type; /* MANAGED, FILE, MEMORY etc bit string */ + int version; /* version used when writing */ + int writing_root_p; + objc_typed_read_func read; + objc_typed_write_func write; + objc_typed_eof_func eof; + objc_typed_flush_func flush; +}; + +/* opcode masks */ +#define _B_VALUE 0x1fU +#define _B_CODE 0xe0U +#define _B_SIGN 0x10U +#define _B_NUMBER 0x0fU + +/* standard opcodes */ +#define _B_INVALID 0x00U +#define _B_SINT 0x20U +#define _B_NINT 0x40U +#define _B_SSTR 0x60U +#define _B_NSTR 0x80U +#define _B_RCOMM 0xa0U +#define _B_UCOMM 0xc0U +#define _B_EXT 0xe0U + +/* eXtension opcodes */ +#define _BX_OBJECT 0x00U +#define _BX_CLASS 0x01U +#define _BX_SEL 0x02U +#define _BX_OBJREF 0x03U +#define _BX_OBJROOT 0x04U +#define _BX_EXT 0x1fU + +/* +** Read and write objects as specified by TYPE. All the `last' +** arguments are pointers to the objects to read/write. +*/ + +int objc_write_type (TypedStream* stream, const char* type, const void* data); +int objc_read_type (TypedStream* stream, const char* type, void* data); + +int objc_write_types (TypedStream* stream, const char* type, ...); +int objc_read_types (TypedStream* stream, const char* type, ...); + +int objc_write_object_reference (TypedStream* stream, id object); +int objc_write_root_object (TypedStream* stream, id object); + +/* +** Convenience funtions +*/ + +int objc_write_array (TypedStream* stream, const char* type, + int count, const void* data); +int objc_read_array (TypedStream* stream, const char* type, + int count, void* data); + +int objc_write_object (TypedStream* stream, id object); + +/* +** Open a typed stream for reading or writing. MODE may be either of +** OBJC_READONLY or OBJC_WRITEONLY. +*/ + +TypedStream* objc_open_typed_stream (FILE* physical, int mode); +TypedStream* objc_open_typed_stream_for_file (const char* file_name, int mode); + +void objc_close_typed_stream (TypedStream* stream); + +BOOL objc_end_of_typed_stream (TypedStream* stream); +void objc_flush_typed_stream (TypedStream* stream); + #endif /* not __objc_api_INCLUDE_GNU */ diff --git a/gcc/objc/objc.h b/gcc/objc/objc.h index cf2f4cb186a..972fe76944a 100644 --- a/gcc/objc/objc.h +++ b/gcc/objc/objc.h @@ -42,7 +42,6 @@ extern const char* __objc_hash_lookup_id; #endif -#include #include #include @@ -415,8 +414,6 @@ typedef struct objc_category { */ typedef struct objc_typed_stream TypedStream; -#include - /* ** Structure used when a message is send to a class's super class. The diff --git a/gcc/objc/runtime.h b/gcc/objc/runtime.h index ce637b1d2a7..e37fb56ef62 100644 --- a/gcc/objc/runtime.h +++ b/gcc/objc/runtime.h @@ -27,17 +27,17 @@ You should have received a copy of the GNU General Public License along with #ifndef __objc_runtime_INCLUDE_GNU #define __objc_runtime_INCLUDE_GNU -#include /* core data types */ -#include /* runtime api functions */ +#include "gstdarg.h" /* for varargs and va_list's */ +#include "gstddef.h" /* so noone else will get system versions */ +#include "assert.h" -#include /* hash structures */ -#include /* linear lists */ +#include "objc/objc.h" /* core data types */ +#include "objc/objc-api.h" /* runtime api functions */ + +#include "objc/hash.h" /* hash structures */ +#include "objc/list.h" /* linear lists */ #include /* argh! I hate this */ -#include /* for varargs and va_list's */ -#include - -#include extern void __objc_add_class_to_hash(Class_t); /* (objc-class.c) */ extern void __objc_init_selector_tables(); /* (objc-sel.c) */ @@ -62,11 +62,6 @@ extern int __objc_selector_max_index; BOOL __objc_responds_to (id object, SEL sel); /* for internal use only! */ -/* standard functions */ -int bcopy(void*, void*, size_t); -int vprintf(const char*, va_list); - - #endif /* not __objc_runtime_INCLUDE_GNU */ diff --git a/gcc/objc/selector.c b/gcc/objc/selector.c index 44a73f64f5d..fdbe6699c24 100644 --- a/gcc/objc/selector.c +++ b/gcc/objc/selector.c @@ -25,7 +25,7 @@ You should have received a copy of the GNU General Public License along with covered by the GNU General Public License. */ #include "runtime.h" -#include +#include "objc/sarray.h" /* Initial selector hash table size. Value doesnt matter much */ #define SELECTOR_HASH_SIZE 128 diff --git a/gcc/objc/sendmsg.c b/gcc/objc/sendmsg.c index 301313d9f47..06fd95a730d 100644 --- a/gcc/objc/sendmsg.c +++ b/gcc/objc/sendmsg.c @@ -35,7 +35,7 @@ const char* __objc_hash_lookup_id = "Method lookup uses hash caching"; #endif #ifdef OBJC_HASH_LOOKUP -#include +#include "objc/cache.h" #endif #ifdef OBJC_SPARSE_LOOKUP