Skip to content

Commit 56d16de

Browse files
mameclaude
authored andcommitted
Reset all per-parse state in JSON::ResumableParser#clear
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent d91b370 commit 56d16de

2 files changed

Lines changed: 17 additions & 0 deletions

File tree

ext/json/ext/parser/parser.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2487,6 +2487,9 @@ static VALUE cResumableParser_clear(VALUE self)
24872487
parser->frames.head = 0;
24882488
parser->value_stack.head = 0;
24892489
parser->state.name_cache.length = 0;
2490+
parser->state.current_nesting = 0;
2491+
parser->state.in_array = 1;
2492+
parser->state.emitted_deprecations = 0;
24902493
parser->state.start = parser->state.cursor = parser->state.end = NULL;
24912494
return self;
24922495
}

test/json/resumable_parser_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,20 @@ def test_parse_with_empty_buffer_keeps_parser_usable
6363
assert_equal [4], @parser.value
6464
end
6565

66+
def test_clear_resets_nesting_depth
67+
# An unfinished document leaks a nesting level; #clear must reset it so a later shallow
68+
# document is not rejected with a spurious NestingError.
69+
parser = new_parser(max_nesting: 10)
70+
10.times do
71+
parser << '[1' # opens an array that is never closed before clear
72+
parser.parse
73+
parser.clear
74+
end
75+
parser << '[1]'
76+
assert parser.parse
77+
assert_equal [1], parser.value
78+
end
79+
6680
def test_parse_document_direct
6781
@parser << '[true]'
6882
assert_equal true, @parser.parse

0 commit comments

Comments
 (0)