00001 #
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 # include "parm.h"
00022 # include "pass1/stt/sttdefs.h"
00023 # include "stree/ststructs.mh"
00024 # include "Idtable.h"
00025
00026 extern NODE * usl_ptr;
00027
00028 static NODE * idnode;
00029 static NODE ** prevdef_field;
00030
00031 Identry * retrieve();
00032
00033 add_id(defnode, scopenode)
00034 NODE * defnode, * scopenode;
00035 { Identry * ip;
00036
00037 findfields(defnode);
00038
00039 switch(defnode->kind) {
00040 case DECLARATION:
00041 defnode->decl_scope = scopenode;
00042 break;
00043 case PARAMETER:
00044 defnode->par_scope = scopenode;
00045 break;
00046 default:
00047 if (idnode != NIL) idnode -> id_last_definition = defnode;
00048 break;
00049 }
00050
00051 if (idnode == NIL) return;
00052 idnode->id_use_list = usl_ptr;
00053 ip = retrieve(idnode->id_str_table_index);
00054 *prevdef_field = ip->i_value;
00055 ip->i_value = defnode;
00056 }
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 static findfields(defnode)
00068 NODE * defnode;
00069 {
00070 switch(defnode->kind) {
00071 case DECLARATION:
00072 idnode = defnode->decl_id;
00073 prevdef_field = &(defnode->decl_previous_definition);
00074 break;
00075 case PARAMETER:
00076 idnode = defnode->par_id;
00077 prevdef_field = &(defnode->par_previous_definition);
00078 break;
00079 case TYPESIGNATURE:
00080 idnode = defnode->ts_local_type_id;
00081 prevdef_field = &(defnode->ts_previous_definition);
00082 break;
00083 case UNIONCONSTRUCTION:
00084 case PRODCONSTRUCTION:
00085 idnode = defnode->prod_local_type_id;
00086 prevdef_field = &(defnode->prod_previous_definition);
00087 break;
00088 case MODPRIMARY:
00089 {
00090 NODE * modifier = defnode -> mp_type_modifier;
00091
00092 switch(modifier -> kind){
00093 case WITHLIST:
00094 idnode = modifier->wl_local_type_id;
00095 prevdef_field = &(modifier->wl_previous_definition);
00096 break;
00097 case EXPORTLIST:
00098 case HIDELIST:
00099 idnode = modifier->el_local_type_id;
00100 prevdef_field = &(modifier->el_previous_definition);
00101 break;
00102 }
00103 }
00104 break;
00105 # ifdef DEBUG
00106 default:
00107 dbgmsg("add_id: bad defnode: kind=%s\n",
00108 kindname(defnode->kind));
00109 # endif
00110 }
00111 }