summaryrefslogtreecommitdiffstats
path: root/parser.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-04-05 06:43:10 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-04-05 06:43:10 -0700
commit34efdb8b2e45eb6543a8fbaadf8867ee58870677 (patch)
tree6feeb4ac8fedb92fbda651407fb4493a732653ad /parser.c
parent4561d4e6be6ffa6ef7b282b9a72ce966625382c3 (diff)
downloadtxr-34efdb8b2e45eb6543a8fbaadf8867ee58870677.tar.gz
txr-34efdb8b2e45eb6543a8fbaadf8867ee58870677.tar.bz2
txr-34efdb8b2e45eb6543a8fbaadf8867ee58870677.zip
compile-file: handle gensyms and such.
* parser.c (read_file_common): The entire compiled representation is now one big list. We must walk the list to visit the individual compiled top-level forms. * share/txr/stdlib/compiler.tl (compile-file): Collect all the compiled top-level forms into one list, and emit it as one object. This way, gensym references among the items will resolve; for instance tests/012/man-or-boy.tl now compiles. That file defines a function named by a gensym, and a macro which expands to calls to that function. These end up in separate top-level forms and have to resolve. Because we are emitting everything as one big object, we cannot rely on (in-package ...) forms influencing the reading of the symbols. So we create a dummy package and switch to that during the writing, which forces all symbols to be fully qualified.
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/parser.c b/parser.c
index f39293ee..82576f43 100644
--- a/parser.c
+++ b/parser.c
@@ -632,13 +632,16 @@ static val read_file_common(val stream, val error_stream, val compiled)
stream, nao);
first = nil;
} else if (compiled) {
- val nlevels = pop(&form);
- val nregs = pop(&form);
- val bytecode = pop(&form);
- val datavec = pop(&form);
- val funvec = car(form);
- val desc = vm_make_desc(nlevels, nregs, bytecode, datavec, funvec);
- (void) vm_execute_toplevel(desc);
+ for (; form; form = cdr(form)) {
+ val item = car(form);
+ val nlevels = pop(&item);
+ val nregs = pop(&item);
+ val bytecode = pop(&item);
+ val datavec = pop(&item);
+ val funvec = car(item);
+ val desc = vm_make_desc(nlevels, nregs, bytecode, datavec, funvec);
+ (void) vm_execute_toplevel(desc);
+ }
} else {
(void) eval_intrinsic(form, nil);
}