Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/make make(1): merge curFile into includes
details: https://anonhg.NetBSD.org/src/rev/c6ad6d677eba
branches: trunk
changeset: 1015632:c6ad6d677eba
user: rillig <rillig%NetBSD.org@localhost>
date: Wed Oct 28 03:12:54 2020 +0000
description:
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).
diffstat:
usr.bin/make/parse.c | 83 +++++++++++++++++++++++++--------------------------
1 files changed, 40 insertions(+), 43 deletions(-)
diffs (236 lines):
diff -r 95fabff6b2fc -r c6ad6d677eba usr.bin/make/parse.c
--- a/usr.bin/make/parse.c Wed Oct 28 02:43:16 2020 +0000
+++ b/usr.bin/make/parse.c Wed Oct 28 03:12:54 2020 +0000
@@ -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 @@
* 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 @@
*
* 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 @@
* (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 @@
static void
ParseMark(GNode *gn)
{
+ IFile *curFile = CurFile();
gn->fname = curFile->fname;
gn->lineno = curFile->lineno;
}
@@ -694,10 +698,11 @@
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 @@
* 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 @@
/* 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 @@
GetActuallyIncludingFile(void)
{
size_t i;
-
- 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;
- }
+ const IFile *incs = GetInclude(0);
+
+ for (i = includes.len; i >= 2; i--)
+ if (!incs[i - 1].fromForLoop)
+ return incs[i - 2].fname;
return NULL;
}
@@ -2379,12 +2382,13 @@
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 @@
/* 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 @@
{
char *ptr;
size_t len;
+ IFile *curFile = CurFile();
assert(curFile->nextbuf != NULL);
@@ -2595,10 +2593,9 @@
/* 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 @@
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 @@
static char *
ParseGetLine(int flags)
{
- IFile *cf = curFile;
+ IFile *cf = CurFile();
char *ptr;
char ch;
char *line;
@@ -2829,7 +2825,7 @@
/* 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 @@
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 @@
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
Home |
Main Index |
Thread Index |
Old Index