rb_respond_to() return value is incorrect
As of Ruby 2.3.0 rb_respond_to incorrectly reports non-zero for methods that are not supported. This occurs with subclasses of BasicObject. This occurs with Oj when but should occur with other C code. A simple sample that demonstrates the failure in below. It works fine on all versions of Ruby until 2.3.0.
require 'oj' class A < BasicObject def initialize(data) @data = data end end a = A.new("xyz") json = Oj.dump(a, mode: :compat, use_to_json: true) #=> NoMethodError: undefined method `to_hash' for #<A:0x007fae03de1dc8>
In the C code the rb_respond_to() function is called to determine if an instance of A responds to "to_hash". 1 is returned in Ruby 2.3.x while previous versions correctly returned 0.
Updated by eugene (Eugene Pimenov) over 3 years ago
- ruby -v changed from 2.3.0, 2.3.1 to 2.3.0-3
We did hit this bug on our system and did a deep dive in it yesterday.
The code to reproduce the issue is:
It always returns
TRUE) in ruby 2.3.x. It's caused by [the following line]. Because
respond_to method doesn't exist in
BasicObject. The correct code was reverted in [r55869 ] because it breaks
As far as I can tell the issue is fixed in trunk and 2.4.x betas.