home *** CD-ROM | disk | FTP | other *** search
/ OpenStep (Enterprise) / OpenStepENTCD.toast / OEDEV / DEV.Z / objc-class.h < prev    next >
Text File  |  1996-09-11  |  7KB  |  281 lines

  1. /*
  2.  *    objc-class.h
  3.  *    Copyright 1988-1996, NeXT Software, Inc.
  4.  */
  5.  
  6. #ifndef _OBJC_CLASS_H_
  7. #define _OBJC_CLASS_H_
  8.  
  9. #import <objc/objc.h>
  10. #import <objc/zone.h>
  11. /* 
  12.  *    Class Template
  13.  */
  14. struct objc_class {            
  15.     struct objc_class *isa;    
  16.     struct objc_class *super_class;    
  17.     const char *name;        
  18.     long version;
  19.     long info;
  20.     long instance_size;
  21.     struct objc_ivar_list *ivars;
  22.  
  23. #if defined(Release3CompatibilityBuild)
  24.     struct objc_method_list *methods;
  25. #else
  26.     struct objc_method_list **methodLists;
  27. #endif
  28.  
  29.     struct objc_cache *cache;
  30.      struct objc_protocol_list *protocols;
  31. };
  32. #define CLS_GETINFO(cls,infomask)    ((cls)->info & infomask)
  33. #define CLS_SETINFO(cls,infomask)    ((cls)->info |= infomask)
  34.  
  35. #define CLS_CLASS        0x1L
  36. #define CLS_META        0x2L
  37. #define CLS_INITIALIZED        0x4L
  38. #define CLS_POSING        0x8L
  39. #define CLS_MAPPED        0x10L
  40. #define CLS_FLUSH_CACHE        0x20L
  41. #define CLS_GROW_CACHE        0x40L
  42. #define CLS_METHOD_ARRAY        0x100L
  43. /* 
  44.  *    Category Template
  45.  */
  46. typedef struct objc_category *Category;
  47.  
  48. struct objc_category {
  49.     char *category_name;
  50.     char *class_name;
  51.     struct objc_method_list *instance_methods;
  52.     struct objc_method_list *class_methods;
  53.      struct objc_protocol_list *protocols;
  54. };
  55. /* 
  56.  *    Instance Variable Template
  57.  */
  58. typedef struct objc_ivar *Ivar;
  59.  
  60. struct objc_ivar_list {
  61.     int ivar_count;
  62. #ifdef __alpha__
  63.     int space;
  64. #endif
  65.     struct objc_ivar {
  66.         char *ivar_name;
  67.         char *ivar_type;
  68.         int ivar_offset;
  69. #ifdef __alpha__
  70.         int space;
  71. #endif
  72.     } ivar_list[1];            /* variable length structure */
  73. };
  74. /* 
  75.  *    Method Template
  76.  */
  77. typedef struct objc_method *Method;
  78.  
  79. struct objc_method_list {
  80. #if defined(Release3CompatibilityBuild)
  81.         struct objc_method_list *method_next;
  82. #else
  83.     struct objc_method_list *obsolete;
  84. #endif
  85.  
  86.     int method_count;
  87. #ifdef __alpha__
  88.     int space;
  89. #endif
  90.     struct objc_method {
  91.         SEL method_name;
  92.         char *method_types;
  93.                 IMP method_imp;
  94.     } method_list[1];        /* variable length structure */
  95. };
  96.  
  97. /* Protocol support */
  98.  
  99. @class Protocol;
  100.  
  101. struct objc_protocol_list {
  102.     struct objc_protocol_list *next;
  103.     int count;
  104.     Protocol *list[1];
  105. };
  106.  
  107. /* Definitions of filer types */
  108.  
  109. #define _C_ID        '@'
  110. #define _C_CLASS    '#'
  111. #define _C_SEL        ':'
  112. #define _C_CHR        'c'
  113. #define _C_UCHR        'C'
  114. #define _C_SHT        's'
  115. #define _C_USHT        'S'
  116. #define _C_INT        'i'
  117. #define _C_UINT        'I'
  118. #define _C_LNG        'l'
  119. #define _C_ULNG        'L'
  120. #define _C_FLT        'f'
  121. #define _C_DBL        'd'
  122. #define _C_BFLD        'b'
  123. #define _C_VOID        'v'
  124. #define _C_UNDEF    '?'
  125. #define _C_PTR        '^'
  126. #define _C_CHARPTR    '*'
  127. #define _C_ARY_B    '['
  128. #define _C_ARY_E    ']'
  129. #define _C_UNION_B    '('
  130. #define _C_UNION_E    ')'
  131. #define _C_STRUCT_B    '{'
  132. #define _C_STRUCT_E    '}'
  133.  
  134. /* Structure for method cache - allocated/sized at runtime */
  135.  
  136. typedef struct objc_cache *Cache;
  137.  
  138. #ifdef OBJC_COPY_CACHE
  139.  
  140. #define CACHE_BUCKET_NAME(B)  ((B).method_name)
  141. #define CACHE_BUCKET_IMP(B)   ((B).method_imp)
  142. #define CACHE_BUCKET_VALID(B) ((B).method_name)
  143. struct objc_cache_bucket {
  144.   SEL method_name;
  145.   IMP method_imp;
  146. };
  147.  
  148. struct objc_cache {
  149.     unsigned int mask;            /* total = mask + 1 */
  150.     unsigned int occupied;        
  151.     struct objc_cache_bucket buckets[1];
  152. };
  153.  
  154. #else
  155.  
  156. #define CACHE_BUCKET_NAME(B)  ((B)->method_name)
  157. #define CACHE_BUCKET_IMP(B)   ((B)->method_imp)
  158. #define CACHE_BUCKET_VALID(B) (B)
  159. struct objc_cache {
  160.     unsigned int mask;            /* total = mask + 1 */
  161.     unsigned int occupied;        
  162.     Method buckets[1];
  163. };
  164. #endif
  165.  
  166. /* operations */
  167.  
  168. OBJC_EXPORT id class_createInstance(Class, unsigned idxIvars);
  169. OBJC_EXPORT id class_createInstanceFromZone(Class, unsigned idxIvars, NXZone *zone);
  170.  
  171. OBJC_EXPORT void class_setVersion(Class, int);
  172. OBJC_EXPORT int class_getVersion(Class);
  173.  
  174. OBJC_EXPORT Ivar class_getInstanceVariable(Class, const char *);
  175. OBJC_EXPORT Method class_getInstanceMethod(Class, SEL);
  176. OBJC_EXPORT Method class_getClassMethod(Class, SEL);
  177.  
  178. OBJC_EXPORT void class_addMethods(Class, struct objc_method_list *);
  179. OBJC_EXPORT void class_removeMethods(Class, struct objc_method_list *);
  180.  
  181. OBJC_EXPORT Class class_poseAs(Class imposter, Class original);
  182.  
  183. OBJC_EXPORT unsigned method_getNumberOfArguments(Method);
  184. OBJC_EXPORT unsigned method_getSizeOfArguments(Method);
  185. OBJC_EXPORT unsigned method_getArgumentInfo(Method m, int arg, const char **type, int *offset);
  186. OBJC_EXPORT const char * NSModulePathForClass (Class aClass);
  187.  
  188. // usage for nextMethodList
  189. //
  190. // void *iterator = 0;
  191. // struct objc_method_list *mlist;
  192. // while ( mlist = class_nextMethodList( cls, &iterator ) )
  193. //    ;
  194. #define OBJC_NEXT_METHOD_LIST 1
  195. OBJC_EXPORT struct objc_method_list *class_nextMethodList(Class, void **);
  196.  
  197. typedef void *marg_list;
  198.  
  199. #if hppa
  200.  
  201. #define marg_malloc(margs, method) \
  202.     do { \
  203.         unsigned int _sz = (7 + method_getSizeOfArguments(method)) & ~7; \
  204.         char *_ml = (char *)malloc(_sz + sizeof(marg_list)); \
  205.         void    **_z ; \
  206.         margs = (marg_list *)(_ml + _sz); \
  207.         _z = margs; \
  208.         *_z = (marg_list)_ml; \
  209.     } while (0)
  210.  
  211. #define marg_free(margs) \
  212.     do { \
  213.         void    **_z = margs; \
  214.         free(*_z); \
  215.     } while (0)
  216.     
  217. #define marg_adjustedOffset(method, offset) \
  218.     ( (!offset) ? -(sizeof(id)) : offset)
  219.  
  220. #else
  221.  
  222. #define marg_malloc(margs, method) \
  223.     do { \
  224.         margs = (marg_list *)malloc ((7 + method_getSizeOfArguments(method)) & ~7); \
  225.     } while (0)
  226.  
  227.  
  228. #define marg_free(margs) \
  229.     do { \
  230.         free(margs); \
  231.     } while (0)
  232.     
  233. #define marg_adjustedOffset(method, offset) \
  234.     (offset)
  235.  
  236. #endif /* hppa */
  237.  
  238.  
  239. #define marg_getRef(margs, offset, type) \
  240.     ( (type *)((char *)margs + marg_adjustedOffset(method,offset) ) )
  241.  
  242. #define marg_getValue(margs, offset, type) \
  243.     ( *marg_getRef(margs, offset, type) )
  244.  
  245. #define marg_setValue(margs, offset, type, value) \
  246.     ( marg_getValue(margs, offset, type) = (value) )
  247.  
  248. /* Load categories and non-referenced classes from libraries. */
  249. #if defined(NeXT_PDO)
  250. #if defined(hpux)
  251.  
  252. #define OBJC_REGISTER_SYMBOL(NAME) asm("._" #NAME "=0\n .globl ._" #NAME "\n")
  253. #define OBJC_REFERENCE_SYMBOL(NAME) asm(".word ._" #NAME "\n")
  254. #define OBJC_REGISTER_CATEGORY(NAME) asm("._" #NAME "=0\n .globl ._" #NAME "\n")
  255. #define OBJC_REFERENCE_CATEGORY(NAME) asm(".word ._" #NAME "\n")
  256. #define OBJC_REFERENCE_CLASS_CATEGORY(CL, CAT) asm(".word .objc_category_name_" #CL "_" #CAT "\n")
  257. #define OBJC_REFERENCE_CLASS(NAME) asm(".word .objc_class_name_" #NAME "\n")
  258.  
  259. #elif defined(__osf__)
  260.  
  261. #define OBJC_REGISTER_SYMBOL(NAME) asm(".globl ._" #NAME "\n\t.align 3\n._" #NAME ":\n\t.quad 0\n")
  262. #define OBJC_REFERENCE_SYMBOL(NAME) asm(".align 3\n\t.quad ._" #NAME "\n")
  263. #define OBJC_REGISTER_CATEGORY(NAME) asm(".globl ._" #NAME "\n\t.align 3\n._" #NAME ":\n\t.quad 0\n")
  264. #define OBJC_REFERENCE_CATEGORY(NAME) asm(".align 3\n\t.quad ._" #NAME "\n")
  265. #define OBJC_REFERENCE_CLASS_CATEGORY(CL, CAT) asm(".align 3\n\t.quad .objc_category_name_" #CL "_" #CAT "\n")
  266. #define OBJC_REFERENCE_CLASS(NAME) asm(".quad .objc_class_name_" #NAME "\n")
  267.  
  268. #else    /* Solaris || SunOS */
  269.  
  270. #define OBJC_REGISTER_SYMBOL(NAME) asm("._" #NAME "=0\n .globl ._" #NAME "\n")
  271. #define OBJC_REFERENCE_SYMBOL(NAME) asm(".global ._" #NAME "\n")
  272. #define OBJC_REGISTER_CATEGORY(NAME) asm("._" #NAME "=0\n .globl ._" #NAME "\n")
  273. #define OBJC_REFERENCE_CATEGORY(NAME) asm(".global ._" #NAME "\n")
  274. #define OBJC_REFERENCE_CLASS_CATEGORY(CL, CAT) asm(".global .objc_category_name_" #CL "_" #CAT "\n")
  275. #define OBJC_REFERENCE_CLASS(NAME) asm(".global .objc_class_name_" #NAME "\n")
  276.  
  277. #endif /* hpux */
  278. #endif /* NeXT_PDO */
  279.  
  280. #endif /* _OBJC_CLASS_H_ */
  281.