diff options
author | Peter Zhu <peter@peterzhu.ca> | 2024-07-22 11:43:22 -0400 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2024-07-22 14:22:47 -0400 |
commit | 5299672a5bb52904cc6b9555be704af2cdc18eba (patch) | |
tree | a51dbc1eaa728c105e747385a59589b9f50096fe | |
parent | 34adc07372c10170b8ca36111d216cbd8e4699be (diff) | |
download | ruby-5299672a5bb52904cc6b9555be704af2cdc18eba.tar.gz |
[PRISM] Fix memory leak in constants
For example, the following code leaks:
code = 1000.times.map { |i| "var#{i} = 1" }.join("\n")
10.times do
1000.times do
RubyVM::InstructionSequence.compile_prism(code)
end
puts `ps -o rss= -p #{$$}`
end
Before:
70384
88032
103856
115712
125584
132768
144784
152624
165296
180608
After:
62368
78784
74512
87712
85072
77728
69424
74992
71264
81440
-rw-r--r-- | prism_compile.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/prism_compile.c b/prism_compile.c index 50a8c87e7d..713635f033 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -9744,6 +9744,8 @@ pm_parse_result_free(pm_parse_result_t *result) { if (result->parsed) { pm_node_destroy(&result->parser, result->node.ast_node); + + xfree(result->node.constants); pm_scope_node_destroy(&result->node); } |