📄 objc-actions.c
字号:
/* * struct objc_category { * char *category_name; * char *class_name; * struct objc_method_list *instance_methods; * struct objc_method_list *class_methods; * }; */static voidbuild_category_template (){ tree decl_specs, field_decl, field_decl_chain; objc_category_template = start_struct (RECORD_TYPE, get_identifier (_TAG_CATEGORY)); /* char *category_name; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_CHAR]); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("category_name")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); field_decl_chain = field_decl; /* char *class_name; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_CHAR]); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("class_name")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); /* struct objc_method_list *instance_methods; */ decl_specs = build_tree_list (NULLT, xref_tag (RECORD_TYPE, get_identifier (_TAG_METHOD_LIST))); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("instance_methods")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); /* struct objc_method_list *class_methods; */ decl_specs = build_tree_list (NULLT, xref_tag (RECORD_TYPE, get_identifier (_TAG_METHOD_LIST))); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("class_methods")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); finish_struct (objc_category_template, field_decl_chain);}/* * struct objc_class { * struct objc_class *isa; * struct objc_class *super_class; * char *name; * long version; * long info; * long instance_size; * struct objc_ivar_list *ivars; * struct objc_method_list *methods; * struct objc_cache *cache; * }; */static voidbuild_class_template (){ tree decl_specs, field_decl, field_decl_chain; objc_class_template = start_struct (RECORD_TYPE, get_identifier (_TAG_CLASS)); /* struct objc_class *isa; */ decl_specs = build_tree_list (NULLT, objc_class_template); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("isa")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); field_decl_chain = field_decl; /* struct objc_class *super_class; */ decl_specs = build_tree_list (NULLT, objc_class_template); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("super_class")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); /* char *name; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_CHAR]); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("name")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); /* long version; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_LONG]); field_decl = get_identifier ("version"); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); /* long info; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_LONG]); field_decl = get_identifier ("info"); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); /* long instance_size; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_LONG]); field_decl = get_identifier ("instance_size"); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); /* struct objc_ivar_list *ivars; */ decl_specs = build_tree_list (NULLT, xref_tag (RECORD_TYPE, get_identifier (_TAG_IVAR_LIST))); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("ivars")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); /* struct objc_method_list *methods; */ decl_specs = build_tree_list (NULLT, xref_tag (RECORD_TYPE, get_identifier (_TAG_METHOD_LIST))); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("methods")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); /* struct objc_cache *cache; */ decl_specs = build_tree_list (NULLT, xref_tag (RECORD_TYPE, get_identifier ("objc_cache"))); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("cache")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); finish_struct (objc_class_template, field_decl_chain);}/* * generate appropriate forward declarations for an implementation */static voidsynth_forward_declarations (){ tree sc_spec, decl_specs, factory_id, anId; /* extern struct objc_class _OBJC_CLASS_<my_name>; */ anId = synth_id_with_class_suffix ("_OBJC_CLASS"); sc_spec = build_tree_list (NULLT, ridpointers[(int) RID_EXTERN]); decl_specs = tree_cons (NULLT, objc_class_template, sc_spec); _OBJC_CLASS_decl = define_decl (anId, decl_specs); /* extern struct objc_class _OBJC_METACLASS_<my_name>; */ anId = synth_id_with_class_suffix ("_OBJC_METACLASS"); _OBJC_METACLASS_decl = define_decl (anId, decl_specs); /* pre-build the following entities - for speed/convenience. */ anId = get_identifier ("super_class"); _clsSuper_ref = build_component_ref (_OBJC_CLASS_decl, anId); __clsSuper_ref = build_component_ref (_OBJC_METACLASS_decl, anId);}static voiderror_with_ivar (message, decl, rawdecl) char *message; tree decl; tree rawdecl;{ count_error (0); fprintf (stderr, "%s:%d: ", DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl)); bzero (errbuf, BUFSIZE); fprintf (stderr, "%s `%s'\n", message, gen_declaration (rawdecl, errbuf));}#define USERTYPE(t) (TREE_CODE (t) == RECORD_TYPE || \ TREE_CODE (t) == UNION_TYPE || \ TREE_CODE (t) == ENUMERAL_TYPE)static voidcheck_ivars (inter, imp) tree inter; tree imp;{ tree intdecls = CLASS_IVARS (inter); tree impdecls = CLASS_IVARS (imp); tree rawintdecls = CLASS_RAW_IVARS (inter); tree rawimpdecls = CLASS_RAW_IVARS (imp); while (1) { tree t1, t2; if (intdecls == 0 && impdecls == 0) break; if (intdecls == 0 || impdecls == 0) { error ("inconsistent instance variable specification"); break; } t1 = TREE_TYPE (intdecls); t2 = TREE_TYPE (impdecls); if (!comptypes (t1, t2)) { if (DECL_NAME (intdecls) == DECL_NAME (impdecls)) { error_with_ivar ("conflicting instance variable type", impdecls, rawimpdecls); error_with_ivar ("previous declaration of", intdecls, rawintdecls); } else /* both the type and the name don't match */ { error ("inconsistent instance variable specification"); break; } } else if (DECL_NAME (intdecls) != DECL_NAME (impdecls)) { error_with_ivar ("conflicting instance variable name", impdecls, rawimpdecls); error_with_ivar ("previous declaration of", intdecls, rawintdecls); } intdecls = TREE_CHAIN (intdecls); impdecls = TREE_CHAIN (impdecls); rawintdecls = TREE_CHAIN (rawintdecls); rawimpdecls = TREE_CHAIN (rawimpdecls); }}/* Set super_type to the data type node for struct objc_super *, first defining struct objc_super itself. This needs to be done just once per compilation. */static treebuild_super_template (){ tree record, decl_specs, field_decl, field_decl_chain; record = start_struct (RECORD_TYPE, get_identifier (_TAG_SUPER)); /* struct objc_object *self; */ decl_specs = build_tree_list (NULLT, objc_object_reference); field_decl = get_identifier ("self"); field_decl = build1 (INDIRECT_REF, NULLT, field_decl); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); field_decl_chain = field_decl; /* struct objc_class *class; */ decl_specs = get_identifier (_TAG_CLASS); decl_specs = build_tree_list (NULLT, xref_tag (RECORD_TYPE, decl_specs)); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("class")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); finish_struct (record, field_decl_chain); /* `struct objc_super *' */ super_type = groktypename (build_tree_list (build_tree_list (NULLT, record), build1 (INDIRECT_REF, NULLT, NULLT))); return record;}/* * struct objc_ivar { * char *ivar_name; * char *ivar_type; * int ivar_offset; * }; */static treebuild_ivar_template (){ tree objc_ivar_id, objc_ivar_record; tree decl_specs, field_decl, field_decl_chain; objc_ivar_id = get_identifier (_TAG_IVAR); objc_ivar_record = start_struct (RECORD_TYPE, objc_ivar_id); /* char *ivar_name; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_CHAR]); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("ivar_name")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); field_decl_chain = field_decl; /* char *ivar_type; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_CHAR]); field_decl = build1 (INDIRECT_REF, NULLT, get_identifier ("ivar_type")); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); /* int ivar_offset; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_INT]); field_decl = get_identifier ("ivar_offset"); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); finish_struct (objc_ivar_record, field_decl_chain); return objc_ivar_record;}/* * struct { * int ivar_count; * struct objc_ivar ivar_list[ivar_count]; * }; */static treebuild_ivar_list_template (list_type, size) tree list_type; int size;{ tree objc_ivar_list_id, objc_ivar_list_record; tree decl_specs, field_decl, field_decl_chain; objc_ivar_list_record = start_struct (RECORD_TYPE, NULLT); /* int ivar_count; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_INT]); field_decl = get_identifier ("ivar_count"); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); field_decl_chain = field_decl; /* struct objc_ivar ivar_list[]; */ decl_specs = build_tree_list (NULLT, list_type); field_decl = build_nt (ARRAY_REF, get_identifier ("ivar_list"), build_int_2 (size, 0)); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); finish_struct (objc_ivar_list_record, field_decl_chain); return objc_ivar_list_record;}/* * struct { * int method_next; * int method_count; * struct objc_method method_list[method_count]; * }; */static treebuild_method_list_template (list_type, size) tree list_type; int size;{ tree objc_ivar_list_id, objc_ivar_list_record; tree decl_specs, field_decl, field_decl_chain; objc_ivar_list_record = start_struct (RECORD_TYPE, NULLT); /* int method_next; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_INT]); field_decl = get_identifier ("method_next"); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); field_decl_chain = field_decl; /* int method_count; */ decl_specs = build_tree_list (NULLT, ridpointers[(int) RID_INT]); field_decl = get_identifier ("method_count"); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); /* struct objc_method method_list[]; */ decl_specs = build_tree_list (NULLT, list_type); field_decl = build_nt (ARRAY_REF, get_identifier ("method_list"), build_int_2 (size, 0)); field_decl = grokfield (input_filename, lineno, field_decl, decl_specs, NULLT); chainon (field_decl_chain, field_decl); finish_struct (objc_ivar_list_record, field_decl_chain); return objc_ivar_list_record;}static treebuild_ivar_list_initializer (field_decl, size) tree field_decl; int *size;{ tree initlist = NULLT; do { int offset; /* set name */ if (DECL_NAME (field_decl)) { offset = add_objc_string (DECL_NAME (field_decl)); initlist = tree_cons (NULLT, build_msg_pool_reference (offset), initlist); } else { /* unnamed bit-field ivar (yuck). */ initlist = tree_cons (NULLT, build_int_2 (0, 0), initlist); } /* set type */ encode_field_decl (field_decl, OBJC_ENCODE_DONT_INLINE_DEFS); offset = add_objc_string (get_identifier (obstack_finish (&util_obstack))); obstack_free (&util_obstack, util_firstobj); initlist = tree_cons (NULLT, build_msg_pool_reference (offset), initlist); /* set offset */ initlist = tree_cons (NULLT, build_int_2 (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field_decl)) / BITS_PER_UNIT, 0), initlist); (*size)++; field_decl = TREE_CHAIN (field_decl); } while (field_decl); return build_nt (CONSTRUCTOR, NULLT, nreverse (initlist));}static treegenerate_ivars_list (type, name, size, list) tree type; char *name; int size; tree list;{ tree sc_spec, decl_specs, decl, initlist; sc_spec = tree_cons (NULLT, ridpointers[(int) RID_STATIC], NULLT); decl_specs = tree_cons (NULLT, type, sc_spec); decl = start_decl (synth_id_with_class_suffix (name), decl_specs, 1); initlist = build_tree_list (NULLT, build_int_2 (size, 0)); initlist = tree_cons (NULLT, list, initlist); finish_decl (decl, build_nt (CONSTRUCTOR, NULLT, nreverse (initlist)), NULLT); return decl;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -