Пример #1
0
        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());
        }
Пример #2
0
        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());
        }
Пример #3
0
 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);
 }
Пример #4
0
        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();
        }