更新异步step

This commit is contained in:
2025-12-11 18:03:28 +08:00
parent e4b7dc0f55
commit 0a7f6eb362
11 changed files with 219 additions and 27 deletions

View File

@@ -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);
}