summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/json/json.h8
-rw-r--r--ext/json/parser/parser.c22
2 files changed, 19 insertions, 11 deletions
diff --git a/ext/json/json.h b/ext/json/json.h
index cf9420d4dd..78b0eee0a4 100644
--- a/ext/json/json.h
+++ b/ext/json/json.h
@@ -11,6 +11,9 @@
#if defined(RUBY_DEBUG) && RUBY_DEBUG
# define JSON_ASSERT RUBY_ASSERT
+# ifndef JSON_DEBUG
+# define JSON_DEBUG 1
+# endif
#else
# ifdef JSON_DEBUG
# include <assert.h>
@@ -20,6 +23,11 @@
# endif
#endif
+#ifdef JSON_DEBUG
+# define JSON_UNREACHABLE_RETURN(val) rb_bug("Unreachable")
+#else
+# define JSON_UNREACHABLE_RETURN UNREACHABLE_RETURN
+#endif
/* shims */
#if SIZEOF_UINT64_T == SIZEOF_LONG_LONG
diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c
index c0631728c3..6b8164c062 100644
--- a/ext/json/parser/parser.c
+++ b/ext/json/parser/parser.c
@@ -488,7 +488,7 @@ static const rb_data_type_t JSON_Parser_frame_stack_type = {
.dfree = json_frame_stack_free,
.dsize = json_frame_stack_memsize,
},
- .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_EMBEDDABLE,
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE,
};
static json_frame_stack *json_frame_stack_spill(json_frame_stack *old_stack, VALUE *handle, json_frame_stack **stack_ref)
@@ -1489,7 +1489,7 @@ static VALUE json_parse_any(JSON_ParserState *state, JSON_ParserConfig *config)
case JSON_PHASE_OBJECT_KEY: goto JSON_PHASE_OBJECT_KEY;
case JSON_PHASE_OBJECT_COLON: goto JSON_PHASE_OBJECT_COLON;
}
- UNREACHABLE_RETURN(Qundef);
+ JSON_UNREACHABLE_RETURN(Qundef);
JSON_PHASE_DONE: {
// The root document value is parsed; it is the lone survivor on
@@ -1623,10 +1623,10 @@ static VALUE json_parse_any(JSON_ParserState *state, JSON_ParserConfig *config)
case JSON_PHASE_ARRAY_COMMA: goto JSON_PHASE_ARRAY_COMMA;
case JSON_PHASE_OBJECT_COMMA: goto JSON_PHASE_OBJECT_COMMA;
case JSON_PHASE_VALUE: goto JSON_PHASE_VALUE;
- case JSON_PHASE_OBJECT_KEY: UNREACHABLE_RETURN(Qundef);
+ case JSON_PHASE_OBJECT_KEY: JSON_UNREACHABLE_RETURN(Qundef);
case JSON_PHASE_OBJECT_COLON: goto JSON_PHASE_OBJECT_COLON;
}
- UNREACHABLE_RETURN(Qundef);
+ JSON_UNREACHABLE_RETURN(Qundef);
}
JSON_PHASE_OBJECT_KEY: {
@@ -1648,7 +1648,7 @@ static VALUE json_parse_any(JSON_ParserState *state, JSON_ParserConfig *config)
raise_parse_error("expected object key, got: %s", state);
}
}
- UNREACHABLE_RETURN(Qundef);
+ JSON_UNREACHABLE_RETURN(Qundef);
}
JSON_PHASE_OBJECT_COLON: {
@@ -1669,7 +1669,7 @@ static VALUE json_parse_any(JSON_ParserState *state, JSON_ParserConfig *config)
raise_parse_error("expected ':' after object key, got: %s", state);
}
}
- UNREACHABLE_RETURN(Qundef);
+ JSON_UNREACHABLE_RETURN(Qundef);
}
JSON_PHASE_ARRAY_COMMA: {
@@ -1705,13 +1705,13 @@ static VALUE json_parse_any(JSON_ParserState *state, JSON_ParserConfig *config)
case JSON_PHASE_ARRAY_COMMA: goto JSON_PHASE_ARRAY_COMMA;
case JSON_PHASE_OBJECT_COMMA: goto JSON_PHASE_OBJECT_COMMA;
case JSON_PHASE_VALUE: goto JSON_PHASE_VALUE;
- case JSON_PHASE_OBJECT_KEY: UNREACHABLE_RETURN(Qundef);
+ case JSON_PHASE_OBJECT_KEY: JSON_UNREACHABLE_RETURN(Qundef);
case JSON_PHASE_OBJECT_COLON: goto JSON_PHASE_OBJECT_COLON;
}
} else {
raise_parse_error("expected ',' or ']' after array value", state);
}
- UNREACHABLE_RETURN(Qundef);
+ JSON_UNREACHABLE_RETURN(Qundef);
}
JSON_PHASE_OBJECT_COMMA: {
@@ -1754,16 +1754,16 @@ static VALUE json_parse_any(JSON_ParserState *state, JSON_ParserConfig *config)
case JSON_PHASE_ARRAY_COMMA: goto JSON_PHASE_ARRAY_COMMA;
case JSON_PHASE_OBJECT_COMMA: goto JSON_PHASE_OBJECT_COMMA;
case JSON_PHASE_VALUE: goto JSON_PHASE_VALUE;
- case JSON_PHASE_OBJECT_KEY: UNREACHABLE_RETURN(Qundef);
+ case JSON_PHASE_OBJECT_KEY: JSON_UNREACHABLE_RETURN(Qundef);
case JSON_PHASE_OBJECT_COLON: goto JSON_PHASE_OBJECT_COLON;
}
} else {
raise_parse_error("expected ',' or '}' after object value, got: %s", state);
}
- UNREACHABLE_RETURN(Qundef);
+ JSON_UNREACHABLE_RETURN(Qundef);
}
- UNREACHABLE_RETURN(Qundef);
+ JSON_UNREACHABLE_RETURN(Qundef);
}
static void json_ensure_eof(JSON_ParserState *state)