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"); } } }
static LuaArguments EvalNumericFor(NumericFor stat, LuaContext Context, out LuaReturnStatus returned) { returned.broke = false; returned.returned = false; var varList = EvalExpression(stat.Var, Context); var limitList = EvalExpression(stat.Limit, Context); var stepList = EvalExpression(stat.Step, Context); var var = LuaEvents.toNumber(varList[0]); var limit = LuaEvents.toNumber(limitList[0]); var step = LuaEvents.toNumber(stepList[0]); if (!(var & limit & step).AsBool()) { throw new LuaException("Error in for loop"); } LuaContext ctx = new LuaContext(Context); while ((step > 0 & var <= limit) | (step <= 0 & var >= limit)) { ctx.SetLocal(stat.Variable, var); LuaArguments obj = EvalBlock(stat.Block, ctx, out returned); if (returned.broke) { break; } if (returned.returned) { return(obj); } var = var + step; } return(Lua.Return()); }
static LuaObject EvalBinaryExpression(BinaryExpression Expression, LuaContext Context) { LuaObject left = EvalExpression(Expression.Left, Context)[0], right = EvalExpression(Expression.Right, Context)[0]; switch (Expression.Operation) { case BinaryOp.Addition: return(left + right); case BinaryOp.And: return(left & right); case BinaryOp.Concat: return(LuaEvents.concat_event(left, right)); case BinaryOp.Different: return(!(LuaEvents.eq_event(left, right))); case BinaryOp.Division: return(left / right); case BinaryOp.Equal: return(LuaEvents.eq_event(left, right)); case BinaryOp.GreaterOrEqual: return(left >= right); case BinaryOp.GreaterThan: return(left > right); case BinaryOp.LessOrEqual: return(left <= right); case BinaryOp.LessThan: return(left < right); case BinaryOp.Modulo: return(left % right); case BinaryOp.Multiplication: return(left * right); case BinaryOp.Or: return(left | right); case BinaryOp.Power: return(left ^ right); case BinaryOp.Subtraction: return(left - right); default: throw new NotImplementedException(); } }
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)); } }
public LuaObject this[LuaObject key] { get { if (IsTable) { var table = AsTable(); LuaObject obj; if (table.TryGetValue(key, out obj)) { return(obj); } else { return(LuaEvents.index_event(this, key)); } } else { return(LuaEvents.index_event(this, key)); } } set { if (IsTable) { var table = AsTable(); LuaObject obj; if (table.TryGetValue(key, out obj)) { table[key] = value; } else { LuaEvents.newindex_event(this, key, value); } } else { LuaEvents.newindex_event(this, key, value); } } }
public LuaObject this[LuaObject key] { get { if (IsTable) { LuaTable table = AsTable(); if (table.ContainsKey(key)) { return(table[key]); } else { return(LuaEvents.index_event(this, key)); } } else { return(LuaEvents.index_event(this, key)); } } set { if (IsTable) { var table = AsTable(); if (table.ContainsKey(key)) { table[key] = value; } else { LuaEvents.newindex_event(this, key, value); } } else { LuaEvents.newindex_event(this, key, value); } } }
public static LuaObject operator /(LuaObject a, LuaObject b) { return(LuaEvents.div_event(a, b)); }
public static LuaObject operator -(LuaObject a, LuaObject b) { return(LuaEvents.sub_event(a, b)); }
LuaArguments tostring(LuaArguments args) { return(Return(LuaEvents.tostring_event(args[0]))); }
public static LuaObject operator %(LuaObject a, LuaObject b) { return(LuaEvents.mod_event(a, b)); }
LuaArguments rawget(LuaArguments args) { return(Return(LuaEvents.rawget(args[0], args[1]))); }
LuaArguments rawset(LuaArguments args) { LuaEvents.rawset(args[0], args[1], args[2]); return(Return(args[0])); }
/// <summary> /// Calls the object. If this is not a function, it calls the metatable field __call /// </summary> /// <param name="args">The arguments to pass</param> public LuaArguments Call(LuaArguments args) { return(LuaEvents.call_event(this, args)); }
public static LuaObject operator -(LuaObject a) { return(LuaEvents.unm_event(a)); }
public static LuaObject operator >=(LuaObject a, LuaObject b) { return(LuaEvents.le_event(b, a)); }
public static LuaObject operator <=(LuaObject a, LuaObject b) { return(LuaEvents.le_event(a, b)); }
public static LuaObject operator ^(LuaObject a, LuaObject b) { return(LuaEvents.pow_event(a, b)); }