diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-04-11 23:38:42 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-04-11 23:38:42 -0700 |
commit | fe1e960389a89f481d46c02aa040fdc762da735f (patch) | |
tree | cd973e0ebcb1e72ff8393e5482ad1190aa7089cc /match.c | |
parent | 3d7330b827d6e9cc0d9e87edd30388374cb45900 (diff) | |
download | txr-fe1e960389a89f481d46c02aa040fdc762da735f.tar.gz txr-fe1e960389a89f481d46c02aa040fdc762da735f.tar.bz2 txr-fe1e960389a89f481d46c02aa040fdc762da735f.zip |
txr: spurious retention in @(next).
* match.c (mf_file_lazy): New static function. The
lazy list is created here and stored directly into
the data field of the context structure.
Function is marked NOINLINE because on an older
system with gcc 4.4.5, it didn't solve the problem.
We need the function to have a stack frame so any
spurious copies of the linked list go into a frame
that disappears when the function returns.
(v_next_impl): Use mf_file_lazy instead of mf_file_data.
(open_data_source): Also make this function INLINE
just in case because it contains calls to lazy_stream_cons.
Diffstat (limited to 'match.c')
-rw-r--r-- | match.c | 19 |
1 files changed, 16 insertions, 3 deletions
@@ -2308,6 +2308,19 @@ static match_files_ctx *mf_file_data(match_files_ctx *nc, return nc; } +NOINLINE static match_files_ctx *mf_file_lazy(match_files_ctx *nc, + match_files_ctx *c, val file, + val stream, val data_lineno) +{ + *nc = *c; + nc->files = cons(file, c->files); + nc->curfile = file; + nc->data = lazy_stream_cons(stream); + nc->data_lineno = data_lineno; + return nc; +} + + static match_files_ctx *mf_from_ml(match_files_ctx *nc, match_line_ctx *ml) { nc->spec = cons(ml->specline, nil); @@ -2857,8 +2870,8 @@ static val v_next_impl(match_files_ctx *c) if (stream) { match_files_ctx cs; cons_bind (new_bindings, success, - match_files(mf_file_data(&cs, c, str, - lazy_stream_cons(stream), one))); + match_files(mf_file_lazy(&cs, c, str, + stream, one))); if (success) return cons(new_bindings, @@ -4584,7 +4597,7 @@ static val h_assert(match_line_ctx *c) abort(); } -static void open_data_source(match_files_ctx *c) +NOINLINE static void open_data_source(match_files_ctx *c) { spec_bind (specline, first_spec, c->spec); int non_matching_dir = (consp(first_spec) && |