Annotation of researchv10no/cmd/cfront/ooptcfront/tree_copy.c, revision 1.1.1.1

1.1       root        1: /*
                      2:        $Source: /usr3/lang/benson/work/stripped_cfront/RCS/tree_copy.c,v $ $RCSfile: tree_copy.c,v $
                      3:        $Revision: 1.1 $                $Date: 89/11/20 08:51:04 $
                      4:        $Author: benson $               $Locker:  $
                      5:        $State: Exp $
                      6: */
                      7:  
                      8: /* utilities to copy pieces of cfront trees. 
                      9:    what we have here is a somewhat parameterizable
                     10:    action procedure for the tree walker.
                     11: 
                     12:    We may make more versions of this for template expansion
                     13:    and saving things in files, or we may just make it possible
                     14:    for this to swing more ways. */
                     15: 
                     16: #include "cfront.h"
                     17: #include "tree_walk.H"
                     18: #include "tree_copy.H"
                     19: #include <memory.h>
                     20: 
                     21: extern loc no_where;
                     22: 
                     23: /* determine whether "n" is a an already defined type */
                     24: static unsigned int type_is_defined(Pnode n) {
                     25:   return (Ptype(n)->defined & DEFINED) ;
                     26: }
                     27: 
                     28: void
                     29: copy_walker (Pnode& node, node_class cl, void * info, 
                     30:             tree_node_action& action, int, Pnode, tree_walk_tree&,
                     31:             int& register_in_hash)
                     32: {
                     33:     union {
                     34:        Pnode node;
                     35:        Pvirt vr;
                     36:        Plist list;
                     37:        Pgen g;
                     38:        Pvec vc;
                     39:        Pfct f;
                     40:        Ptable t;
                     41:        Pbase  bt;
                     42:        Pexpr  x;
                     43:        Pstmt  s;
                     44:        Penum  e;
                     45:        Pclass c;
                     46:        Pbcl   bcl;
                     47:        Pin    iline;
                     48:        ia   * ia;
                     49:        Pname  n;
                     50:        Pptr p;
                     51:       } n;
                     52:     Pnode original_node = node;
                     53: 
                     54:     tree_copy_info * tci = (tree_copy_info *)info;
                     55:     action = tna_continue;
                     56: 
                     57:     /* first, give an application-specific hook a shot at the node. */
                     58: 
                     59:     tci->check_node(node, cl, action, register_in_hash);
                     60:     if(action != tna_continue) return;    
                     61: 
                     62:     if(node != original_node) { /* a replacement */
                     63:       n.node = node;
                     64:     } else /* ok, nothing funny, we just go ahead and copy */
                     65:       switch (cl) {
                     66:       case nc_eof:
                     67:        n.node = Pnode(tci->malloc(sizeof (node)));
                     68:        *n.node = *node;
                     69:        goto Replace;
                     70: 
                     71:       case nc_virt:
                     72:        n.vr = Pvirt(tci->malloc(sizeof(virt)));
                     73:        *n.vr = *Pvirt(node);
                     74:        goto Replace;
                     75: 
                     76:       case nc_nlist:
                     77:        n.list = Plist(tci->malloc(sizeof(name_list)));
                     78:        *n.list = *Plist(node);
                     79:        goto Replace;
                     80: 
                     81:       case nc_gen:
                     82:        n.g = Pgen(tci->malloc(sizeof(gen)));
                     83:        *n.g = *Pgen(node);
                     84:        goto Replace;
                     85: 
                     86:       case nc_vec: 
                     87:        n.vc = Pvec(tci->malloc(sizeof(vec)));
                     88:        *n.vc = *Pvec(node);
                     89:        goto Replace;
                     90: 
                     91:       case nc_ptr:
                     92:        n.p = Pptr(tci->malloc(sizeof(ptr)));
                     93:        *n.p = *Pptr(node);
                     94:        goto Replace;
                     95: 
                     96:       case nc_fct:
                     97:        n.f = Pfct(tci->malloc(sizeof(fct)));
                     98:        *n.f = *Pfct(node);
                     99:        if(n.f->f_signature) {
                    100:            n.f->f_signature =
                    101:                (char *)tci->malloc(strlen(Pfct(node)->f_signature)+1);
                    102:            strcpy(n.f->f_signature, Pfct(node)->f_signature);
                    103:        };
                    104:        goto Replace;
                    105: 
                    106:       case nc_table:
                    107:        n.t = Ptable(tci->malloc(sizeof(table)));
                    108:        *n.t = *Ptable(node);
                    109:        n.t->entries = (Pname *)tci->malloc(sizeof(Pname) * n.t->size);
                    110:        memcpy((char *)n.t->entries, (char *)Ptable(node)->entries, n.t->size * sizeof(Pname));
                    111:        n.t->hashtbl = (short *)tci->malloc(sizeof(short) * n.t->hashsize);
                    112:        memcpy((char *)n.t->hashtbl, (char *)Ptable(node)->hashtbl, n.t->hashsize * sizeof (short));
                    113:        goto Replace;
                    114: 
                    115:       case nc_basetype:
                    116:        // Don't copy types that have already been dealt with
                    117:        if (type_is_defined(node)) {
                    118:          action = tna_stop ;
                    119:          return ;
                    120:        }
                    121:        n.bt = Pbase(tci->malloc(sizeof(basetype)));
                    122:        *n.bt = *Pbase(node);
                    123:        if(n.bt->discriminator(0) == 2 && n.bt->b_linkage) {
                    124:            n.bt->b_linkage = tci->malloc(strlen(n.bt->b_linkage) + 1);
                    125:            strcpy(n.bt->b_linkage, Pbase(node)->b_linkage);
                    126:        }
                    127:        goto Replace;
                    128: 
                    129:       case nc_expr:
                    130:        // cfront needs identity maintaied for these nodes
                    131:        if ((node == dummy) || (node == zero)) {
                    132:          action = tna_stop ;
                    133:          return ;
                    134:        }
                    135:        n.x = Pexpr(tci->malloc(sizeof(expr)));
                    136:        *n.x = *Pexpr(node);
                    137:        if(n.x->discriminator(1) == 3 && n.x->string) {
                    138:            n.x->string = tci->malloc(strlen(n.x->string) + 1);
                    139:            strcpy(n.x->string, Pexpr(node)->string);
                    140:        }
                    141:        if(n.x->discriminator(2) == 3 && n.x->string2) {
                    142:            n.x->string2 = tci->malloc(strlen(n.x->string2) + 1);
                    143:            strcpy(n.x->string2, Pexpr(node)->string2);
                    144:        }
                    145:        goto Replace;
                    146: 
                    147:       case nc_stmt:
                    148:        n.s = Pstmt(tci->malloc(sizeof(stmt)));
                    149:        *n.s = *Pstmt(node);
                    150:        goto Replace;
                    151: 
                    152:       case nc_enumdef:
                    153:        if (type_is_defined(node)) {
                    154:          action = tna_stop ;
                    155:          return ;
                    156:        }
                    157:        n.e = Penum(tci->malloc(sizeof(enumdef)));
                    158:        *n.e = *Penum(node);
                    159:        if(n.e->string) {
                    160:            n.e->string = tci->malloc(n.e->strlen+1);
                    161:            strcpy(n.e->string, Penum(node)->string);
                    162:        }
                    163:        goto Replace;
                    164: 
                    165:       case nc_classdef:
                    166:        // Don't copy types that have already been dealt with
                    167:        if (type_is_defined(node)) {
                    168:          action = tna_stop ;
                    169:          return ;
                    170:        }
                    171:        n.c = Pclass(tci->malloc(sizeof(classdef)));
                    172:        *n.c = *Pclass(node);
                    173:        if(n.c->string) {
                    174:            n.c->string = tci->malloc(strlen(n.c->string)+1);
                    175:            strcpy(n.c->string, Pclass(node)->string);
                    176:        }
                    177:        goto Replace;
                    178: 
                    179:       case nc_baseclass:
                    180:        n.bcl = Pbcl(tci->malloc(sizeof(struct basecl)));
                    181:        *n.bcl = *Pbcl(node);
                    182:        goto Replace;
                    183: 
                    184:       case nc_iline:
                    185:        n.iline = Pin(tci->malloc(sizeof(iline)));
                    186:        *n.iline = *Pin(node);
                    187:        goto Replace;
                    188: 
                    189:       case nc_ia:
                    190:        n.ia = (ia *)tci->malloc(sizeof(ia));
                    191:        *n.ia = *(ia *)node;
                    192:        goto Replace;
                    193: 
                    194:       case nc_name:
                    195:        /* check for globalosity */
                    196:        if(Pname(node)->string && (node == (node->base == TNAME ? ktbl : gtbl)->look(Pname(node)->string, 0))) {
                    197:            action = tna_stop;
                    198:            return;
                    199:        }
                    200:        n.n = Pname(tci->malloc(sizeof(name)));
                    201:        *n.n = *Pname(node);
                    202: /* First, hack exprosity */
                    203:        if(n.x->discriminator(1) == 3 && n.n->string) {
                    204:            n.n->string = tci->malloc(strlen(n.n->string) + 1);
                    205:            strcpy(n.n->string, Pexpr(node)->string);
                    206:        }
                    207:        if(n.x->discriminator(2) == 3 && n.n->string2) {
                    208:            n.n->string2 = tci->malloc(strlen(n.n->string2) + 1);
                    209:            strcpy(n.n->string2, Pexpr(node)->string2);
                    210: /* ok, name stuff */
                    211:        }
                    212:        if(n.n->n_anon) {
                    213:            n.n->n_anon = tci->malloc(strlen(n.n->n_anon)+1);
                    214:            strcpy(n.n->n_anon, Pname(node)->n_anon);
                    215:        }
                    216:        if(n.n->output_string) {
                    217:            n.n->output_string = tci->malloc(strlen(n.n->output_string)+1);
                    218:            strcpy(n.n->output_string, Pname(node)->output_string);
                    219:        }
                    220:        if(n.n->n_template_arg_string) {
                    221:            n.n->n_template_arg_string =
                    222:                tci->malloc(strlen(n.n->n_template_arg_string)+1);
                    223:            strcpy(n.n->n_template_arg_string, Pname(node)->n_template_arg_string);
                    224:        }
                    225:     }
                    226:   Replace:
                    227:     node = n.node;
                    228:     action = tna_continue;
                    229:     return;
                    230: }
                    231: 
                    232: static int call_error (int i, const char * s)
                    233: {
                    234:     return error (i, s);
                    235: }
                    236: 
                    237: void
                    238: copy_tree (Pnode& node, tree_copy_info& tci, Hash * cht)
                    239: {
                    240:     tree_walk_control twc;
                    241: 
                    242:     twc.call_i_error = 1;
                    243:     twc.i_error = call_error; /* ... in type of error confuses compiler */
                    244:     twc.action_proc = copy_walker;
                    245:     twc.nodes_seen_hash = cht;
                    246:     twc.callback_info = (void *)&tci;
                    247: 
                    248:     walk_tree (twc, node);
                    249: }
                    250: 
                    251: 
                    252: static char rcsinfo[] = "$Header: /usr3/lang/benson/work/stripped_cfront/RCS/tree_copy.c,v 1.1 89/11/20 08:51:04 benson Exp $";
                    253: 
                    254: 
                    255: /*
                    256:    $Log:       tree_copy.c,v $
                    257:  * Revision 1.1  89/11/20  08:51:04  benson
                    258:  * Initial revision
                    259:  * 
                    260:  * Revision 1.5  89/10/10  08:43:12  benson
                    261:  * new error system prototype.
                    262:  * 
                    263:  * 
                    264:  * Revision 1.4  89/09/02  22:06:38  benson
                    265:  * add ability to keep something out of the hash table.
                    266:  * 
                    267:  * Revision 1.3  89/08/24  10:01:06  benson
                    268:  * additional argument as a walker action procedure.
                    269:  * 
                    270:  * Revision 1.2  89/08/11  15:07:19  sam
                    271:  * - stopped copying at "defined" types
                    272:  * - stop copying ofthe pre-defined exprs zero, and dummy
                    273:  * - if the hook returns a new node, use it rather than mallocing a new one.
                    274:  * 
                    275:  * Revision 1.1  89/07/21  16:46:03  benson
                    276:  * Initial revision
                    277:  * 
                    278: 
                    279:    end_log
                    280: */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.