Annotation of researchv9/jtools/src/pi/frame.c, revision 1.1

1.1     ! root        1: #include "frame.pri"
        !             2: #include "core.pub"
        !             3: #include "symbol.h"
        !             4: #include "symtab.pub"
        !             5: #include "format.pub"
        !             6: #include "expr.pub"
        !             7: #include "phrase.pri"
        !             8: #include "parse.h"
        !             9: #include "process.pub"
        !            10: #include "bpts.pub"
        !            11: #include "journal.pub"
        !            12: SRCFILE("frame.c")
        !            13: 
        !            14: CallStk::CallStk(long s, Core *c)
        !            15: {
        !            16:        fpf = new FpFrame[size = s];
        !            17:        core = c;
        !            18: }
        !            19: 
        !            20: CallStk::~CallStk()
        !            21: {
        !            22:        delete fpf;
        !            23: }
        !            24: 
        !            25: Frame CallStk::frame(long l)
        !            26: {
        !            27:        Frame f = core->frameabove(l==0 ? 0 : fpf[l-1].fp);     // cfront bug
        !            28:        return f;
        !            29: }
        !            30: 
        !            31: Frame::Frame(Core *c)  // cfront bug - c = 0
        !            32: {
        !            33:        core = c;
        !            34:        level = 0;
        !            35:        fp = ap = pc = nargs = regsave = regbase = 0;
        !            36:        func = 0;
        !            37:        pad = 0;
        !            38:        phraset = 0;
        !            39: }
        !            40: 
        !            41: Frame::Frame()         // cfront bug - c = 0
        !            42: {
        !            43:        core = 0;
        !            44:        level = 0;
        !            45:        fp = ap = pc = nargs = regsave = regbase = 0;
        !            46:        func = 0;
        !            47:        pad = 0;
        !            48:        phraset = 0;
        !            49: }
        !            50: 
        !            51: void Frame::pop()
        !            52: {
        !            53:        trace("%d.pop()", this); VOK;
        !            54:        core->process()->pop();
        !            55: }
        !            56: 
        !            57: SymTab *Frame::symtab()        { OK(0); return core->symtab(); }
        !            58:        
        !            59: int Frame::addsymbols()
        !            60: {
        !            61:        trace("%d.addsymbols()", this); OK(0);
        !            62:        func = (Func*) symtab()->loctosym(U_FUNC, pc);
        !            63:        return func!=0;
        !            64: }
        !            65: 
        !            66: void Frame::hostclose()
        !            67: {
        !            68:        Phrase *p, *psib;
        !            69: 
        !            70:        trace("%d.hostclose()", this); VOK;
        !            71:        if( pad ) delete pad;
        !            72:        pad = 0;
        !            73:        invalidate();
        !            74:        for( p = phraset; p; p = psib ){
        !            75:                psib = p->sib;                  // new malloc
        !            76:                p->expr->setspy(0);             // why?
        !            77:                delete p;
        !            78:        }
        !            79: }
        !            80: 
        !            81: void Frame::banner()
        !            82: {
        !            83:        Bls t;
        !            84:        trace("%d.banner()", this); VOK;
        !            85:        if( pad ){
        !            86:                pad->banner("%s:", text(t));
        !            87:                pad->name(func ? func->text() : "?()");
        !            88:        }
        !            89: }
        !            90: 
        !            91: void Frame::opencallersframe()
        !            92: {
        !            93:        trace("%d.opencallersframe()", this); VOK;
        !            94:        Frame *c = caller();
        !            95:        if( c ) c->open();
        !            96: }
        !            97: 
        !            98: Frame *Frame::caller()
        !            99: {
        !           100:        trace("%d.caller()", this); OK(0);
        !           101:        return core->process()->frame(level+1);
        !           102: }
        !           103: 
        !           104: void Frame::open(long svp)
        !           105: {
        !           106:        Menu m;
        !           107: 
        !           108:        trace("%d.open()", this); VOK;
        !           109:        if( !pad ){
        !           110:                pad = new Pad( (PadRcv*) this );
        !           111:                if( func->stmt(pc) )
        !           112:                        m.last( sf("src text",func->text()), (Action)&Frame::select );
        !           113:                if( core->process()->frame(level+1) )
        !           114:                        m.last( "caller's frame", (Action) &Frame::opencallersframe );
        !           115:                m.last( "changed spies ", (Action)&Frame::changes, 1 );
        !           116:                m.last( varcarte() );
        !           117:                m.last( regcarte() );
        !           118:                pad->menu(m);
        !           119:        }
        !           120:        banner();
        !           121:        if( svp!=SVP ) pad->makecurrent();
        !           122: }
        !           123: 
        !           124: int Frame::changes(long verbose)
        !           125: {
        !           126:        Phrase *p;
        !           127:        long changes = 0, key = 0x40000000, spies = 0;
        !           128: 
        !           129:        trace("%d.changes()", this); OK(0);
        !           130: 
        !           131:        for( p = phraset; p; p = p->sib )
        !           132:                if( p->expr->spy ){
        !           133:                        Bls b;
        !           134:                        ++spies;
        !           135:                        if( p->changed(b) ){
        !           136:                                ++changes;
        !           137:                                core->process()->journal()->insert("%s",b.text);
        !           138:                        }
        !           139:                }
        !           140:        if( verbose && pad ){
        !           141:                pad->removeline(key);   
        !           142:                if( spies == 0 )
        !           143:                        pad->insert( key, SELECTLINE, "no spies in this frame" );
        !           144:                else if( changes==0 )
        !           145:                        pad->insert( key, SELECTLINE, "no spies changed" );
        !           146:        }
        !           147:        return changes;
        !           148: }      
        !           149: 
        !           150: char *Frame::text(Bls &buf)
        !           151: {
        !           152:        Var *arg;
        !           153:        Stmt *stmt = 0;
        !           154: 
        !           155:        trace("%d.text()", this);       OK("Frame::text");
        !           156:        if( !func ) return sf( "pc=%d ?()", pc );
        !           157:        if( core->online() )
        !           158:                stmt = core->process()->bpts()->bptstmt(pc);
        !           159:        if( !stmt ) stmt = func->stmt(pc);
        !           160:        if( stmt )
        !           161:                buf.af("%s", stmt->text(pc));
        !           162:        else
        !           163:                buf.af( "%s+%d", func->_text, pc - func->range.lo );
        !           164:        buf.af(" %s(", func->_text);
        !           165:        for( int i = 1; arg = func->argument(i); ++i ){
        !           166:                if( i>1 ) buf.af(",");
        !           167:                E_Sym(arg)->evaltext(this,buf);         // should use a stack expr
        !           168:        }
        !           169:        return buf.af( ")" );
        !           170: }
        !           171: 
        !           172: void Frame::select(long svp)
        !           173: {
        !           174:        Stmt *stmt = 0;
        !           175: 
        !           176:        trace("%d.select(%d)", this, svp);      VOK;
        !           177:        if( core->online() )
        !           178:                stmt = core->process()->bpts()->bptstmt(pc);
        !           179:        if( !stmt && func ) stmt = func->stmt(pc);
        !           180:        if( stmt ) stmt->select(svp);
        !           181: }
        !           182: 
        !           183: long Frame::saved(int r, int size) { return core->saved(this,r,size); }
        !           184: 
        !           185: long Frame::regloc(int r, int size)            /* what about r>=12 on vax ? */
        !           186: {
        !           187:        if( !this ) return 0;
        !           188:        long loc = saved(r,size);
        !           189:        if( loc ) return loc;
        !           190:        if( level == 0 ) return core->regloc(r,size);
        !           191:        return core->process()->frame(level-1)->regloc(r,size);
        !           192: }
        !           193: 
        !           194: long Frame::locate(Var *v)
        !           195: {
        !           196:        trace("%d.locate(%d) %s %d", this, v, v->_text, v->range.lo);
        !           197:        IF_LIVE( !v ) return 0;
        !           198:        switch( (int) v->disc() ){
        !           199:        case U_GLB:
        !           200:        case U_STA:
        !           201:        case U_FST:
        !           202:        case U_FUNC:
        !           203:                IF_LIVE(!v->range.lo) return 0;         /* this == 0 */
        !           204:                return    v->range.lo;
        !           205:        case U_ARG:
        !           206:                IF_LIVE(!this || !ap) return 0;
        !           207:                return ap+v->range.lo;
        !           208:        case U_AUT:
        !           209:                IF_LIVE(!this || !fp) return 0;
        !           210:                return fp+v->range.lo;
        !           211:        case U_REG:
        !           212:                IF_LIVE(!this) return 0;
        !           213:                if( level == 0 )        /* SAME AS CODE ABOVE! */
        !           214:                        return core->regloc(v->range.lo, v->type.size_of());
        !           215:                return core->process()->frame(level-1)->regloc(v->range.lo, v->type.size_of());
        !           216:        }
        !           217:        IF_LIVE( 1 ) return 0;
        !           218: }
        !           219: 
        !           220: Cslfd *Frame::peek(long loc, Cslfd* fail)
        !           221: {
        !           222:        trace("%d.peek(0x%X,%d)", this, loc, fail); OK(0);
        !           223:        return core->peek(loc, fail);
        !           224: }
        !           225: 
        !           226: char *Frame::special(char *id, long loc )
        !           227: {
        !           228:        trace("%d.special(%s,0x%X)", this, id, loc); OK(0);
        !           229:        return core->special(id, loc);
        !           230: }
        !           231: 
        !           232: char *Frame::peekstring(long loc, char *fail)
        !           233: {
        !           234:        trace("%d.peekstring(0x%X,%s)", this, loc, fail?fail:"0"); OK(0);
        !           235:        return core->peekstring(loc, fail);
        !           236: }
        !           237: 
        !           238: char *Frame::poke(long loc, long data, int bytes)
        !           239: {
        !           240:        trace("%d.poke(0x%X,0x%X,%d)", this, loc, data, bytes); OK(0);
        !           241:        return core->poke(loc, data, bytes);
        !           242: }
        !           243: 
        !           244: char *Frame::pokedbl(long loc, double data, int bytes) /* broke float poke */
        !           245: {
        !           246:        trace("%d.pokedbl(0x%X,%g,%d)", this, loc, data, bytes); OK(0);
        !           247:        return core->pokedbl(loc, data, bytes);
        !           248: }
        !           249: 
        !           250: char *Frame::blockmove(long s, long d, long ct)
        !           251: {
        !           252:        trace("%d.blockmove(0x%X,0x%X,%d)", this, s, d, ct); OK("Frame::blockmove");
        !           253:        return core->blockmove(s, d, ct);
        !           254: }
        !           255: 
        !           256: char *Frame::help()
        !           257: {
        !           258:        trace("%d.help()", this);
        !           259:        return "<expr> {evaluate in this scope}";
        !           260: }
        !           261: 
        !           262: char *Frame::kbd(char *s)
        !           263: {
        !           264:        Parse y(G_EXPR,0);
        !           265:        Expr *e;
        !           266:        char *error;
        !           267: 
        !           268:        trace("%d.kbd(%s)", this, s);   OK("kbd");
        !           269:        if( !(e = (Expr*)y.parse(s)) ){
        !           270:                pad->error( "%s: %s", y.error, s );
        !           271:                return 0;
        !           272:        }
        !           273:        if( error = makephrase(e) ) pad->error( "%s", error );
        !           274:        return 0;
        !           275: }
        !           276: 
        !           277: #define GAP 2
        !           278: void Frame::freekey(long k)
        !           279: {
        !           280:        Phrase *p;
        !           281:        int found = 0;
        !           282: 
        !           283:        trace("%d.freekey(%d)", this, k); VOK;
        !           284:        for( p = phraset; p; p = p->sib )
        !           285:                if( p->key >= k ){
        !           286:                        p->key += GAP;
        !           287:                        found = 1;
        !           288:                }
        !           289:        if( found ) pad->makegap(k,GAP);
        !           290: }
        !           291: 
        !           292: char *Frame::makephrase(Expr *e,long k)
        !           293: {
        !           294:        Bls b;
        !           295:        Phrase *p;
        !           296:        char *error = 0;
        !           297: 
        !           298:        trace("%d.makephrase(%d,%d)", this, e, k); OK("Frame::makephrase");
        !           299:        if( !e ) return "not and expr";
        !           300:        if( !k ) k = UniqueKey();
        !           301:        for( p = phraset; p; p = p->sib )
        !           302:                if( p->key == k || p->expr == e) break;
        !           303:        if( !p ) phraset = p = new Phrase(this, phraset, e, k);
        !           304:        e->evaltext(this,b);
        !           305:        if( e->evalerr ){
        !           306:                Attrib a = ACCEPT_KBD;
        !           307:                switch( e->op ){
        !           308:                case O_TYPEOF: break;
        !           309:                case O_INDEX:  if( e->sub2->op == O_RANGE ) break;
        !           310:                default:
        !           311:                   pad->insert(p->key, a, (PadRcv*)p ,e->carte(0), "%s", e->text());
        !           312:                }
        !           313:                return sf( "%s", b.text );
        !           314:        }
        !           315:        Attrib a = ACCEPT_KBD|SELECTLINE;
        !           316:        if( e->spy ) a |= DONT_CUT;
        !           317:        pad->insert(p->key, a, (PadRcv*)p, e->carte(this), "%s", b.text);
        !           318:        return 0;
        !           319: 
        !           320: }
        !           321: 
        !           322: void Frame::pickvar(Var *v)
        !           323: {
        !           324:        char *error;
        !           325: 
        !           326:        trace("%d.pickvar(%d)", this, v); VOK;
        !           327:        if( error = makephrase(E_Sym(v)) )              /* who owns this expr? */
        !           328:                pad->error(error);
        !           329: }
        !           330: 
        !           331: Index Frame::varcarte()
        !           332: {
        !           333:        Var   *v, *d;
        !           334:        Menu  m;
        !           335:        int   limit = 75, n;
        !           336:        char *q = "'''''''''''''''";
        !           337: 
        !           338:        if( !func ) return ZIndex;
        !           339:        BlkVars bv(func->blk(pc));
        !           340:        while( (v = bv.gen()) && limit-->0 ){
        !           341:                BlkVars  dup(0);
        !           342:                dup = bv;
        !           343:                for( n = 0; d = dup.gen(); )
        !           344:                        if( !strcmp(d->_text,v->_text) ) ++n;
        !           345:                Bls id( "%s%0.*s\240%s", v->_text, n, q, DiscName(v->disc()));
        !           346:                m.sort( id.text, (Action)&Frame::pickvar, (long) v);
        !           347:        }
        !           348:        return m.index();
        !           349: }
        !           350: 
        !           351: //     void Frame::ambiguous(char *id, BlkVars &bl)
        !           352: //     {
        !           353: //             Var *v;                                 VOK;
        !           354: //     
        !           355: //             while( v = bl.gen() )
        !           356: //                     if( !strcmp(v->text(),id) ){
        !           357: //                             PadsWarn("more than one %s in %s (use the menu)",
        !           358: //                                     id, func->text() );
        !           359: //                             return;
        !           360: //                     }
        !           361: //     }
        !           362: 
        !           363: Var *Frame::idtosym(char *id)  // ever called with id==0 ?
        !           364: {
        !           365:        Var *v;
        !           366: 
        !           367:        trace("%d.idtosym(%s)", this, id?id:"0");       OK(0);
        !           368:        if( !id ) return 0;
        !           369:        if( func ) {
        !           370:                BlkVars bl((Block*)func->blk()->child);         // blk(pc) ?
        !           371:                while( v = bl.gen() )
        !           372:                        if( !strcmp(v->text(),id) ){
        !           373: //                             ambiguous(id, bl);
        !           374:                                return v;
        !           375:                        }
        !           376:        }
        !           377:        BlkVars bg(core->symtab()->blk());      // idtosym doesn't work for regs
        !           378:        while( v = bg.gen() )
        !           379:                if( !strcmp(v->text(),id) ) return v;
        !           380:        return (Var*) symtab()->idtosym(SSet(U_GLB,U_FUNC), id);
        !           381: }
        !           382: 
        !           383: Index Frame::carte()
        !           384: {
        !           385:        trace("%d.carte()", this);      OK(ZIndex);
        !           386:        if( !func ) return ZIndex;
        !           387:                Bls o("open %s frame", func->text());
        !           388:                Menu m(o.text, (Action)&Frame::open);
        !           389:                Stmt *stmt = func->stmt(pc);
        !           390:                if( stmt ){
        !           391:                        Bls s("show %s", stmt->text());
        !           392:                        m.last(s.text, (Action)&Frame::select);
        !           393:                }
        !           394:                if( core->online() && core->process()->frame(0) == this )
        !           395:                        m.last("pop off callstack", (Action)&Frame::pop);
        !           396:                return m.index();
        !           397: }
        !           398: 
        !           399: Globals::Globals(Core *c):(c)
        !           400: {
        !           401:        trace("%d.Globals(%d)", this, c);       VOK;
        !           402: }
        !           403: 
        !           404: void Globals::banner()
        !           405: {
        !           406:        trace("%d.banner()", this); VOK;
        !           407:        if( pad ){
        !           408:                pad->banner("Globals: %s", core->procpath());
        !           409:                pad->name("Globals");
        !           410:        }
        !           411: }
        !           412: 
        !           413: void Globals::open(long)
        !           414: {
        !           415:        Var *g;
        !           416:        Menu m;
        !           417: 
        !           418:        trace( "%d.open()", this );     VOK;
        !           419:        if( !pad ){
        !           420:                BlkVars bv(core->symtab()->blk());
        !           421:                pad = new Pad( (PadRcv *) this );
        !           422:                banner();
        !           423:                while( g = bv.gen() ){
        !           424:                        if( g->range.lo && g->disc() == U_GLB ){
        !           425:                                Bls id("%s\240%s", g->_text, DiscName(g->disc()));
        !           426:                                m.sort(id.text, (Action)&Frame::pickvar, (long) g);
        !           427:                        }
        !           428:                }
        !           429:                m.first("changed spies", (Action)&Frame::changes, 1);
        !           430:                m.last(regcarte());
        !           431:                pad->menu(m);
        !           432:                ix = m.index();
        !           433:        }
        !           434:        pad->makecurrent();
        !           435: }
        !           436: 
        !           437: void Globals::addvars(Menu *m)
        !           438: {
        !           439:        Menu combine;
        !           440:        trace("%d.addvars(%d)", this, m);       VOK;
        !           441:        if( !pad ) open();
        !           442:        combine.first(ix);
        !           443:        combine.last(m->index());
        !           444:        pad->menu(combine);
        !           445:        ix = combine.index();
        !           446:        pad->makecurrent();
        !           447: }
        !           448: 
        !           449: Index Frame::regcarte()
        !           450: {
        !           451:        Var *v;
        !           452:        Menu m;
        !           453: 
        !           454:        trace("%d.regcarte()", this);   OK(ZIndex);
        !           455:        BlkVars bv( core->symtab()->blk() );
        !           456:        while( v = bv.gen() )
        !           457:                if( v->disc() == U_REG )
        !           458:                        m.last(v->text(), (Action)&Frame::pickvar, (long)v);
        !           459:        return m.index("registers\240");
        !           460: }

unix.superglobalmegacorp.com

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