Project

General

Profile

Actions

Bug #20348

closed

Memory leak with method kwargs in ERB template

Added by davidtaylorhq (David Taylor) 11 months ago. Updated 11 months ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
[ruby-core:117227]

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.


Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #19907: Method calls with keyword arguments in eval leaks callcache and callinfo objectsClosedActions

Updated by jeremyevans0 (Jeremy Evans) 11 months ago

This has been fixed in the master branch. However, I'm not sure which commit fixed it.

Updated by byroot (Jean Boussier) 11 months ago

  • Status changed from Open to Closed

Confirmed, this is a duplicate of [Bug #19907]. I'll make that one for backport.

Actions #4

Updated by byroot (Jean Boussier) 11 months ago

  • Related to Bug #19907: Method calls with keyword arguments in eval leaks callcache and callinfo objects added
Actions

Also available in: Atom PDF

Like1
Like1Like0Like0Like0