]> git.saurik.com Git - apple/objc4.git/blobdiff - runtime/objc-runtime-old.h
objc4-493.9.tar.gz
[apple/objc4.git] / runtime / objc-runtime-old.h
diff --git a/runtime/objc-runtime-old.h b/runtime/objc-runtime-old.h
new file mode 100644 (file)
index 0000000..1523b3e
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 1999-2007 Apple Inc.  All Rights Reserved.
+ * 
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifndef _OBJC_RUNTIME_OLD_H
+#define _OBJC_RUNTIME_OLD_H
+
+#include "objc-private.h"
+#include "objc-file-old.h"
+
+
+struct old_class {
+    struct old_class *isa;
+    struct old_class *super_class;
+    const char *name;
+    long version;
+    long info;
+    long instance_size;
+    struct old_ivar_list *ivars;
+    struct old_method_list **methodLists;
+    Cache cache;
+    struct old_protocol_list *protocols;
+    // CLS_EXT only
+    const uint8_t *ivar_layout;
+    struct old_class_ext *ext;
+};
+
+struct old_class_ext {
+    uint32_t size;
+    const uint8_t *weak_ivar_layout;
+    struct old_property_list **propertyLists;
+};
+
+struct old_category {
+    char *category_name;
+    char *class_name;
+    struct old_method_list *instance_methods;
+    struct old_method_list *class_methods;
+    struct old_protocol_list *protocols;
+    uint32_t size;
+    struct old_property_list *instance_properties;
+};
+
+struct old_ivar {
+    char *ivar_name;
+    char *ivar_type;
+    int ivar_offset;
+#ifdef __LP64__
+    int space;
+#endif
+};
+
+struct old_ivar_list {
+    int ivar_count;
+#ifdef __LP64__
+    int space;
+#endif
+    /* variable length structure */
+    struct old_ivar ivar_list[1];
+};
+
+
+struct old_method {
+    SEL method_name;
+    char *method_types;
+    IMP method_imp;
+};
+
+struct old_method_list {
+    struct old_method_list *obsolete;
+
+    int method_count;
+#ifdef __LP64__
+    int space;
+#endif
+    /* variable length structure */
+    struct old_method method_list[1];
+};
+
+struct old_protocol {
+    Class isa;
+    const char *protocol_name;
+    struct old_protocol_list *protocol_list;
+    struct objc_method_description_list *instance_methods;
+    struct objc_method_description_list *class_methods;
+};
+
+struct old_protocol_list {
+    struct old_protocol_list *next;
+    long count;
+    struct old_protocol *list[1];
+};
+
+struct old_protocol_ext {
+    uint32_t size;
+    struct objc_method_description_list *optional_instance_methods;
+    struct objc_method_description_list *optional_class_methods;
+    struct old_property_list *instance_properties;
+};
+
+
+struct old_property {
+    const char *name;
+    const char *attributes;
+};
+
+struct old_property_list {
+    uint32_t entsize;
+    uint32_t count;
+    struct old_property first;
+};
+
+
+#define CLS_CLASS              0x1
+#define CLS_META               0x2
+#define CLS_INITIALIZED                0x4
+#define CLS_POSING             0x8
+#define CLS_MAPPED             0x10
+#define CLS_FLUSH_CACHE                0x20
+#define CLS_GROW_CACHE         0x40
+#define CLS_NEED_BIND          0x80
+#define CLS_METHOD_ARRAY        0x100
+// the JavaBridge constructs classes with these markers
+#define CLS_JAVA_HYBRID                0x200
+#define CLS_JAVA_CLASS         0x400
+// thread-safe +initialize
+#define CLS_INITIALIZING       0x800
+// bundle unloading
+#define CLS_FROM_BUNDLE                0x1000
+// C++ ivar support
+#define CLS_HAS_CXX_STRUCTORS  0x2000
+// Lazy method list arrays
+#define CLS_NO_METHOD_ARRAY    0x4000
+// +load implementation
+#define CLS_HAS_LOAD_METHOD     0x8000
+// objc_allocateClassPair API
+#define CLS_CONSTRUCTING        0x10000
+// visibility=hidden
+#define CLS_HIDDEN              0x20000
+// GC:  class has unsafe finalize method
+#define CLS_FINALIZE_ON_MAIN_THREAD 0x40000
+// Lazy property list arrays
+#define CLS_NO_PROPERTY_ARRAY  0x80000
+// +load implementation
+#define CLS_CONNECTED           0x100000
+#define CLS_LOADED              0x200000
+// objc_allocateClassPair API
+#define CLS_CONSTRUCTED         0x400000
+// class is leaf for cache flushing
+#define CLS_LEAF                0x800000
+// class instances may have associative references
+#define CLS_INSTANCES_HAVE_ASSOCIATED_OBJECTS 0x1000000
+// class has instance-specific GC layout
+#define CLS_HAS_INSTANCE_SPECIFIC_LAYOUT 0x2000000
+
+
+// Terminator for array of method lists
+#define END_OF_METHODS_LIST ((struct old_method_list*)-1)
+
+#define ISCLASS(cls)           (((cls)->info & CLS_CLASS) != 0)
+#define ISMETA(cls)            (((cls)->info & CLS_META) != 0)
+#define GETMETA(cls)           (ISMETA(cls) ? (cls) : (cls)->isa)
+
+
+__BEGIN_DECLS
+
+#define oldcls(cls) ((struct old_class *)cls)
+#define oldprotocol(proto) ((struct old_protocol *)proto)
+#define oldmethod(meth) ((struct old_method *)meth)
+#define oldcategory(cat) ((struct old_category *)cat)
+#define oldivar(ivar) ((struct old_ivar *)ivar)
+#define oldproperty(prop) ((struct old_property *)prop)
+
+extern void unload_class(struct old_class *cls);
+
+extern Class objc_getOrigClass (const char *name);
+extern IMP lookupNamedMethodInMethodList(struct old_method_list *mlist, const char *meth_name);
+extern void _objc_insertMethods(struct old_class *cls, struct old_method_list *mlist, struct old_category *cat);
+extern void _objc_removeMethods(struct old_class *cls, struct old_method_list *mlist);
+extern void _objc_flush_caches (Class cls);
+extern BOOL _class_addProperties(struct old_class *cls, struct old_property_list *additions);
+extern void change_class_references(struct old_class *imposter, struct old_class *original, struct old_class *copy, BOOL changeSuperRefs);
+extern void flush_marked_caches(void);
+extern void set_superclass(struct old_class *cls, struct old_class *supercls, BOOL cls_is_new);
+extern void try_free(const void *p);
+
+extern struct old_property *property_list_nth(const struct old_property_list *plist, uint32_t i);
+extern struct old_property **copyPropertyList(struct old_property_list *plist, unsigned int *outCount);
+
+extern void _class_setInfo(Class cls, long set);
+extern void _class_clearInfo(Class cls, long clear);
+extern void _class_changeInfo(Class cls, long set, long clear);
+
+
+// used by flush_caches outside objc-cache.m
+extern void _cache_flush(Class cls);
+#ifdef OBJC_INSTRUMENTED
+extern unsigned int LinearFlushCachesCount;
+extern unsigned int LinearFlushCachesVisitedCount;
+extern unsigned int MaxLinearFlushCachesVisitedCount;
+extern unsigned int NonlinearFlushCachesCount;
+extern unsigned int NonlinearFlushCachesClassCount;
+extern unsigned int NonlinearFlushCachesVisitedCount;
+extern unsigned int MaxNonlinearFlushCachesVisitedCount;
+extern unsigned int IdealFlushCachesCount;
+extern unsigned int MaxIdealFlushCachesCount;
+#endif
+
+__END_DECLS
+
+#endif