123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- //
- // custom_objc_class.h
- // Objc4_Study
- //
- // Created by huangyirong on 2020/6/27.
- // Copyright © 2020 Sogou. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- # if __arm64__
- # define ISA_MASK 0x0000000ffffffff8ULL
- # elif __x86_64__
- # define ISA_MASK 0x00007ffffffffff8ULL
- # endif
- #ifndef custom_objc_class_h
- #define custom_objc_class_h
- #if __LP64__
- typedef uint32_t mask_t;
- #else
- typedef uint16_t mask_t;
- #endif
- typedef uintptr_t cache_key_t;
- struct bucket_t {
- cache_key_t _key;
- IMP _imp;
- };
- struct cache_t {
- bucket_t *_buckets;
- mask_t _mask;
- mask_t _occupied;
- };
- struct entsize_list_tt {
- uint32_t entsizeAndFlags;
- uint32_t count;
- };
- struct method_t {
- SEL name;
- const char *types;
- IMP imp;
- };
- struct method_list_t : entsize_list_tt {
- method_t first;
- };
- struct ivar_t {
- int32_t *offset;
- const char *name;
- const char *type;
- uint32_t alignment_raw;
- uint32_t size;
- };
- struct ivar_list_t : entsize_list_tt {
- ivar_t first;
- };
- struct property_t {
- const char *name;
- const char *attributes;
- };
- struct property_list_t : entsize_list_tt {
- property_t first;
- };
- struct chained_property_list {
- chained_property_list *next;
- uint32_t count;
- property_t list[0];
- };
- typedef uintptr_t protocol_ref_t;
- struct protocol_list_t {
- uintptr_t count;
- protocol_ref_t list[0];
- };
- struct class_ro_t {
- uint32_t flags;
- uint32_t instanceStart;
- uint32_t instanceSize; // instance对象占用的内存空间
- #ifdef __LP64__
- uint32_t reserved;
- #endif
- const uint8_t * ivarLayout;
- const char * name; // 类名
- method_list_t * baseMethodList;
- protocol_list_t * baseProtocols;
- const ivar_list_t * ivars; // 成员变量列表
- const uint8_t * weakIvarLayout;
- property_list_t *baseProperties;
- };
- struct class_rw_t {
- uint32_t flags;
- uint32_t version;
- const class_ro_t *ro;
- method_list_t * methods; // 方法列表
- property_list_t *properties; // 属性列表
- const protocol_list_t * protocols; // 协议列表
- Class firstSubclass;
- Class nextSiblingClass;
- char *demangledName;
- };
- #define FAST_DATA_MASK 0x00007ffffffffff8UL
- struct class_data_bits_t {
- uintptr_t bits;
- public:
- class_rw_t* data() {
- return (class_rw_t *)(bits & FAST_DATA_MASK);
- }
- };
- /* OC对象 */
- struct custom_objc_object {
- // void *isa;
- Class _Nonnull isa OBJC_ISA_AVAILABILITY;
- };
- /* 类对象 */
- struct custom_objc_class : custom_objc_object {
- Class superclass;
- cache_t cache;
- class_data_bits_t bits;
- public:
- class_rw_t* data() {
- return bits.data();
- }
-
- custom_objc_class* metaClass() {
- return (custom_objc_class *)((long long)isa & ISA_MASK);
- }
- };
- #endif /* custom_objc_class_h */
|