⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objc-actions.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 5 页
字号:
/* *  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 + -