新增跳转缓存
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using Convention.RScript.Parser;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
namespace Convention.RScript.Runner
|
||||
@@ -8,28 +9,38 @@ namespace Convention.RScript.Runner
|
||||
{
|
||||
protected static void DoJumpRuntimePointer(ExpressionParser parser, int target, RScriptContext context)
|
||||
{
|
||||
Tuple<int, int> enterKey = Tuple.Create(context.CurrentRuntimePointer, target);
|
||||
int currentPointer = context.CurrentRuntimePointer;
|
||||
bool isForwardMove = target > context.CurrentRuntimePointer;
|
||||
int step = isForwardMove ? 1 : -1;
|
||||
int depth = 0;
|
||||
int lastLayer = 0;
|
||||
for (; context.CurrentRuntimePointer != target; context.CurrentRuntimePointer += step)
|
||||
if (context.JumpPointerCache.TryGetValue(enterKey, out var jumpResult))
|
||||
{
|
||||
if (context.CurrentSentence.mode == RScriptSentence.Mode.ExitNamespace)
|
||||
depth = jumpResult.Item1;
|
||||
lastLayer = jumpResult.Item2;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool isForwardMove = target > context.CurrentRuntimePointer;
|
||||
int step = isForwardMove ? 1 : -1;
|
||||
for (; context.CurrentRuntimePointer != target; context.CurrentRuntimePointer += step)
|
||||
{
|
||||
if (isForwardMove)
|
||||
lastLayer--;
|
||||
else
|
||||
lastLayer++;
|
||||
if (context.CurrentSentence.mode == RScriptSentence.Mode.ExitNamespace)
|
||||
{
|
||||
if (isForwardMove)
|
||||
lastLayer--;
|
||||
else
|
||||
lastLayer++;
|
||||
}
|
||||
else if (context.CurrentSentence.mode == RScriptSentence.Mode.EnterNamespace)
|
||||
{
|
||||
if (isForwardMove)
|
||||
lastLayer++;
|
||||
else
|
||||
lastLayer--;
|
||||
}
|
||||
depth = lastLayer < depth ? lastLayer : depth;
|
||||
}
|
||||
else if (context.CurrentSentence.mode == RScriptSentence.Mode.EnterNamespace)
|
||||
{
|
||||
if (isForwardMove)
|
||||
lastLayer++;
|
||||
else
|
||||
lastLayer--;
|
||||
}
|
||||
depth = lastLayer < depth ? lastLayer : depth;
|
||||
context.JumpPointerCache.Add(enterKey, Tuple.Create(depth, lastLayer));
|
||||
}
|
||||
// 对上层的最深影响
|
||||
for (; depth < 0; depth++)
|
||||
|
Reference in New Issue
Block a user