Project

General

Profile

Actions

Bug #20348

closed

Memory leak with method kwargs in ERB template

Added by davidtaylorhq (David Taylor) 8 months ago. Updated 8 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
Actions

Also available in: Atom PDF

Like1
Like1Like0Like0Like0