summaryrefslogtreecommitdiff
path: root/test/ruby
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2024-10-15 15:46:23 -0400
committerPeter Zhu <peter@peterzhu.ca>2024-10-16 14:52:46 -0400
commit90aa6aefc4e351d3840cfd58872c5f42a11f4c7a (patch)
tree540628302525d673583a7ff25c6cf16e434d307f /test/ruby
parent4621c9b8154533e96a3f53de823578b1e171aa03 (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.rb14
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