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 <mira@lottiefiles.com>
This commit is contained in:
Hermet Park 2025-05-07 13:46:31 +09:00
parent 00f6600499
commit a21ecdc1ae
2 changed files with 41 additions and 50 deletions

View file

@ -45,13 +45,6 @@
#include "tvgLottieParserHandler.h" #include "tvgLottieParserHandler.h"
/************************************************************************/
/* Internal Class Implementation */
/************************************************************************/
static const int PARSE_FLAGS = kParseDefaultFlags | kParseInsituFlag;
/************************************************************************/ /************************************************************************/
/* External Class Implementation */ /* External Class Implementation */
/************************************************************************/ /************************************************************************/
@ -59,12 +52,12 @@ static const int PARSE_FLAGS = kParseDefaultFlags | kParseInsituFlag;
bool LookaheadParserHandler::enterArray() bool LookaheadParserHandler::enterArray()
{ {
if (state != kEnteringArray) { if (state == kEnteringArray) {
Error(); parseNext();
return false; return true;
} }
parseNext(); Error();
return true; return false;
} }
@ -86,37 +79,37 @@ bool LookaheadParserHandler::nextArrayValue()
int LookaheadParserHandler::getInt() int LookaheadParserHandler::getInt()
{ {
if (state != kHasNumber) { if (state == kHasNumber) {
Error(); auto result = val.GetInt();
return 0; parseNext();
return result;
} }
auto result = val.GetInt(); Error();
parseNext(); return 0;
return result;
} }
float LookaheadParserHandler::getFloat() float LookaheadParserHandler::getFloat()
{ {
if (state != kHasNumber) { if (state == kHasNumber) {
Error(); auto result = val.GetFloat();
return 0; parseNext();
return result;
} }
auto result = val.GetFloat(); Error();
parseNext(); return 0;
return result;
} }
const char* LookaheadParserHandler::getString() const char* LookaheadParserHandler::getString()
{ {
if (state != kHasString) { if (state == kHasString) {
Error(); auto result = val.GetString();
return nullptr; parseNext();
return result;
} }
auto result = val.GetString(); Error();
parseNext(); return nullptr;
return result;
} }
@ -130,33 +123,29 @@ char* LookaheadParserHandler::getStringCopy()
bool LookaheadParserHandler::getBool() bool LookaheadParserHandler::getBool()
{ {
if (state != kHasBool) { if (state == kHasBool) {
Error(); auto result = val.GetBool();
return false; parseNext();
return result;
} }
auto result = val.GetBool(); Error();
parseNext(); return false;
return result;
} }
void LookaheadParserHandler::getNull() void LookaheadParserHandler::getNull()
{ {
if (state != kHasNull) { if (state == kHasNull) {
Error(); parseNext();
return; return;
} }
parseNext(); Error();
} }
bool LookaheadParserHandler::parseNext() bool LookaheadParserHandler::parseNext()
{ {
if (reader.HasParseError()) { if (reader.HasParseError() || !reader.IterativeParseNext<PARSE_FLAGS>(iss, *this)) {
Error();
return false;
}
if (!reader.IterativeParseNext<PARSE_FLAGS>(iss, *this)) {
Error(); Error();
return false; return false;
} }
@ -166,12 +155,12 @@ bool LookaheadParserHandler::parseNext()
bool LookaheadParserHandler::enterObject() bool LookaheadParserHandler::enterObject()
{ {
if (state != kEnteringObject) { if (state == kEnteringObject) {
Error(); parseNext();
return false; return true;
} }
parseNext(); Error();
return true; return false;
} }

View file

@ -51,6 +51,7 @@
using namespace rapidjson; using namespace rapidjson;
#define PARSE_FLAGS (kParseDefaultFlags | kParseInsituFlag)
struct LookaheadParserHandler struct LookaheadParserHandler
{ {
@ -172,8 +173,9 @@ struct LookaheadParserHandler
void Error() void Error()
{ {
TVGERR("LOTTIE", "Parsing Error!"); TVGERR("LOTTIE", "Invalid JSON: unexpected or misaligned data fields.");
state = kError; state = kError;
reader.IterativeParseNext<PARSE_FLAGS>(iss, *this); //something wrong but try advancement.
} }
bool Invalid() bool Invalid()