From e79e5e0b40d28d0a7eaa06dbfd6b7812bbea2d1e Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Wed, 6 May 2020 00:24:29 +0200 Subject: Generalize the explanation of the side effect of the rb_equal() optimization --- object.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'object.c') diff --git a/object.c b/object.c index 1e314e14a9..9830feff10 100644 --- a/object.c +++ b/object.c @@ -154,8 +154,10 @@ case_equal(VALUE obj1, VALUE obj2) { * identity check using using C's == (same as BasicObject#equal?). * If that check fails, it calls #== dynamically. * This optimization actually affects semantics, - * as Float::NAN == Float::NAN is false, - * but rb_equal(Float::NAN, Float::NAN) is true! + * because when #== returns false for the same object obj, + * rb_equal(obj, obj) would still return true. + * This happens for Float::NAN, where Float::NAN == Float::NAN + * is false, but rb_equal(Float::NAN, Float::NAN) is true. */ VALUE rb_equal(VALUE obj1, VALUE obj2) -- cgit v1.2.3