Module Name: src
Committed By: rillig
Date: Wed Oct 28 03:12:54 UTC 2020
Modified Files:
src/usr.bin/make: parse.c
Log Message:
make(1): merge curFile into includes
This makes GetActuallyIncludingFile simpler since it no longer needs the
special case for curFile.
The type of 'includes' has changed from Vector<IFile *> to
Vector<IFile>, to avoid a few extra memory allocations and because
Vector is easier to use with structs than with pointers (see
GetInclude).
To generate a diff of this commit:
cvs rdiff -u -r1.407 -r1.408 src/usr.bin/make/parse.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/make/parse.c
diff -u src/usr.bin/make/parse.c:1.407 src/usr.bin/make/parse.c:1.408
--- src/usr.bin/make/parse.c:1.407 Wed Oct 28 01:58:37 2020
+++ src/usr.bin/make/parse.c Wed Oct 28 03:12:54 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: parse.c,v 1.407 2020/10/28 01:58:37 rillig Exp $ */
+/* $NetBSD: parse.c,v 1.408 2020/10/28 03:12:54 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -117,7 +117,7 @@
#include "pathnames.h"
/* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: parse.c,v 1.407 2020/10/28 01:58:37 rillig Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.408 2020/10/28 03:12:54 rillig Exp $");
/* types and constants */
@@ -226,13 +226,9 @@ static int fatals = 0;
* Variables for doing includes
*/
-/* current file being read */
-static IFile *curFile;
-
-/* The include chain of makefiles that leads to curFile. At the bottom of
- * the stack is the top-level makefile from the command line, and on top of
- * this file, there are the included files or .for loops, up to but excluding
- * curFile.
+/* The include chain of makefiles. At the bottom is the top-level makefile
+ * from the command line, and on top of that, there are the included files or
+ * .for loops, up to and including the current file.
*
* This data could be used to print stack traces on parse errors. As of
* 2020-09-14, this is not done though. It seems quite simple to print the
@@ -249,13 +245,13 @@ static IFile *curFile;
*
* To make the stack trace intuitive, the entry below the first .for loop must
* be ignored completely since neither its lineno nor its first_lineno is
- * useful. Instead, the topmost .for loop needs to be printed twice, once
- * with its first_lineno and once with its lineno.
+ * useful. Instead, the topmost of each chain of .for loop needs to be
+ * printed twice, once with its first_lineno and once with its lineno.
*
- * As of 2020-09-15, using the above rules, the stack trace for the .info line
+ * As of 2020-10-28, using the above rules, the stack trace for the .info line
* in include-subsub.mk would be:
*
- * curFile: include-subsub.mk:4
+ * includes[5]: include-subsub.mk:4
* (lineno, from an .include)
* includes[4]: include-sub.mk:32
* (lineno, from a .for loop below an .include)
@@ -269,12 +265,19 @@ static IFile *curFile;
* (not printed since it is below a .for loop)
* includes[0]: include-main.mk:27
*/
-static Vector /* of IFile pointer */ includes;
+static Vector /* of IFile */ includes;
static IFile *
GetInclude(size_t i)
{
- return *((IFile **)Vector_Get(&includes, i));
+ return Vector_Get(&includes, i);
+}
+
+/* The file that is currently being read. */
+static IFile *
+CurFile(void)
+{
+ return GetInclude(includes.len - 1);
}
/* include paths (lists of directories) */
@@ -571,6 +574,7 @@ ParseIsEscaped(const char *line, const c
static void
ParseMark(GNode *gn)
{
+ IFile *curFile = CurFile();
gn->fname = curFile->fname;
gn->lineno = curFile->lineno;
}
@@ -694,10 +698,11 @@ Parse_Error(ParseErrorLevel type, const
const char *fname;
size_t lineno;
- if (curFile == NULL) {
+ if (includes.len == 0) {
fname = NULL;
lineno = 0;
} else {
+ IFile *curFile = CurFile();
fname = curFile->fname;
lineno = (size_t)curFile->lineno;
}
@@ -2152,7 +2157,7 @@ Parse_include_file(char *file, Boolean i
* we can locate the beast.
*/
- incdir = bmake_strdup(curFile->fname);
+ incdir = bmake_strdup(CurFile()->fname);
prefEnd = strrchr(incdir, '/');
if (prefEnd != NULL) {
*prefEnd = '\0';
@@ -2225,7 +2230,7 @@ Parse_include_file(char *file, Boolean i
/* Start reading from this file next */
Parse_SetInput(fullname, 0, -1, loadedfile_nextbuf, lf);
- curFile->lf = lf;
+ CurFile()->lf = lf;
if (depinc)
doing_depend = depinc; /* only turn it on */
}
@@ -2316,13 +2321,11 @@ static const char *
GetActuallyIncludingFile(void)
{
size_t i;
+ const IFile *incs = GetInclude(0);
- for (i = includes.len; i > 0; i--) {
- IFile *parent = GetInclude(i - 1);
- IFile *child = i < includes.len ? GetInclude(i) : curFile;
- if (!child->fromForLoop)
- return parent->fname;
- }
+ for (i = includes.len; i >= 2; i--)
+ if (!incs[i - 1].fromForLoop)
+ return incs[i - 2].fname;
return NULL;
}
@@ -2379,12 +2382,13 @@ void
Parse_SetInput(const char *name, int line, int fd,
char *(*nextbuf)(void *, size_t *), void *arg)
{
+ IFile *curFile;
char *buf;
size_t len;
Boolean fromForLoop = name == NULL;
if (fromForLoop)
- name = curFile->fname;
+ name = CurFile()->fname;
else
ParseTrackInput(name);
@@ -2398,14 +2402,7 @@ Parse_SetInput(const char *name, int lin
/* sanity */
return;
- if (curFile != NULL) {
- /* Save existing file info */
- IFile **next = Vector_Push(&includes);
- *next = curFile;
- }
-
- /* Allocate and fill in new structure */
- curFile = bmake_malloc(sizeof *curFile);
+ curFile = Vector_Push(&includes);
/*
* Once the previous state has been saved, we can get down to reading
@@ -2569,6 +2566,7 @@ ParseEOF(void)
{
char *ptr;
size_t len;
+ IFile *curFile = CurFile();
assert(curFile->nextbuf != NULL);
@@ -2595,10 +2593,9 @@ ParseEOF(void)
/* Dispose of curFile info */
/* Leak curFile->fname because all the gnodes have pointers to it */
free(curFile->buf_freeIt);
- free(curFile);
+ Vector_Pop(&includes);
if (includes.len == 0) {
- curFile = NULL;
/* We've run out of input */
Var_Delete(".PARSEDIR", VAR_GLOBAL);
Var_Delete(".PARSEFILE", VAR_GLOBAL);
@@ -2607,8 +2604,7 @@ ParseEOF(void)
return FALSE;
}
- curFile = GetInclude(includes.len - 1);
- Vector_Pop(&includes);
+ curFile = CurFile();
DEBUG2(PARSE, "ParseEOF: returning to file %s, line %d\n",
curFile->fname, curFile->lineno);
@@ -2622,7 +2618,7 @@ ParseEOF(void)
static char *
ParseGetLine(int flags)
{
- IFile *cf = curFile;
+ IFile *cf = CurFile();
char *ptr;
char ch;
char *line;
@@ -2829,7 +2825,7 @@ ParseReadLine(void)
/* Syntax error - error printed, ignore line */
continue;
/* Start of a .for loop */
- lineno = curFile->lineno;
+ lineno = CurFile()->lineno;
/* Accumulate loop lines until matching .endfor */
do {
line = ParseGetLine(PARSE_RAW);
@@ -3116,11 +3112,12 @@ Parse_File(const char *name, int fd)
name = "(stdin)";
Parse_SetInput(name, 0, -1, loadedfile_nextbuf, lf);
- curFile->lf = lf;
+ CurFile()->lf = lf;
do {
while ((line = ParseReadLine()) != NULL) {
- DEBUG2(PARSE, "ParseReadLine (%d): '%s'\n", curFile->lineno, line);
+ DEBUG2(PARSE, "ParseReadLine (%d): '%s'\n",
+ CurFile()->lineno, line);
ParseLine(line);
}
/*
@@ -3148,7 +3145,7 @@ Parse_Init(void)
parseIncPath = Lst_New();
sysIncPath = Lst_New();
defIncPath = Lst_New();
- Vector_Init(&includes, sizeof(IFile *));
+ Vector_Init(&includes, sizeof(IFile));
#ifdef CLEANUP
targCmds = Lst_New();
#endif