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

1.1     ! root        1: /* -*- Mode:C++ -*- */
        !             2: /*ident        "@(#)ctrans:src/typ2.c  1.1.5.15" */
        !             3: /*
        !             4:        $Source: /usr3/lang/benson/work/stripped_cfront/RCS/typ2.c,v $ $RCSfile: typ2.c,v $
        !             5:        $Revision: 1.1 $                $Date: 89/11/20 08:51:09 $
        !             6:        $Author: benson $               $Locker:  $
        !             7:        $State: Exp $
        !             8: 
        !             9: 
        !            10: */
        !            11: /**************************************************************************
        !            12: 
        !            13:        C++ source for cfront, the C++ compiler front-end
        !            14:        written in the computer science research center of Bell Labs
        !            15: 
        !            16:        Copyright (c) 1984 AT&T, Inc. All rigths Reserved
        !            17:        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC.
        !            18: 
        !            19: typ2.c:
        !            20: 
        !            21: ***************************************************************************/
        !            22:  
        !            23: #include "cfront.h"
        !            24: #include "size.h"
        !            25: 
        !            26: extern int chars_in_largest;
        !            27: int largest_int;
        !            28: 
        !            29: void typ_init()
        !            30: {      
        !            31:        chars_in_largest = strlen(LARGEST_INT);
        !            32:        largest_int = int(str_to_long(LARGEST_INT));
        !            33: 
        !            34:        defa_type = new basetype(INT,0);        // note defa_type!=int_type
        !            35:        int_type = new basetype(INT,0);         // but they both represent `int'
        !            36: 
        !            37:        PERM(int_type); int_type->defined = DEFINED ;
        !            38:        PERM(defa_type); defa_type->defined = DEFINED ;
        !            39: 
        !            40:        moe_type = new basetype(INT,0);
        !            41:        PERM(moe_type); moe_type->defined = DEFINED ;
        !            42:        moe_type->b_const = 1;
        !            43:        moe_type->check(0);
        !            44: 
        !            45:        uint_type = new basetype(INT,0);
        !            46:        PERM(uint_type); uint_type->defined = DEFINED ;
        !            47:        uint_type->type_adj(UNSIGNED);
        !            48:        uint_type->check(0);
        !            49: 
        !            50:        long_type = new basetype(LONG,0);
        !            51:        PERM(long_type); long_type->defined = DEFINED ;
        !            52:        long_type->check(0);
        !            53: 
        !            54:        ulong_type = new basetype(LONG,0);
        !            55:        PERM(ulong_type); ulong_type->defined = DEFINED ;
        !            56:        ulong_type->type_adj(UNSIGNED);
        !            57:        ulong_type->check(0);
        !            58: 
        !            59:        short_type = new basetype(SHORT,0);
        !            60:        PERM(short_type); short_type->defined = DEFINED ;
        !            61:        short_type->check(0);
        !            62: 
        !            63:        ushort_type = new basetype(SHORT,0);
        !            64:        PERM(ushort_type); ushort_type->defined = DEFINED ;
        !            65:        ushort_type->type_adj(UNSIGNED);
        !            66:        ushort_type->check(0);
        !            67: 
        !            68:        float_type = new basetype(FLOAT,0);
        !            69:        PERM(float_type); float_type->defined = DEFINED ;
        !            70: 
        !            71:        double_type = new basetype(DOUBLE,0);
        !            72:        PERM(double_type); double_type->defined = DEFINED ;
        !            73: 
        !            74:        ldouble_type = new basetype(LDOUBLE,0);
        !            75:        PERM(ldouble_type); ldouble_type->defined = DEFINED ;
        !            76: 
        !            77:        zero_type = new basetype(ZTYPE,0);
        !            78:        PERM(zero_type); zero_type->defined = DEFINED ;
        !            79:        zero->tp = zero_type;
        !            80: 
        !            81:        void_type = new basetype(VOID,0);
        !            82:        PERM(void_type); void_type->defined = DEFINED ;
        !            83: 
        !            84:        char_type = new basetype(CHAR,0);
        !            85:        PERM(char_type); char_type->defined = DEFINED ;
        !            86: 
        !            87:        uchar_type = new basetype(CHAR,0);
        !            88:        PERM(uchar_type); uchar_type->defined = DEFINED ;
        !            89:        uchar_type->type_adj(UNSIGNED);
        !            90:        uchar_type->check(0);
        !            91: 
        !            92:        Pchar_type = char_type->addrof();
        !            93:        PERM(Pchar_type); Pchar_type->defined = DEFINED ;
        !            94: 
        !            95:        Pint_type = int_type->addrof();
        !            96:        PERM(Pint_type); Pint_type->defined = DEFINED ;
        !            97: 
        !            98:        Pvoid_type = void_type->addrof();
        !            99:        PERM(Pvoid_type); Pvoid_type->defined = DEFINED ;
        !           100: 
        !           101:        Pfctvec_type = new fct(int_type,0,0);   // must be last, see basetype::normalize()
        !           102:        Pfctvec_type = Pfctvec_type->addrof();
        !           103:        Pfctvec_type = Pfctvec_type->addrof();
        !           104:        PERM(Pfctvec_type); Pfctvec_type->defined = DEFINED ;
        !           105: 
        !           106:        any_tbl = new table(TBLSIZE,0,0);
        !           107:        gtbl = new table(GTBLSIZE,0,0);
        !           108:        gtbl->t_name = new name("global");
        !           109: }
        !           110: 
        !           111: Pbase basetype::arit_conv(Pbase t)
        !           112: /*
        !           113:        perform the "usual arithmetic conversions" C ref Manual 6.6
        !           114:        on "this" op "t"
        !           115:        "this" and "t" are integral or floating
        !           116:        "t" may be 0
        !           117: */
        !           118: {
        !           119:        while (base == TYPE) this = Pbase(Pbase(this)->b_name->tp);
        !           120: 
        !           121:        bit l;
        !           122:        bit u;
        !           123:        bit f;
        !           124:        bit l1 = (base == LONG);
        !           125:        bit u1 = b_unsigned;
        !           126:        bit f1 = (base==FLOAT || base==DOUBLE || base==LDOUBLE);
        !           127:        if (t) {
        !           128:                while (t->base == TYPE) t = Pbase(Pbase(t)->b_name->tp);
        !           129:                bit l2 = (t->base == LONG);
        !           130:                bit u2 = t->b_unsigned;
        !           131:                bit f2 = (t->base==FLOAT || t->base==DOUBLE || base==LDOUBLE);
        !           132:                l = l1 || l2;
        !           133:                u = u1 || u2;
        !           134:                f = f1 || f2;
        !           135:        }
        !           136:        else {
        !           137:                l = l1;
        !           138:                u = u1;
        !           139:                f = f1;
        !           140:        }
        !           141: 
        !           142:        if (f) {
        !           143:                if (base==LDOUBLE || (t && t->base==LDOUBLE)) return ldouble_type;
        !           144:                if (base==DOUBLE || (t && t->base==DOUBLE)) return double_type;
        !           145:                return float_type;
        !           146:        }
        !           147:        if (l & u) return ulong_type;
        !           148:        if (l & !u) return long_type;
        !           149:        if (u) {
        !           150:                if (base==INT || (t && t->base==INT)) return uint_type;
        !           151:                if (SZ_SHORT==SZ_INT) // ANSIism
        !           152:                        if (base==SHORT || (t && t->base==SHORT)) return uint_type;
        !           153:                return int_type;
        !           154:        }
        !           155:        return int_type;
        !           156: }
        !           157: 
        !           158: bit vec_const = 0;
        !           159: bit fct_const = 0;
        !           160: 
        !           161: bit type::tconst()
        !           162: /*
        !           163:        is this type a constant
        !           164: */
        !           165: {
        !           166:        Ptype t = this;
        !           167:        vec_const = 0;
        !           168:        fct_const = 0;
        !           169: //error('d',"tconst %t",t);
        !           170: xxx:
        !           171:        switch (t->base) {
        !           172:        case TYPE:
        !           173:                if (Pbase(t)->b_const) return 1;
        !           174:                t = Pbase(t)->b_name->tp;
        !           175:                goto xxx;
        !           176:        case VEC:
        !           177:                vec_const = 1;
        !           178:                return 1;
        !           179:        case PTR:
        !           180:        case RPTR:
        !           181:                return Pptr(t)->rdo;
        !           182:        case FCT:
        !           183:        case OVERLOAD:
        !           184:                fct_const = 1;
        !           185:                return 1;
        !           186:        default:
        !           187:                return Pbase(t)->b_const;
        !           188:        }
        !           189: }
        !           190: 
        !           191: TOK type::set_const(bit mode)
        !           192: /*
        !           193:        make someting a constant or variable, return old status
        !           194: */
        !           195: {
        !           196:        Ptype t = this;
        !           197:        int m;
        !           198: xxx:
        !           199:        switch (t->base) {
        !           200:        case TYPE:
        !           201:                m = Pbase(t)->b_const;
        !           202:                Pbase(t)->b_const = mode;
        !           203:                t = Pbase(t)->b_name->tp;
        !           204:                goto xxx;
        !           205:        case ANY:
        !           206:        case RPTR:
        !           207:        case VEC:
        !           208:                return t->base;         // constant by definition
        !           209:        case PTR:
        !           210:                m = Pptr(t)->rdo;
        !           211:                Pptr(t)->rdo = mode;
        !           212:                return m;
        !           213:        default:
        !           214:                m = Pbase(t)->b_const;
        !           215:                Pbase(t)->b_const = mode;
        !           216:                return m;
        !           217:        }
        !           218: }
        !           219: 
        !           220: Pptr type::is_ref()
        !           221: {
        !           222:        Ptype t = this;
        !           223: xxx:
        !           224:        switch (t->base) {
        !           225:        case TYPE:      t = Pbase(t)->b_name->tp; goto xxx;
        !           226:        case RPTR:      return Pptr(t);
        !           227:        default:        return 0;
        !           228:        }
        !           229: }
        !           230: 
        !           231: Pclass Mptr;
        !           232: 
        !           233: Pptr type::is_ptr()
        !           234: {
        !           235:        Ptype t = this;
        !           236: xxx:
        !           237:        switch (t->base) {
        !           238:        case TYPE:      t = Pbase(t)->b_name->tp; goto xxx;
        !           239:        case PTR:
        !           240:        case VEC:       Mptr = Pptr(t)->memof;
        !           241:                        return Pptr(t);
        !           242:        default:        return 0;
        !           243:        }
        !           244: }
        !           245: 
        !           246: Pptr type::is_ptr_or_ref()
        !           247: {
        !           248:        Ptype t = this;
        !           249: xxx:
        !           250:        switch (t->base) {
        !           251:        case TYPE:      t = Pbase(t)->b_name->tp; goto xxx;
        !           252:        case PTR:
        !           253:        case RPTR:
        !           254:        case VEC:       Mptr = Pptr(t)->memof;
        !           255:                        return Pptr(t);
        !           256:        default:        return 0;
        !           257:        }
        !           258: }
        !           259: 
        !           260: int type::align()
        !           261: {
        !           262:        Ptype t = this;
        !           263: xx:
        !           264: /*fprintf(stderr,"align %d %d\n",t,t->base);*/
        !           265:        switch (t->base) {
        !           266:        case TYPE:      t = Pbase(t)->b_name->tp; goto xx;
        !           267:        case COBJ:      t = Pbase(t)->b_name->tp; goto xx;
        !           268:        case VEC:       t = Pvec(t)->typ; goto xx;
        !           269:        case ANY:       return 1;
        !           270:        case CHAR:      return AL_CHAR;
        !           271:        case SHORT:     return AL_SHORT;
        !           272:        case INT:       return AL_INT;
        !           273:        case LONG:      return AL_LONG;
        !           274:        case FLOAT:     return AL_FLOAT;
        !           275:        case DOUBLE:    return AL_DOUBLE;
        !           276:        case LDOUBLE:   return AL_LDOUBLE;
        !           277:        case PTR:
        !           278:        case RPTR:      return AL_WPTR;
        !           279:        case CLASS:     return Pclass(t)->obj_align;
        !           280:        case ENUM:
        !           281:        case EOBJ:      return AL_INT;
        !           282:        case VOID:      error("illegal use of void"); return AL_INT;
        !           283:        default:        error('i',"(%d,%k)->type::align",t,t->base);
        !           284:        }
        !           285: }
        !           286: 
        !           287: bit fake_sizeof;
        !           288: 
        !           289: int type::tsizeof()
        !           290: /*
        !           291:        the sizeof type operator
        !           292:        return the size in bytes of the types representation
        !           293: */
        !           294: {
        !           295:        Ptype t = this;
        !           296: zx:
        !           297: //error('d',"zx %t %d",t,t->base);
        !           298:        if (t == 0) error('i',"typ.tsizeof(t==0)");
        !           299:        switch (t->base) {
        !           300:        case TYPE:
        !           301:                t = Pbase(t)->b_name->tp;
        !           302:                goto zx;
        !           303:        case COBJ:
        !           304:                t = Pbase(t)->b_name->tp;
        !           305:                if (t == 0) return 0;   // ``fake'' generated classes: _Sdd
        !           306:                goto zx;
        !           307: 
        !           308:        case ANY:       return 1;
        !           309:        case VOID:      return 0;
        !           310:        case ZTYPE:     return SZ_WPTR; /* assume pointer */
        !           311:        case CHAR:      return SZ_CHAR;
        !           312:        case SHORT:     return SZ_SHORT;
        !           313:        case INT:       return SZ_INT;
        !           314:        case LONG:      return SZ_LONG;
        !           315:        case FLOAT:     return SZ_FLOAT;
        !           316:        case DOUBLE:    return SZ_DOUBLE;
        !           317:        case LDOUBLE:   return SZ_LDOUBLE;
        !           318: 
        !           319:        case VEC:
        !           320:                {       Pvec v = Pvec(t);
        !           321:                        if (v->size == 0) {
        !           322:                                if (fake_sizeof == 0) error('w',"sizeof array with undeclared dimension");
        !           323:                                return SZ_WPTR; // vector argument has sizeof ptr
        !           324:                        }
        !           325:                        return v->size * v->typ->tsizeof();
        !           326:                }
        !           327:        case RPTR:      
        !           328:        case PTR:
        !           329:        {       int k = (Pptr(t)->memof)?sizeof(short)+sizeof(short):0;
        !           330:                t = Pptr(t)->typ;
        !           331:        xxx:
        !           332:                switch (t->base) {
        !           333:                default:        return SZ_WPTR;
        !           334:                case CHAR:      return SZ_BPTR;
        !           335:                case FCT:       return SZ_WPTR+k;
        !           336:                case TYPE:      t = Pbase(t)->b_name->tp; goto xxx;
        !           337:                }
        !           338:        }
        !           339:        case FIELD:
        !           340:                return Pbase(t)->b_bits/BI_IN_BYTE+1;
        !           341: 
        !           342:        case CLASS:     
        !           343:        {
        !           344:                 Pclass cl = Pclass(t);
        !           345:                if ((cl->defined&(DEFINED|SIMPLIFIED)) == 0) {
        !           346:                        error("%tU, size not known",cl);
        !           347:                        return SZ_INT;
        !           348:                }
        !           349:                if (cl->c_body == 1)    // detect first allocation or sizeof
        !           350:                        cl->dcl_print(0);
        !           351:                return cl->obj_size;
        !           352:        }
        !           353: 
        !           354:        case EOBJ:
        !           355:        case ENUM:      return SZ_INT;
        !           356: 
        !           357:        default:        return 0;       // deref can be called for any type
        !           358:                        //error('i',"sizeof(%d)",t->base);
        !           359:        }
        !           360: }
        !           361: 
        !           362: bit type::vec_type()
        !           363: {
        !           364:        Ptype t = this;
        !           365: xx:
        !           366:        switch (t->base) {
        !           367:        case ANY:
        !           368:        case VEC:
        !           369:        case PTR:
        !           370:        case RPTR:      return 1;
        !           371:        case TYPE:      t = Pbase(t)->b_name->tp; goto xx;
        !           372:        default:        return 0;
        !           373:        }
        !           374: }
        !           375: 
        !           376: int ref_initializer;
        !           377: 
        !           378: Ptype type::deref()
        !           379: /*     index==1:       *p
        !           380:        index==0:       p[expr]
        !           381: */
        !           382: {
        !           383: //error('d',"%t -> deref() refd %d",this,ref_initializer);
        !           384:        Ptype t = this;
        !           385: xx:
        !           386:        switch (t->base) {
        !           387:        case TYPE:
        !           388:                t = Pbase(t)->b_name->tp;
        !           389:                goto xx;
        !           390:        case PTR:
        !           391:        case RPTR:
        !           392:        case VEC:
        !           393:        {       if (t == Pvoid_type) error("void* deRd");
        !           394:                Ptype tt = t = Pvec(t)->typ;
        !           395:                if (ref_initializer == 0) {
        !           396:                        while (tt->base == TYPE) tt = Pbase(tt)->b_name->tp;
        !           397:                        if (tt->base == COBJ) { 
        !           398:                                tt = Pbase(tt)->b_name->tp;
        !           399:                                if (tt && Pclass(tt)->defined&(DEFINED|SIMPLIFIED))
        !           400:                                        (void) t->tsizeof();
        !           401:                         }
        !           402:                }
        !           403:                // no break
        !           404:        }
        !           405:        case ANY:
        !           406:                return t;
        !           407:        default:
        !           408:                error("nonP deRd");
        !           409:                return any_type;
        !           410:        }
        !           411: }
        !           412: 
        !           413: Pfct type::memptr()
        !           414: // is ``this'' a pointer to member function
        !           415: {
        !           416:        Ptype t = this;
        !           417:        while (t->base == TYPE) t = Pbase(t)->b_name->tp;
        !           418:        if (t->base != PTR || Pptr(t)->memof==0) return 0;
        !           419: 
        !           420:        t = Pptr(t)->typ;
        !           421:        while (t->base == TYPE) t = Pbase(t)->b_name->tp;
        !           422:        return (t->base == FCT) ? Pfct(t) : 0;
        !           423: }
        !           424: 
        !           425: /* ODI notes
        !           426: 
        !           427:    turn on DEFINED for predefined types to control tree copying
        !           428:    for parameterized types 
        !           429: */

unix.superglobalmegacorp.com

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