|
|
1.1 ! root 1: #include "univ.h" ! 2: #include "dtype.pri" ! 3: #include "symbol.h" ! 4: #include "symtab.pub" ! 5: #include "srctext.pub" ! 6: #include "core.pub" ! 7: #include "process.pub" ! 8: #include "bpts.pub" ! 9: #include "phrase.pub" ! 10: #include "parse.h" ! 11: #include "format.pub" ! 12: SRCFILE("symbol.c") ! 13: ! 14: int Symbol::disc() { trace( "%d.disc()", this ); return U_ERROR; } ! 15: int Var::disc() { return _disc; } ! 16: ! 17: int Symbol::ok() ! 18: { ! 19: if( !this ) return 0; ! 20: switch( disc() ){ ! 21: case U_ARG: ! 22: case U_AUT: ! 23: case U_BLOCK: ! 24: case U_FST: ! 25: case U_FUNC: ! 26: case U_GLB: ! 27: case U_MOT: ! 28: case U_REG: ! 29: case U_SOURCE: ! 30: case U_STA: ! 31: case U_STMT: ! 32: case U_UTYPE: ! 33: return 1; ! 34: } ! 35: return 0; ! 36: } ! 37: ! 38: int Var::ok() ! 39: { ! 40: if( !this ) return 0; ! 41: switch( disc() ){ ! 42: case U_ARG: ! 43: case U_AUT: ! 44: case U_FST: ! 45: case U_GLB: ! 46: case U_MOT: ! 47: case U_STA: ! 48: return 1; ! 49: } ! 50: return 0; ! 51: } ! 52: ! 53: ! 54: Symbol::Symbol( Symbol *up, Symbol *left, char *t ) ! 55: { ! 56: trace( "%d.Symbol(%d ^%d <%d %s)", this, up, left, t ); ! 57: _text = t; ! 58: parent = up; ! 59: if( left ) left->rsib = this; ! 60: this->lsib = left; ! 61: } ! 62: ! 63: Stmt::Stmt(SymTab *stab, Block *up, Stmt *left ):(up,left,"<stmt>") ! 64: { ! 65: if(stab) stab->enter(this); ! 66: process = stab ? stab->core()->process(): 0; ! 67: condition = 0; ! 68: condtext = 0; ! 69: } ! 70: ! 71: Block::Block(SymTab *stab, Symbol *up, Block *left, char *t ):(up,left,t) {} ! 72: ! 73: BlkVars::BlkVars(Block *i) { VOK; b = i; v = 0; } ! 74: ! 75: Var *BlkVars::gen() ! 76: { ! 77: trace( "%d.gen() %d %d", this, v, b ); OK(0); ! 78: if(v) v = (Var*)v->rsib; ! 79: while( !v && b && b->disc()==U_BLOCK ){ ! 80: v = b->var; ! 81: b = (Block*)b->parent; ! 82: } ! 83: trace( "%s", v->dump() ); ! 84: return v; ! 85: } ! 86: ! 87: Source::Source(SymTab *stab, Source *left, char *t, long c):(0,left,t) ! 88: { ! 89: symtab = stab; ! 90: blk = new Block( stab, this, 0, sf("%s.sta_blk",t) ); ! 91: srctext = new SrcText(this,c); ! 92: #ifndef V9 ! 93: bsdp = 0; ! 94: #endif ! 95: } ! 96: ! 97: UType::UType(SymTab *stab, long b, long s, char *id):(0,0,id) ! 98: { ! 99: trace( "%d.UType(%d,%d,%d,%s)", this, stab, b, s, id ); ! 100: begin = b; ! 101: size = s; ! 102: symtab = stab; ! 103: #ifndef V9 ! 104: encode = 0; ! 105: #endif ! 106: canspecial = stab->core()->specialop(_text); ! 107: if( stab ) stab->enter(this); ! 108: } ! 109: ! 110: #ifndef V9 ! 111: UType::UType(SymTab *stab, char *enc, char *id, BsdType *bs):(0,0,id) ! 112: { ! 113: encode = enc; ! 114: symtab = stab; ! 115: bsdp = bs; ! 116: canspecial = stab->core()->specialop(_text); ! 117: if( stab ) stab->enter(this); ! 118: } ! 119: #endif ! 120: ! 121: Var::Var(SymTab *stab, Block *up, Var *left, UDisc d, char* id):(up,left,id) ! 122: { ! 123: if( (_disc = d)<=TOSYM && stab ) stab->enter( this ); ! 124: } ! 125: ! 126: Func::Func(SymTab *stab, Source *up, Func *left, long i, char* id):(up,left,id) ! 127: { ! 128: begin = i; ! 129: if( stab ) stab->enter( this ); ! 130: } ! 131: ! 132: char *Symbol::dump() ! 133: { ! 134: static char t[128]; ! 135: ! 136: if( !this ) return "0"; ! 137: sprintf(t,"%d %s %s %d %d",this,DiscName(disc()),_text,range.lo,range.hi); ! 138: return t; ! 139: } ! 140: ! 141: int Func::regused(int r) ! 142: { ! 143: trace("%d.regused(%d)", this, r); OK(0); ! 144: Var *v; ! 145: BlkVars bv(blk()); ! 146: while( v = bv.gen() ) ! 147: if( v->disc()==U_REG && v->range.lo==r ) return 1; ! 148: return 0; ! 149: } ! 150: ! 151: void Func::gather() ! 152: { ! 153: Source *src = source(); ! 154: ! 155: trace("%d.gather() %s", this, dump() ); VOK; ! 156: if( _blk = src->symtab->gatherfunc(this) ) ! 157: _blk->parent = src->blk; ! 158: else ! 159: _blk = src->blk; ! 160: } ! 161: ! 162: char* Var::fmtlist() ! 163: { ! 164: trace("%d.fmtlist()", this); OK(""); ! 165: static Bls *b; ! 166: if( !b ) b = new Bls; ! 167: b->clear(); ! 168: long f = type.format(); ! 169: for( long bit = 1; bit; bit <<= 1 ) if( bit&f ){ ! 170: char *fn = FmtName(bit); // yuck ! 171: do b->af("%c", *fn); // yuck ! 172: while ( *fn++ != ' ' ); // yuck ! 173: } ! 174: return b->text; ! 175: } ! 176: ! 177: void Var::showutype(UType *u) ! 178: { ! 179: trace("%d.showutype(%d)", this, u); VOK; ! 180: u->show(LEAVE, SELECTLINE); ! 181: } ! 182: ! 183: void Var::reformat(long o) ! 184: { ! 185: trace("%d.reformat(0X%x)", this, o); VOK; ! 186: type.reformat(o); ! 187: show(SHOW, SELECTLINE); ! 188: } ! 189: ! 190: Index Var::carte() ! 191: { ! 192: trace("%d.carte()", this); OK(ZIndex); ! 193: Menu m; ! 194: if( showorhide==SHOW ) ! 195: m.last(" hide ", (Action)&Var::show, HIDE); ! 196: else ! 197: m.last(" show ", (Action)&Var::show, SHOW); ! 198: long f = type.formatset(); ! 199: long o = type.format(); ! 200: if( f ){ ! 201: Menu s; ! 202: for( long bit = 1; bit; bit <<= 1 ) if( bit & f ){ ! 203: long b = bit; ! 204: if( b&o ) b |= F_TURNOFF; ! 205: s.last(FmtName(b), (Action)&Var::reformat, (long)b); ! 206: } ! 207: m.last(s.index("format")); ! 208: } ! 209: DType *d = &type; ! 210: while( d->isaryorptr() ) d = d->decref(); ! 211: if( d->isstrun() && d->utype()){ ! 212: UType *u = d->utype(); ! 213: m.last(u->type.text(), (Action)&Var::showutype, (long)u); ! 214: } ! 215: return m.index(); ! 216: } ! 217: ! 218: void Var::show(int soh, Attrib a) ! 219: { ! 220: trace("%d.display(%d)", this, soh); VOK; ! 221: if( _disc != U_MOT ) return; ! 222: UType *u = (UType*) parent; ! 223: if( !u ) return; ! 224: TypMems g(u); ! 225: Var *v; ! 226: for( long k = (long) u; v = g.gen(); ++k ) ! 227: if( v == this ) break; ! 228: if( soh != LEAVE ) showorhide = soh; ! 229: SymTab *symtab = u->symtab; ! 230: if( !symtab ) return; ! 231: Pad *pad = symtab->pad(); ! 232: if( !pad ) return; ! 233: Index ix = carte(); ! 234: char *mark = showorhide==SHOW ? ">>>" : ""; ! 235: pad->insert(k+1, a, (PadRcv*)this ,ix, ! 236: "%s\t%s\t%s;\t%s", mark, type.text(), text(), fmtlist()); ! 237: } ! 238: ! 239: void UType::show(int soh, Attrib a) ! 240: { ! 241: trace("%d.display()", this); VOK; ! 242: TypMems g(this); ! 243: Var *v; ! 244: long k = (long) this; ! 245: while( v = g.gen() ){ ! 246: v->show(soh); ! 247: ++k; ! 248: } ! 249: Pad *pad = symtab->pad(); ! 250: if( !pad ) return; ! 251: Menu m; ! 252: m.first("hide all", (Action)&UType::show, HIDE); ! 253: m.first("show all", (Action)&UType::show, SHOW); ! 254: pad->insert((long)this, a, (PadRcv*)this, m, "%s {", type.text()); ! 255: pad->insert(++k, 0, (PadRcv*)this, m, "} %s", type.text()); ! 256: pad->insert(++k, ""); ! 257: } ! 258: ! 259: void UType::gather() ! 260: { ! 261: trace("%d.gather()", this); VOK; ! 262: mem = symtab->gatherutype(this); ! 263: if( !mem ) ! 264: return; ! 265: TypMems g(this); ! 266: Var *v; ! 267: for( int i = 1; v = g.gen(); ++i ){ ! 268: v->parent = this; ! 269: if( i <= 2 ) v->showorhide = SHOW; ! 270: } ! 271: if( type.isstrun() ) show(); ! 272: } ! 273: ! 274: Source *Symbol::source() ! 275: { ! 276: trace( "%d.source() %s", this, dump() ); ! 277: return !this ? 0 : disc() == U_SOURCE ? (Source*)this : parent->source(); ! 278: } ! 279: ! 280: char *Symbol::text(long) { OK("Symbol::text"); return _text; } ! 281: ! 282: char *Source::text(long) { OK("Source::text"); return basename(_text); } ! 283: ! 284: Stmt *Func::stmt(long pc) ! 285: { ! 286: Stmt *s, *r; ! 287: ! 288: trace( "%d.stmt(%d)", this, pc ); OK(0); ! 289: for( s = blk()->stmt; s; s = r ){ ! 290: r = (Stmt*)s->rsib; ! 291: if( !r || r->range.lo>pc ) break; ! 292: } ! 293: return s && s->range.lo<=pc ? s : 0; ! 294: } ! 295: ! 296: TypMems::TypMems(UType *i) { ut = i; v = 0; } ! 297: ! 298: Var *TypMems::gen() ! 299: { ! 300: trace( "%d.gen()", this ); OK(0); ! 301: if( ut ){ ! 302: if( !ut->mem ) ut->gather(); ! 303: v = ut->mem; ! 304: ut = 0; ! 305: } else if( v ) ! 306: v = (Var*)v->rsib; ! 307: trace( "%s", v->dump() ); ! 308: return v; ! 309: } ! 310: ! 311: Block *Func::blk() ! 312: { ! 313: OK(0); ! 314: if(!_blk) gather(); ! 315: return _blk; ! 316: } ! 317: ! 318: Block *Func::blk(long pc) ! 319: { ! 320: Stmt *s; ! 321: ! 322: trace( "%d.blk(%d)", this, pc ); OK(0); ! 323: if( !pc || !(s = stmt(pc)) || !s->parent ) return blk(); ! 324: return (Block*) s->parent; ! 325: } ! 326: ! 327: Var *Func::argument(int a) ! 328: { ! 329: trace( "%d.argument(%d)", this, a ); OK(0); ! 330: BlkVars bv(blk()); ! 331: Var *v; ! 332: int i = 0; ! 333: while( v = bv.gen() ) ! 334: if( v->disc()==U_ARG && ++i==a ) return v; ! 335: return 0; ! 336: } ! 337: ! 338: char *Func::text(long) ! 339: { ! 340: return sf( "%s()", this ? _text : "?" ); ! 341: } ! 342: ! 343: char *Stmt::text(long pc) // pass in a Bls argument? ! 344: { ! 345: char buf[256]; // use a Bls instead ! 346: ! 347: trace("%d.text(%d)", this, pc); OK("Stmt::text"); ! 348: Source *src = source(); ! 349: if( !src ) return sf( "pc=%d", range.lo ); ! 350: sprintf( buf, "%s:%d", src->text(), lineno ); ! 351: if( pc && range.lo < pc ) ! 352: strcatfmt( buf, "+%u", pc-range.lo ); ! 353: return sf("%s", buf); ! 354: } ! 355: ! 356: char *Stmt::journal(Bls &b) ! 357: { ! 358: trace("%d.journal(%d)", this, &b); OK("Stmt::journal"); ! 359: ! 360: b.af("%s %s %s%s", text(), condtext->text, func()->text(), srcline()); ! 361: return b.text; ! 362: } ! 363: ! 364: char *Stmt::srcline() ! 365: { ! 366: trace("%d.srcline()", this); OK( "Stmt::srcline"); ! 367: Source *s = source(); ! 368: if( !s || !s->srctext ) return ""; ! 369: return s->srctext->srcline(lineno); ! 370: } ! 371: ! 372: void Stmt::select(long svp) ! 373: { ! 374: trace( "%d.select(%d)", this, svp ); VOK; ! 375: Source *src = source(); ! 376: if( src ) src->srctext->select(lineno, svp); ! 377: else asmblr(); ! 378: } ! 379: ! 380: char *Stmt::contextsearch(char *pat, int dir) ! 381: { ! 382: trace( "%d.conetxtsearch(%s,%d)", this, pat?pat:"", dir); OK("search"); ! 383: Source *src = source(); ! 384: if( src ) ! 385: return src->srctext->contextsearch(lineno, pat, dir); ! 386: return "can't search"; ! 387: } ! 388: ! 389: Pad *Stmt::srcpad() { return source()->srctext->pad; } ! 390: ! 391: void Stmt::error(char *s) ! 392: { ! 393: trace( "%d.error(%s)", this, s ); VOK; ! 394: Line l; ! 395: l.text = s; ! 396: l.object = this; ! 397: l.attributes |= SELECTLINE; ! 398: l.key = lineno; ! 399: srcpad()->insert( l ); ! 400: } ! 401: ! 402: char *Stmt::kbd(char *s) ! 403: { ! 404: Parse y(G_EXPR, 0); ! 405: trace( "%d.kbd(%s)", this, s ); OK("kbd"); ! 406: if( condition != Q_BPT ){ ! 407: switch( *s ){ ! 408: case '/': return contextsearch(s+1, 1); ! 409: case '?': return contextsearch(s+1, -1); ! 410: } ! 411: process->openframe( range.lo, s ); ! 412: return 0; ! 413: } ! 414: Expr *newcond = (Expr*)y.parse(s); ! 415: if( newcond ){ ! 416: conditional(newcond); ! 417: // condition = newcond; ! 418: // if( !condtext ) condtext = new Bls; ! 419: // condtext->clear(); ! 420: // condtext->af("%s", newcond->text() ); ! 421: dobpt(1); ! 422: select(); ! 423: } else { ! 424: dobpt(0); ! 425: error( sf("%s: %s", y.error, s) ); ! 426: } ! 427: return 0; ! 428: } ! 429: ! 430: char *Stmt::help() ! 431: { ! 432: trace( "%d.help()", this ); ! 433: return condition == Q_BPT ! 434: ? "<expr> {breakpoint condition}" ! 435: : "<expr> {eval in frame} | [/?]<string> {search}"; ! 436: } ! 437: ! 438: void Stmt::conditional(Expr *e) ! 439: { ! 440: trace( "%d.conditional()", this ); VOK; ! 441: condition = e; ! 442: if( !condtext ) condtext = new Bls; ! 443: condtext->clear(); ! 444: condtext->af("%s", condition==Q_BPT ? "?" : condition->text() ); ! 445: select(); ! 446: } ! 447: ! 448: Stmt *Source::stmtafter(int l) ! 449: { ! 450: trace( "%d.stmtafter(%d)", this, l ); OK(0); ! 451: ! 452: if( !linefunc ) return 0; ! 453: while( l < linefunc->lines.lo && linefunc->lsib ){ ! 454: linefunc = (Func*) linefunc->lsib; ! 455: linestmt = 0; ! 456: } ! 457: while( l > linefunc->lines.hi && linefunc->rsib ){ ! 458: linefunc = (Func*) linefunc->rsib; ! 459: linestmt = 0; ! 460: } ! 461: if( !linestmt && !(linestmt = linefunc->blk()->stmt) ) ! 462: return 0; ! 463: while ( linestmt->lsib && ! 464: (l < linestmt->lineno || l <= ((Stmt*)linestmt->lsib)->lineno) ) ! 465: linestmt = (Stmt*) linestmt->lsib; ! 466: while( l > linestmt->lineno && linestmt->rsib ) ! 467: linestmt = (Stmt*) linestmt->rsib; ! 468: return linestmt; ! 469: } ! 470: ! 471: Func *Stmt::func() ! 472: { ! 473: trace("%d.func()", this); OK(0); ! 474: Source *src = source(); ! 475: if( !src ) return 0; ! 476: return (Func*) src->symtab->loctosym(U_FUNC, range.lo); ! 477: } ! 478: ! 479: void Stmt::asmblr() ! 480: { ! 481: trace( "%d.asmblr() %d", this, process ); VOK; ! 482: if( process ) process->openasm(range.lo); ! 483: } ! 484: ! 485: void Stmt::settrace() ! 486: { ! 487: trace("%d.settrace()", this); VOK; ! 488: static Expr *zero = 0; ! 489: // bpts()->pad->makecurrent(); ! 490: conditional(E_IConst(0)); ! 491: dobpt(1); ! 492: } ! 493: ! 494: void Stmt::dobpt(int setorclr) ! 495: { ! 496: trace( "%d.dobpt(%d) %d", this, setorclr, process ); VOK; ! 497: if( condition == Q_BPT ){ ! 498: condtext = 0; ! 499: condition = 0; ! 500: if( setorclr ) ! 501: process->bpts()->set( this ); ! 502: else ! 503: select(); ! 504: } else { ! 505: if( setorclr ) ! 506: process->bpts()->set( this ); ! 507: else { ! 508: if( condtext ) delete condtext; ! 509: condtext = 0; ! 510: condition = 0; ! 511: process->bpts()->clr( this ); ! 512: } ! 513: } ! 514: } ! 515: ! 516: void Stmt::openframe() ! 517: { ! 518: trace( "%d.openframe()", this ); VOK; ! 519: process->openframe( range.lo ); ! 520: } ! 521: ! 522: Index UType::carte(Op op) ! 523: { ! 524: Menu m; ! 525: Var *v; ! 526: TypMems tm(this); ! 527: long n = 0; ! 528: char *on = (char*) OpName(op); ! 529: Action a = op==O_ARROW ? (Action)&Phrase::applyarrow : (Action)&Phrase::applydot; // C++ bug (Action) ! 530: ! 531: trace( "%d.carte(%s)", this, on ); OK(ZIndex); ! 532: if( canspecial ) ! 533: m.last( canspecial, (Action)&Phrase::applyunary, O_SPECIAL ); ! 534: while( v = tm.gen() ){ ! 535: Bls field( "$%s%s\240", on, v->_text ); ! 536: m.sort( field.text, a, (long) v ); ! 537: ++n; ! 538: } ! 539: a = op==O_ARROW ? (Action)&Phrase::allstar : (Action)&Phrase::alleval; ! 540: m.first(sf("$%s*",on), a, (long)this); ! 541: return m.index(n>4 ? sf("$%sid",on) : 0); ! 542: } ! 543: ! 544: Source::~Source() ! 545: { ! 546: #ifndef V9 ! 547: if( bsdp ) ! 548: delete bsdp; ! 549: #endif ! 550: } ! 551: ! 552: Stmt::~Stmt() {} ! 553: ! 554: UType::~UType() ! 555: { ! 556: #ifndef V9 ! 557: if (encode) ! 558: delete encode; ! 559: #endif ! 560: } ! 561: ! 562: Var::~Var() { /* on the stack in Expr */ } ! 563: ! 564: Func::~Func() ! 565: { ! 566: type.free(); ! 567: } ! 568: ! 569: Block::~Block() ! 570: { ! 571: while( var ){ ! 572: var->type.free(); ! 573: delete var; ! 574: var = (Var*)var->rsib; ! 575: } ! 576: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.