summaryrefslogtreecommitdiff
path: root/sys/src/cmd/rc/code.c
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2020-11-01 11:56:26 -0800
committerOri Bernstein <ori@eigenstate.org>2020-11-01 11:56:26 -0800
commitd75d842cf576cb4785f89c5f5b73a4f73170001b (patch)
tree008a1cd386c97ee735ab2e1129eeda890093bcef /sys/src/cmd/rc/code.c
parentdbd54342fd66fd372f5c2edd1597019814f41c9c (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.c21
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);