Skip to content

Commit f1dda5e

Browse files
committed
Warn when redefining __id__ as well as object_id
[Feature #20912]
1 parent a505cd3 commit f1dda5e

File tree

5 files changed

+11
-8
lines changed

5 files changed

+11
-8
lines changed

defs/id.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ firstline, predefined = __LINE__+1, %[\
88
inspect
99
intern
1010
object_id
11+
__id__
1112
const_added
1213
const_missing
1314
method_missing MethodMissing

spec/ruby/core/basicobject/equal_spec.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
it "is unaffected by overriding __id__" do
1212
o1 = mock("object")
1313
o2 = mock("object")
14-
def o1.__id__; 10; end
15-
def o2.__id__; 10; end
14+
suppress_warning {
15+
def o1.__id__; 10; end
16+
def o2.__id__; 10; end
17+
}
1618
o1.equal?(o2).should be_false
1719
end
1820

test/ruby/test_module.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1488,7 +1488,7 @@ def test_undef
14881488
class << o; self; end.instance_eval { undef_method(:foo) }
14891489
end
14901490

1491-
%w(object_id __send__ initialize).each do |n|
1491+
%w(object_id __id__ __send__ initialize).each do |n|
14921492
assert_in_out_err([], <<-INPUT, [], %r"warning: undefining '#{n}' may cause serious problems$")
14931493
$VERBOSE = false
14941494
Class.new.instance_eval { undef_method(:#{n}) }

test/ruby/test_object.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ def o.foo; 2; end
480480
end
481481

482482
def test_redefine_method_which_may_case_serious_problem
483-
%w(object_id __send__).each do |m|
483+
%w(object_id __id__ __send__).each do |m|
484484
assert_in_out_err([], <<-INPUT, [], %r"warning: redefining '#{m}' may cause serious problems$")
485485
$VERBOSE = false
486486
def (Object.new).#{m}; end
@@ -542,7 +542,7 @@ def meth1; "meth" end
542542
bug2202 = '[ruby-core:26074]'
543543
assert_raise(NoMethodError, bug2202) {o2.meth2}
544544

545-
%w(object_id __send__ initialize).each do |m|
545+
%w(object_id __id__ __send__ initialize).each do |m|
546546
assert_in_out_err([], <<-INPUT, %w(:ok), %r"warning: removing '#{m}' may cause serious problems$")
547547
$VERBOSE = false
548548
begin

vm_method.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,7 +1072,7 @@ rb_method_entry_make(VALUE klass, ID mid, VALUE defined_class, rb_method_visibil
10721072
}
10731073
}
10741074
/* check mid */
1075-
if (mid == object_id || mid == id__send__) {
1075+
if (mid == object_id || mid == id__id__ || mid == id__send__) {
10761076
if (type != VM_METHOD_TYPE_CFUNC && search_method(klass, mid, 0)) {
10771077
rb_warn("redefining '%s' may cause serious problems", rb_id2name(mid));
10781078
}
@@ -1681,7 +1681,7 @@ remove_method(VALUE klass, ID mid)
16811681

16821682
rb_class_modify_check(klass);
16831683
klass = RCLASS_ORIGIN(klass);
1684-
if (mid == object_id || mid == id__send__ || mid == idInitialize) {
1684+
if (mid == object_id || mid == id__id__ || mid == id__send__ || mid == idInitialize) {
16851685
rb_warn("removing '%s' may cause serious problems", rb_id2name(mid));
16861686
}
16871687

@@ -1911,7 +1911,7 @@ rb_undef(VALUE klass, ID id)
19111911
rb_raise(rb_eTypeError, "no class to undef method");
19121912
}
19131913
rb_class_modify_check(klass);
1914-
if (id == object_id || id == id__send__ || id == idInitialize) {
1914+
if (id == object_id || id == id__id__ || id == id__send__ || id == idInitialize) {
19151915
rb_warn("undefining '%s' may cause serious problems", rb_id2name(id));
19161916
}
19171917

0 commit comments

Comments
 (0)