From a1fd4204934ccdf1c94d4fbd9fa15ccd3975b1d6 Mon Sep 17 00:00:00 2001 From: PopSlime Date: Sat, 22 Apr 2023 21:09:53 +0800 Subject: [PATCH] Fix error handling in PDT evaluator. --- Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs | 8 +++++--- Assets/Cryville/Crtr/SkinPropertyKey.cs | 6 ++++-- Assets/Cryville/Crtr/SkinSelectors.cs | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs b/Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs index 6887f8b..0001054 100644 --- a/Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs +++ b/Assets/Cryville/Common/Pdt/PdtEvaluatorBase.cs @@ -64,8 +64,10 @@ namespace Cryville.Common.Pdt { } else { var frame = _stack[_framecount - 1]; - ReplaceIP(il, new PdtInstruction.PushConstant(frame.Type, _mem, frame.Offset, frame.Length), cols); - for (var j = 0; j < fc1; j++) il.Remove(_ip.Previous); + if (frame.Type != PdtInternalType.Error) { + ReplaceIP(il, new PdtInstruction.PushConstant(frame.Type, _mem, frame.Offset, frame.Length), cols); + for (var j = 0; j < fc1; j++) il.Remove(_ip.Previous); + } } } else if (i is PdtInstruction.Collapse) { @@ -197,7 +199,7 @@ namespace Cryville.Common.Pdt { for (int i = 0; i < pc; i++) { var frame = _stack[--_framecount]; if (frame.Type == PdtInternalType.Error) { - _framecount -= pc - i; + _framecount -= pc - i - 1; _stack[_framecount++] = new StackFrame { Type = PdtInternalType.Error, Offset = _goffset, Length = 0 }; return false; } diff --git a/Assets/Cryville/Crtr/SkinPropertyKey.cs b/Assets/Cryville/Crtr/SkinPropertyKey.cs index 863de24..a448c8f 100644 --- a/Assets/Cryville/Crtr/SkinPropertyKey.cs +++ b/Assets/Cryville/Crtr/SkinPropertyKey.cs @@ -189,13 +189,15 @@ namespace Cryville.Crtr { SkinVariable v; if (!vars.TryGetValue(Name, out v)) vars.Add(Name, v = new SkinVariable()); - ChartPlayer.etor.Evaluate(v.Op, exp); + if (!ChartPlayer.etor.Evaluate(v.Op, exp)) + throw new EvaluationFailureException(); } public override void ExecuteDynamic(ISkinnableGroup group, RuntimeSkinContext ctx, PdtExpression exp, IntKeyedDictionary vars, int dl) { SkinVariable v; if (!vars.TryGetValue(Name, out v)) throw new InvalidOperationException(string.Format("Variable \"{0}\" not defined", IdentifierManager.SharedInstance.Retrieve(Name))); - ChartPlayer.etor.Evaluate(v.Op, exp); + if (!ChartPlayer.etor.Evaluate(v.Op, exp)) + throw new EvaluationFailureException(); } } } diff --git a/Assets/Cryville/Crtr/SkinSelectors.cs b/Assets/Cryville/Crtr/SkinSelectors.cs index 9425c5a..62c9eec 100644 --- a/Assets/Cryville/Crtr/SkinSelectors.cs +++ b/Assets/Cryville/Crtr/SkinSelectors.cs @@ -131,7 +131,8 @@ namespace Cryville.Crtr { public SkinContext Match(SkinContext a) { ChartPlayer.etor.ContextTransform = a.Transform; try { - ChartPlayer.etor.Evaluate(_op, _exp); + if (!ChartPlayer.etor.Evaluate(_op, _exp)) + throw new EvaluationFailureException(); return _flag ? a : null; } catch (Exception ex) {