Annotation of objc/objc-class.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.0 (the 'License').  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License."
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: /*
                     25:  *     objc-class.h
                     26:  *     Copyright 1988, NeXT, Inc.
                     27:  */
                     28: 
                     29: #ifndef _OBJC_CLASS_H_
                     30: #define _OBJC_CLASS_H_
                     31: 
                     32: #import "objc.h"
                     33: #import <objc/zone.h>
                     34: /* 
                     35:  *     Class Template
                     36:  */
                     37: struct objc_class {                    
                     38:        struct objc_class *isa; 
                     39:        struct objc_class *super_class; 
                     40:        const char *name;               
                     41:        long version;
                     42:        long info;
                     43:        long instance_size;
                     44:        struct objc_ivar_list *ivars;
                     45:        struct objc_method_list *methods;
                     46:        struct objc_cache *cache;
                     47:        struct objc_protocol_list *protocols;
                     48: };
                     49: #define CLS_GETINFO(cls,infomask)      ((cls)->info & infomask)
                     50: #define CLS_SETINFO(cls,infomask)      ((cls)->info |= infomask)
                     51: 
                     52: #define CLS_CLASS              0x1L
                     53: #define CLS_META               0x2L
                     54: #define CLS_INITIALIZED                0x4L
                     55: #define CLS_POSING             0x8L
                     56: #define CLS_MAPPED             0x10L
                     57: #define CLS_FLUSH_CACHE                0x20L
                     58: #define CLS_GROW_CACHE         0x40L
                     59: /* 
                     60:  *     Category Template
                     61:  */
                     62: typedef struct objc_category *Category;
                     63: 
                     64: struct objc_category {
                     65:        char *category_name;
                     66:        char *class_name;
                     67:        struct objc_method_list *instance_methods;
                     68:        struct objc_method_list *class_methods;
                     69:        struct objc_protocol_list *protocols;
                     70: };
                     71: /* 
                     72:  *     Instance Variable Template
                     73:  */
                     74: typedef struct objc_ivar *Ivar;
                     75: 
                     76: struct objc_ivar_list {
                     77:        int ivar_count;
                     78:        struct objc_ivar {
                     79:                char *ivar_name;
                     80:                char *ivar_type;
                     81:                int ivar_offset;
                     82:        } ivar_list[1];                 /* variable length structure */
                     83: };
                     84: /* 
                     85:  *     Method Template
                     86:  */
                     87: typedef struct objc_method *Method;
                     88: 
                     89: struct objc_method_list {
                     90:        struct objc_method_list *method_next;
                     91:        int method_count;
                     92:        struct objc_method {
                     93:                SEL method_name;
                     94:                char *method_types;
                     95:                 IMP method_imp;
                     96:        } method_list[1];               /* variable length structure */
                     97: };
                     98: 
                     99: /* Protocol support */
                    100: 
                    101: @class Protocol;
                    102: 
                    103: struct objc_protocol_list {
                    104:        struct objc_protocol_list *next;
                    105:        int count;
                    106:        Protocol *list[1];
                    107: };
                    108: 
                    109: /* Definitions of filer types */
                    110: 
                    111: #define _C_ID          '@'
                    112: #define _C_CLASS       '#'
                    113: #define _C_SEL         ':'
                    114: #define _C_CHR         'c'
                    115: #define _C_UCHR                'C'
                    116: #define _C_SHT         's'
                    117: #define _C_USHT                'S'
                    118: #define _C_INT         'i'
                    119: #define _C_UINT                'I'
                    120: #define _C_LNG         'l'
                    121: #define _C_ULNG                'L'
                    122: #define _C_FLT         'f'
                    123: #define _C_DBL         'd'
                    124: #define _C_BFLD                'b'
                    125: #define _C_VOID                'v'
                    126: #define _C_UNDEF       '?'
                    127: #define _C_PTR         '^'
                    128: #define _C_CHARPTR     '*'
                    129: #define _C_ARY_B       '['
                    130: #define _C_ARY_E       ']'
                    131: #define _C_UNION_B     '('
                    132: #define _C_UNION_E     ')'
                    133: #define _C_STRUCT_B    '{'
                    134: #define _C_STRUCT_E    '}'
                    135: 
                    136: /* Structure for method cache - allocated/sized at runtime */
                    137: 
                    138: typedef struct objc_cache *Cache;
                    139: 
                    140: #ifdef OBJC_COPY_CACHE
                    141: 
                    142: #define CACHE_BUCKET_NAME(B)  ((B).method_name)
                    143: #define CACHE_BUCKET_IMP(B)   ((B).method_imp)
                    144: #define CACHE_BUCKET_VALID(B) ((B).method_name)
                    145: struct objc_cache_bucket {
                    146:   SEL method_name;
                    147:   IMP method_imp;
                    148: };
                    149: 
                    150: struct objc_cache {
                    151:        unsigned int mask;            /* total = mask + 1 */
                    152:        unsigned int occupied;        
                    153:        struct objc_cache_bucket buckets[1];
                    154: };
                    155: 
                    156: #else
                    157: 
                    158: #define CACHE_BUCKET_NAME(B)  ((B)->method_name)
                    159: #define CACHE_BUCKET_IMP(B)   ((B)->method_imp)
                    160: #define CACHE_BUCKET_VALID(B) (B)
                    161: struct objc_cache {
                    162:        unsigned int mask;            /* total = mask + 1 */
                    163:        unsigned int occupied;        
                    164:        Method buckets[1];
                    165: };
                    166: #endif
                    167: 
                    168: /* operations */
                    169: 
                    170: extern id class_createInstance(Class, unsigned idxIvars);
                    171: extern id class_createInstanceFromZone(Class, unsigned idxIvars, NXZone *zone);
                    172: 
                    173: extern void class_setVersion(Class, int);
                    174: extern int class_getVersion(Class);
                    175: 
                    176: extern Ivar class_getInstanceVariable(Class, const char *);
                    177: extern Method class_getInstanceMethod(Class, SEL);
                    178: extern Method class_getClassMethod(Class, SEL);
                    179: 
                    180: extern void class_addMethods(Class, struct objc_method_list *);
                    181: extern void class_removeMethods(Class, struct objc_method_list *);
                    182: 
                    183: extern Class class_poseAs(Class imposter, Class original);
                    184: 
                    185: extern unsigned method_getNumberOfArguments(Method);
                    186: extern unsigned method_getSizeOfArguments(Method);
                    187: extern unsigned method_getArgumentInfo(Method m, int arg, const char **type, int *offset);
                    188: 
                    189: typedef void *marg_list;
                    190: 
                    191: #define marg_getRef(margs, offset, type) \
                    192:        ( (type *)((char *)margs + offset) )
                    193: 
                    194: #define marg_getValue(margs, offset, type) \
                    195:        ( *marg_getRef(margs, offset, type) )
                    196: 
                    197: #define marg_setValue(margs, offset, type, value) \
                    198:        ( marg_getValue(margs, offset, type) = (value) )
                    199: 
                    200: #endif /* _OBJC_CLASS_H_ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.