diff options
author | Ori Bernstein <ori@eigenstate.org> | 2020-11-01 11:56:26 -0800 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2020-11-01 11:56:26 -0800 |
commit | d75d842cf576cb4785f89c5f5b73a4f73170001b (patch) | |
tree | 008a1cd386c97ee735ab2e1129eeda890093bcef /sys/src/cmd/rc/code.c | |
parent | dbd54342fd66fd372f5c2edd1597019814f41c9c (diff) |
rc: show line numbers on error
This change provides a location for errors
like 'null list in concatenation'.
Diffstat (limited to 'sys/src/cmd/rc/code.c')
-rw-r--r-- | sys/src/cmd/rc/code.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/sys/src/cmd/rc/code.c b/sys/src/cmd/rc/code.c index 4a415bd54..d85a12260 100644 --- a/sys/src/cmd/rc/code.c +++ b/sys/src/cmd/rc/code.c @@ -6,10 +6,12 @@ #define c0 t->child[0] #define c1 t->child[1] #define c2 t->child[2] +code *codebuf; int codep, ncode; #define emitf(x) ((codep!=ncode || morecode()), codebuf[codep].f = (x), codep++) #define emiti(x) ((codep!=ncode || morecode()), codebuf[codep].i = (x), codep++) #define emits(x) ((codep!=ncode || morecode()), codebuf[codep].s = (x), codep++) + void stuffdot(int); char *fnstr(tree*); void outcode(tree*, int); @@ -38,7 +40,7 @@ int compile(tree *t) { ncode = 100; - codebuf = (code *)emalloc(ncode*sizeof codebuf[0]); + codebuf = emalloc(ncode*sizeof codebuf[0]); codep = 0; emiti(0); /* reference count */ outcode(t, flag['e']?1:0); @@ -64,12 +66,8 @@ fnstr(tree *t) { io *f = openstr(); void *v; - extern char nl; - char svnl = nl; - nl = ';'; pfmt(f, "%t", t); - nl = svnl; v = f->strp; f->strp = 0; closeio(f); @@ -79,12 +77,19 @@ fnstr(tree *t) void outcode(tree *t, int eflag) { + static int line; int p, q; tree *tt; + char *f; if(t==0) return; if(t->type!=NOT && t->type!=';') runq->iflast = 0; + if(t->line != line){ + line = t->line; + emitf(Xsrcline); + emiti(line); + } switch(t->type){ default: pfmt(err, "bad type %d in outcode\n", t->type); @@ -174,6 +179,12 @@ outcode(tree *t, int eflag) emitf(Xfn); p = emiti(0); emits(fnstr(c1)); + if((f = curfile(runq)) != nil){ + emitf(Xsrcfile); + emits(strdup(f)); + } + emitf(Xsrcline); + emiti(lexline); outcode(c1, eflag); emitf(Xunlocal); /* get rid of $* */ emitf(Xreturn); |