|
|
1.1 ! root 1: /*ident "@(#)ctrans:src/cfront.h 1.14" */ ! 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 Rights Reserved ! 8: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC. ! 9: ! 10: When reading cfront code please remember that C++ was not available ! 11: when it was originally written. Out of necessity cfront is written ! 12: in a style that takes advantage of only few of C++'s features. ! 13: ! 14: WARNING: This program relies on non-initialized class members being ZERO. ! 15: This will be true as long as they are allocated using the "new" operator ! 16: from alloc.c ! 17: ! 18: cfront.h: ! 19: ! 20: Here is all the class definitions for cfront, and most of the externs ! 21: ! 22: ***********************************************************************/ ! 23: ! 24: #ifndef _CFRONT_H ! 25: #define _CFRONT_H ! 26: ! 27: #include "token.h" ! 28: #include "typedef.h" ! 29: ! 30: #ifndef GRAM ! 31: extern char* prog_name; // compiler name and version ! 32: extern int inline_restr; // inline expansion restrictions ! 33: #endif ! 34: ! 35: extern TOK tlex(); ! 36: extern Pname syn(); ! 37: ! 38: extern void ext(int); ! 39: ! 40: extern char* make_name(TOK); ! 41: extern void make_dummy(); ! 42: extern Pname dummy_fct; ! 43: extern Pname really_dominate(Pname, Pname, bit); ! 44: extern int exact1(Pname, Ptype); ! 45: extern char* strdup(const char*); ! 46: ! 47: extern int friend_check(Pclass start,Pclass stop, Pfct f); ! 48: ! 49: struct loc // a source file location ! 50: { ! 51: short file; // index into file_name[], or zero ! 52: short line; ! 53: #ifndef GRAM ! 54: void put(FILE*); ! 55: void putline(); ! 56: #endif ! 57: }; ! 58: ! 59: extern Loc curloc; ! 60: extern int curr_file; ! 61: extern char* src_file_name; ! 62: extern loc noloc; // dummy null location ! 63: extern bit binary_val; ! 64: extern bit stmtno; ! 65: ! 66: struct ea { // fudge portable printf-like formatting for error() ! 67: union { ! 68: void* p; ! 69: long i; ! 70: }; ! 71: ! 72: ea(const void* pp) { p = pp; } ! 73: ea(long ii) { i = ii; } ! 74: ea() {} ! 75: }; ! 76: ! 77: extern ea* ea0; ! 78: ! 79: overload error; ! 80: int error(const char*); ! 81: int error(const char*, const ea&, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0); ! 82: int error(int, const char*); ! 83: int error(int, const char*, const ea&, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0); ! 84: int error(loc*, const char*, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0); ! 85: int error(int, loc*, const char*, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0); ! 86: extern char emode; ! 87: ! 88: extern int error_count; ! 89: extern int vtbl_opt; ! 90: extern int debug_opt; ! 91: extern int warning_opt; ! 92: extern int ansi_opt; ! 93: extern int strict_opt; ! 94: extern FILE* out_file; ! 95: extern FILE* in_file; ! 96: extern char scan_started; ! 97: ! 98: extern int bl_level; ! 99: extern Ptable ktbl; // keywords and typedef names ! 100: extern Ptable gtbl; // global names ! 101: extern Ptable ptbl; ! 102: extern Ptable lcl_tbl; ! 103: extern char* oper_name(TOK); ! 104: extern Pname def_name; ! 105: extern Pname pdef_name; ! 106: extern Pclass ccl; ! 107: extern Pbase defa_type; ! 108: extern Pbase moe_type; ! 109: extern Pbase mptr_type; ! 110: ! 111: #ifndef GRAM ! 112: extern Pstmt Cstmt; // current statement, or 0 ! 113: extern Pname Cdcl; // name currently being declared, or 0 ! 114: ! 115: extern Pbase any_type; ! 116: extern int largest_int; ! 117: #endif ! 118: ! 119: extern Pbase int_type; ! 120: extern Pbase char_type; ! 121: extern Pbase short_type; ! 122: extern Pbase long_type; ! 123: extern Pbase uint_type; ! 124: extern Pbase float_type; ! 125: extern Pbase double_type; ! 126: extern Pbase ldouble_type; ! 127: extern Pbase void_type; ! 128: ! 129: #ifndef GRAM ! 130: extern Pbase uchar_type; ! 131: extern Pbase ushort_type; ! 132: extern Pbase ulong_type; ! 133: extern Ptype Pchar_type; ! 134: extern Ptype Pint_type; ! 135: extern Ptype Pvptr_type; ! 136: extern Ptype Pfctvec_type; ! 137: extern Ptype Pvoid_type; ! 138: extern Pbase zero_type; ! 139: extern Ptype size_t_type; ! 140: ! 141: extern int byte_offset; ! 142: extern int bit_offset; ! 143: extern int max_align; ! 144: extern int const_save; ! 145: extern int const_ptr; ! 146: extern int cm_const_save; ! 147: extern bit const_problem; ! 148: #endif ! 149: ! 150: extern Pexpr dummy; /* the empty expression */ ! 151: extern Pexpr zero; ! 152: extern Pexpr one; ! 153: extern Pname sta_name; /* qualifier for unary :: */ ! 154: ! 155: #define DEL(p) if (p && (p->permanent==0)) p->del() ! 156: #define PERM(p) p->permanent=1 ! 157: #define UNPERM(p) p->permanent=0 ! 158: ! 159: struct node { ! 160: TOK base; ! 161: bit permanent; ! 162: bit baseclass; // base classes have NAME in their base ... ! 163: #ifdef DBG ! 164: bit displayed; // avoid infinite recursion in display functions ! 165: bit allocated; // set when not on free list ! 166: long id; ! 167: #endif ! 168: }; ! 169: #ifdef DBG ! 170: extern long node_id; ! 171: extern int Adebug; ! 172: #define DBID() { node::id = ++::node_id; node::allocated=1; displayed=0; \ ! 173: if(Adebug>=1)fprintf(stderr,"\n*** allocated %d base %d\n",id,base); } ! 174: #else ! 175: #define DBID() /**/ ! 176: #endif ! 177: ! 178: struct table : node { ! 179: /* a table is a node only to give it a "base" for debugging */ ! 180: bit init_stat; /* ==0 if block(s) of table not simplified, ! 181: ==1 if simplified but had no initializers, ! 182: ==2 if simplified and had initializers. ! 183: */ ! 184: short size; ! 185: short hashsize; ! 186: short free_slot; /* next free slot in entries */ ! 187: Pname* entries; ! 188: short* hashtbl; ! 189: Pstmt real_block; /* the last block the user wrote, ! 190: not one of the ones cfront created ! 191: */ ! 192: Ptable next; /* table for enclosing scope */ ! 193: Pname t_name; /* name of the table */ ! 194: ! 195: static Ptable table_free; ! 196: void* operator new(size_t); ! 197: void operator delete(void*,size_t); ! 198: ! 199: table(short, Ptable, Pname); ! 200: ~table(); ! 201: ! 202: Pname look(char*, TOK); ! 203: Pname insert(Pname, TOK); ! 204: #ifndef GRAM ! 205: void grow(int); ! 206: void set_name(Pname n) { t_name = n; }; ! 207: Pname get_mem(int); ! 208: int max() { return free_slot-1; }; ! 209: void dcl_print(TOK,TOK); ! 210: #endif ! 211: void del(); ! 212: }; ! 213: ! 214: #ifndef GRAM ! 215: extern bit Nold; ! 216: extern bit vec_const, fct_const; ! 217: #endif ! 218: ! 219: extern void restore(); ! 220: extern void set_scope(Pname); ! 221: extern Plist modified_tn; ! 222: ! 223: // local class ! 224: extern Plist local_tn; ! 225: extern Plist local_blk; ! 226: extern Plist local_class; ! 227: extern void local_hide( Pname ); ! 228: extern char *make_local_name(Pclass, int=0); ! 229: ! 230: // nested type ! 231: extern Plist nested_tn; ! 232: extern Plist nested_type; ! 233: extern Pname curr_scope; ! 234: extern Pname curr_fct; ! 235: extern void nested_hide(Pname); ! 236: extern int is_empty(Pclass,bit=0); ! 237: ! 238: extern Pbase start_cl(TOK, Pname, Pbcl); ! 239: extern void end_cl(); ! 240: extern Pbase end_enum(Pname, nlist*); ! 241: ! 242: /************ types : basic types, aggregates, declarators ************/ ! 243: ! 244: #ifndef GRAM ! 245: extern bit new_type; ! 246: extern Pname cl_obj_vec; ! 247: extern Pname eobj; ! 248: #endif ! 249: ! 250: ! 251: #define DEFINED 01 /* definition fed through ?::dcl() */ ! 252: #define SIMPLIFIED 02 /* in ?::simpl() */ ! 253: #define DEF_SEEN 04 /* definition seen, but not processed */ ! 254: #define REF_SEEN 010 /* reference seen (classdef) */ ! 255: /* used for class members in norm.c */ ! 256: #define IN_ERROR 010 ! 257: ! 258: struct type : node { ! 259: bit defined; /* flags DEF_SEEN, DEFINED, SIMPLIFIED, IN_ERROR ! 260: not used systematically yet ! 261: */ ! 262: bit lex_level; ! 263: Pclass in_class; // nested type ! 264: Pname in_fct; // local type ! 265: char *lcl; ! 266: char *nested_sig; ! 267: char *signature(char*); ! 268: Ptype tlist; ! 269: bit check(Ptype, TOK); ! 270: ! 271: // encapsulate casts ! 272: inline Pclass classtype(); ! 273: inline Penum enumtype(); ! 274: inline Ptype bname_type(); ! 275: inline Pname bname(); ! 276: #ifndef GRAM ! 277: void print(); ! 278: void dcl_print(Pname); ! 279: void base_print(); ! 280: ! 281: Pname is_cl_obj(); /* sets cl_obj_vec */ ! 282: Pptr is_ref(); ! 283: Pptr is_ptr(); ! 284: Pptr is_ptr_or_ref(); ! 285: bit is_unsigned(); ! 286: void dcl(Ptable); ! 287: int tsizeof(int = 0); ! 288: bit tconst(); ! 289: TOK set_const(bit); ! 290: int align(); ! 291: TOK kind(TOK,TOK); ! 292: TOK integral(TOK oo) { return kind(oo,'I'); }; ! 293: TOK numeric(TOK oo) { return kind(oo,'N'); }; ! 294: TOK num_ptr(TOK oo) { return kind(oo,'P'); }; ! 295: bit vec_type(); ! 296: Ptype deref(); ! 297: inline Pptr addrof(); ! 298: Pfct memptr(); ! 299: #endif ! 300: void del(); ! 301: }; ! 302: ! 303: struct enumdef : type { /* ENUM */ ! 304: bit e_body; ! 305: short no_of_enumerators; ! 306: unsigned char strlen; // strlen(string) ! 307: char* string; // name of enum ! 308: Pname mem; ! 309: Pbase e_type; // type representing the enum ! 310: enumdef(Pname n) { base=ENUM; mem=n; }; ! 311: #ifndef GRAM ! 312: void print(); ! 313: void dcl_print(Pname); ! 314: void dcl(Pname, Ptable); ! 315: void simpl(); ! 316: #endif ! 317: }; ! 318: ! 319: struct velem { ! 320: Pname n; ! 321: int offset; ! 322: }; ! 323: ! 324: struct virt : node { ! 325: Pvirt next; ! 326: int n_init; ! 327: velem* virt_init; // vector of vtbl initializers (zero-terminated) ! 328: Pclass vclass; // for class vclass ! 329: char* string; ! 330: bit is_vbase; // vtable for virtual base ! 331: bit printed; ! 332: virt(Pclass cl, velem* v, char* s, bit flag, int ni) {base = XVIRT; vclass=cl; virt_init=v; string=s; is_vbase=flag; next=0; n_init = ni;} ! 333: }; ! 334: ! 335: enum { C_VPTR=1, C_XREF=2, C_ASS=4, C_VBASE=8 }; ! 336: ! 337: // An enumeration of the types of classes for Objectstore ! 338: enum class_type_enum { vanilla_class, // A regular class ! 339: template_class, ! 340: instantiated_template_class, ! 341: uninstantiated_template_class, ! 342: relationship_class, ! 343: defining_class ! 344: }; ! 345: class type_extension; ! 346: ! 347: struct classdef : type { /* CLASS */ ! 348: class_type_enum class_base; // An extension of "base" to further define ! 349: // the real subtype of the class ! 350: bit c_body; /* print definition only once */ ! 351: TOK csu; /* CLASS, STRUCT, UNION, or ANON */ ! 352: bit obj_align; ! 353: bit c_xref; ! 354: // 1 set: has vptr(s) ! 355: // 2 set: X(X&) exists ! 356: // 4 set: operator=(X&) exists ! 357: // 8 set: has vbaseptr(s) ! 358: ! 359: bit virt_count; // number of virtual functions ! 360: // starting at max base class virt_count in ! 361: bit virt_merge; // set when no virtual functions, but ! 362: // need to merge virtual base classes ! 363: bit c_abstract; // abstract class: don't instantiate ! 364: bit has_vvtab; // set if class has vtable from virtual base ! 365: unsigned char strlen; // strlen(string) ! 366: Pbcl baselist; // list of base classes ! 367: char* string; /* name of class */ ! 368: Pname mem_list; ! 369: Ptable memtbl; ! 370: int obj_size; ! 371: int real_size; /* obj_size - alignment waste */ ! 372: Plist friend_list; ! 373: Pname pubdef; ! 374: Plist tn_list; // list of member names hiding type names ! 375: Plist nest_list; // list of nested types ! 376: Ptype this_type; ! 377: Pvirt virt_list; // vtbl initializers ! 378: Pname c_ctor; // constuctor: ! 379: // possibly overloaded, possibly inherited ! 380: Pname c_dtor; // destructor ! 381: Pname c_itor; /* constructor X(X&) */ ! 382: Pname conv; /* operator T() chain */ ! 383: struct toknode *c_funqf, *c_funqr; // token Q for parsing function defs after class def ! 384: ! 385: classdef(TOK); ! 386: ~classdef(); ! 387: TOK is_simple() { return (csu==CLASS)?0:csu; }; ! 388: #ifndef GRAM ! 389: void print(); ! 390: void dcl_print(Pname); ! 391: void simpl(); ! 392: ! 393: void print_members(); ! 394: void dcl(Pname, Ptable); ! 395: ! 396: // bit has_friend(Pname); ! 397: bit has_friend(Pclass); ! 398: bit has_friend(Pfct); ! 399: ! 400: bit has_base(Pclass cl); ! 401: bit baseof(Pname); ! 402: bit baseof(Pclass); ! 403: Pclass is_base(char*); ! 404: ! 405: Pname has_oper(TOK); ! 406: Pname has_ctor() { return c_ctor; } ! 407: Pname has_dtor() { return c_dtor; } ! 408: Pname has_itor() { return c_itor; } ! 409: Pname has_ictor(); ! 410: Pname make_itor(int); ! 411: Pexpr find_name(char*, Pclass, int=0); ! 412: int do_virtuals(Pvirt, char*, int, bit); ! 413: int all_virt(Pclass, char*, int, bit); ! 414: void add_vtbl(velem*, char*, bit, int); ! 415: void print_all_vtbls(Pclass); ! 416: void print_vtbl(Pvirt); ! 417: void really_print(Pvirt); ! 418: int check_dup(Pclass, TOK); ! 419: int has_allocated_base(Pclass); ! 420: char *has_allocated_base(char*); ! 421: int get_offset(char*); ! 422: Pbcl get_base(char*); ! 423: Pexpr get_vptr_exp(char*); ! 424: Pexpr find_in_base(char*, Pclass); ! 425: void modify_inst_names(char *s); // Adjust ctor names for instantiation ! 426: bit parametrized_class(); ! 427: bit same_class(Pclass p); ! 428: #endif ! 429: }; ! 430: ! 431: #ifndef GRAM ! 432: ! 433: class clist { ! 434: Pclass cl; ! 435: clist* next; ! 436: public: ! 437: clist(Pclass c, clist* n) { cl=c; next=n; } ! 438: int onlist(Pclass); ! 439: void clear(); ! 440: }; ! 441: ! 442: extern clist * vcllist; ! 443: ! 444: struct vl { ! 445: struct vl* next; ! 446: Pvirt vt; ! 447: classdef* cl; ! 448: ! 449: vl(classdef* c, Pvirt v, struct vl* n) ! 450: { cl = c; vt = v; next = n; } ! 451: }; ! 452: ! 453: extern vl* vlist; ! 454: ! 455: extern int nin; ! 456: extern int Nvis; ! 457: extern int Noffset; ! 458: extern TOK Nvirt; ! 459: extern Pexpr Nptr; ! 460: extern Pbcl Nvbc_alloc; ! 461: extern char *Nalloc_base; ! 462: extern Pexpr rptr(Ptype,Pexpr,int); ! 463: extern Pexpr vbase_args(Pfct, Pname); ! 464: extern Pexpr cdvec(Pname,Pexpr,Pclass,Pname,int,Pexpr,Pexpr=0); ! 465: ! 466: extern Pexpr find(char*, Pclass, int); ! 467: extern Pexpr find_name(Pname, Pclass, Ptable, int, Pname); ! 468: extern Pname find_virtual(Pclass,Pname); ! 469: extern Pname vfct(Pclass, char*); ! 470: extern int Vcheckerror; ! 471: extern int ignore_const; ! 472: ! 473: extern int mex; ! 474: extern Pclass mec; ! 475: extern Pclass tcl; ! 476: #endif ! 477: ! 478: struct basetype : type ! 479: /* ZTYPE CHAR SHORT INT LONG FLOAT DOUBLE ! 480: FIELD EOBJ COBJ TYPE ANY ! 481: */ ! 482: /* used for gathering all the attributes ! 483: for a list of declarators ! 484: ! 485: ZTYPE is the (generic) type of ZERO ! 486: ANY is the generic type of an undeclared name ! 487: */ ! 488: { ! 489: bit b_unsigned; ! 490: bit b_signed; ! 491: bit b_volatile; ! 492: bit b_const; ! 493: bit b_typedef; ! 494: bit b_inline; ! 495: bit b_virtual; ! 496: bit b_short; ! 497: bit b_long; ! 498: bit b_bits; /* number of bits in field */ ! 499: bit b_offset; // bit offset of field ! 500: TOK b_sto; /* AUTO STATIC EXTERN REGISTER 0 */ ! 501: Pname b_name; /* name of non-basic type */ ! 502: Ptable b_table; /* memtbl for b_name, or 0 */ ! 503: Pname b_xname; /* extra name */ ! 504: union { ! 505: Ptype b_fieldtype; ! 506: char* b_linkage; ! 507: }; ! 508: ! 509: basetype(TOK, Pname); ! 510: ! 511: Pbase type_adj(TOK); ! 512: Pbase base_adj(Pbase); ! 513: Pbase name_adj(Pname); ! 514: Pname aggr(); ! 515: Pbase check(Pname); ! 516: #ifndef GRAM ! 517: void dcl_print(); ! 518: Pbase arit_conv(Pbase); ! 519: bit parametrized_class(); ! 520: #endif ! 521: int discriminator(int); // union discriminator fcn ! 522: }; ! 523: ! 524: enum Linkage { linkage_default, linkage_C, linkage_Cplusplus }; ! 525: extern Linkage linkage; ! 526: void set_linkage(char*); ! 527: ! 528: struct fct : type // FCT ! 529: { ! 530: TOK nargs; ! 531: TOK nargs_known; // 0 if unknown, 1 if known, or ELLIPSIS ! 532: bit last_stmt; ! 533: bit f_vdef; // 1 if this is the first virtual definition ! 534: // of this function ! 535: bit f_inline; // 1 if inline, 2 if being expanded, else 0 ! 536: bit f_const; // one if member function that may be called for ! 537: // a const object, else 0 ! 538: bit f_static; // 1 if static member function, else 0 ! 539: short f_virtual; // index in virtual table, or 0 meaning non-virtual ! 540: short f_imeasure; // some measure of the size of an inline function ! 541: Ptype returns; ! 542: Pname argtype; ! 543: Ptype s_returns; ! 544: Pname f_this; ! 545: Pclass memof; // member of class memof ! 546: Pblock body; ! 547: Pname f_init; // base and member initializers ! 548: Pexpr f_expr; // body expanded into an expression ! 549: Pexpr last_expanded; ! 550: Pname f_result; // extra second argument of type X& ! 551: Pname f_args; // argument list including args added by cfront ! 552: Linkage f_linkage; ! 553: char* f_signature; // character encoding of function type ! 554: Plist local_class; // list of local classes ! 555: static Pfct fct_free; ! 556: void* operator new(size_t); ! 557: void operator delete(void*,size_t); ! 558: ! 559: fct(Ptype, Pname, TOK); ! 560: void argdcl(Pname,Pname); ! 561: #ifndef GRAM ! 562: Ptype normalize(Ptype); ! 563: void dcl_print(); ! 564: void dcl(Pname); ! 565: Pexpr base_init(Pclass, Pexpr, Ptable, int); ! 566: Pexpr mem_init(Pname, Pexpr, Ptable); ! 567: void init_bases(Pclass, Pexpr); ! 568: bit declared() { return nargs_known; }; ! 569: void simpl(); ! 570: int ctor_simpl(Pclass, Pexpr); ! 571: Pstmt dtor_simpl(Pclass, Pexpr); ! 572: Pexpr expand(Pname,Ptable,Pexpr); ! 573: void sign(); ! 574: #endif ! 575: int discriminator(int); // union discriminator fcn ! 576: }; ! 577: ! 578: struct name_list : node { ! 579: Pname f; ! 580: Plist l; ! 581: name_list(Pname ff, Plist ll) { base = XNLIST; f=ff; l=ll; }; ! 582: }; ! 583: ! 584: #ifndef GRAM ! 585: struct gen : type { // OVERLOAD ! 586: Plist fct_list; ! 587: ! 588: gen() { base = OVERLOAD; } ! 589: Pname add(Pname); ! 590: Pname find(Pfct, bit); ! 591: Pname match(Pname, Pfct, bit); ! 592: }; ! 593: #endif ! 594: ! 595: struct pvtyp : type { ! 596: Ptype typ; ! 597: }; ! 598: ! 599: struct vec : pvtyp // VEC ! 600: // typ [ dim ] ! 601: { ! 602: Pexpr dim; ! 603: int size; ! 604: ! 605: static Pvec vec_free; ! 606: void* operator new(size_t); ! 607: void operator delete(void*,size_t); ! 608: ! 609: vec(Ptype t, Pexpr e) { base=VEC; typ=t; dim=e; DBID(); } ! 610: #ifndef GRAM ! 611: Ptype normalize(Ptype); ! 612: #endif ! 613: }; ! 614: ! 615: struct ptr : pvtyp // PTR, RPTR i.e. reference ! 616: { ! 617: Pclass memof; // pointer to member of memof: memof::* ! 618: bit rdo; // "*const" ! 619: ! 620: static Pptr ptr_free; ! 621: void* operator new(size_t); ! 622: void operator delete(void*,size_t); ! 623: ! 624: ptr(TOK b, Ptype t) { base=b; typ=t; DBID(); } ! 625: #ifndef GRAM ! 626: Ptype normalize(Ptype); ! 627: #endif ! 628: }; ! 629: ! 630: #ifndef GRAM ! 631: inline Pptr type::addrof() { return new ptr(PTR,this); } ! 632: ! 633: extern bit vrp_equiv; ! 634: #endif ! 635: ! 636: ! 637: /****************************** constants ********************************/ ! 638: ! 639: /* STRING ZERO ICON FCON CCON ID */ ! 640: /* IVAL FVAL LVAL */ ! 641: ! 642: /***************************** expressions ********************************/ ! 643: ! 644: #ifndef GRAM ! 645: extern Pexpr next_elem(); ! 646: extern void new_list(Pexpr); ! 647: extern void list_check(Pname, Ptype, Pexpr, Ptable=0); ! 648: extern Pexpr ref_init(Pptr,Pexpr,Ptable); ! 649: extern Pexpr class_init(Pexpr,Ptype,Pexpr,Ptable); ! 650: extern Pexpr check_cond(Pexpr, TOK, Ptable); ! 651: extern Pexpr ptof(Pfct,Pexpr,Ptable); ! 652: extern void dosimpl(Pexpr, Pname); ! 653: extern int ref_initializer; ! 654: extern int ntok; ! 655: ! 656: extern void ptbl_init(int); ! 657: extern void ptbl_add_pair(char*,char*); ! 658: extern char *ptbl_lookup(char*); ! 659: extern char *st_name(char*); ! 660: #endif ! 661: ! 662: struct expr : node /* PLUS, MINUS, etc. */ ! 663: /* IMPORTANT: all expressions are of sizeof(expr) */ ! 664: /* DEREF => *e1 (e2==0) OR e1[e2] ! 665: UMINUS => -e2 ! 666: INCR (e1==0) => ++e2 ! 667: INCR (e2==0) => e1++ ! 668: CM => e1 , e2 ! 669: ILIST => LC e1 RC (an initializer list) ! 670: a Pexpr may denote a name ! 671: */ ! 672: { ! 673: union { ! 674: Ptype tp; ! 675: char *string4; ! 676: }; ! 677: union { ! 678: Pexpr e1; ! 679: long i1; ! 680: char* string; ! 681: }; ! 682: union { ! 683: Pexpr e2; ! 684: int i2; ! 685: char* string2; ! 686: Pexpr n_initializer; ! 687: Ptype tpdef; // local and nested typedef info ! 688: }; ! 689: union { /* used by the derived classes */ ! 690: Ptype tp2; ! 691: Pname fct_name; ! 692: Pexpr cond; ! 693: Pexpr mem; ! 694: Ptype as_type; ! 695: Ptable n_table; ! 696: Pin il; ! 697: Pname query_this; ! 698: }; ! 699: ! 700: static Pexpr expr_free; ! 701: void* operator new(size_t); ! 702: void operator delete(void*,size_t); ! 703: expr(TOK, Pexpr, Pexpr); ! 704: void del(); ! 705: #ifndef GRAM ! 706: void print(); ! 707: Pexpr typ0(Ptable); ! 708: Pexpr typ(Ptable); ! 709: long eval(); ! 710: unsigned long ueval(long,long); ! 711: int lval(TOK); ! 712: Ptype call_fct(Ptable); ! 713: Pexpr address(); ! 714: Pexpr contents(); ! 715: void simpl(); ! 716: Pexpr expand(); ! 717: bit not_simple(); ! 718: Pexpr try_to_overload(Ptable); ! 719: Pexpr docast(Ptable); ! 720: Pexpr dovalue(Ptable); ! 721: Pexpr donew(Ptable); ! 722: void simpl_new(); ! 723: void simpl_delete(); ! 724: #endif ! 725: int discriminator(int); // union discriminator fcn ! 726: }; ! 727: ! 728: struct texpr : expr { // CAST NEW VALUE (also ICALL) ! 729: texpr(TOK bb, Ptype tt, Pexpr ee) : expr (bb,ee,0) { tp2=tt; } ! 730: }; ! 731: ! 732: struct cast : expr { // CAST ! 733: cast(Ptype tt, Pexpr ee) : expr (CAST,ee,0) { tp=tp2=tt; } ! 734: }; ! 735: ! 736: struct ival : expr { // IVAL ! 737: ival(long ii) : expr (IVAL,0,0) { i1 = ii;} ! 738: }; ! 739: ! 740: struct call : expr { // CALL ! 741: call(Pexpr aa, Pexpr bb) : expr (CALL,aa,bb) { } ! 742: #ifndef GRAM ! 743: void simpl(); ! 744: Pexpr expand(Ptable); ! 745: #endif ! 746: }; ! 747: ! 748: struct qexpr : expr { // QUEST cond ? e1 : e2 ! 749: qexpr(Pexpr ee, Pexpr ee1, Pexpr ee2) : expr (QUEST,ee1,ee2) { cond=ee; } ! 750: }; ! 751: ! 752: struct ref : expr { // REF DOT e1->mem OR e1.mem ! 753: ref(TOK ba, Pexpr a, Pexpr b) : expr (ba,a,0) { mem=b; } ! 754: }; ! 755: ! 756: struct mdot : expr { // MDOT a.b ! 757: mdot(char* a, Pexpr b) : expr (MDOT,0,0) { string2=a; mem=b; } ! 758: }; ! 759: ! 760: struct text_expr : expr { // TEXT (vtbl_name) ! 761: text_expr(char* a, char* b) : expr (TEXT,0,0) ! 762: { string=a; string2=b; } ! 763: }; ! 764: char* vtbl_name(char*,char*); ! 765: /************************* names (are expressions) ****************************/ ! 766: ! 767: struct basecl : node { // NAME => base class ! 768: // VIRTUAL => virtual base class ! 769: TOK ppp; // private / public / protected ! 770: bit allocated; // allocated virtual base ! 771: bit promoted; // non-explicit, promoted virtual base ! 772: Pclass bclass; ! 773: Pexpr init; // base class initializers for ctors ! 774: int ptr_offset; // pointer's relative position in derived class ! 775: int obj_offset; // object's relative position in derived class ! 776: Pname* virt_init; // vector of vtbl table initializers ! 777: basecl* next; ! 778: ! 779: basecl(Pclass cl, basecl* n) { baseclass=1; bclass=cl; next=n; promoted=0; init=0;} ! 780: }; ! 781: ! 782: enum template_formal_types { ! 783: template_type_formal =1 , template_expr_formal, ! 784: template_stmt_tree_formal, template_expr_tree_formal, ! 785: template_actual_arg_dummy // used during the parse ! 786: }; ! 787: extern TOK ppbase; ! 788: ! 789: struct name : expr { // NAME TNAME and the keywords in the ktbl ! 790: TOK n_oper; // name of operator or 0 ! 791: TOK n_sto; // EXTERN STATIC AUTO REGISTER ENUM 0 ! 792: TOK n_stclass; // STATIC AUTO REGISTER 0 ! 793: TOK n_scope; // EXTERN STATIC FCT ARG PUBLIC 0 ! 794: TOK n_key; /* for names in table: class */ ! 795: bit n_evaluated; // 0 or n_val holds the value ! 796: bit n_xref; // argument of type X(X&) ! 797: unsigned char lex_level; ! 798: TOK n_protect; // PROTECTED (<=>n_scope==0) or 0 ! 799: bit n_dcl_printed; // 1: declaration printed ! 800: // 2: definition printed ! 801: // 0: declaration not printed ! 802: ! 803: // if this is set it implies that n_template_arg == template_type_formal ! 804: char n_template_arg; // One of template_formal_types for template arguments ! 805: bit n_template_formal_must_be_class ; ! 806: bit n_redefined ; // set only for PT function names where an explict ! 807: // definition was provided. ! 808: char *n_anon; // nested anonymous unions ! 809: short n_union; // 0, or union index ! 810: short n_addr_taken; ! 811: short n_used; ! 812: short n_assigned_to; ! 813: Loc where; ! 814: int n_offset; // byte offset in frame or struct ! 815: Pname n_list; ! 816: Pname n_tbl_list; ! 817: char *n_gen_fct_name; // used to be punned with n_tbl_list. ! 818: char *n_template_arg_string ; // the mangled string name ! 819: union { ! 820: /* ! 821: * n_qualifier: name of containing class ! 822: * n_realscope: for labels (always entered in function table) ! 823: * the table for the actual scope in which label occurred. ! 824: * syn_class: lex table only ! 825: */ ! 826: Pname n_qualifier; ! 827: Ptable n_realscope; ! 828: int syn_class; ! 829: }; ! 830: ! 831: /* n_val: the value of n_initializer; also the argument ! 832: * number for inline arguments (when base == ANAME) */ ! 833: long n_val; ! 834: static Pname name_free; ! 835: void* operator new(size_t); ! 836: void operator delete(void*,size_t); ! 837: name(char* =0); ! 838: ! 839: ! 840: Pname normalize(Pbase, Pblock, bit); ! 841: Pname tdef(); ! 842: Pname tname(TOK); ! 843: void hide(); ! 844: void unhide() { n_key=0; n_list=0; }; ! 845: #ifndef GRAM ! 846: Pname dcl(Ptable,TOK); ! 847: int no_of_names(); ! 848: void use() { n_used++; }; ! 849: void assign(); ! 850: void take_addr(); ! 851: void check_oper(Pname); ! 852: void simpl(); ! 853: void print(); ! 854: void dcl_print(TOK); ! 855: void field_align(); ! 856: Pname dofct(Ptable,TOK); ! 857: #endif ! 858: void del(); ! 859: inline Pfct fct_type(); ! 860: int discriminator(int); // union discriminator fcn ! 861: }; ! 862: ! 863: extern int friend_in_class; ! 864: extern int in_class_dcl; ! 865: ! 866: // from parser ! 867: extern int in_class_decl; ! 868: extern int parsing_class_members; ! 869: extern int in_mem_fct; ! 870: extern int in_arg_list; ! 871: extern Ptype in_typedef; ! 872: extern int defer_check; // redefinition typedef check delay ! 873: extern int declTag; // !1: inline, virtual mod permitted ! 874: extern Pname in_tag; ! 875: extern Pname statStat; ! 876: extern int DECL_TYPE; ! 877: ! 878: /******************** statements *********************************/ ! 879: ! 880: struct stmt : node { /* BREAK CONTINUE DEFAULT */ ! 881: /* IMPORTANT: all statement nodes have sizeof(stmt) */ ! 882: Pstmt s; ! 883: Pstmt s_list; ! 884: Loc where; ! 885: union { ! 886: Pname d; // goto/block -- destination ! 887: Pexpr e2; // for iteration ! 888: Pstmt has_default; // switch statement default ! 889: int case_value; ! 890: Ptype ret_tp; // pair ! 891: }; ! 892: union { ! 893: Pexpr e; ! 894: bit own_tbl; ! 895: Pstmt s2; ! 896: }; ! 897: Ptable memtbl; ! 898: union { ! 899: Pstmt for_init; ! 900: Pstmt else_stmt; ! 901: Pstmt case_list; ! 902: Loc where2; // location of } at end of block ! 903: }; ! 904: ! 905: static Pstmt stmt_free; ! 906: void* operator new(size_t); ! 907: void operator delete(void*,size_t); ! 908: stmt(TOK, loc, Pstmt); ! 909: void del(); ! 910: #ifndef GRAM ! 911: void print(); ! 912: void dcl(); ! 913: void dcl1(Pstmt&); ! 914: void reached(); ! 915: Pstmt simpl(); ! 916: Pstmt expand(); ! 917: Pstmt copy(); ! 918: #endif ! 919: int discriminator(int); // union discriminator fcn ! 920: }; ! 921: ! 922: #ifndef GRAM ! 923: extern char* Neval; ! 924: extern Ptable scope; ! 925: extern Ptable expand_tbl; ! 926: extern Pname expand_fn; ! 927: #endif ! 928: ! 929: struct estmt : stmt /* SM WHILE DO SWITCH RETURN CASE */ ! 930: /* SM (e!=0) => e; ! 931: in particular assignments and function calls ! 932: SM (e==0) => ; (the null statement) ! 933: CASE => case e : s ; ! 934: SM_PARAM => e is the template_statement_tree_formal name ! 935: */ ! 936: { ! 937: estmt(TOK t, loc ll, Pexpr ee, Pstmt ss) : stmt (t,ll,ss) { e=ee; } ! 938: }; ! 939: ! 940: struct ifstmt : stmt /* IF */ ! 941: // else_stme==0 => if (e) s ! 942: // else_stmt!=0 => if (e) s else else_stmt ! 943: { ! 944: ifstmt(loc ll, Pexpr ee, Pstmt ss1, Pstmt ss2) ! 945: : stmt (IF,ll,ss1) { e=ee; else_stmt=ss2; }; ! 946: }; ! 947: ! 948: struct lstmt : stmt /* LABEL GOTO */ ! 949: /* ! 950: d : s ! 951: goto d ! 952: */ ! 953: { ! 954: lstmt(TOK bb, loc ll, Pname nn, Pstmt ss) : stmt (bb,ll,ss) { d=nn; } ! 955: }; ! 956: ! 957: struct forstmt : stmt { // FOR ! 958: forstmt(loc ll, Pstmt fss, Pexpr ee1, Pexpr ee2, Pstmt ss) ! 959: : stmt (FOR,ll,ss) { for_init=fss; e=ee1; e2=ee2; } ! 960: }; ! 961: ! 962: struct block : stmt { // BLOCK { d s } ! 963: block(loc ll, Pname nn, Pstmt ss, loc rr = noloc ) : stmt (BLOCK,ll,ss) ! 964: { d=nn; where2=rr; } ! 965: #ifndef GRAM ! 966: void dcl(Ptable); ! 967: Pstmt simpl(); ! 968: #endif ! 969: }; ! 970: ! 971: #ifndef GRAM ! 972: struct pair : public stmt { // PAIR ! 973: pair(loc ll, Pstmt a, Pstmt b) : stmt (PAIR,ll,a) { s2 = b; } ! 974: }; ! 975: #endif ! 976: ! 977: struct nlist { ! 978: Pname head; ! 979: Pname tail; ! 980: nlist(Pname); ! 981: void add(Pname n) { tail->n_list = n; tail = n; }; ! 982: void add_list(Pname); ! 983: }; ! 984: ! 985: extern Pname name_unlist(nlist*); ! 986: ! 987: struct slist { ! 988: Pstmt head; ! 989: Pstmt tail; ! 990: slist(Pstmt s) { /*Nl++;*/ head = tail = s; }; ! 991: void add(Pstmt s) { tail->s_list = s; tail = s; }; ! 992: }; ! 993: ! 994: extern Pstmt stmt_unlist(slist*); ! 995: ! 996: struct elist { ! 997: Pexpr head; ! 998: Pexpr tail; ! 999: elist(Pexpr e) { /*Nl++;*/ head = tail = e; }; ! 1000: void add(Pexpr e) { tail->e2 = e; tail = e; }; ! 1001: }; ! 1002: ! 1003: extern Pexpr expr_unlist(elist*); ! 1004: ! 1005: #ifndef GRAM ! 1006: extern class dcl_context * cc; ! 1007: ! 1008: struct dcl_context { ! 1009: Pname c_this; /* current fct's "this" */ ! 1010: Ptype tot; /* type of "this" or 0 */ ! 1011: Pname not; /* name of "this"'s class or 0 */ ! 1012: Pclass cot; /* the definition of "this"'s class */ ! 1013: Ptable ftbl; /* current fct's symbol table */ ! 1014: Pname nof; /* current fct's name */ ! 1015: ! 1016: void stack() { cc++; *cc = *(cc-1); }; ! 1017: void unstack() { cc--; }; ! 1018: }; ! 1019: ! 1020: #define MAXCONT 20 ! 1021: extern dcl_context ccvec[MAXCONT]; ! 1022: #endif ! 1023: ! 1024: extern void yyerror(char*); ! 1025: ! 1026: ! 1027: #ifndef GRAM ! 1028: extern char* line_format; ! 1029: ! 1030: extern Plist stat_mem_list; ! 1031: extern Plist isf_list; ! 1032: extern Pstmt st_ilist; ! 1033: extern Pstmt st_dlist; ! 1034: extern Ptable sti_tbl; ! 1035: extern Ptable std_tbl; ! 1036: extern int need_sti( Pexpr e, Ptable tbl = 0, bit is_static_ok = 0 ); ! 1037: Pexpr try_to_coerce(Ptype, Pexpr, char*, Ptable); ! 1038: extern bit can_coerce(Ptype, Ptype); ! 1039: extern Ptype np_promote(TOK, TOK, TOK, Ptype, Ptype, TOK); ! 1040: extern bit enum_promote; ! 1041: extern int suppress_error; ! 1042: extern void delete_local(); ! 1043: ! 1044: extern int over_call(Pname, Pexpr); ! 1045: extern Pname overFound; ! 1046: extern Pname Nover; ! 1047: extern Pname Ncoerce; ! 1048: extern Nover_coerce; ! 1049: struct ia : node { ! 1050: Pname local; // local variable for argument ! 1051: Pexpr arg; // actual arguments for call ! 1052: Ptype tp; // type of formal argument ! 1053: ia() { base = XIA; }; ! 1054: }; ! 1055: ! 1056: struct iline : node { ! 1057: Pname fct_name; /* fct called */ ! 1058: Pin i_next; ! 1059: Ptable i_table; ! 1060: int i_slots; // no of arg slots pointer to by i_args ! 1061: ia* i_args; ! 1062: iline() { base = XILINE; }; ! 1063: }; ! 1064: ! 1065: extern Pexpr curr_expr; ! 1066: extern Pin curr_icall; ! 1067: #define FUDGE111 11111 ! 1068: #define VTOK 22222 ! 1069: #define ITOR 77 ! 1070: ! 1071: extern Pstmt curr_loop; ! 1072: extern Pblock curr_block; ! 1073: extern Pstmt curr_switch; ! 1074: extern loc last_line; // last #line + number of '\n's output since ! 1075: extern int last_ll; // 0 or line of current stmt/dcl being printed ! 1076: extern FILE* out_file; // output file descriptor ! 1077: extern bit Cast; ! 1078: extern loc no_where; ! 1079: ! 1080: extern no_of_undcl; ! 1081: extern no_of_badcall; ! 1082: extern Pname undcl, badcall; ! 1083: ! 1084: extern long str_to_long(const char*); ! 1085: extern int c_strlen(const char* s); ! 1086: #endif ! 1087: ! 1088: #ifndef GRAM ! 1089: extern Pname vec_new_fct; ! 1090: extern Pname new_fct; ! 1091: extern Pname del_fct; ! 1092: extern Pname vec_del_fct; ! 1093: ! 1094: extern int Nstd; // standard coercion used (derived* =>base* or int=>long or ...) ! 1095: ! 1096: extern int stcount; // number of names generated using make_name() ! 1097: ! 1098: Pexpr replace_temp(Pexpr,Pexpr); ! 1099: void make_res(Pfct); ! 1100: ! 1101: extern int Pchecked; ! 1102: Pexpr ptr_init(Pptr,Pexpr,Ptable); ! 1103: Pexpr call_ctor(Ptable, Pexpr p, Pexpr ctor, Pexpr args, int d = REF, Pexpr vb_args = 0); ! 1104: Pexpr call_dtor(Pexpr p, Pexpr dtor, Pexpr arg = 0, int d = DOT, Pexpr vb_args = 0); ! 1105: void check_visibility(Pname, Pname, Pclass, Ptable, Pname); ! 1106: ! 1107: int make_assignment(Pname); ! 1108: ! 1109: extern Pname make_tmp(char, Ptype, Ptable); ! 1110: Pexpr init_tmp(Pname, Pexpr, Ptable); ! 1111: ! 1112: extern int is_unique_base(Pclass, char*, int, int = 0); ! 1113: extern Pexpr rptr(Ptype, Pexpr, int); ! 1114: ! 1115: extern int read_align(char*); ! 1116: extern void new_init(); ! 1117: ! 1118: extern void Eprint(Pexpr); ! 1119: extern Pexpr cast_cptr(Pclass ccl, Pexpr ee, Ptable tbl, int real_cast); ! 1120: extern Pexpr mptr_assign(Pexpr,Pexpr); ! 1121: extern Pclass Mptr; ! 1122: ! 1123: #endif ! 1124: ! 1125: extern bit fake_sizeof; // suppress error message for ``int v[];'' ! 1126: ! 1127: extern TOK lalex(); ! 1128: ! 1129: // encapsulate casts ! 1130: inline Pname type::bname() { return Pbase(this)->b_name; } ! 1131: inline Ptype type::bname_type() { return Pbase(this)->b_name->tp; } ! 1132: inline Pclass type::classtype() { ! 1133: return (base==COBJ)?Pclass(Pbase(this)->b_name->tp) ! 1134: : (error('i',"T::classtype(): %k cobjX",base),0); ! 1135: } ! 1136: ! 1137: inline Penum type::enumtype() { ! 1138: return (base==EOBJ)?Penum(Pbase(this)->b_name->tp) ! 1139: : (error('i',"T::enumtype(): %k eobjX",base),0); ! 1140: } ! 1141: ! 1142: inline Pfct name::fct_type() { ! 1143: return (tp->base==FCT) ? Pfct(tp) ! 1144: : (error('i',"N::fct_type():%n is %k notF",this,tp->base),0); ! 1145: } ! 1146: ! 1147: ! 1148: #ifdef DBG ! 1149: extern void display_expr( Pexpr, char* = 0, int = 0 ); ! 1150: extern void display_stmt( Pstmt, char* = 0, int = 0 ); ! 1151: extern void display_type( Ptype ); ! 1152: extern void display_namelist( Plist, char* = 0, int = 0 ); ! 1153: ! 1154: extern fprintf(const FILE*, const char* ...); ! 1155: extern void process_debug_flags( char* ); ! 1156: #define DB(a) if(scan_started){a;} ! 1157: extern int Adebug; // allocation (ctor/del) debugging ! 1158: extern int Ddebug; // dcl debugging ! 1159: extern int Edebug; // expr debugging ! 1160: extern int Ldebug; // lex/lalex debugging ! 1161: extern int Mdebug; // trace function matching ! 1162: extern int Ndebug; // norm debugging ! 1163: extern int Pdebug; // print debugging ! 1164: extern int Rdebug; // run() debugging ! 1165: extern int Sdebug; // simpl debugging ! 1166: extern int Tdebug; // typ debugging ! 1167: #define Ydebug yydebug ! 1168: extern int Ydebug; // yacc debugging ! 1169: ! 1170: #else ! 1171: ! 1172: #define DB(a) /**/ ! 1173: ! 1174: #endif ! 1175: ! 1176: #endif ! 1177: /* end */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.