From 89ad4c879dfb7758c1cb9760133d316eb8594937 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Fri, 19 Jun 2026 00:15:19 +0900 Subject: [PATCH] Reset all per-parse state in JSON::ResumableParser#clear Co-Authored-By: Claude Opus 4.8 (1M context) --- ext/json/ext/parser/parser.c | 3 +++ test/json/resumable_parser_test.rb | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/ext/json/ext/parser/parser.c b/ext/json/ext/parser/parser.c index 9762fb81..48700911 100644 --- a/ext/json/ext/parser/parser.c +++ b/ext/json/ext/parser/parser.c @@ -2487,6 +2487,9 @@ static VALUE cResumableParser_clear(VALUE self) parser->frames.head = 0; parser->value_stack.head = 0; parser->state.name_cache.length = 0; + parser->state.current_nesting = 0; + parser->state.in_array = 1; + parser->state.emitted_deprecations = 0; parser->state.start = parser->state.cursor = parser->state.end = NULL; return self; } diff --git a/test/json/resumable_parser_test.rb b/test/json/resumable_parser_test.rb index b48b9e05..2801544c 100644 --- a/test/json/resumable_parser_test.rb +++ b/test/json/resumable_parser_test.rb @@ -63,6 +63,20 @@ def test_parse_with_empty_buffer_keeps_parser_usable assert_equal [4], @parser.value end + def test_clear_resets_nesting_depth + # An unfinished document leaks a nesting level; #clear must reset it so a later shallow + # document is not rejected with a spurious NestingError. + parser = new_parser(max_nesting: 10) + 10.times do + parser << '[1' # opens an array that is never closed before clear + parser.parse + parser.clear + end + parser << '[1]' + assert parser.parse + assert_equal [1], parser.value + end + def test_parse_document_direct @parser << '[true]' assert_equal true, @parser.parse