Actions
Bug #20348
closedMemory leak with method kwargs in ERB template
Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
Description
Evaluating ERB templates with kwarg method calls leads to unbounded growth in memory use.
Example script:
require "erb"
def noop(kwarg1:); end
template = ERB.new("<%= noop kwarg1: false %>")
50.times do
10_000.times do
template.result(binding)
end
GC.start;
puts "Object Count: #{ObjectSpace.count_objects[:TOTAL]}"
end
When run, this script will print something like:
Object Count: 53825
Object Count: 80432
Object Count: 105811
Object Count: 137331
Object Count: 179491
Object Count: 179491
Object Count: 236389
...
This issue does not occur when the keyword argument is replaced with a positional argument.
I can reproduce the issue using Ruby 3.0.6, 3.1.4, 3.2.3 and 3.3.0.
The issue does not reproduce using Ruby 2.7.8.
Updated by jeremyevans0 (Jeremy Evans) 9 months ago
This has been fixed in the master branch. However, I'm not sure which commit fixed it.
Updated by byroot (Jean Boussier) 9 months ago
I suspect it's https://github.com/ruby/ruby/pull/9973, trying to confirm.
Updated by byroot (Jean Boussier) 9 months ago
- Status changed from Open to Closed
Confirmed, this is a duplicate of [Bug #19907]. I'll make that one for backport.
Updated by byroot (Jean Boussier) 9 months ago
- Related to Bug #19907: Method calls with keyword arguments in eval leaks callcache and callinfo objects added
Actions
Like1
Like1Like0Like0Like0