lottie/expressions: enhance stability

When the system fails to interpret the expression code,
it forcibly disables the feature per property.

This improvement enhances stability and performance
by avoiding reckless attempts to interpret JavaScript code.

When we confirm the full stability with expressions,
we can revert this code.
This commit is contained in:
Hermet Park 2024-05-04 15:19:26 +09:00 committed by Hermet Park
parent 7bb8d60097
commit 25c0f32e8a
3 changed files with 11 additions and 5 deletions

View file

@ -1219,7 +1219,10 @@ jerry_value_t LottieExpressions::evaluate(float frameNo, LottieExpression* exp)
//evaluate the code //evaluate the code
auto eval = jerry_eval((jerry_char_t *) exp->code, strlen(exp->code), JERRY_PARSE_NO_OPTS); auto eval = jerry_eval((jerry_char_t *) exp->code, strlen(exp->code), JERRY_PARSE_NO_OPTS);
if (jerry_value_is_exception(eval)) return jerry_undefined(); if (jerry_value_is_exception(eval)) {
exp->enabled = false; // The feature is experimental, it will be forcely turned off if it's incompatible.
return jerry_undefined();
}
jerry_value_free(eval); jerry_value_free(eval);

View file

@ -45,6 +45,7 @@ static LottieExpression* _expression(char* code, LottieComposition* comp, Lottie
inst->object = object; inst->object = object;
inst->property = property; inst->property = property;
inst->type = type; inst->type = type;
inst->enabled = true;
return inst; return inst;
} }

View file

@ -194,6 +194,8 @@ struct LottieExpression
LottieProperty* property; LottieProperty* property;
LottieProperty::Type type; LottieProperty::Type type;
bool enabled;
struct { struct {
uint32_t key = 0; //the keyframe number repeating to uint32_t key = 0; //the keyframe number repeating to
float in = FLT_MAX; //looping duration in frame number float in = FLT_MAX; //looping duration in frame number
@ -367,7 +369,7 @@ struct LottieGenericProperty : LottieProperty
T operator()(float frameNo, LottieExpressions* exps) T operator()(float frameNo, LottieExpressions* exps)
{ {
T out{}; T out{};
if (exps && exp) { if (exps && (exp && exp->enabled)) {
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp); if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
if (exps->result<LottieGenericProperty<T>>(frameNo, out, exp)) return out; if (exps->result<LottieGenericProperty<T>>(frameNo, out, exp)) return out;
} }
@ -507,7 +509,7 @@ struct LottiePathSet : LottieProperty
bool operator()(float frameNo, Array<PathCommand>& cmds, Array<Point>& pts, Matrix* transform, LottieExpressions* exps) bool operator()(float frameNo, Array<PathCommand>& cmds, Array<Point>& pts, Matrix* transform, LottieExpressions* exps)
{ {
if (exps && exp) { if (exps && (exp && exp->enabled)) {
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp); if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
if (exps->result<LottiePathSet>(frameNo, cmds, pts, transform, exp)) return true; if (exps->result<LottiePathSet>(frameNo, cmds, pts, transform, exp)) return true;
} }
@ -588,7 +590,7 @@ struct LottieColorStop : LottieProperty
Result operator()(float frameNo, Fill* fill, LottieExpressions* exps) Result operator()(float frameNo, Fill* fill, LottieExpressions* exps)
{ {
if (exps && exp) { if (exps && (exp && exp->enabled)) {
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp); if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
if (exps->result<LottieColorStop>(frameNo, fill, exp)) return Result::Success; if (exps->result<LottieColorStop>(frameNo, fill, exp)) return Result::Success;
} }
@ -724,7 +726,7 @@ struct LottiePosition : LottieProperty
Point operator()(float frameNo, LottieExpressions* exps) Point operator()(float frameNo, LottieExpressions* exps)
{ {
Point out{}; Point out{};
if (exps && exp) { if (exps && (exp && exp->enabled)) {
if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp); if (exp->loop.mode != LottieExpression::LoopMode::None) frameNo = _loop(frames, frameNo, exp);
if (exps->result<LottiePosition>(frameNo, out, exp)) return out; if (exps->result<LottiePosition>(frameNo, out, exp)) return out;
} }