increase and decrease depth properly on subhandlers
the original implementation couldn't parse a document with more than depth_limit entries. now we explicitly increase *and* decrease the depth on specific handlers like maps, sequences and so on - any handler that may in turn callback into HandleNode(). this is a little clunky - I would have prefered to increment and decrement the counter in only one place, but there are many different return points and this is not Golang so I can't think of a better way to to this.
This commit is contained in:
parent
ac00ef9377
commit
e78e3bf6a6
@ -49,7 +49,6 @@ void SingleDocParser::HandleNode(EventHandler& eventHandler) {
|
|||||||
if (depth > depth_limit) {
|
if (depth > depth_limit) {
|
||||||
throw ParserException(m_scanner.mark(), ErrorMsg::BAD_FILE);
|
throw ParserException(m_scanner.mark(), ErrorMsg::BAD_FILE);
|
||||||
}
|
}
|
||||||
depth++;
|
|
||||||
// an empty node *is* a possibility
|
// an empty node *is* a possibility
|
||||||
if (m_scanner.empty()) {
|
if (m_scanner.empty()) {
|
||||||
eventHandler.OnNull(m_scanner.mark(), NullAnchor);
|
eventHandler.OnNull(m_scanner.mark(), NullAnchor);
|
||||||
@ -61,9 +60,11 @@ void SingleDocParser::HandleNode(EventHandler& eventHandler) {
|
|||||||
|
|
||||||
// special case: a value node by itself must be a map, with no header
|
// special case: a value node by itself must be a map, with no header
|
||||||
if (m_scanner.peek().type == Token::VALUE) {
|
if (m_scanner.peek().type == Token::VALUE) {
|
||||||
|
depth++;
|
||||||
eventHandler.OnMapStart(mark, "?", NullAnchor, EmitterStyle::Default);
|
eventHandler.OnMapStart(mark, "?", NullAnchor, EmitterStyle::Default);
|
||||||
HandleMap(eventHandler);
|
HandleMap(eventHandler);
|
||||||
eventHandler.OnMapEnd();
|
eventHandler.OnMapEnd();
|
||||||
|
depth--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,32 +99,42 @@ void SingleDocParser::HandleNode(EventHandler& eventHandler) {
|
|||||||
m_scanner.pop();
|
m_scanner.pop();
|
||||||
return;
|
return;
|
||||||
case Token::FLOW_SEQ_START:
|
case Token::FLOW_SEQ_START:
|
||||||
|
depth++;
|
||||||
eventHandler.OnSequenceStart(mark, tag, anchor, EmitterStyle::Flow);
|
eventHandler.OnSequenceStart(mark, tag, anchor, EmitterStyle::Flow);
|
||||||
HandleSequence(eventHandler);
|
HandleSequence(eventHandler);
|
||||||
eventHandler.OnSequenceEnd();
|
eventHandler.OnSequenceEnd();
|
||||||
|
depth--;
|
||||||
return;
|
return;
|
||||||
case Token::BLOCK_SEQ_START:
|
case Token::BLOCK_SEQ_START:
|
||||||
|
depth++;
|
||||||
eventHandler.OnSequenceStart(mark, tag, anchor, EmitterStyle::Block);
|
eventHandler.OnSequenceStart(mark, tag, anchor, EmitterStyle::Block);
|
||||||
HandleSequence(eventHandler);
|
HandleSequence(eventHandler);
|
||||||
eventHandler.OnSequenceEnd();
|
eventHandler.OnSequenceEnd();
|
||||||
|
depth--;
|
||||||
return;
|
return;
|
||||||
case Token::FLOW_MAP_START:
|
case Token::FLOW_MAP_START:
|
||||||
|
depth++;
|
||||||
eventHandler.OnMapStart(mark, tag, anchor, EmitterStyle::Flow);
|
eventHandler.OnMapStart(mark, tag, anchor, EmitterStyle::Flow);
|
||||||
HandleMap(eventHandler);
|
HandleMap(eventHandler);
|
||||||
eventHandler.OnMapEnd();
|
eventHandler.OnMapEnd();
|
||||||
|
depth--;
|
||||||
return;
|
return;
|
||||||
case Token::BLOCK_MAP_START:
|
case Token::BLOCK_MAP_START:
|
||||||
|
depth++;
|
||||||
eventHandler.OnMapStart(mark, tag, anchor, EmitterStyle::Block);
|
eventHandler.OnMapStart(mark, tag, anchor, EmitterStyle::Block);
|
||||||
HandleMap(eventHandler);
|
HandleMap(eventHandler);
|
||||||
eventHandler.OnMapEnd();
|
eventHandler.OnMapEnd();
|
||||||
|
depth--;
|
||||||
return;
|
return;
|
||||||
case Token::KEY:
|
case Token::KEY:
|
||||||
// compact maps can only go in a flow sequence
|
// compact maps can only go in a flow sequence
|
||||||
if (m_pCollectionStack->GetCurCollectionType() ==
|
if (m_pCollectionStack->GetCurCollectionType() ==
|
||||||
CollectionType::FlowSeq) {
|
CollectionType::FlowSeq) {
|
||||||
|
depth++;
|
||||||
eventHandler.OnMapStart(mark, tag, anchor, EmitterStyle::Flow);
|
eventHandler.OnMapStart(mark, tag, anchor, EmitterStyle::Flow);
|
||||||
HandleMap(eventHandler);
|
HandleMap(eventHandler);
|
||||||
eventHandler.OnMapEnd();
|
eventHandler.OnMapEnd();
|
||||||
|
depth--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user