diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-04-05 06:43:10 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-04-05 06:43:10 -0700 |
commit | 34efdb8b2e45eb6543a8fbaadf8867ee58870677 (patch) | |
tree | 6feeb4ac8fedb92fbda651407fb4493a732653ad /parser.c | |
parent | 4561d4e6be6ffa6ef7b282b9a72ce966625382c3 (diff) | |
download | txr-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.c | 17 |
1 files changed, 10 insertions, 7 deletions
@@ -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); } |