From 57adfbd499aee4aed4d5aee7f6333d90084eb37b Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 7 May 2025 13:46:31 +0900 Subject: [PATCH] lottie/parser: revise logic to handle exceptional cases more gracefully - prioritize valid (positive) cases first - continue parsing even when encountering parsing errors Co-Authored-By: Mira Grudzinska --- src/loaders/lottie/tvgLottieParserHandler.cpp | 87 ++++++++----------- src/loaders/lottie/tvgLottieParserHandler.h | 4 +- 2 files changed, 41 insertions(+), 50 deletions(-) diff --git a/src/loaders/lottie/tvgLottieParserHandler.cpp b/src/loaders/lottie/tvgLottieParserHandler.cpp index 0df2daab..6b1a5b9f 100644 --- a/src/loaders/lottie/tvgLottieParserHandler.cpp +++ b/src/loaders/lottie/tvgLottieParserHandler.cpp @@ -46,13 +46,6 @@ #include "tvgLottieParserHandler.h" -/************************************************************************/ -/* Internal Class Implementation */ -/************************************************************************/ - -static const int PARSE_FLAGS = kParseDefaultFlags | kParseInsituFlag; - - /************************************************************************/ /* External Class Implementation */ /************************************************************************/ @@ -60,12 +53,12 @@ static const int PARSE_FLAGS = kParseDefaultFlags | kParseInsituFlag; bool LookaheadParserHandler::enterArray() { - if (state != kEnteringArray) { - Error(); - return false; + if (state == kEnteringArray) { + parseNext(); + return true; } - parseNext(); - return true; + Error(); + return false; } @@ -87,37 +80,37 @@ bool LookaheadParserHandler::nextArrayValue() int LookaheadParserHandler::getInt() { - if (state != kHasNumber) { - Error(); - return 0; + if (state == kHasNumber) { + auto result = val.GetInt(); + parseNext(); + return result; } - auto result = val.GetInt(); - parseNext(); - return result; + Error(); + return 0; } float LookaheadParserHandler::getFloat() { - if (state != kHasNumber) { - Error(); - return 0; + if (state == kHasNumber) { + auto result = val.GetFloat(); + parseNext(); + return result; } - auto result = val.GetFloat(); - parseNext(); - return result; + Error(); + return 0; } const char* LookaheadParserHandler::getString() { - if (state != kHasString) { - Error(); - return nullptr; + if (state == kHasString) { + auto result = val.GetString(); + parseNext(); + return result; } - auto result = val.GetString(); - parseNext(); - return result; + Error(); + return nullptr; } @@ -131,33 +124,29 @@ char* LookaheadParserHandler::getStringCopy() bool LookaheadParserHandler::getBool() { - if (state != kHasBool) { - Error(); - return false; + if (state == kHasBool) { + auto result = val.GetBool(); + parseNext(); + return result; } - auto result = val.GetBool(); - parseNext(); - return result; + Error(); + return false; } void LookaheadParserHandler::getNull() { - if (state != kHasNull) { - Error(); + if (state == kHasNull) { + parseNext(); return; } - parseNext(); + Error(); } bool LookaheadParserHandler::parseNext() { - if (reader.HasParseError()) { - Error(); - return false; - } - if (!reader.IterativeParseNext(iss, *this)) { + if (reader.HasParseError() || !reader.IterativeParseNext(iss, *this)) { Error(); return false; } @@ -167,12 +156,12 @@ bool LookaheadParserHandler::parseNext() bool LookaheadParserHandler::enterObject() { - if (state != kEnteringObject) { - Error(); - return false; + if (state == kEnteringObject) { + parseNext(); + return true; } - parseNext(); - return true; + Error(); + return false; } diff --git a/src/loaders/lottie/tvgLottieParserHandler.h b/src/loaders/lottie/tvgLottieParserHandler.h index 6c595022..507b830e 100644 --- a/src/loaders/lottie/tvgLottieParserHandler.h +++ b/src/loaders/lottie/tvgLottieParserHandler.h @@ -51,6 +51,7 @@ using namespace rapidjson; +#define PARSE_FLAGS (kParseDefaultFlags | kParseInsituFlag) struct LookaheadParserHandler { @@ -172,8 +173,9 @@ struct LookaheadParserHandler void Error() { - TVGERR("LOTTIE", "Parsing Error!"); + TVGERR("LOTTIE", "Invalid JSON: unexpected or misaligned data fields."); state = kError; + reader.IterativeParseNext(iss, *this); //something wrong but try advancement. } bool Invalid()