diff options
| author | Peter Zhu <peter@peterzhu.ca> | 2024-10-15 15:46:23 -0400 |
|---|---|---|
| committer | Peter Zhu <peter@peterzhu.ca> | 2024-10-16 14:52:46 -0400 |
| commit | 90aa6aefc4e351d3840cfd58872c5f42a11f4c7a (patch) | |
| tree | 540628302525d673583a7ff25c6cf16e434d307f /test/ruby | |
| parent | 4621c9b8154533e96a3f53de823578b1e171aa03 (diff) | |
Fix memory leak in syntax error in prism
If there is a syntax error, there could be an ast_node in the result.
This could get leaked if there is a syntax error so parsing could not
complete (parsed is not set to true).
For example, the following script leaks memory:
10.times do
10_000.times do
eval("def foo(...) super(...) {}; end")
rescue SyntaxError
end
puts `ps -o rss= -p #{$$}`
end
Before:
31328
42768
53856
65120
76208
86768
97856
109120
120208
131296
After:
20944
20944
20944
20944
20944
20944
20944
20944
20944
20944
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/11901
Diffstat (limited to 'test/ruby')
| -rw-r--r-- | test/ruby/test_syntax.rb | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 7a6c66d782..edf5886a53 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -2204,6 +2204,20 @@ eom assert_syntax_error('def foo(...) super(1, ...) {}; end', /both block arg and actual block/) end + def test_argument_forwarding_with_super_memory_leak + assert_no_memory_leak([], "#{<<-'begin;'}", "#{<<-'end;'}", rss: true) + code = proc do + eval("def foo(...) super(...) {}; end") + raise "unreachable" + rescue SyntaxError + end + + 1_000.times(&code) + begin; + 100_000.times(&code) + end; + end + def test_class_module_Object_ancestors assert_separately([], <<-RUBY) m = Module.new |
