aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2020-05-20 12:22:30 -0700
committerNicholas Noll <nbnoll@eml.cc>2020-05-20 12:22:30 -0700
commit6ea22d950fd7246c9159a3601819ae23d03e8dcd (patch)
tree483f6df6536ec6e81913641a405d7a6ae3ffefa4 /sys
parent57eb0c15a10dfcd9816b84166106a1aa32323325 (diff)
fix: truncate infinite recursion caused by self referential macros
Diffstat (limited to 'sys')
-rw-r--r--sys/cmd/cc/cc.c7
-rw-r--r--sys/cmd/cc/cc.h2
-rw-r--r--sys/cmd/cc/lex.c4
3 files changed, 7 insertions, 6 deletions
diff --git a/sys/cmd/cc/cc.c b/sys/cmd/cc/cc.c
index 6338050..00cd4a5 100644
--- a/sys/cmd/cc/cc.c
+++ b/sys/cmd/cc/cc.c
@@ -130,13 +130,13 @@ openio(byte *path)
}
Io*
-makeio()
+makeio(byte *name)
{
if ((C.io - C.iostk) >= arrlen(C.iostk)-1)
panicf("out of I/O space!");
- C.io->path = "<buffer>";
- C.io->buf = (io·Buffer) {
+ C.io->path = name;
+ C.io->buf = (io·Buffer) {
.state = bufio·rdr | bufio·end,
.runesize = 0,
.h = nil,
@@ -163,6 +163,7 @@ freeio(Io *io)
io->link = nil;
io->path = nil;
io->store = (Pos){ 0 };
+ io->path = "<empty>";
}
void
diff --git a/sys/cmd/cc/cc.h b/sys/cmd/cc/cc.h
index 6ed2caa..685dce2 100644
--- a/sys/cmd/cc/cc.h
+++ b/sys/cmd/cc/cc.h
@@ -388,7 +388,7 @@ struct Io
/* cc.c io functions */
Io* openio(byte *path);
-Io* makeio();
+Io* makeio(byte *name);
void freeio(Io *io);
struct StrTab
diff --git a/sys/cmd/cc/lex.c b/sys/cmd/cc/lex.c
index 8ce4e79..4cc1259 100644
--- a/sys/cmd/cc/lex.c
+++ b/sys/cmd/cc/lex.c
@@ -635,8 +635,8 @@ Dispatch:
}
sym = lookup(&lx->sym, tok.val.s);
- if (sym) {
- io = makeio();
+ if (sym && ((uintptr)sym->name != (uintptr)lx->io->path)) {
+ io = makeio(sym->name);
printf("EXPANDING MACRO %s\n", sym->name);
io->buf.end += expandmacro(lx, sym, io->b);
*io->buf.end++ = EOF;