diff --git a/lib/json/truffle_ruby/generator.rb b/lib/json/truffle_ruby/generator.rb index 09459286..01911645 100644 --- a/lib/json/truffle_ruby/generator.rb +++ b/lib/json/truffle_ruby/generator.rb @@ -413,7 +413,7 @@ def generate(obj, anIO = nil) buf << obj.to_json(self) end when Integer - buf << obj.to_s + buf << String(obj) when Symbol if @strict fast_serialize_string(obj.name, buf) @@ -652,7 +652,9 @@ def json_transform(state) module Integer # Returns a JSON string representation for this Integer number. - def to_json(*) to_s end + def to_json(*) + String(self) + end end module Float diff --git a/test/json/json_generator_test.rb b/test/json/json_generator_test.rb index 1e44117e..00960dff 100755 --- a/test/json/json_generator_test.rb +++ b/test/json/json_generator_test.rb @@ -493,25 +493,27 @@ def foo.to_h assert_equal '2', state.indent end - def test_broken_bignum # [ruby-core:38867] - pid = fork do - x = 1 << 64 - x.class.class_eval do - def to_s - end + def test_broken_bignum # [Bug #5173] + bignum = 1 << 64 + bignum_to_s = bignum.to_s + + original_to_s = bignum.class.instance_method(:to_s) + bignum.class.class_eval do + def to_s + nil end - begin - JSON::Ext::Generator::State.new.generate(x) - exit 1 - rescue TypeError - exit 0 + alias_method :to_s, :to_s + end + case RUBY_PLATFORM + when "java" + assert_equal bignum_to_s, JSON.generate(bignum) + else + assert_raise(TypeError) do + JSON.generate(bignum) end end - _, status = Process.waitpid2(pid) - assert status.success? - rescue NotImplementedError - # forking to avoid modifying core class of a parent process and - # introducing race conditions of tests are run in parallel + ensure + bignum.class.define_method(:to_s, original_to_s) if original_to_s end def test_hash_likeness_set_symbol