更新异步step
This commit is contained in:
@@ -77,6 +77,7 @@ namespace Convention.RScript
|
||||
public interface IRSentenceRunner
|
||||
{
|
||||
[return: MaybeNull] object Run(ExpressionParser parser, RScriptSentence sentence, RScriptContext context);
|
||||
[return: MaybeNull] IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context);
|
||||
void Compile(ExpressionParser parser, RScriptSentence sentence, RScriptContext context);
|
||||
}
|
||||
|
||||
@@ -266,18 +267,8 @@ namespace Convention.RScript
|
||||
|
||||
public RScriptSentence CurrentSentence => Sentences[CurrentRuntimePointer];
|
||||
|
||||
public int StepCount { get; private set; }
|
||||
|
||||
#if DEBUG
|
||||
public List<RScriptSentence> StepStack = new();
|
||||
#endif
|
||||
|
||||
internal object RunNextStep(ExpressionParser parser)
|
||||
{
|
||||
StepCount++;
|
||||
#if DEBUG
|
||||
StepStack.Add(CurrentSentence);
|
||||
#endif
|
||||
var sentence = CurrentSentence;
|
||||
try
|
||||
{
|
||||
@@ -292,6 +283,12 @@ namespace Convention.RScript
|
||||
throw new RScriptRuntimeException($"Runtime error: {ex.Message}", CurrentRuntimePointer, ex);
|
||||
}
|
||||
}
|
||||
internal IEnumerator RunNextStepAsync(ExpressionParser parser)
|
||||
{
|
||||
var sentence = CurrentSentence;
|
||||
if (SentenceRunners.TryGetValue(sentence.mode, out var runner))
|
||||
yield return runner.RunAsync(parser, sentence, this);
|
||||
}
|
||||
|
||||
internal readonly Stack<int> RuntimePointerStack = new();
|
||||
internal readonly Stack<int> GotoPointerStack = new();
|
||||
@@ -311,7 +308,6 @@ namespace Convention.RScript
|
||||
|
||||
private void BeforeRun(ExpressionParser parser)
|
||||
{
|
||||
StepCount = 0;
|
||||
CurrentLocalSpaceVariableNames.Clear();
|
||||
RuntimePointerStack.Clear();
|
||||
GotoPointerStack.Clear();
|
||||
@@ -331,13 +327,13 @@ namespace Convention.RScript
|
||||
|
||||
private void ResetAndSureRunAgain(ExpressionParser parser)
|
||||
{
|
||||
StepCount = 0;
|
||||
CurrentLocalSpaceVariableNames.Clear();
|
||||
RuntimePointerStack.Clear();
|
||||
GotoPointerStack.Clear();
|
||||
CurrentLocalSpaceVariableNames.Clear();
|
||||
CurrentLocalSpaceVariableNames.Push(new());
|
||||
JumpPointerCache.Clear();
|
||||
parser.context.Variables.Clear();
|
||||
foreach (var (name, varObject) in Variables)
|
||||
{
|
||||
parser.context.Variables[name] = varObject.data;
|
||||
@@ -356,6 +352,7 @@ namespace Convention.RScript
|
||||
public void Run(ExpressionParser parser)
|
||||
{
|
||||
BeforeRun(parser);
|
||||
Stack<IEnumerator> buffer = new();
|
||||
for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++)
|
||||
{
|
||||
RunNextStep(parser);
|
||||
@@ -368,12 +365,7 @@ namespace Convention.RScript
|
||||
BeforeRun(parser);
|
||||
for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++)
|
||||
{
|
||||
var ret = RunNextStep(parser);
|
||||
if (ret is IEnumerator ir)
|
||||
{
|
||||
yield return ir;
|
||||
}
|
||||
yield return null;
|
||||
yield return RunNextStepAsync(parser);
|
||||
}
|
||||
AfterRun(parser);
|
||||
}
|
||||
@@ -393,12 +385,7 @@ namespace Convention.RScript
|
||||
ResetAndSureRunAgain(parser);
|
||||
for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++)
|
||||
{
|
||||
var ret = RunNextStep(parser);
|
||||
if (ret is IEnumerator ir)
|
||||
{
|
||||
yield return ir;
|
||||
}
|
||||
yield return null;
|
||||
yield return RunNextStepAsync(parser);
|
||||
}
|
||||
AfterRun(parser);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user