summaryrefslogtreecommitdiff
path: root/ext/json/parser
diff options
context:
space:
mode:
authorJean Boussier <[email protected]>2025-03-27 10:34:17 +0100
committerHiroshi SHIBATA <[email protected]>2025-03-28 12:44:53 +0900
commit756b75f2421008a46ee68390c683ca2c1a0ddc31 (patch)
treebabcd374b16cae7ab40c11be176e32661a693b5d /ext/json/parser
parent96ecac1e245aaac4484f69a731d2af4328760a8e (diff)
[ruby/json] Remove `Class#json_creatable?` monkey patch.
https://github.com/ruby/json/commit/1ca7efed1f
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/13004
Diffstat (limited to 'ext/json/parser')
-rw-r--r--ext/json/parser/parser.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c
index d990612a2b..d2d0d38d84 100644
--- a/ext/json/parser/parser.c
+++ b/ext/json/parser/parser.c
@@ -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;