Project

General

Profile

Bug #10831

Variable keyword arguments shouldn't create immortal symbols

Added by marcandre (Marc-Andre Lafortune) over 5 years ago. Updated over 5 years ago.

Status:
Closed
Priority:
Normal
Target version:
-
[ruby-core:68031]

Description

Calling a method with keyword arguments will, sometimes, create immortal symbols.

The following tests should not fail:

def test_kwarg_symbol_leak_no_rest
  foo = -> (arg: 42) {}
  assert_no_immortal_symbol_created("kwarg no rest") do |name|
    assert_raise(ArgumentError) { foo.call(name.to_sym => 42) }
  end
end

def test_kwarg_symbol_leak_with_rest
  foo = -> (arg: 2, **options) {}
  assert_no_immortal_symbol_created("kwarg with rest") do |name|
    foo.call(name.to_sym => 42)
  end
end

def test_kwarg_symbol_leak_just_rest
  foo = -> (**options) {}
  assert_no_immortal_symbol_created("kwarg just rest") do |name|
    foo.call(name.to_sym => 42)
  end
end

Note: the last one succeeds (because the hash is simply cloned internally), and is there for completeness.

#1

Updated by nobu (Nobuyoshi Nakada) over 5 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

Applied in changeset r49517.


vm_core.h: fix symbols leak

  • vm_core.h (rb_call_info_kw_arg_struct): make keywords a symbols list to get rid of inadvertent creation by variable keyword arguments. [ruby-core:68031] [Bug #10831]

Updated by naruse (Yui NARUSE) over 5 years ago

  • Backport changed from 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: REQUIRED to 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: DONE

ruby_2_2 r49666 merged revision(s) 49517.

Also available in: Atom PDF