Skip to content

Commit 5bcae57

Browse files
committed
* vm_insnhelper.c (vm_defined): skip respond_to_missing? when
a method is available. [Bug ruby#11211] * test/ruby/test_defined.rb: add a test for this fix. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50737 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 15164bf commit 5bcae57

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

ChangeLog

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
Wed Jun 3 04:34:39 2015 Koichi Sasada <[email protected]>
2+
3+
* vm_insnhelper.c (vm_defined): skip respond_to_missing? when
4+
a method is available.
5+
[Bug #11211]
6+
7+
* test/ruby/test_defined.rb: add a test for this fix.
8+
19
Wed Jun 3 04:14:13 2015 Koichi Sasada <[email protected]>
210

311
* insns.def (defined), vm_insnhelper.c (vm_defined):

test/ruby/test_defined.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,4 +208,29 @@ def x; b {return defined?(super)}; end
208208
def test_super_toplevel
209209
assert_separately([], "assert_nil(defined?(super))")
210210
end
211+
212+
class ExampleRespondToMissing
213+
attr_reader :called
214+
215+
def initialize
216+
@called = false
217+
end
218+
219+
def respond_to_missing? *args
220+
@called = true
221+
false
222+
end
223+
224+
def existing_method
225+
end
226+
end
227+
228+
def test_method_by_respond_to_missing
229+
bug_11211 = '[Bug #11211]'
230+
obj = ExampleRespondToMissing.new
231+
assert_equal("method", defined?(obj.existing_method), bug_11211)
232+
assert_equal(false, obj.called, bug_11211)
233+
assert_equal(nil, defined?(obj.non_existing_method), bug_11211)
234+
assert_equal(true, obj.called, bug_11211)
235+
end
211236
end

vm_insnhelper.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2456,15 +2456,12 @@ vm_defined(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_num_t op_type, VALUE
24562456

24572457
if (me) {
24582458
const rb_method_definition_t *def = me->def;
2459-
if (!(def->flag & NOEX_PRIVATE)) {
2460-
if (!((def->flag & NOEX_PROTECTED) &&
2461-
!rb_obj_is_kind_of(GET_SELF(),
2462-
rb_class_real(klass)))) {
2463-
expr_type = DEFINED_METHOD;
2464-
}
2459+
if (!(def->flag & NOEX_PRIVATE) &&
2460+
!((def->flag & NOEX_PROTECTED) && !rb_obj_is_kind_of(GET_SELF(), rb_class_real(klass)))) {
2461+
expr_type = DEFINED_METHOD;
24652462
}
24662463
}
2467-
{
2464+
else {
24682465
VALUE args[2];
24692466
VALUE r;
24702467

0 commit comments

Comments
 (0)