[ruby/json] Remove Class#json_creatable? monkey patch.

https://github.com/ruby/json/commit/1ca7efed1f
This commit is contained in:
Jean Boussier 2025-03-27 10:34:17 +01:00 committed by Hiroshi SHIBATA
parent 96ecac1e24
commit 756b75f242
Notes: git 2025-03-28 03:45:13 +00:00
3 changed files with 12 additions and 26 deletions

View File

@ -951,14 +951,3 @@ module ::Kernel
JSON.generate(object, args.first)
end
end
# Extends any Class to include _json_creatable?_ method.
class ::Class
# Returns true if this class can be used to create an instance
# from a serialised JSON string. The class has to implement a class
# method _json_create_ that expects a hash as first parameter. The hash
# should include the required data.
def json_creatable?
respond_to?(:json_create)
end
end

View File

@ -790,6 +790,15 @@ static inline VALUE json_decode_array(JSON_ParserState *state, JSON_ParserConfig
return array;
}
static bool json_obj_creatable_p(VALUE klass)
{
if (rb_respond_to(klass, i_json_creatable_p)) {
return RTEST(rb_funcall(klass, i_json_creatable_p, 0));
} else {
return rb_respond_to(klass, i_json_create);
}
}
static inline VALUE json_decode_object(JSON_ParserState *state, JSON_ParserConfig *config, long count)
{
VALUE object;
@ -818,7 +827,7 @@ static inline VALUE json_decode_object(JSON_ParserState *state, JSON_ParserConfi
}
if (!NIL_P(klassname)) {
VALUE klass = rb_funcall(mJSON, i_deep_const_get, 1, klassname);
if (RTEST(rb_funcall(klass, i_json_creatable_p, 0))) {
if (json_obj_creatable_p(klass)) {
if (config->deprecated_create_additions) {
json_deprecated(deprecated_create_additions_warning);
}
@ -837,7 +846,7 @@ static inline VALUE json_decode_object(JSON_ParserState *state, JSON_ParserConfi
static int match_i(VALUE regexp, VALUE klass, VALUE memo)
{
if (regexp == Qundef) return ST_STOP;
if (RTEST(rb_funcall(klass, i_json_creatable_p, 0)) &&
if (json_obj_creatable_p(klass) &&
RTEST(rb_funcall(regexp, i_match, 1, rb_ary_entry(memo, 0)))) {
rb_ary_push(memo, klass);
return ST_STOP;

View File

@ -44,10 +44,6 @@ class JSONAdditionTest < Test::Unit::TestCase
end
class B
def self.json_creatable?
false
end
def to_json(*args)
{
'json_class' => self.class.name,
@ -56,10 +52,6 @@ class JSONAdditionTest < Test::Unit::TestCase
end
class C
def self.json_creatable?
false
end
def to_json(*args)
{
'json_class' => 'JSONAdditionTest::Nix',
@ -69,7 +61,6 @@ class JSONAdditionTest < Test::Unit::TestCase
def test_extended_json
a = A.new(666)
assert A.json_creatable?
json = generate(a)
a_again = parse(json, :create_additions => true)
assert_kind_of a.class, a_again
@ -78,7 +69,7 @@ class JSONAdditionTest < Test::Unit::TestCase
def test_extended_json_default
a = A.new(666)
assert A.json_creatable?
assert A.respond_to?(:json_create)
json = generate(a)
a_hash = parse(json)
assert_kind_of Hash, a_hash
@ -86,7 +77,6 @@ class JSONAdditionTest < Test::Unit::TestCase
def test_extended_json_disabled
a = A.new(666)
assert A.json_creatable?
json = generate(a)
a_again = parse(json, :create_additions => true)
assert_kind_of a.class, a_again
@ -101,14 +91,12 @@ class JSONAdditionTest < Test::Unit::TestCase
def test_extended_json_fail1
b = B.new
assert !B.json_creatable?
json = generate(b)
assert_equal({ "json_class"=>"JSONAdditionTest::B" }, parse(json))
end
def test_extended_json_fail2
c = C.new
assert !C.json_creatable?
json = generate(c)
assert_raise(ArgumentError, NameError) { parse(json, :create_additions => true) }
end