summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2024-01-18 09:51:45 -0500
committerPeter Zhu <peter@peterzhu.ca>2024-01-18 10:35:46 -0500
commit00814fd6724fff66a10966f5be10ea6dae06c616 (patch)
tree298f19a6227f63bc94cfacaa3f9e3ea22b95e6b9
parentef685554c90e78f1ce8ed3a26745b0bd58df278e (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.c1
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);