LuaArguments ipairs(LuaArguments args) { LuaObject handler = LuaEvents.getMetamethod(args[0], "__ipairs"); if (!handler.IsNil) { return(handler.Call(args)); } else { if (args[0].IsTable) { LuaFunction f = delegate(LuaArguments x) { var s = x[0]; var var = x[1].AsNumber() + 1; var val = s[var]; if (val == LuaObject.Nil) { return(Return(LuaObject.Nil)); } else { return(Return(var, val)); } }; return(Return(f, args[0], 0)); } else { throw new LuaException("t must be a table"); } } }
LuaArguments pairs(LuaArguments args) { LuaObject handler = LuaEvents.getMetamethod(args[0], "__pairs"); if (!handler.IsNil) { return(handler.Call(args)); } else { return(Return((LuaFunction)next, args[0], LuaObject.Nil)); } }
static LuaArguments EvalGenericFor(GenericFor stat, LuaContext Context, out LuaReturnStatus returned) { returned.broke = false; returned.returned = false; LuaArguments args = null; foreach (IExpression expr in stat.Expressions) { if (args == null) { args = EvalExpression(expr, Context); } else { args.Concat(EvalExpression(expr, Context)); } } LuaObject f = args[0], s = args[1], var = args[2]; LuaContext ctx = new LuaContext(Context); while (true) { LuaArguments res = f.Call(s, var); for (int i = 0; i < stat.Variables.Count; i++) { ctx.SetLocal(stat.Variables[i], res[i]); } if (res[0].IsNil) { break; } var = res[0]; LuaArguments obj = EvalBlock(stat.Block, ctx, out returned); if (returned.broke) { break; } if (returned.returned) { return(obj); } } return(Lua.Return()); }
static LuaArguments EvalFunctionCall(FunctionCall Expression, LuaContext Context) { LuaObject func = EvalExpression(Expression.Function, Context)[0]; LuaArguments args = null; if (Expression.Arguments != null || Expression.Arguments.Count != 0) { List <LuaObject> values = new List <LuaObject>(); foreach (IExpression expr in Expression.Arguments) { values.AddRange(EvalExpression(expr, Context)); } args = values.ToArray(); } return(func.Call(args)); }