From d75d842cf576cb4785f89c5f5b73a4f73170001b Mon Sep 17 00:00:00 2001 From: Ori Bernstein Date: Sun, 1 Nov 2020 11:56:26 -0800 Subject: rc: show line numbers on error This change provides a location for errors like 'null list in concatenation'. --- sys/src/cmd/rc/code.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'sys/src/cmd/rc/code.c') 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); -- cgit v1.2.3