00001 #
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 # include "parm.h"
00016 # include "pass1/stt/sttdefs.h"
00017 # include "stree/ststructs.mh"
00018 # include "Idtable.h"
00019 # define DEBUG yes
00020
00021 restore(defnode)
00022 NODE * defnode;
00023 { Identry * ip;
00024 NODE * idnode;
00025 NODE **prevdef_field;
00026
00027 switch(defnode->kind) {
00028 case DECLARATION:
00029 idnode = defnode->decl_id;
00030 prevdef_field = &(defnode->decl_previous_definition);
00031 break;
00032 case PARAMETER:
00033 idnode = defnode->par_id;
00034 prevdef_field = &(defnode->par_previous_definition);
00035 break;
00036 case TYPESIGNATURE:
00037 idnode = defnode->ts_local_type_id;
00038 prevdef_field = &(defnode->ts_previous_definition);
00039 break;
00040 case UNIONCONSTRUCTION:
00041 case PRODCONSTRUCTION:
00042 idnode = defnode->prod_local_type_id;
00043 prevdef_field = &(defnode->prod_previous_definition);
00044 break;
00045 case MODPRIMARY:
00046 {
00047 NODE * modifier = defnode -> mp_type_modifier;
00048
00049 switch(modifier -> kind){
00050 case WITHLIST:
00051 idnode = modifier->wl_local_type_id;
00052 prevdef_field = &(modifier->wl_previous_definition);
00053 break;
00054 case EXPORTLIST:
00055 case HIDELIST:
00056 idnode = modifier->el_local_type_id;
00057 prevdef_field = &(modifier->el_previous_definition);
00058 break;
00059 }
00060 }
00061 break;
00062 default:
00063 # ifdef DEBUG
00064 dbgmsg("restore: bad defnode: kind=%s\n",
00065 kindname(defnode->kind));
00066 abort();
00067 # endif
00068 break;
00069 }
00070
00071 if (idnode == NIL) return;
00072 ip = (Identry *)retrieve(idnode->id_str_table_index);
00073 ip->i_value = *prevdef_field;
00074 }
00075