From f200086eff39c729cbdbb5dbdcb97b134f3fdd0d Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 15 Apr 2016 20:03:56 -0700 Subject: Close source files after parsing. * eval.c (sys_load): close stream in all cases. * match.c (v_load): Likewise. * parser.c (load_rcfile): Close stream in unwind block, if open. * txr.c (txr_main): Close stream after parsing in all cases. If stream is std_input, or a string stream, close_stream does nothing. --- eval.c | 3 +++ match.c | 7 ++++++- parser.c | 5 ++++- txr.c | 4 ++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/eval.c b/eval.c index 25678510..d9aca0df 100644 --- a/eval.c +++ b/eval.c @@ -3261,15 +3261,18 @@ static val sys_load(val target, val sloc) open_txr_file(path, &txr_lisp_p, &name, &stream); if (!txr_lisp_p) { + close_stream(stream, nil); rlset(sloc, sloc); eval_error(sloc, lit("load doesn't process .txr files"), nao); } if (!read_eval_stream(stream, std_error, nil)) { rlset(sloc, sloc); + close_stream(stream, nil); eval_error(sloc, lit("load: ~s contains errors"), path, nao); } + close_stream(stream, nil); return nil; } diff --git a/match.c b/match.c index 05b1a094..857e1df6 100644 --- a/match.c +++ b/match.c @@ -3739,6 +3739,8 @@ static val v_load(match_files_ctx *c) parse_once(stream, name, &parser); gc_state(gc); + close_stream(stream, nil); + if (parser.errors) sem_error(specline, lit("~s: errors encountered in ~s"), sym, path, nao); @@ -3773,8 +3775,11 @@ static val v_load(match_files_ctx *c) } } } else { - if (!read_eval_stream(stream, std_error, nil)) + if (!read_eval_stream(stream, std_error, nil)){ + close_stream(stream, nil); sem_error(specline, lit("load: ~s contains errors"), path, nao); + } + close_stream(stream, nil); return (sym == include_s) ? nil : next_spec_k; } } diff --git a/parser.c b/parser.c index 012b4da1..865dee7b 100644 --- a/parser.c +++ b/parser.c @@ -426,7 +426,10 @@ static void load_rcfile(val name) format(std_output, lit("** details: ~a\n"), car(va), nao); } - uw_unwind; + uw_unwind { + if (stream) + close_stream(stream, nil); + } uw_catch_end; } diff --git a/txr.c b/txr.c index d9c2b166..def35cc9 100644 --- a/txr.c +++ b/txr.c @@ -831,6 +831,8 @@ int txr_main(int argc, char **argv) parse_once(parse_stream, spec_file_str, &parser); gc_state(gc); + close_stream(parse_stream, nil); + if (parser.errors) return EXIT_FAILURE; @@ -861,6 +863,8 @@ int txr_main(int argc, char **argv) { val result = read_eval_stream(parse_stream, std_error, t); + close_stream(parse_stream, nil); + if (!enter_repl) return result ? 0 : EXIT_FAILURE; } -- cgit v1.2.3