C:/Users/Dennis/src/lang/russell.orig/src/pass2/restore.c

Go to the documentation of this file.
00001 #
00002 /*
00003  *  restore(defnode)
00004  *  NODE * defnode;
00005  *
00006  *  defnode - A definition node, giving a definition to an id.
00007  *
00008  *  Remove the knowledge of this definition of the identifier from
00009  *  the Idtable.
00010  *  Ignore the request if the definition node in fact does not define
00011  *  an identifier, e.g. if it is an ononymous parameter.
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;        /* The node of the defined id. */
00025     NODE **prevdef_field; /* The previous definition field in defnode. */
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 

Generated on Fri Jan 25 10:39:46 2008 for russell by  doxygen 1.5.4