Skip to content

Commit 04494d9

Browse files
committed
Binding#local_variable_defined? must not handle numbered parameters
[Bug #21776]
1 parent be43ad3 commit 04494d9

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

proc.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,9 @@ bind_local_variable_defined_p(VALUE bindval, VALUE sym)
640640
const rb_env_t *env;
641641

642642
if (!lid) return Qfalse;
643+
if (rb_numparam_id_p(lid)) {
644+
return Qfalse;
645+
}
643646

644647
GetBindingPtr(bindval, bind);
645648
env = VM_ENV_ENVVAL_PTR(vm_block_ep(&bind->block));

test/ruby/test_proc.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1659,29 +1659,35 @@ def test_numparam_is_not_local_variables
16591659
assert_equal([], binding.local_variables)
16601660
assert_raise(NameError) { binding.local_variable_get(:_9) }
16611661
assert_raise(NameError) { binding.local_variable_set(:_9, 1) }
1662+
assert_equal(false, binding.local_variable_defined?(:_9))
16621663
"bar".tap do
16631664
assert_equal([], binding.local_variables)
16641665
assert_raise(NameError) { binding.local_variable_get(:_9) }
16651666
assert_raise(NameError) { binding.local_variable_set(:_9, 1) }
1667+
assert_equal(false, binding.local_variable_defined?(:_9))
16661668
end
16671669
assert_equal([], binding.local_variables)
16681670
assert_raise(NameError) { binding.local_variable_get(:_9) }
16691671
assert_raise(NameError) { binding.local_variable_set(:_9, 1) }
1672+
assert_equal(false, binding.local_variable_defined?(:_9))
16701673
end
16711674

16721675
"foo".tap do
16731676
assert_equal([], binding.local_variables)
16741677
assert_raise(NameError) { binding.local_variable_get(:_9) }
16751678
assert_raise(NameError) { binding.local_variable_set(:_9, 1) }
1679+
assert_equal(false, binding.local_variable_defined?(:_9))
16761680
"bar".tap do
16771681
_9 and flunk
16781682
assert_equal([], binding.local_variables)
16791683
assert_raise(NameError) { binding.local_variable_get(:_9) }
16801684
assert_raise(NameError) { binding.local_variable_set(:_9, 1) }
1685+
assert_equal(false, binding.local_variable_defined?(:_9))
16811686
end
16821687
assert_equal([], binding.local_variables)
16831688
assert_raise(NameError) { binding.local_variable_get(:_9) }
16841689
assert_raise(NameError) { binding.local_variable_set(:_9, 1) }
1690+
assert_equal(false, binding.local_variable_defined?(:_9))
16851691
end
16861692
end
16871693

@@ -1690,31 +1696,39 @@ def test_it_is_not_local_variable
16901696
it
16911697
assert_equal([], binding.local_variables)
16921698
assert_raise(NameError) { binding.local_variable_get(:it) }
1699+
assert_equal(false, binding.local_variable_defined?(:it))
16931700
"bar".tap do
16941701
assert_equal([], binding.local_variables)
16951702
assert_raise(NameError) { binding.local_variable_get(:it) }
1703+
assert_equal(false, binding.local_variable_defined?(:it))
16961704
end
16971705
assert_equal([], binding.local_variables)
16981706
assert_raise(NameError) { binding.local_variable_get(:it) }
1707+
assert_equal(false, binding.local_variable_defined?(:it))
16991708
"bar".tap do
17001709
it
17011710
assert_equal([], binding.local_variables)
17021711
assert_raise(NameError) { binding.local_variable_get(:it) }
1712+
assert_equal(false, binding.local_variable_defined?(:it))
17031713
end
17041714
assert_equal([], binding.local_variables)
17051715
assert_raise(NameError) { binding.local_variable_get(:it) }
1716+
assert_equal(false, binding.local_variable_defined?(:it))
17061717
end
17071718

17081719
"foo".tap do
17091720
assert_equal([], binding.local_variables)
17101721
assert_raise(NameError) { binding.local_variable_get(:it) }
1722+
assert_equal(false, binding.local_variable_defined?(:it))
17111723
"bar".tap do
17121724
it
17131725
assert_equal([], binding.local_variables)
17141726
assert_raise(NameError) { binding.local_variable_get(:it) }
1727+
assert_equal(false, binding.local_variable_defined?(:it))
17151728
end
17161729
assert_equal([], binding.local_variables)
17171730
assert_raise(NameError) { binding.local_variable_get(:it) }
1731+
assert_equal(false, binding.local_variable_defined?(:it))
17181732
end
17191733
end
17201734

0 commit comments

Comments
 (0)