diff options
| author | Peter Zhu <peter@peterzhu.ca> | 2024-01-18 09:51:45 -0500 |
|---|---|---|
| committer | Peter Zhu <peter@peterzhu.ca> | 2024-01-18 10:35:46 -0500 |
| commit | 00814fd6724fff66a10966f5be10ea6dae06c616 (patch) | |
| tree | 298f19a6227f63bc94cfacaa3f9e3ea22b95e6b9 | |
| parent | ef685554c90e78f1ce8ed3a26745b0bd58df278e (diff) | |
[PRISM] Fix memory leak in iseq
rb_iseq_compile_prism_node calls both rb_translate_prism and iseq_setup.
Both of these functions call iseq_set_sequence. This means that the first
iseq_set_sequence will leak because the iseq will be overwritten.
For example:
10.times do
100_000.times do
RubyVM::InstructionSequence.compile_prism("")
end
puts `ps -o rss= -p #{$$}`
end
Before:
20528
27328
33840
40208
46400
52960
59168
65600
71888
78352
After:
13696
13712
13712
13712
13712
14352
14352
14992
14992
14992
| -rw-r--r-- | prism_compile.c | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/prism_compile.c b/prism_compile.c index 876278166b..e87c240638 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -6901,7 +6901,6 @@ rb_translate_prism(pm_parser_t *parser, rb_iseq_t *iseq, pm_scope_node_t *scope_ scope_node->index_lookup_table = index_lookup_table; pm_compile_node(iseq, (pm_node_t *)scope_node, ret, scope_node->base.location.start, false, (pm_scope_node_t *)scope_node); - iseq_set_sequence(iseq, ret); st_free_table(index_lookup_table); |
