static LuaArguments EvalRepeat(RepeatStat stat, LuaContext Context, out LuaReturnStatus returned) { returned.returned = false; returned.broke = false; LuaContext ctx = new LuaContext(Context); while (true) { LuaArguments obj = EvalBlock(stat.Block, ctx, out returned); if (returned.broke) { break; } if (returned.returned) { return(obj); } LuaObject cond = EvalExpression(stat.Condition, ctx)[0]; if (cond) { break; } } return(Lua.Return()); }
public async Task ExecuteRepeatStat(RepeatStat repeatStat, LuaState state, CancellationToken token) { var repeatState = state.WithNewContext(); do { await _engine.ExecuteStatement(repeatStat.Block, repeatState, token); } while (!(await _engine.EvaluateExpression(repeatStat.Condition, repeatState, token).FirstAsync()).AsBool()); }
public bool Match(XMLLuaSearchRepeatStatement req, RepeatStat real) { Logger.Debug($"repeat_statement"); if (Match(req.Block, real.Block) && Match(req.Condition, real.Condition)) { SetSelectionIfSelected(real.Span, req); return(true); } return(false); }
private static void CgRepeatStat(FuncInfo fi, RepeatStat node) { fi.EnterScope(true); var pcBeforeBlock = fi.PC(); CgBlock(fi, node.Block); var r = fi.AllocReg(); CgExp(fi, node.Exp, r, 1); fi.FreeReg(); fi.EmitTest(r, 0); fi.EmitJmp(fi.GetJmpArgA(), pcBeforeBlock - fi.PC() - 1); fi.CloseOpenUpvals(); fi.ExitScope(); }