From 6221390e43375c054a2d556edfbfb4af44ea2361 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 13 Feb 2022 12:05:22 -0800 Subject: load: support loading catenated .tlo files. * parser.c (read_file_common): Tolerate the presence of version expressions, as long as they match the initial version under equal. Thus a larger .tlo file can be made of two or more .tlo files by simple catenation; it will load as long as they have exactly the same version. --- parser.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'parser.c') diff --git a/parser.c b/parser.c index 4609546b..2937ecd8 100644 --- a/parser.c +++ b/parser.c @@ -755,6 +755,7 @@ static val read_file_common(val self, val stream, val error_stream, val compiled val big_endian = nil; val parser = ensure_parser(stream, name); val not_compiled = null(compiled); + val version_form = nil; if (compiled) { parser_t *pi = parser_get_impl(self, parser); @@ -779,20 +780,26 @@ static val read_file_common(val self, val stream, val error_stream, val compiled stream, nao); big_endian = caddr(form); first = nil; + version_form = form; } else if (compiled) { - 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); - if ((big_endian && HAVE_LITTLE_ENDIAN) || - (!big_endian && !HAVE_LITTLE_ENDIAN)) - buf_swap32(bytecode); - (void) vm_execute_toplevel(desc); - gc_hint(desc); + if (consp(car(form))) { + 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); + if ((big_endian && HAVE_LITTLE_ENDIAN) || + (!big_endian && !HAVE_LITTLE_ENDIAN)) + buf_swap32(bytecode); + (void) vm_execute_toplevel(desc); + gc_hint(desc); + } + } else if (nequal(form, version_form)) { + uw_throwf(error_s, lit("~s: mismatched version ~s in combined .tlo file"), + stream, form, nao); } } else { (void) eval_intrinsic(form, nil); -- cgit v1.2.3