Annotation of researchv10no/cmd/cfront/ooptcfront/dump_tree.c, revision 1.1

1.1     ! root        1: /* -*- Mode:C++ -*- */
        !             2: /* dump_tree.C -- utilities for displaying the cfront tree. */
        !             3: /* BIM 890530 */
        !             4: /* rewritten 890712 to use the tree-walking facilities */
        !             5: 
        !             6: /*
        !             7:        $Source: /usr3/lang/benson/work/stripped_cfront/RCS/dump_tree.c,v $ $RCSfile: dump_tree.c,v $
        !             8:        $Revision: 1.1 $                $Date: 89/11/20 08:50:22 $
        !             9:        $Author: benson $               $Locker:  $
        !            10:        $State: Exp $
        !            11: 
        !            12: 
        !            13: */
        !            14: 
        !            15: 
        !            16: #include "dump_tree.H"
        !            17: #include <stdio.h>             /* turds and whey */
        !            18: #include <malloc.h>
        !            19: #include "template.h"
        !            20: #include "token_names.H"
        !            21: 
        !            22: const int Indent_Increment = 4;
        !            23: static char badnamebuf[100];
        !            24: 
        !            25: char *
        !            26: token_name(TOK t)
        !            27: {
        !            28:     char * bnb = badnamebuf;
        !            29: 
        !            30:     if((int) t == -1) return "-1";
        !            31:     if(t > DUMMY_LAST_NODE) {
        !            32: bad:
        !            33:        printf_to_string(bnb, sizeof(badnamebuf), 
        !            34:                         "<unknown token %d>", (int) t);
        !            35:        return bnb;
        !            36:     } 
        !            37:     int x;
        !            38:     for (x = 0; x < DUMMY_LAST_NODE; x++) {
        !            39:        if(token_names[x].val == t) return token_names[x].string;
        !            40:     }
        !            41:     goto bad;
        !            42: }
        !            43: 
        !            44: class displayer{
        !            45:   public:
        !            46:     dcn_arg * arg;
        !            47:     Pnode node;
        !            48:     Pnode node_address;
        !            49:     displayer (dcn_arg& d) { arg = &d; indent = 0; print_null_values = 0; };
        !            50:     void do_node (Pnode& node, node_class cl, tree_node_action& action, int depth, Pnode);
        !            51:   private:
        !            52:     enum ppc {print_ptr_copy = 0, print_ptr_copied = 1};
        !            53:     int indent;
        !            54:     int err;
        !            55:     int print_null_values;
        !            56:     void printf (const char *, ...);
        !            57:     void catprintf (const char *, ...);
        !            58:     void print_ptr (const char *, Pnode);
        !            59:     void print_ptr (Pnode, ppc = print_ptr_copy);
        !            60:     void minimal ();
        !            61:     void a_basetype ();
        !            62:     void a_basecl() ;
        !            63:     void a_type() ;
        !            64:     void a_node() ;
        !            65:     void a_name ();
        !            66:     void a_expr (int from_name = 0);
        !            67:     void a_fct ();
        !            68:     void a_stmt ();
        !            69:     void a_enumdef ();
        !            70:     void a_table();
        !            71:     void a_classdef ();
        !            72:     void a_gen ();
        !            73:     void a_vec ();
        !            74:     void a_ptr ();
        !            75:     void a_virt ();
        !            76:     void a_nlist ();
        !            77:     void a_iline ();
        !            78:     void a_elist ();
        !            79:     void a_ia ();
        !            80:     void a_by_name ();
        !            81:     void print_loc(loc&);
        !            82:     void * display_address () { return node_address; }
        !            83:     void fetch (void * addr, unsigned long length, void *& taddr);
        !            84:     void fetch_string (void * addr, unsigned long length, void *& taddr);
        !            85:     void free_fetched(void *);
        !            86:     void flag (int, const char *);
        !            87:     void print_string (const char *, void *);
        !            88:     void print_string_brief (void *);
        !            89:     void null_field (const char *);
        !            90:     void nz_printf(const char *format, const int i) ;
        !            91:     void nz_printf(const char *format, const char *p) ;
        !            92:     void nz_printf(const char *format, const long l) ;
        !            93:     void ind();
        !            94: };
        !            95: 
        !            96: const char many_spaces[] = "                                                                                                                                                                                                        ";
        !            97: 
        !            98: inline void
        !            99: displayer::ind()
        !           100: {
        !           101:     arg->output_stream->write(many_spaces, indent);
        !           102: }
        !           103: 
        !           104: /* call me for full lines */
        !           105: 
        !           106: void
        !           107: displayer::printf (const char * format, ...)
        !           108: {
        !           109:     va_list args;
        !           110:     va_start(args, format);
        !           111: 
        !           112:     ind();
        !           113:     vostream_printf (format, args, *arg->output_stream);
        !           114:     arg->output_stream->write("\n", 1);
        !           115:     va_end (args);
        !           116: }
        !           117: 
        !           118: void
        !           119: displayer::catprintf (const char * format, ...)
        !           120: {
        !           121:     va_list args;
        !           122:     va_start(args, format);
        !           123: 
        !           124:     vostream_printf (format, args, *arg->output_stream);
        !           125:     va_end (args);
        !           126: }
        !           127: 
        !           128: void
        !           129: displayer::minimal ()
        !           130: {
        !           131:     print_ptr(node, print_ptr_copied);
        !           132: }    
        !           133: 
        !           134: void
        !           135: displayer::print_ptr(const char * label, Pnode node)
        !           136: {
        !           137:     if(node || print_null_values) {
        !           138:        ind();
        !           139:        catprintf("%s:\t", label);
        !           140:        print_ptr(node);
        !           141:        catprintf("\n");
        !           142:     }
        !           143: }
        !           144: 
        !           145: 
        !           146: void
        !           147: displayer::print_ptr(Pnode node, ppc copy_ptr)
        !           148: {
        !           149:     void * string = 0;
        !           150:     void * ncopy;
        !           151:     void * na = (void *)node;
        !           152: 
        !           153:     if(node) {
        !           154: 
        !           155:        if(copy_ptr == print_ptr_copy) {
        !           156:            fetch(na, sizeof(node), ncopy);
        !           157:            node = Pnode(ncopy);
        !           158:        } else ncopy = node;
        !           159: 
        !           160:        switch(node->base) {
        !           161:        case CLASS:
        !           162:            free_fetched(ncopy);
        !           163:            fetch(na, sizeof(classdef),ncopy);
        !           164:            node = Pnode(ncopy);
        !           165:            string = Pclass(node)->string;
        !           166:            break;
        !           167:        case ENUM:
        !           168:            free_fetched(ncopy);
        !           169:            fetch(na, sizeof(enumdef),ncopy);
        !           170:            node = Pnode(ncopy);
        !           171:            string = Penum(node)->string;
        !           172:            break;
        !           173:        case NAME:
        !           174:        case TNAME:
        !           175:        case PUBLIC:
        !           176:        case PROTECTED:
        !           177:            if(!node->baseclass) {
        !           178:                free_fetched(ncopy);
        !           179:                fetch(na, sizeof(name),ncopy);
        !           180:                node = Pnode(ncopy);
        !           181:                string = Pname(node)->string;
        !           182:            }
        !           183:            break;
        !           184:        }
        !           185:        if(string) {
        !           186:            catprintf("<%s |0x%p ", token_name(node->base), na);
        !           187:            print_string_brief(string);
        !           188:            catprintf(">");
        !           189:        }
        !           190:        else catprintf("<%s |0x%p>", token_name(node->base), na);
        !           191:        free_fetched (ncopy);
        !           192:     }
        !           193:     else catprintf("Null");
        !           194: }
        !           195: 
        !           196: void
        !           197: displayer::do_node (Pnode& n, node_class cl, tree_node_action& action,
        !           198:         int depth, Pnode na)
        !           199: {
        !           200:     int forced_min = 0;
        !           201:     int printed_min = 0;
        !           202:     int prune = 0;
        !           203: 
        !           204:     switch(cl) {
        !           205:       case nc_table:
        !           206:        if(depth > 0 && !arg->walk_tables)prune = 1;
        !           207:       case nc_fct:
        !           208:       case nc_classdef:
        !           209:       case nc_enumdef:
        !           210:        if(arg->stop_at_top && depth > 1) prune = 1;
        !           211:        break;
        !           212:     }
        !           213: 
        !           214:     if((arg->max_depth > 0) && (depth >= arg->max_depth))
        !           215:        prune = 1;
        !           216: 
        !           217:     if(prune || arg->max_depth == 0)
        !           218:        action = tna_stop;
        !           219:     else action = tna_continue;
        !           220: 
        !           221:     node = n;
        !           222:     node_address = na;
        !           223: 
        !           224:     if(arg->verbose == dt_brief || prune) {
        !           225:        printed_min = 1;
        !           226:        minimal();
        !           227:     }
        !           228:     else {
        !           229:        switch(cl)
        !           230:            {
        !           231:              default:
        !           232:            case nc_unused:
        !           233:                ostream_printf(*arg->error_stream, "Unknown node %d\n", node->base);
        !           234:                forced_min = 1;
        !           235: 
        !           236:            case nc_eof:
        !           237:                minimal();
        !           238:                printed_min = 1;
        !           239:                break;
        !           240: 
        !           241:            case nc_virt:
        !           242:                a_virt ();
        !           243:                break;
        !           244: 
        !           245:            case nc_nlist:
        !           246:                a_nlist();
        !           247:                break;
        !           248: 
        !           249:            case nc_gen:
        !           250:                a_gen();
        !           251:                break;
        !           252: 
        !           253:            case nc_vec:
        !           254:                a_vec();
        !           255:                break;
        !           256: 
        !           257:            case nc_ptr:
        !           258:                a_ptr();
        !           259:                break;
        !           260: 
        !           261:            case nc_fct:
        !           262:                a_fct();
        !           263:                break;
        !           264: 
        !           265:            case nc_table:
        !           266:                a_table();
        !           267:                break;
        !           268: 
        !           269:            case nc_basetype:
        !           270:                a_basetype();
        !           271:                break;
        !           272: 
        !           273:            case nc_name:
        !           274:                a_name();
        !           275:                break;
        !           276: 
        !           277:            case nc_expr:
        !           278:                a_expr();
        !           279:                break;
        !           280: 
        !           281:            case nc_stmt:
        !           282:                a_stmt();
        !           283:                break;
        !           284: 
        !           285:            case nc_enumdef:
        !           286:                a_enumdef();
        !           287:                break;
        !           288: 
        !           289:            case nc_classdef:
        !           290:                a_classdef();
        !           291:                break;
        !           292: 
        !           293:            case nc_baseclass:
        !           294:                a_basecl ();
        !           295:                break;
        !           296: 
        !           297:            case nc_iline:
        !           298:                a_iline();
        !           299:                break;
        !           300: 
        !           301:            case nc_ia:
        !           302:                a_ia();
        !           303:                break;
        !           304: 
        !           305:            }
        !           306:        if(printed_min) catprintf(">");
        !           307:     }
        !           308: }
        !           309: 
        !           310: 
        !           311: void
        !           312: displayer::flag(int f, const char * n)
        !           313: {
        !           314:     if(f)catprintf("%s", n);
        !           315: }
        !           316: 
        !           317: void
        !           318: displayer::free_fetched (void * addr)
        !           319: {
        !           320:     if (arg->fetcher != null_tfp) /* not in the same address space. */
        !           321:        free ((char *)addr);
        !           322: }    
        !           323: 
        !           324: 
        !           325: void
        !           326: displayer::fetch (void * addr, unsigned long length, void *& taddr)
        !           327: {
        !           328:     if (arg->fetcher == null_tfp) {    /* in the same address space. */
        !           329:        taddr = addr;
        !           330:        err = 0;
        !           331:     } else {
        !           332:        taddr = (void *)malloc ((unsigned int)length);
        !           333:        err = arg->fetcher (arg->fetcher_info,
        !           334:                            addr,
        !           335:                            length,
        !           336:                            0,
        !           337:                            taddr);
        !           338:     }
        !           339: }
        !           340: 
        !           341: void
        !           342: displayer::fetch_string (void * addr, unsigned long length, void *& taddr)
        !           343: {
        !           344:     if (arg->fetcher == null_tfp) {    /* in the same address space. */
        !           345:        taddr = addr;
        !           346:        err = 0;
        !           347:     } else {
        !           348:        taddr = (void *)malloc ((unsigned int)length);
        !           349:        err = arg->fetcher (arg->fetcher_info,
        !           350:                            addr,
        !           351:                            length,
        !           352:                            1,
        !           353:                            taddr);
        !           354:     }
        !           355: }
        !           356: 
        !           357: /* Print the field, only if it has a non_zero value, or requested to print */
        !           358: /* always */
        !           359: void
        !           360: displayer::nz_printf(const char *format, const int i)
        !           361: {
        !           362:     if (i || print_null_values) {
        !           363:        printf(format, i) ;
        !           364:     }
        !           365: } 
        !           366: 
        !           367: void
        !           368: displayer::nz_printf(const char *format, const char *p)
        !           369: {
        !           370:     if (p || print_null_values) {
        !           371:        printf(format, (p ? p : "0")) ;
        !           372:     }
        !           373: } 
        !           374: 
        !           375: 
        !           376: void 
        !           377: displayer::nz_printf(const char *format, const long i)
        !           378: {
        !           379:     if (i || print_null_values) {
        !           380:        printf(format, i) ;
        !           381:     }
        !           382: } 
        !           383: 
        !           384: void 
        !           385: displayer::a_node() 
        !           386: {
        !           387:     struct node &n = *node ;
        !           388: 
        !           389:     nz_printf("$node", (n.n_key || n.permanent)) ;
        !           390:     nz_printf("n_key:\t%d", (int)n.n_key) ;
        !           391:     nz_printf("permanent:\t%d", n.permanent) ;
        !           392:     nz_printf("baseclass:\t%d", n.baseclass) ;
        !           393: }
        !           394:   
        !           395:   
        !           396: 
        !           397: void 
        !           398: displayer::a_type()
        !           399: {
        !           400:     struct type& t = *Ptype(node);
        !           401:     int show_up =  t.defined || t.inline_temp_index != 0;
        !           402: 
        !           403:     if(show_up) {
        !           404:        printf("$type") ;
        !           405:        nz_printf("defined:\t%d", t.defined) ;
        !           406:        nz_printf("inline_temp_index:\t%d", t.inline_temp_index);
        !           407:        indent += Indent_Increment;
        !           408:     }
        !           409:     a_node();
        !           410:     if(show_up) indent -= Indent_Increment;
        !           411: } 
        !           412:   
        !           413: 
        !           414:   
        !           415:   
        !           416: 
        !           417: void
        !           418: displayer::null_field(const char * name)
        !           419: {
        !           420:   nz_printf( "%s:\t0", name);
        !           421: }
        !           422: 
        !           423: 
        !           424: void 
        !           425: displayer::a_basecl()
        !           426: {
        !           427:     struct basecl& bc = *Pbcl(node);
        !           428: 
        !           429:     printf("$basecl %s |0x%p",
        !           430:           token_name(node->base),
        !           431:           node_address);
        !           432:     
        !           433:     nz_printf ("ppp:\t%s", token_name(bc.ppp)) ;
        !           434:     nz_printf ("allocated:\t%d", bc.allocated) ;
        !           435:     nz_printf ("promoted:\t%d", bc.promoted) ;
        !           436:     print_ptr("bclass", bc.bclass);
        !           437:     nz_printf ("ptr_offset:\t%d", bc.ptr_offset) ;
        !           438:     nz_printf ("obj_offset:\t%d", bc.obj_offset) ;
        !           439:     indent += Indent_Increment;
        !           440:     a_node();                  /* do the supertype. */
        !           441:     indent -= Indent_Increment;
        !           442: }
        !           443: 
        !           444: 
        !           445: 
        !           446: 
        !           447: void
        !           448: displayer::a_basetype ()
        !           449: {
        !           450:     struct basetype& bt = *Pbase(node);
        !           451:   
        !           452:     printf("$basetype %s |0x%p",
        !           453:           token_name(node->base),
        !           454:           node_address);
        !           455: 
        !           456:     ind();
        !           457:     catprintf("Flags:\t");
        !           458:     flag(bt.b_unsigned, "unsigned ");
        !           459:     flag(bt.b_signed, "signed ");
        !           460:     flag(bt.b_volatile, "volatile ");
        !           461:     flag(bt.b_const, "const ");
        !           462:     flag(bt.b_typedef, "typedef ");
        !           463:     flag(bt.b_virtual, "virtual ");
        !           464:     flag(bt.b_short, "short ");
        !           465:     flag(bt.b_long, "long ");
        !           466:     catprintf("\n");
        !           467:     nz_printf( "b_bits:\t%d", bt.b_bits);
        !           468:     nz_printf( "b_offset:\t%d", bt.b_offset);
        !           469:     nz_printf( "b_sto:\t%s", bt.b_sto ? token_name(bt.b_sto) : 0);
        !           470:     switch(bt.discriminator(0)) {
        !           471:       case 1:
        !           472:        print_ptr("b_fieldtype", bt.b_fieldtype);
        !           473:        break;
        !           474:       case 2:
        !           475:        nz_printf( "b_linkage:\t%s", bt.b_linkage ? "C" : "0(C++)");
        !           476:     }
        !           477: 
        !           478:     print_ptr("b_name", bt.b_name);
        !           479:     print_ptr("b_table", bt.b_table);
        !           480:     print_ptr("b_field", bt.b_field);
        !           481:     print_ptr("b_xname", bt.b_xname);
        !           482: 
        !           483:     indent += Indent_Increment;
        !           484:     a_type();                  /* do the supertype. */
        !           485:     indent -= Indent_Increment;
        !           486:     
        !           487: }
        !           488: 
        !           489: void
        !           490: displayer::print_loc(loc& loc)
        !           491: {
        !           492:   catprintf("file %d line %d", (int)loc.file, (int)loc.line);
        !           493: }
        !           494: 
        !           495: 
        !           496: void
        !           497: displayer::print_string_brief(void * addr)
        !           498: {
        !           499:   void * tmp;
        !           500:   
        !           501:   fetch_string (addr, 1000, tmp);
        !           502:   *arg->output_stream << (char *)tmp;
        !           503:   free_fetched (tmp);
        !           504: }
        !           505: 
        !           506: void
        !           507: displayer::print_string(const char * label, void * addr)
        !           508: {
        !           509:   ind();
        !           510:   catprintf("%s:\t", label);
        !           511:   print_string_brief(addr);
        !           512:   *arg->output_stream << "\n";
        !           513: }
        !           514: 
        !           515: void
        !           516: displayer::a_expr(int from_name)
        !           517: {
        !           518:     struct expr& e = *Pexpr(node);
        !           519:   
        !           520:     if(from_name) printf("$expr");
        !           521:     else printf("$expr %s |0x%p",
        !           522:                token_name(node->base),
        !           523:                node_address);
        !           524:   
        !           525:     print_ptr("tp", e.tp);
        !           526:   
        !           527:     switch(e.discriminator(1)) {
        !           528:       case 0: break;
        !           529:       case 1:
        !           530:        print_ptr("e1", e.e1);
        !           531:        break;
        !           532:       case 2:
        !           533:        printf("i1:\t%ld", e.i1);
        !           534:        break;
        !           535:       case 3:
        !           536:        print_string("string", (void *)e.string);
        !           537:     }
        !           538: 
        !           539:     switch(e.discriminator(2)) {
        !           540:       case 0: break;
        !           541:       case 1:
        !           542:        print_ptr("e2", e.e2);
        !           543:        break;
        !           544:       case 2:
        !           545:        printf("i2:\t%ld", e.i2);
        !           546:        break;
        !           547:       case 3:
        !           548:        print_string("string2", (void *)e.string2);
        !           549:        break;
        !           550:       case 4:
        !           551:        print_ptr("n_initializer", e.n_initializer);
        !           552:     }
        !           553: 
        !           554:     switch(e.discriminator(3)) {
        !           555:       case 0:
        !           556:        break;
        !           557:       case 1: print_ptr ("tp2", e.tp2); break;
        !           558:       case 2: print_ptr ("fct_name", e.fct_name); break;
        !           559:       case 3: print_ptr ("cond", e.cond); break;
        !           560:       case 4: print_ptr ("mem", e.mem); break;
        !           561:       case 5: print_ptr ("as_type", e.as_type); break;
        !           562:       case 6: print_ptr ("n_table", e.n_table); break;
        !           563:       case 7: print_ptr ("il", e.il); break;
        !           564:       case 8: print_ptr ("query_this", e.query_this); break;
        !           565:     }
        !           566: 
        !           567:   indent += Indent_Increment;
        !           568:   a_node();
        !           569:   indent -= Indent_Increment;
        !           570: 
        !           571: }
        !           572: 
        !           573: void
        !           574: displayer::a_name()
        !           575: {
        !           576:     struct name& n = *Pname(node);
        !           577: 
        !           578: 
        !           579:     ind();
        !           580:     catprintf("$name %s |0x%p ",
        !           581:              token_name(node->base),
        !           582:              node_address);
        !           583:     print_string_brief((void *)n.string);
        !           584:     *arg->output_stream << "\n";
        !           585: 
        !           586:     nz_printf( "n_oper:\t\t%s", n.n_oper ?
        !           587:              token_name(n.n_oper) : 0);
        !           588:     nz_printf( "n_sto:\t\t%s", n.n_sto ?
        !           589:              token_name(n.n_sto) : 0);
        !           590:     nz_printf( "n_stclass:\t%s", n.n_stclass ?
        !           591:              token_name(n.n_stclass) : 0);
        !           592:     nz_printf( "n_scope:\t%s", n.n_scope ?
        !           593:              token_name(n.n_scope) : 0);
        !           594:     nz_printf( "n_union:\t%d", n.n_union);
        !           595:     nz_printf( "n_evaluated:\t%d", n.n_evaluated);
        !           596:     nz_printf( "n_xref:\t\t%d", n.n_xref);
        !           597:     nz_printf( "lex_level:\t%d", n.lex_level);
        !           598:     nz_printf( "n_protect:\t%s", n.n_protect ?
        !           599:              token_name(n.n_protect) : 0);
        !           600:     if (n.n_dcl_printed || print_null_values) {
        !           601:        ind();
        !           602:        catprintf("n_dcl_printed:\t%d", n.n_dcl_printed);
        !           603: 
        !           604:        switch(n.n_dcl_printed)
        !           605:            {
        !           606:            case 0:
        !           607:                catprintf("(not)\n");
        !           608:                break;
        !           609:            case 1:
        !           610:                printf("(declaration)\n");
        !           611:                break;
        !           612:            case 2:
        !           613:                printf("(definition)\n");
        !           614:                break;
        !           615:            }
        !           616:        
        !           617:     }
        !           618:     if(n.n_template_arg) {
        !           619:        ind();
        !           620:        catprintf( "n_template_arg:\t");
        !           621:        switch(n.n_template_arg) 
        !           622:            { 
        !           623:            case name::template_type_formal:
        !           624:                catprintf("template_type_formal\n");
        !           625:                break;
        !           626:            case name::template_expr_formal:
        !           627:                catprintf("template_expr_formal\n");
        !           628:                break;
        !           629:            case name::template_stmt_tree_formal:
        !           630:                catprintf("template_stmt_formal\n");
        !           631:                break;
        !           632:            case name::template_expr_tree_formal:
        !           633:                catprintf("template_expr_tree_formal\n");
        !           634:                break;
        !           635:            case name::template_actual_arg_dummy:
        !           636:                catprintf("template_actual_arg_dummy\n");
        !           637:                break;
        !           638:            } ;
        !           639:     }
        !           640:     nz_printf( "n_addr_taken:\t%d", n.n_addr_taken);
        !           641:     nz_printf( "n_used:\t\t%d", n.n_used);
        !           642:     nz_printf( "n_assigned_to:\t%d", n.n_assigned_to);
        !           643:     ind();
        !           644:     catprintf("loc:\t\t");
        !           645:     print_loc(n.where);
        !           646:     catprintf("\n");
        !           647:     nz_printf( "n_offset:\t%d", n.n_offset);
        !           648:     if(n.output_string) {
        !           649:        print_string("output_string", (void *)n.output_string);
        !           650:     }
        !           651:     nz_printf( "n_val:\t\t%ld", n.n_val);
        !           652: 
        !           653:     print_ptr("n_list", n.n_list);
        !           654:     print_ptr("n_tbl_list", n.n_tbl_list);
        !           655:     if(n.n_gen_fct_name)
        !           656:        print_string("n_gen_fct_name", n.n_gen_fct_name);
        !           657:     if(n.n_template_arg_string) {
        !           658:        print_string("n_template_arg_string",
        !           659:                     n.n_template_arg_string);
        !           660:     }
        !           661:     switch(n.discriminator(0)) {
        !           662:     case 2: print_ptr("n_realscope", n.n_realscope); break;
        !           663:     case 1: print_ptr("n_qualifier", n.n_qualifier); break;
        !           664:     }
        !           665:     nz_printf("n_val:\t%ld", n.n_val);
        !           666: 
        !           667:     indent += Indent_Increment;
        !           668:     a_expr(1);                 /* do the supertype. */
        !           669:     indent -= Indent_Increment;
        !           670: }
        !           671: 
        !           672: void
        !           673: displayer::a_fct()
        !           674: {
        !           675:     struct fct& f = *Pfct(node);
        !           676: 
        !           677:     printf("$fct %s |0x%p",
        !           678:           token_name(node->base),
        !           679:           node_address);
        !           680: 
        !           681: 
        !           682:     printf("nargs:\t\t%d", f.nargs);
        !           683:     printf("nargs_known:\t%d%s", f.nargs_known,
        !           684:           f.nargs_known == 0 ? " UNKNOWN" :
        !           685:           (f.nargs_known == 1 ? " KNOWN" :
        !           686:            (f.nargs_known == ELLIPSIS ? "ELLIPSIS" : "" )));
        !           687:     nz_printf( "f_vdef:\t\t%d", f.f_vdef);
        !           688:     printf("f_inline:\t%d%s", f.f_inline,
        !           689:           f.f_inline == 0 ? "" :
        !           690:           f.f_inline == 1 ? " inline" :
        !           691:           f.f_inline == 2 ? " inline in expansion" : "");
        !           692:     nz_printf( "f_const:\t\t%d", f.f_const);
        !           693:     nz_printf( "f_static:\t\t%d", f.f_static);
        !           694:     nz_printf( "f_virtual:\t%d", f.f_virtual);
        !           695:     nz_printf( "f_imeasure:\t%d", f.f_imeasure);
        !           696:     print_string("f_signature", (void *)f.f_signature);
        !           697: 
        !           698:     print_ptr("returns", f.returns);
        !           699:     print_ptr("argtype", f.argtype);
        !           700:     print_ptr("s_returns", f.s_returns);
        !           701:     print_ptr("f_this", f.f_this);
        !           702:     print_ptr("memof", f.memof);
        !           703:     print_ptr("body", f.body);
        !           704:     print_ptr("f_init", f.f_init);
        !           705:     print_ptr("f_expr", f.f_expr);
        !           706:     print_ptr("last_expanded", f.last_expanded);
        !           707:     print_ptr("f_result", f.f_result);
        !           708:     print_ptr("f_args", f.f_args);
        !           709:     print_ptr("local_classes", f.local_class);
        !           710:     
        !           711:     indent += Indent_Increment;
        !           712:     a_type();                  /* do the supertype. */
        !           713:     indent -= Indent_Increment;
        !           714: }
        !           715: 
        !           716: void
        !           717: displayer::a_stmt ()
        !           718: {
        !           719:     struct stmt& s = *Pstmt(node);
        !           720: 
        !           721:     ind();
        !           722:     catprintf("$stmt %s |0x%p ",
        !           723:              token_name(node->base),
        !           724:              node_address);
        !           725:     print_loc(s.where);
        !           726:     *arg->output_stream << "\n";
        !           727: 
        !           728:     ind();
        !           729:     *arg->output_stream << "where:\t";
        !           730:     print_loc(s.where);
        !           731:     *arg->output_stream << "\n";
        !           732: 
        !           733:     print_ptr("s", s.s);
        !           734:     print_ptr("s_list", s.s_list);
        !           735:     print_ptr("memtbl", s.memtbl);
        !           736:     switch(s.discriminator(0)) {
        !           737:       case 1: print_ptr("d", s.d); break;
        !           738:       case 2: print_ptr("e2", s.e2); break;
        !           739:       case 3: print_ptr("has_default", s.has_default); break;
        !           740:       case 4: nz_printf("case_value:\t0x%x", s.case_value);
        !           741:       case 5: print_ptr("ret_tp", s.ret_tp); break;
        !           742:     }
        !           743:     switch(s.discriminator(1)) {
        !           744:       case 1: print_ptr("e", s.e); break;
        !           745:       case 2: nz_printf("own_tbl:\t%d", s.own_tbl); break;
        !           746:       case 3: print_ptr("s2", s.s2); break;
        !           747:     }
        !           748: 
        !           749:     switch(s.discriminator(2)) {
        !           750:        case 1: print_ptr("for_init", s.for_init); break;
        !           751:        case 2: print_ptr("else_stmt",s.for_init); break;
        !           752:        case 3: print_ptr("case_list", s.case_list); break;
        !           753:     }
        !           754: }
        !           755: 
        !           756: void
        !           757: displayer::a_enumdef ()
        !           758: {
        !           759:    struct enumdef& e = *Penum(node);
        !           760: 
        !           761:    printf("$enumdef %s |0x%p",
        !           762:          token_name(node->base),
        !           763:          node_address);
        !           764: 
        !           765:    nz_printf( "e_body:\t\t%d", e.e_body);
        !           766:    nz_printf( "no_of_enumerators: %d", 
        !           767:             e.no_of_enumerators);
        !           768:    nz_printf( "strlen:\t%d", e.strlen);
        !           769:    print_string ("string", (void *)e.string);
        !           770: 
        !           771:    print_ptr("mem", e.mem);
        !           772:    print_ptr("e_type", e.e_type);
        !           773:    indent += Indent_Increment;
        !           774:    a_type();                   /* do the supertype. */
        !           775:    indent -= Indent_Increment;
        !           776: }
        !           777: 
        !           778: void
        !           779: displayer::a_classdef ()
        !           780: {
        !           781:     struct classdef& c = *Pclass(node);
        !           782: 
        !           783:     ind();
        !           784:     catprintf("$classdef %s |0x%p ",
        !           785:              token_name(node->base),
        !           786:              node_address);
        !           787:     print_string_brief(c.string);
        !           788:     *arg->output_stream << "\n";
        !           789:     ind();
        !           790:     catprintf("class_base:\t");
        !           791:     switch(c.class_base) 
        !           792:        { 
        !           793:          case vanilla_class:
        !           794:            *arg->output_stream << "vanilla_class\n";
        !           795:            break;
        !           796:          case template_class:
        !           797:            *arg->output_stream << "template_class\n";
        !           798: Template_Class:            
        !           799:            nz_printf("inst:\t\t%p", (int)Ptclass(&c)->inst);
        !           800:            break;
        !           801:          case instantiated_template_class:
        !           802:            *arg->output_stream << "instantiated_template_class\n";
        !           803:            goto Template_Class;
        !           804:          case uninstantiated_template_class:
        !           805:            *arg->output_stream << "uninstantiated_template_class\n";
        !           806:            goto Template_Class;
        !           807:          case relationship_class:
        !           808:            *arg->output_stream << "relationship_class\n";
        !           809:            break;
        !           810:          case defining_class:
        !           811:            *arg->output_stream << "defining_class\n";
        !           812:            break;
        !           813:        }
        !           814: 
        !           815:     nz_printf( "c_body:\t\t%d", c.c_body);
        !           816:     printf("csu:\t\t%s", 
        !           817:           token_name(c.csu));
        !           818:     nz_printf( "obj_align:\t%d", c.obj_align);
        !           819:     if(c.c_xref) {
        !           820:        ind();
        !           821:        catprintf( "c_xref:\t%x", c.c_xref);
        !           822:        flag(c.c_xref & 1, "has-vptr ");
        !           823:        flag(c.c_xref & 2, "X(X&)-defined ");
        !           824:        flag(c.c_xref & 4, "operator=(X&)-defined ");
        !           825:        flag(c.c_xref & 8, "has-vbaseptr(s) ");
        !           826:        *arg->output_stream << "\n";
        !           827:     }
        !           828:     nz_printf( "virt_count:\t%d", c.virt_count);
        !           829:     nz_printf( "virt_merge:\t%d", c.virt_merge);
        !           830:     nz_printf( "c_abstract:\t%d", c.c_abstract);
        !           831:     nz_printf( "has_vvtab:\t%d", c.has_vvtab);
        !           832:     nz_printf( "strlen:\t%d", c.strlen);
        !           833:     print_string ("string", (void *)c.string);
        !           834:     nz_printf( "obj_size:\t%d", c.obj_size);
        !           835:     nz_printf( "real_size:\t%d", c.real_size);
        !           836:     nz_printf("lex_level:\t%d", c.lex_level);
        !           837:     if(c.lcl)print_string("lcl", c.lcl);
        !           838: 
        !           839:     print_ptr("baselist", c.baselist);
        !           840:     print_ptr("mem_list", c.mem_list);
        !           841:     print_ptr("memtbl", c.memtbl);
        !           842:     print_ptr("friend_list", c.friend_list);
        !           843:     print_ptr("pubdef", c.pubdef);
        !           844:     print_ptr("tn_list", c.tn_list); /* not brief */
        !           845:     print_ptr("in_class", c.in_class);
        !           846:     print_ptr("in_fct", c.in_fct);
        !           847:     print_ptr("this_type", c.this_type);
        !           848:     print_ptr("virt_list", c.virt_list); 
        !           849:     print_ptr("c_ctor", c.c_ctor);
        !           850:     print_ptr("c_dtor", c.c_dtor);
        !           851:     print_ptr("c_itor", c.c_itor);
        !           852:     print_ptr("conv", c.conv);
        !           853:     indent += Indent_Increment;
        !           854:     a_type();                  /* do the supertype. */
        !           855:     indent -= Indent_Increment;
        !           856: }
        !           857: 
        !           858: 
        !           859: void
        !           860: displayer::a_virt()
        !           861: {
        !           862:     virt& v = *Pvirt(node);
        !           863:     void * vna;
        !           864:     void * vna_e;
        !           865:     int vx;
        !           866: 
        !           867:     printf("$virt %s |0x%p ",
        !           868:           token_name(node->base),
        !           869:           node_address);
        !           870:     
        !           871:     print_ptr("next", v.next);
        !           872:     if(v.n_init) {
        !           873:        printf("n_init:\t%d", v.n_init);
        !           874:        printf("virt_init:");
        !           875:        for (vna = v.virt_init, vx = 0; vx < (v.n_init - 1);
        !           876:             vna = (char *)vna + sizeof (velem), vx++)
        !           877:            {
        !           878:                fetch(vna, sizeof (velem), vna_e);
        !           879:                struct velem * ve = (struct velem *) vna_e;
        !           880:                ind();
        !           881:                catprintf("%d offset %d\t", vx, ve->offset);
        !           882:                print_ptr(ve->n);
        !           883:                free_fetched(vna_e);
        !           884:            }
        !           885:     }
        !           886:     print_ptr("vclass", v.vclass);
        !           887:     nz_printf( "\nis_vbase:\t %d", v.is_vbase);
        !           888:     nz_printf( "\nprinted:\t %d", v.printed);
        !           889: }
        !           890: 
        !           891: void
        !           892: displayer::a_table ()
        !           893: {
        !           894:    struct table& t = *Ptable(node);
        !           895:    int x;
        !           896:    int y;
        !           897:    void * nlist;
        !           898:    void * slist;
        !           899: 
        !           900:    printf("$table %s |0x%p",
        !           901:          token_name(node->base),
        !           902:          node_address);
        !           903: 
        !           904:     printf("init_stat:\t%d%s", t.init_stat,
        !           905:           t.init_stat == 0 ? " not simplified" :
        !           906:           t.init_stat == 1 ? " simplified, no inits" :
        !           907:           t.init_stat == 2 ? " simplified, inits" :
        !           908:           "");
        !           909:    printf("size:\t%d", t.size);
        !           910:    printf("hashsize:\t%d", t.hashsize);
        !           911:    printf("free_slot:\t%d", t.free_slot);
        !           912: 
        !           913:    /* it looks like there is an array of Pnames here ... */
        !           914:    *arg->output_stream << "\n";
        !           915:    ind();
        !           916:    *arg->output_stream << "entries:\n";
        !           917:    fetch((void *)t.entries, t.size * sizeof(Pname), nlist);
        !           918:    Pname * tmp_nlist = (Pname *)nlist;
        !           919:    for(x = 0; x < t.size; x ++) {
        !           920:        if(tmp_nlist[x]) {
        !           921:           ind();
        !           922:           *arg->output_stream << x;
        !           923:           *arg->output_stream << "\t";
        !           924:           print_ptr(tmp_nlist[x]);
        !           925:           unsigned char tmp_name_s[sizeof(name)];
        !           926:           void * tmp_name;
        !           927:           tmp_name = (void *)&tmp_name_s[0];
        !           928:           fetch(tmp_nlist[x], sizeof(name), tmp_name);
        !           929:           catprintf(" key %d\n", Pname(tmp_name)->n_key);
        !           930:        }
        !           931:    }
        !           932:    free_fetched(nlist);
        !           933:    /* and then an array of shorts for the hash table. */
        !           934:    /* we really need a tabular format here, alright. */
        !           935:    ind();
        !           936:    *arg->output_stream << "hashtbl:\n";
        !           937:    fetch(t.hashtbl, t.hashsize * sizeof(short), slist);
        !           938:    short * tmp_slist = (short *)slist;
        !           939:    for(x = 0;; x++ ) {
        !           940:        for (y = 0; y < 11; y ++) {
        !           941:        if(((x * 12) + y) > t.hashsize) break;
        !           942:           catprintf("%6d ", tmp_slist[(x*12)+y]);
        !           943:        }
        !           944:        *arg->output_stream << "\n";
        !           945:        if(((x * 12) + y) > t.hashsize) break;
        !           946:    }
        !           947: 
        !           948:    free_fetched (slist);
        !           949: 
        !           950:    print_ptr("t_name", t.t_name);
        !           951:    print_ptr("real_block", t.real_block);
        !           952:    print_ptr("name", t.t_name);
        !           953:    print_ptr("next", t.next);
        !           954: }
        !           955: 
        !           956: void
        !           957: displayer::a_gen ()
        !           958: {
        !           959:     struct gen& g = *Pgen(node);
        !           960: 
        !           961:     printf("$gen %s |0x%p",
        !           962:           token_name(node->base),
        !           963:           node_address);
        !           964: 
        !           965:     print_ptr ("fct_list", g.fct_list);
        !           966:     indent += Indent_Increment;
        !           967:     a_type();                  /* do the supertype. */
        !           968:     indent -= Indent_Increment;
        !           969: }
        !           970: 
        !           971: void
        !           972: displayer::a_vec ()
        !           973: {
        !           974:    struct vec& v = *Pvec(node);
        !           975: 
        !           976:    printf("$vec %s |0x%p",
        !           977:          token_name(node->base),
        !           978:          node_address);
        !           979:    printf("size:\t\t%d", v.size);
        !           980:    print_ptr ("typ", v.typ);
        !           981:    print_ptr ("dim", v.dim);
        !           982: }
        !           983: 
        !           984: void
        !           985: displayer::a_ptr ()
        !           986: {
        !           987:     struct ptr& p = *Pptr(node);
        !           988: 
        !           989:     printf("$ptr %s |0x%p",
        !           990:           token_name(node->base),
        !           991:           node_address);
        !           992:     ind();
        !           993:     printf("rdo:\t\t%d", p.rdo);
        !           994:     ind();
        !           995: 
        !           996:     print_ptr ("typ", p.typ);
        !           997:     print_ptr ("memof", p.memof);
        !           998: }
        !           999: 
        !          1000: 
        !          1001: void
        !          1002: displayer::a_nlist()
        !          1003: {
        !          1004:     name_list& n = *Plist(node);
        !          1005: 
        !          1006:     printf("$name_list %s |0x%p ",
        !          1007:           token_name(node->base),
        !          1008:           node_address);
        !          1009:     
        !          1010:     print_ptr("f", n.f);
        !          1011:     print_ptr("l", n.l);
        !          1012: }
        !          1013: 
        !          1014: void
        !          1015: displayer::a_iline()
        !          1016: {
        !          1017:     struct iline& i = *(struct iline *)node;
        !          1018: 
        !          1019:     printf("$iline %s |0x%p ",
        !          1020:           token_name(node->base),
        !          1021:           node_address);
        !          1022:     
        !          1023:     print_ptr("fct_name", i.fct_name);
        !          1024:     print_ptr("i_next", i.i_next);
        !          1025:     print_ptr("i_table", i.i_table);
        !          1026:     nz_printf("i_slots:\t%d", i.i_slots);
        !          1027:     print_ptr("i_args", i.i_args);
        !          1028: }
        !          1029: 
        !          1030: void
        !          1031: displayer::a_ia()
        !          1032: {
        !          1033:     struct ia& i = *(struct ia *)node;
        !          1034: 
        !          1035:     printf("$ia %s |0x%p ",
        !          1036:           token_name(node->base),
        !          1037:           node_address);
        !          1038:     
        !          1039:     print_ptr("local", i.local);
        !          1040:     print_ptr("arg", i.arg);
        !          1041:     print_ptr("tp", i.tp);
        !          1042: }
        !          1043: 
        !          1044: static int fetcher (void * info,
        !          1045:                    void * pointer,
        !          1046:                    unsigned long length,
        !          1047:                    int zero_stop,  /* for character strings.*/
        !          1048:                    void * target)
        !          1049: {
        !          1050:     displayer * d = (displayer *)info;
        !          1051:     if(d->arg->fetcher)
        !          1052:        return d->arg->fetcher(d->arg->fetcher_info, pointer, length,
        !          1053:                               zero_stop, target);
        !          1054: }
        !          1055: 
        !          1056: static void 
        !          1057: do_node (Pnode& node, node_class cl, void * info, tree_node_action& action,
        !          1058:         int depth, Pnode na, tree_walk_tree&, int&)
        !          1059: {
        !          1060:     displayer * d = (displayer *)info;
        !          1061:     d->do_node(node, cl, action, depth, na);
        !          1062:     d->arg->output_stream->write("\n", 1);
        !          1063: }
        !          1064: 
        !          1065: 
        !          1066: /* Note -- declared extern "C" in dump_tree.H. */
        !          1067: 
        !          1068: void
        !          1069: display_cfront_node (dcn_arg& arg, Pnode n)
        !          1070: {
        !          1071:     tree_walk_control twc;
        !          1072:     displayer d (arg);
        !          1073:     
        !          1074:     if(arg.verbose == dt_normal)arg.max_depth = 0;
        !          1075:     twc.callback_info = (void *)&d;
        !          1076:     if(arg.fetcher) twc.fetcher = fetcher;
        !          1077:     twc.action_proc = do_node;
        !          1078:     twc.error_stream = arg.error_stream;
        !          1079:     twc.nodes_seen_hash = arg.nodes_seen_hash;
        !          1080:     twc.resolve_by_name = 0;   /* we want to display the by_name nodes */
        !          1081:     twc.dont_chase_lists_top = 1; /* don't display n_list or s_list peers
        !          1082:                                     at the top level. */
        !          1083: 
        !          1084:     walk_tree(twc, n);
        !          1085: 
        !          1086:     arg.error_stream->flush();
        !          1087:     arg.output_stream->flush();
        !          1088: }
        !          1089: 
        !          1090: 
        !          1091: extern "C" void _fcout();
        !          1092: 
        !          1093: void _fcout () { cout.flush(); }
        !          1094: 
        !          1095: static char rcsinfo[] = "$Header: /usr3/lang/benson/work/stripped_cfront/RCS/dump_tree.c,v 1.1 89/11/20 08:50:22 benson Exp $";
        !          1096: 
        !          1097: 
        !          1098: /* $Log:       dump_tree.c,v $
        !          1099:  * Revision 1.1  89/11/20  08:50:22  benson
        !          1100:  * Initial revision
        !          1101:  * 
        !          1102: Revision 1.32  89/11/03  16:18:32  benson
        !          1103: mind rot.
        !          1104: 
        !          1105: Revision 1.31  89/11/03  16:10:04  benson
        !          1106: Oh, don't try to use the name constructor inside dgb.
        !          1107: 
        !          1108: Revision 1.30  89/11/03  15:28:39  benson
        !          1109: fix cn for tables.
        !          1110: 
        !          1111: Revision 1.29  89/10/31  14:47:24  benson
        !          1112: new function flags. Bug in vector printing.
        !          1113: 
        !          1114: Revision 1.28  89/10/20  14:33:06  benson
        !          1115: print abnormal function flag, don't print n_list and s_list peers
        !          1116: of top item dumped.
        !          1117: 
        !          1118: Revision 1.27  89/10/06  14:44:28  benson
        !          1119: use new token name array courtesy of byacc.
        !          1120: 
        !          1121: Revision 1.26  89/10/04  18:54:21  dysak
        !          1122: Add code to dump the let_address_of_deref_be_address_of and
        !          1123:    nonempty_converted_collection flags in an expression node.
        !          1124: Add code to dump the n_persistent_db field of a name node.
        !          1125: Fix failure to discriminate properly between the n_realscope
        !          1126:    and n_qualifier nodes properly when dumping.
        !          1127: 
        !          1128: Revision 1.25  89/09/22  14:03:32  benson
        !          1129: fixes for locs.
        !          1130: 
        !          1131: Revision 1.24  89/09/14  15:25:47  benson
        !          1132: display a table as the top level item, but not deeper in.
        !          1133: 
        !          1134: Revision 1.23  89/09/13  09:17:10  benson
        !          1135: rename aggregate to collection.
        !          1136: 
        !          1137: Revision 1.22  89/09/08  13:49:52  benson
        !          1138: fix handling for dt_normal to print something,
        !          1139: and also stop printing a spurious >.
        !          1140: 
        !          1141: Revision 1.21  89/09/02  22:08:10  benson
        !          1142: deal with changes to tree copies.
        !          1143: 
        !          1144: Revision 1.20  89/08/29  13:39:57  benson
        !          1145: disentangle the character string name of a generic function
        !          1146: from n_table_list.
        !          1147: 
        !          1148: Revision 1.19  89/08/24  08:45:11  benson
        !          1149: some support for queries and templates.
        !          1150: 
        !          1151: Revision 1.17  89/07/27  13:30:33  benson
        !          1152: agg changes.
        !          1153: 
        !          1154: Revision 1.16  89/07/21  16:49:44  benson
        !          1155: checked in with -k by benson at 89.07.24.15.48.50.
        !          1156: 
        !          1157: Revision 1.16  89/07/21  16:49:44  benson
        !          1158: support for by_name nodes.
        !          1159: 
        !          1160: Revision 1.15  89/07/18  15:17:39  benson
        !          1161: print local classes, not args, under label local_classes.
        !          1162: other bugfixes.
        !          1163: 
        !          1164: Revision 1.14  89/07/14  10:58:30  benson
        !          1165: rewrite as a user of the new tree_walk facilities. Brief mode
        !          1166: is most likely busted.
        !          1167: 
        !          1168: Revision 1.13  89/07/10  10:51:32  benson
        !          1169: add fields added in 2.0 or just plain missed before.
        !          1170: 
        !          1171: Revision 1.13  89/07/09  14:37:21  benson
        !          1172: print aggregate facts. Treat QUERIES as exprs. 
        !          1173: 
        !          1174: Revision 1.12  89/06/30  15:28:26  benson
        !          1175: checked in with -k by benson at 89.07.07.08.32.34.
        !          1176: 
        !          1177: Revision 1.12  89/06/30  15:28:26  benson
        !          1178: add ZTYPE to the list of type nodes, whatever it is.
        !          1179: 
        !          1180: Revision 1.11  89/06/30  14:34:07  benson
        !          1181: run script to make token name list automatically from tokens
        !          1182: in gram.y
        !          1183: 
        !          1184: Revision 1.9  89/06/29  08:44:47  benson
        !          1185: checked in with -k by benson at 89.06.29.20.54.47.
        !          1186: 
        !          1187: Revision 1.9  89/06/29  08:44:47  benson
        !          1188: token_name function useful in parse tracing.
        !          1189: 
        !          1190: Revision 1.8  89/06/28  12:57:53  benson
        !          1191: Port of changes from 2.0beta6 odi bugfixes
        !          1192: 
        !          1193:    end_log
        !          1194: 
        !          1195: */

unix.superglobalmegacorp.com

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