summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-04-15 20:03:56 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-04-15 20:03:56 -0700
commitf200086eff39c729cbdbb5dbdcb97b134f3fdd0d (patch)
tree66d1853e84c8ed28a6fff176eb401db8cb6d5372
parent50b5651649f71c7f1e4c480504b61cea04d8f789 (diff)
downloadtxr-f200086eff39c729cbdbb5dbdcb97b134f3fdd0d.tar.gz
txr-f200086eff39c729cbdbb5dbdcb97b134f3fdd0d.tar.bz2
txr-f200086eff39c729cbdbb5dbdcb97b134f3fdd0d.zip
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.
-rw-r--r--eval.c3
-rw-r--r--match.c7
-rw-r--r--parser.c5
-rw-r--r--txr.c4
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;
}