Annotation of researchv10no/cmd/cfront/ocfront/norm2.c, revision 1.1.1.1

1.1       root        1: /*ident        "@(#)ctrans:src/norm2.c 1.1.5.12" */
                      2: /************************************************************************
                      3: 
                      4:        C++ source for cfront, the C++ compiler front-end
                      5:        written in the computer science research center of Bell Labs
                      6: 
                      7:        Copyright (c) 1984 AT&T, Inc. All rigths Reserved
                      8:        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC.
                      9: 
                     10: norm2.c:
                     11: 
                     12:        "normalization" handles problems which could have been handled
                     13:        by the syntax analyser; but has not been done. The idea is
                     14:        to simplify the grammar and the actions associated with it,
                     15:        and to get a more robust error handling
                     16: 
                     17: ****************************************************************************/
                     18: 
                     19: #include "cfront.h"
                     20: #include "size.h"
                     21: const NBITE = (CHUNK-8)/sizeof(name)-1;
                     22: const EBITE = (CHUNK-8)/sizeof(expr)-1;
                     23: const SBITE = (CHUNK-8)/sizeof(stmt)-1;
                     24: 
                     25: #ifdef DBG
                     26: long node_id = 0;
                     27: #define DBCHECK() if(node::allocated) error('i',"allocated node (id %d, base%k) on free list! (src: \"%s\", %d",node::id,node::base,__FILE__,__LINE__);
                     28: #else
                     29: #define DBCHECK() /**/
                     30: #endif
                     31: 
                     32: fct::fct(Ptype t, Pname arg, TOK known)
                     33: {
                     34:        base = FCT;
                     35:        nargs_known = known;
                     36:        returns = t;
                     37:        argtype = arg; 
                     38:        DBID();
                     39: 
                     40:        if (arg==0 || arg->base==ELIST) return;
                     41: //error('d',"fct::fct %d sig %d",this,f_signature);
                     42:        register Pname n;
                     43:        Pname pn = 0;
                     44:        for (n=arg; n; pn=n,n=n->n_list) {
                     45:                if( n->n_sto==EXTERN ) error("externA");
                     46:                if( n->n_sto==STATIC ) error("static used forA%n",arg);
                     47:  
                     48:                switch (n->tp->base) {
                     49:                case VOID:
                     50:                        argtype = 0;
                     51:                        nargs_known = 1;
                     52:                        if(n->n_initializer)
                     53:                                error("voidFA");
                     54:                        else if (n->string)
                     55:                                error("voidFA%n",n);
                     56:                        else if (nargs || n->n_list) {
                     57:                                error("voidFA");
                     58:                                nargs_known = 0;
                     59:                        }
                     60:                        nargs = 0;
                     61:                        break;
                     62:                case CLASS:
                     63:                case ENUM:
                     64:                        error("%k defined inAL (will not be in scope at point of call)",n->tp->base);
                     65:                        if (n == argtype)
                     66:                                argtype = n->n_list;
                     67:                        else
                     68:                                pn->n_list = n->n_list;
                     69:                        break;
                     70:                default:
                     71:                        nargs++;
                     72:                }
                     73:        }
                     74: }
                     75: 
                     76: Pexpr expr_free;
                     77: 
                     78: expr::expr(TOK ba, Pexpr a, Pexpr b)
                     79: {
                     80:        register Pexpr p;
                     81: 
                     82:        if (this) goto ret;
                     83: 
                     84:        if ( (p=expr_free) == 0 ) {
                     85:                register Pexpr q = (Pexpr) chunk(1);
                     86:                for (p=expr_free=&q[EBITE-1]; q<p; p--) {
                     87:                        p->e1 = p-1;
                     88:                        DB(p->node::allocated=0);
                     89:                }
                     90:                (p+1)->e1 = 0;
                     91:                DB(p->node::allocated=0);
                     92:        }
                     93:        else
                     94:                expr_free = p->e1;
                     95: 
                     96:        this = p;
                     97:        DBCHECK();
                     98: 
                     99:        permanent = 0;
                    100:        tp = 0;
                    101:        tp2 = 0;
                    102: ret:
                    103:        base = ba;
                    104:        e1 = a;
                    105:        e2 = b;
                    106:        DBID();
                    107: }
                    108: 
                    109: expr::~expr()
                    110: {
                    111:        DB( if(!node::allocated) error('i',"deleting unallocated expr:%k! -- id==%d",base,node::id);
                    112:            node::allocated = 0;
                    113:        );
                    114:        e1 = expr_free;
                    115:        expr_free = this;
                    116:        this = 0;
                    117: }
                    118: 
                    119: Pstmt stmt_free;
                    120: 
                    121: stmt::stmt(TOK ba, loc ll, Pstmt a)
                    122: {
                    123:        register Pstmt p;
                    124: 
                    125:        if ( (p=stmt_free) == 0 ) {
                    126:                register Pstmt q = (Pstmt) chunk(1);
                    127:                for (p=stmt_free=&q[SBITE-1]; q<p; p--) {
                    128:                        p->s_list = p-1;
                    129:                        DB(p->node::allocated=0);
                    130:                }
                    131:                (p+1)->s_list = 0;
                    132:                DB(p->node::allocated=0);
                    133:        }
                    134:        else
                    135:                stmt_free = p->s_list;
                    136: 
                    137:        this = p;
                    138:        DBCHECK();
                    139: 
                    140:        permanent = 0;
                    141:        e = e2 = 0;
                    142:        memtbl = 0;
                    143:        else_stmt = 0;
                    144:        s_list = 0;
                    145: 
                    146: //     Ns++;
                    147:        base = ba;
                    148:        where = ll;
                    149:        s=a;
                    150:        DBID();
                    151: }
                    152: 
                    153: stmt::~stmt()
                    154: {
                    155:        DB( if(!node::allocated) error('i',"deleting unallocated stmt:%k! -- id==%d",base,node::id);
                    156:            node::allocated = 0;
                    157:        );
                    158: //     NFs++;
                    159:        s_list = stmt_free;
                    160:        stmt_free = this;
                    161:        this = 0;
                    162: }
                    163: 
                    164: classdef::classdef(TOK b)
                    165: {
                    166:        base = CLASS;
                    167:        csu = b;
                    168:        memtbl = new table(CTBLSIZE,0,0);
                    169:        c_funqf = 0;
                    170:        c_funqr = 0;
                    171:        DBID();
                    172: }
                    173: 
                    174: basetype::basetype(TOK b, Pname n)
                    175: {
                    176: //     Nbt++;
                    177:        switch (b) {
                    178:        case 0:                         break;
                    179:        case TYPEDEF:   b_typedef = 1;  break;
                    180:        case INLINE:    b_inline = 1;   break;
                    181:        case VIRTUAL:   b_virtual = 1;  break;
                    182:        case CONST:     b_const = 1;    break;
                    183:        case UNSIGNED:  b_unsigned = 1; break;
                    184:        case FRIEND:
                    185:        case OVERLOAD:
                    186:        case EXTERN:
                    187:        case STATIC:
                    188:        case AUTO:
                    189:        case REGISTER:  b_sto = b;      break;
                    190:        case SHORT:     b_short = 1;    break;
                    191:        case LONG:      b_long = 1;     break;
                    192:        case ANY:
                    193:        case ZTYPE:
                    194:        case VOID:
                    195:        case CHAR:
                    196:        case INT:
                    197:        case FLOAT:
                    198:        case LDOUBLE:
                    199:        case DOUBLE:    base = b;       break;
                    200:        case TYPE:
                    201:        case COBJ:
                    202:        case EOBJ:
                    203:        case FIELD:
                    204:        case ASM:
                    205:                base = b;
                    206:                b_name = n;
                    207:                break;
                    208:        case SIGNED:
                    209:        case VOLATILE:
                    210:                error('w',"\"%k\" not implemented (ignored)",b);
                    211:                break;
                    212:        default:
                    213:                error('i',"badBT:%k",b);
                    214:        }
                    215:        DBID();
                    216: }
                    217: 
                    218: Pname name_free;
                    219: 
                    220: #ifdef __cplusplus
                    221: name::name(char* s) : expr(NAME,0,0)
                    222: #else
                    223: name::name(char* s) : (NAME,0,0)
                    224: #endif
                    225: {
                    226:        register Pname p;
                    227: 
                    228:        if ( (p=name_free) == 0 ) {
                    229:                register Pname q = (Pname) chunk(1);
                    230:                for (p=name_free=&q[NBITE-1]; q<p; p--) {
                    231:                        p->n_tbl_list = p-1;
                    232:                        DB(p->node::allocated=0);
                    233:                }
                    234:                (p+1)->n_tbl_list = 0;
                    235:                DB(p->node::allocated=0);
                    236:        }
                    237:        else
                    238:                name_free = p->n_tbl_list;
                    239: 
                    240:        this = p;
                    241:        // DBCHECK() called in expr::expr
                    242: 
                    243:        string = s;
                    244:        where = curloc;
                    245:        lex_level = bl_level;
                    246: 
                    247:        // beware of alignment differences & pointer-zeros that is not int-zeros
                    248:        tp = 0;
                    249:        n_initializer = 0;
                    250:        n_table = 0;
                    251:        n_oper = 0;
                    252:        n_sto = 0;
                    253:        n_stclass = 0;
                    254:        n_scope = 0;
                    255:        n_union = 0;
                    256:        n_evaluated = 0;
                    257:        n_xref = 0;
                    258:        n_protect = 0;
                    259:        n_dcl_printed = 0;
                    260:        n_addr_taken = 0;
                    261:        n_used = 0;
                    262:        n_assigned_to = 0;
                    263:        n_val = 0;
                    264:        n_offset = 0;
                    265:        n_list = 0;
                    266:        n_tbl_list = 0;
                    267:        n_qualifier = 0;
                    268:        n_key = 0;
                    269:        n_anon = 0;
                    270: }
                    271: 
                    272: name::~name()
                    273: {
                    274:        DB( if(!node::allocated) error('i',"deleting unallocated name %s! -- id==%d",string?string:"???",node::id);
                    275:            node::allocated = 0;
                    276:        );
                    277:        n_tbl_list = name_free;
                    278:        name_free = this;
                    279:        this = 0;
                    280: }
                    281: 
                    282: 
                    283: nlist::nlist(Pname n)
                    284: {
                    285:        head = n;
                    286:        for (Pname nn=n; nn->n_list; nn=nn->n_list);
                    287:        tail = nn;
                    288: }
                    289: 
                    290: void nlist::add_list(Pname n)
                    291: {
                    292:        if (n->tp && (n->tp->defined & IN_ERROR)) return;
                    293: 
                    294:        tail->n_list = n;
                    295:        for (Pname nn=n; nn->n_list; nn=nn->n_list);
                    296:        tail = nn;
                    297: }
                    298: 
                    299: Pname name_unlist(Pnlist l)
                    300: {
                    301:        if (l == 0) return 0;
                    302:        Pname n = l->head;
                    303: 
                    304:        delete l;
                    305:        return n;
                    306: }
                    307: 
                    308: Pstmt stmt_unlist(Pslist l)
                    309: {
                    310:        if (l == 0) return 0;
                    311:        Pstmt s = l->head;
                    312: //     NFl++;
                    313: 
                    314:        delete l;
                    315:        return s;
                    316: }
                    317: 
                    318: Pexpr expr_unlist(Pelist l)
                    319: {
                    320:        if (l == 0) return 0;
                    321:        Pexpr e = l->head;
                    322: //     NFl++;
                    323: 
                    324:        delete l;
                    325:        return e;
                    326: }
                    327: 
                    328: void sig_name(Pname n)
                    329: {
                    330:        static char buf[256];
                    331:        buf[0] = '_';
                    332:        buf[1] = '_';
                    333:        buf[2] = 'o';
                    334:        buf[3] = 'p';
                    335:        char* p = n->tp->signature(buf+4);
                    336:        if (255 < p-buf) error('i',"sig_name():N buffer overflow");
                    337:        char *s = new char [ p - buf + 1 ];
                    338:        strcpy(s,buf);
                    339:        n->string = s;
                    340:        n->tp = 0;
                    341: }
                    342: 
                    343: Ptype tok_to_type(TOK b)
                    344: {
                    345:        Ptype t;
                    346:        switch (b) {
                    347:        case CHAR:      t = char_type; break;
                    348:        case SHORT:     t = short_type; break;
                    349:        case LONG:      t = long_type; break;
                    350:        case UNSIGNED:  t = uint_type; break;
                    351:        case FLOAT:     t = float_type; break;
                    352:        case DOUBLE:    t = double_type; break;
                    353:        case LDOUBLE:   t = ldouble_type; break;
                    354:        case VOID:      t = void_type; break;
                    355:        default:        error("illegalK:%k",b);
                    356:        case INT:       t = int_type;
                    357:        }
                    358:        return t;
                    359: }
                    360: 
                    361: Pbase defa_type;
                    362: Pbase moe_type;
                    363: Pexpr dummy;
                    364: Pexpr zero;
                    365: 
                    366: Pclass ccl;
                    367: Plist modified_tn = 0;
                    368: 
                    369: Plist local_tn = 0;
                    370: Plist local_blk = 0;
                    371: Plist local_class = 0;
                    372: 
                    373: Plist nested_tn = 0;
                    374: Plist nested_type = 0;
                    375: 
                    376: void memptrdcl(Pname bn, Pname tn, Ptype ft, Pname n)
                    377: {
                    378:        Pptr p = new ptr(PTR,0);
                    379:        p->memof = Pclass(Pbase(bn->tp)->b_name->tp);
                    380:        Pbase b = new basetype(TYPE,tn);
                    381:        PERM(p);
                    382:        Pfct f = Pfct(ft);
                    383:        Ptype t = n->tp;
                    384:        if (t) {
                    385:                p->typ = t;
                    386:        ltlt:
                    387:                switch (t->base) {
                    388:                case PTR:
                    389:                case RPTR:
                    390:                case VEC:
                    391:                        if (Pptr(t)->typ == 0) {
                    392:                                Pptr(t)->typ = b;
                    393:                                break;
                    394:                        }
                    395:                        t = Pptr(t)->typ;
                    396:                        goto ltlt;
                    397:                default:
                    398:                        error('s',"P toMFT too complicated");
                    399:                }
                    400:        }
                    401:        else
                    402:        p->typ = b;     
                    403:        f->returns = p;
                    404:        n->tp = f;
                    405: }

unix.superglobalmegacorp.com

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