shithub: plan9front

Download patch

ref: 577033228209f28350dc3f75ef9d4ce88dfdf190
parent: ce73821f3575921e24f839b21c7be60520a9dc42
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Jun 22 19:40:11 EDT 2021

rc: correct line numbers

When loading a file using ".", we could
end up with our line numbers thrown off
due to the mutation of lexline. Putting
lexline into the runq beside the file
that we're reading from causes it to get
pushed and popped correctly, so that we
no longer lose track of our location.

--- a/sys/src/cmd/rc/code.c	Mon Jun 21 11:38:11 2021
+++ b/sys/src/cmd/rc/code.c	Tue Jun 22 19:40:11 2021
@@ -184,7 +184,7 @@
 				emits(strdup(f));
 			}
 			emitf(Xsrcline);
-			emiti(lexline);
+			emiti(runq->lexline);
 			outcode(c1, eflag);
 			emitf(Xunlocal);	/* get rid of $* */
 			emitf(Xreturn);
--- a/sys/src/cmd/rc/exec.c	Mon Jun 21 11:38:11 2021
+++ b/sys/src/cmd/rc/exec.c	Tue Jun 22 19:40:11 2021
@@ -23,7 +23,7 @@
 	p->cmdfd = 0;
 	p->eof = 0;
 	p->iflag = 0;
-	p->lineno = 1;
+	p->lineno = runq ? runq->lineno : 1;
 	p->ret = runq;
 	runq = p;
 }
@@ -203,12 +203,12 @@
 	bootstrap[i].i = 0;
 	start(bootstrap, 1, (var *)0);
 	runq->cmdfile = strdup("rc");
+	runq->lexline = 0;
 	/* prime bootstrap argv */
 	pushlist();
 	argv0 = estrdup(argv[0]);
 	for(i = argc-1;i!=0;--i) pushword(argv[i]);
 
-	lexline = 0;
 
 	for(;;){
 		if(flag['r'])
@@ -922,6 +922,7 @@
 {
 	struct thread *p = runq;
 	word *prompt;
+
 	flush(err);
 	nerror = 0;
 	if(flag['s'] && !truestatus())
--- a/sys/src/cmd/rc/exec.h	Mon Jun 21 11:38:11 2021
+++ b/sys/src/cmd/rc/exec.h	Tue Jun 22 19:40:11 2021
@@ -49,6 +49,7 @@
 	var *local;			/* list of local variables */
 	char *cmdfile;			/* file name in Xrdcmd */
 	io *cmdfd;			/* file descriptor for Xrdcmd */
+	int lexline;			/* file descriptor line */
 	int iflast;			/* static `if not' checking */
 	int eof;			/* is cmdfd at eof? */
 	int iflag;			/* interactive? */
--- a/sys/src/cmd/rc/lex.c	Mon Jun 21 11:38:11 2021
+++ b/sys/src/cmd/rc/lex.c	Tue Jun 22 19:40:11 2021
@@ -28,7 +28,6 @@
 int lastc;
 int ndot;
 int nerror;
-int lexline;
 int nlexpath;
 int lexpathsz;
 
@@ -53,7 +52,7 @@
 	lastc = future;
 	future = EOF;
 	if(c == '\n')
-		lexline++;
+		runq->lexline++;
 	return c;
 }
 /*
--- a/sys/src/cmd/rc/plan9.c	Mon Jun 21 11:38:11 2021
+++ b/sys/src/cmd/rc/plan9.c	Tue Jun 22 19:40:11 2021
@@ -166,8 +166,8 @@
 	else {
 		free(runq->cmdfile);
 		int f = open(runq->argv->words->word, 0);
-		lexline = 0;
 		runq->cmdfile = strdup(runq->argv->words->word);
+		runq->lexline = 1;
 		runq->pc--;
 		popword();
 		if(f>=0) execcmds(openfd(f));
--- a/sys/src/cmd/rc/rc.h	Mon Jun 21 11:38:11 2021
+++ b/sys/src/cmd/rc/rc.h	Tue Jun 22 19:40:11 2021
@@ -132,7 +132,6 @@
 extern char **args;
 extern int nerror;		/* number of errors encountered during compilation */
 extern int doprompt;		/* is it time for a prompt? */
-extern int lexline;
 
 /*
  * Which fds are the reading/writing end of a pipe?
--- a/sys/src/cmd/rc/simple.c	Mon Jun 21 11:38:11 2021
+++ b/sys/src/cmd/rc/simple.c	Tue Jun 22 19:40:11 2021
@@ -364,13 +364,12 @@
 		return;
 	}
 
-	lexline = 1;
-
 	/* set up for a new command loop */
 	start(dotcmds, 1, (struct var *)0);
 	pushredir(RCLOSE, fd, 0);
 	runq->cmdfile = zero;
 	runq->cmdfd = openfd(fd);
+	runq->lexline = 1;
 	runq->iflag = iflag;
 	runq->iflast = 0;
 	/* push $* value */
--- a/sys/src/cmd/rc/tree.c	Mon Jun 21 11:38:11 2021
+++ b/sys/src/cmd/rc/tree.c	Tue Jun 22 19:40:11 2021
@@ -16,7 +16,7 @@
 	t->str = 0;
 	t->child[0] = t->child[1] = t->child[2] = 0;
 	t->next = treenodes;
-	t->line = lexline;
+	t->line = runq->lexline;
 	treenodes = t;
 	return t;
 }