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

📄 objc-act.c

📁 gcc库的原代码,对编程有很大帮助.
💻 C
📖 第 1 页 / 共 5 页
字号:
/* Implement classes and message passing for Objective C.   Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.   Contributed by Steve Naroff.This file is part of GNU CC.GNU CC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GNU CC is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING.  If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330,Boston, MA 02111-1307, USA.  *//* Purpose: This module implements the Objective-C 4.0 language.   compatibility issues (with the Stepstone translator):   - does not recognize the following 3.3 constructs.     @requires, @classes, @messages, = (...)   - methods with variable arguments must conform to ANSI standard.   - tagged structure definitions that appear in BOTH the interface     and implementation are not allowed.   - public/private: all instance variables are public within the     context of the implementation...I consider this to be a bug in     the translator.   - statically allocated objects are not supported. the user will     receive an error if this service is requested.   code generation `options':   - OBJC_INT_SELECTORS  */#include <stdio.h>#include "config.h"#include "tree.h"#include "c-tree.h"#include "c-lex.h"#include "flags.h"#include "objc-act.h"#include "input.h"#include "function.h"/* This is the default way of generating a method name.  *//* I am not sure it is really correct.   Perhaps there's a danger that it will make name conflicts   if method names contain underscores. -- rms.  */#ifndef OBJC_GEN_METHOD_LABEL#define OBJC_GEN_METHOD_LABEL(BUF, IS_INST, CLASS_NAME, CAT_NAME, SEL_NAME, NUM) \  do {					    \    char *temp;				    \    sprintf ((BUF), "_%s_%s_%s_%s",	    \	     ((IS_INST) ? "i" : "c"),	    \	     (CLASS_NAME),		    \	     ((CAT_NAME)? (CAT_NAME) : ""), \	     (SEL_NAME));		    \    for (temp = (BUF); *temp; temp++)	    \      if (*temp == ':') *temp = '_';	    \  } while (0)#endif/* These need specifying.  */#ifndef OBJC_FORWARDING_STACK_OFFSET#define OBJC_FORWARDING_STACK_OFFSET 0#endif#ifndef OBJC_FORWARDING_MIN_OFFSET#define OBJC_FORWARDING_MIN_OFFSET 0#endif/* Define the special tree codes that we use.  *//* Table indexed by tree code giving a string containing a character   classifying the tree code.  Possibilities are   t, d, s, c, r, <, 1 and 2.  See objc-tree.def for details.  */#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,char *objc_tree_code_type[] = {  "x",#include "objc-tree.def"};#undef DEFTREECODE/* Table indexed by tree code giving number of expression   operands beyond the fixed part of the node structure.   Not used for types or decls.  */#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,int objc_tree_code_length[] = {  0,#include "objc-tree.def"};#undef DEFTREECODE/* Names of tree components.   Used for printing out the tree and error messages.  */#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,char *objc_tree_code_name[] = {  "@@dummy",#include "objc-tree.def"};#undef DEFTREECODE/* Set up for use of obstacks.  */#include "obstack.h"#define obstack_chunk_alloc xmalloc#define obstack_chunk_free free/* This obstack is used to accumulate the encoding of a data type.  */static struct obstack util_obstack;/* This points to the beginning of obstack contents,   so we can free the whole contents.  */char *util_firstobj;/* List of classes with list of their static instances.  */static tree objc_static_instances;/* The declaration of the array administrating the static instances.  */static tree static_instances_decl;/* for encode_method_def */#include "rtl.h"#include "c-parse.h"#define OBJC_VERSION	(flag_next_runtime ? 5 : 7)#define PROTOCOL_VERSION 2#define OBJC_ENCODE_INLINE_DEFS 	0#define OBJC_ENCODE_DONT_INLINE_DEFS	1/*** Private Interface (procedures) ***//* Used by compile_file. */static void init_objc				PROTO((void));static void finish_objc				PROTO((void));/* Code generation. */static void synth_module_prologue		PROTO((void));static tree build_constructor			PROTO((tree, tree));static char *build_module_descriptor		PROTO((void));static tree init_module_descriptor		PROTO((tree));static tree build_objc_method_call		PROTO((int, tree, tree,						       tree, tree, tree));static void generate_strings			PROTO((void));static tree get_proto_encoding 			PROTO((tree));static void build_selector_translation_table	PROTO((void));static tree build_ivar_chain			PROTO((tree, int));static tree objc_add_static_instance		PROTO((tree, tree));static tree build_ivar_template			PROTO((void));static tree build_method_template		PROTO((void));static tree build_private_template		PROTO((tree));static void build_class_template		PROTO((void));static void build_selector_template		PROTO((void));static void build_category_template		PROTO((void));static tree build_super_template		PROTO((void));static tree build_category_initializer		PROTO((tree, tree, tree,						       tree, tree, tree));static tree build_protocol_initializer		PROTO((tree, tree, tree,						       tree, tree));static void synth_forward_declarations		PROTO((void));static void generate_ivar_lists			PROTO((void));static void generate_dispatch_tables		PROTO((void));static void generate_shared_structures		PROTO((void));static tree generate_protocol_list		PROTO((tree));static void generate_forward_declaration_to_string_table PROTO((void));static void build_protocol_reference		PROTO((tree));static tree init_selector			PROTO((int));static tree build_keyword_selector		PROTO((tree));static tree synth_id_with_class_suffix		PROTO((char *, tree));/* From expr.c */extern int apply_args_register_offset           PROTO((int));/* Misc. bookkeeping */typedef struct hashed_entry 	*hash;typedef struct hashed_attribute  *attr;struct hashed_attribute{  attr next;  tree value;};struct hashed_entry{  attr list;  hash next;  tree key;};static void hash_init				PROTO((void));static void hash_enter				PROTO((hash *, tree));static hash hash_lookup				PROTO((hash *, tree));static void hash_add_attr			PROTO((hash, tree));static tree lookup_method			PROTO((tree, tree));static tree lookup_instance_method_static	PROTO((tree, tree));static tree lookup_class_method_static		PROTO((tree, tree));static tree add_class				PROTO((tree));static void add_category			PROTO((tree, tree));enum string_section{  class_names,		/* class, category, protocol, module names */  meth_var_names,	/* method and variable names */  meth_var_types	/* method and variable type descriptors */};static tree add_objc_string			PROTO((tree,						       enum string_section));static tree build_objc_string_decl		PROTO((tree,						       enum string_section));static tree build_selector_reference_decl	PROTO((tree));/* Protocol additions. */static tree add_protocol			PROTO((tree));static tree lookup_protocol			PROTO((tree));static tree lookup_and_install_protocols	PROTO((tree));/* Type encoding. */static void encode_type_qualifiers		PROTO((tree));static void encode_pointer			PROTO((tree, int, int));static void encode_array			PROTO((tree, int, int));static void encode_aggregate			PROTO((tree, int, int));static void encode_bitfield			PROTO((int, int));static void encode_type				PROTO((tree, int, int));static void encode_field_decl			PROTO((tree, int, int));static void really_start_method			PROTO((tree, tree));static int comp_method_with_proto		PROTO((tree, tree));static int comp_proto_with_proto		PROTO((tree, tree));static tree get_arg_type_list			PROTO((tree, int, int));static tree expr_last				PROTO((tree));/* Utilities for debugging and error diagnostics. */static void warn_with_method			PROTO((char *, int, tree));static void error_with_ivar			PROTO((char *, tree, tree));static char *gen_method_decl			PROTO((tree, char *));static char *gen_declaration			PROTO((tree, char *));static char *gen_declarator			PROTO((tree, char *, char *));static int is_complex_decl			PROTO((tree));static void adorn_decl				PROTO((tree, char *));static void dump_interface			PROTO((FILE *, tree));/* Everything else. */static void objc_fatal				PROTO((void));static tree define_decl				PROTO((tree, tree));static tree lookup_method_in_protocol_list	PROTO((tree, tree, int));static tree lookup_protocol_in_reflist		PROTO((tree, tree));static tree create_builtin_decl			PROTO((enum tree_code,						       tree, char *));static tree my_build_string			PROTO((int, char *));static void build_objc_symtab_template		PROTO((void));static tree init_def_list			PROTO((tree));static tree init_objc_symtab			PROTO((tree));static void forward_declare_categories		PROTO((void));static void generate_objc_symtab_decl		PROTO((void));static tree build_selector			PROTO((tree));static tree build_msg_pool_reference		PROTO((int));static tree build_typed_selector_reference     	PROTO((tree, tree));static tree build_selector_reference		PROTO((tree));static tree build_class_reference_decl		PROTO((tree));static void add_class_reference			PROTO((tree));static tree objc_copy_list			PROTO((tree, tree *));static tree build_protocol_template		PROTO((void));static tree build_descriptor_table_initializer	PROTO((tree, tree));static tree build_method_prototype_list_template PROTO((tree, int));static tree build_method_prototype_template	PROTO((void));static int forwarding_offset			PROTO((tree));static tree encode_method_prototype		PROTO((tree, tree));static tree generate_descriptor_table		PROTO((tree, char *, int, tree, tree));static void generate_method_descriptors		PROTO((tree));static tree build_tmp_function_decl		PROTO((void));static void hack_method_prototype		PROTO((tree, tree));static void generate_protocol_references	PROTO((tree));static void generate_protocols			PROTO((void));static void check_ivars				PROTO((tree, tree));static tree build_ivar_list_template		PROTO((tree, int));static tree build_method_list_template		PROTO((tree, int));static tree build_ivar_list_initializer		PROTO((tree, tree));static tree generate_ivars_list			PROTO((tree, char *,						       int, tree));static tree build_dispatch_table_initializer	PROTO((tree, tree));static tree generate_dispatch_table		PROTO((tree, char *,						       int, tree));static tree build_shared_structure_initializer	PROTO((tree, tree, tree, tree,						       tree, int, tree, tree,						       tree));static void generate_category			PROTO((tree));static int is_objc_type_qualifier		PROTO((tree));static tree adjust_type_for_id_default		PROTO((tree));static tree check_duplicates			PROTO((hash));static tree receiver_is_class_object		PROTO((tree));static int check_methods			PROTO((tree, tree, int));static int conforms_to_protocol			PROTO((tree, tree));static void check_protocols			PROTO((tree, char *, char *));static tree encode_method_def			PROTO((tree));static void gen_declspecs			PROTO((tree, char *, int));static void generate_classref_translation_entry	PROTO((tree));static void handle_class_ref			PROTO((tree));/*** Private Interface (data) ***//* Reserved tag definitions. */#define TYPE_ID			"id"#define TAG_OBJECT		"objc_object"#define TAG_CLASS		"objc_class"#define TAG_SUPER		"objc_super"#define TAG_SELECTOR		"objc_selector"#define UTAG_CLASS		"_objc_class"#define UTAG_IVAR		"_objc_ivar"#define UTAG_IVAR_LIST		"_objc_ivar_list"#define UTAG_METHOD		"_objc_method"#define UTAG_METHOD_LIST	"_objc_method_list"#define UTAG_CATEGORY		"_objc_category"#define UTAG_MODULE		"_objc_module"#define UTAG_STATICS		"_objc_statics"#define UTAG_SYMTAB		"_objc_symtab"#define UTAG_SUPER		"_objc_super"#define UTAG_SELECTOR		"_objc_selector"#define UTAG_PROTOCOL		"_objc_protocol"#define UTAG_PROTOCOL_LIST	"_objc_protocol_list"#define UTAG_METHOD_PROTOTYPE	"_objc_method_prototype"#define UTAG_METHOD_PROTOTYPE_LIST "_objc__method_prototype_list"#define STRING_OBJECT_CLASS_NAME "NXConstantString"#define PROTOCOL_OBJECT_CLASS_NAME "Protocol"static char *TAG_GETCLASS;static char *TAG_GETMETACLASS;static char *TAG_MSGSEND;static char *TAG_MSGSENDSUPER;static char *TAG_EXECCLASS;/* Set by `continue_class' and checked by `is_public'.  */#define TREE_STATIC_TEMPLATE(record_type) (TREE_PUBLIC (record_type))#define TYPED_OBJECT(type) \       (TREE_CODE (type) == RECORD_TYPE && TREE_STATIC_TEMPLATE (type))/* Some commonly used instances of "identifier_node".  */static tree self_id, ucmd_id;static tree unused_list;static tree self_decl, umsg_decl, umsg_super_decl;static tree objc_get_class_decl, objc_get_meta_class_decl;static tree super_type, selector_type, id_type, objc_class_type;static tree instance_type, protocol_type;/* Type checking macros.  */#define IS_ID(TYPE) \  (TYPE_MAIN_VARIANT (TYPE) == TYPE_MAIN_VARIANT (id_type))#define IS_PROTOCOL_QUALIFIED_ID(TYPE) \  (IS_ID (TYPE) && TYPE_PROTOCOL_LIST (TYPE))#define IS_SUPER(TYPE) \  (super_type && TYPE_MAIN_VARIANT (TYPE) == TYPE_MAIN_VARIANT (super_type))static tree class_chain = NULL_TREE;static tree alias_chain = NULL_TREE;static tree interface_chain = NULL_TREE;static tree protocol_chain = NULL_TREE;/* Chains to manage selectors that are referenced and defined in the module. */static tree cls_ref_chain = NULL_TREE;	/* Classes referenced. */static tree sel_ref_chain = NULL_TREE;	/* Selectors referenced. *//* Chains to manage uniquing of strings. */static tree class_names_chain = NULL_TREE;static tree meth_var_names_chain = NULL_TREE;static tree meth_var_types_chain = NULL_TREE;/* Hash tables to manage the global pool of method prototypes. */static hash *nst_method_hash_list = 0;static hash *cls_method_hash_list = 0;/* Backend data declarations. */static tree UOBJC_SYMBOLS_decl;static tree UOBJC_INSTANCE_VARIABLES_decl, UOBJC_CLASS_VARIABLES_decl;static tree UOBJC_INSTANCE_METHODS_decl, UOBJC_CLASS_METHODS_decl;static tree UOBJC_CLASS_decl, UOBJC_METACLASS_decl;static tree UOBJC_SELECTOR_TABLE_decl;static tree UOBJC_MODULES_decl;static tree UOBJC_STRINGS_decl;/* The following are used when compiling a class implementation.   implementation_template will normally be an interface, however if   none exists this will be equal to implementation_context...it is   set in start_class.  */static tree implementation_context = NULL_TREE;static tree implementation_template = NULL_TREE;struct imp_entry{  struct imp_entry *next;  tree imp_context;  tree imp_template;  tree class_decl;		/* _OBJC_CLASS_<my_name>; */  tree meta_decl;		/* _OBJC_METACLASS_<my_name>; */};static void handle_impent			PROTO((struct imp_entry *));static struct imp_entry *imp_list = 0;static int imp_count = 0;	/* `@implementation' */static int cat_count = 0;	/* `@category' */static tree objc_class_template, objc_category_template, uprivate_record;static tree objc_protocol_template, objc_selector_template;static tree ucls_super_ref, uucls_super_ref;static tree objc_method_template, objc_ivar_template;static tree objc_symtab_template, objc_module_template;static tree objc_super_template, objc_object_reference;static tree objc_object_id, objc_class_id, objc_id_id;static tree constant_string_id;static tree constant_string_type;static tree UOBJC_SUPER_decl;static tree method_context = NULL_TREE;static int  method_slot = 0;	/* Used by start_method_def, */#define BUFSIZE		1024static char *errbuf;	/* Buffer for error diagnostics *//* Data imported from tree.c. */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -