示例#1
0
        public static void AddIoLibrary(LuaContext Context)
        {
            dynamic io = LuaObject.NewTable();

            FileMetatable.__index = LuaObject.NewTable();
            FileMetatable.__index.write = (LuaFunction)write;
            FileMetatable.__index.close = (LuaFunction)close;
            FileMetatable.__index.flush = (LuaFunction)flush;
            FileMetatable.__index.seek = (LuaFunction)seek;
            FileMetatable.__index.read = (LuaFunction)read;

            io.open = (LuaFunction)io_open;
            io.type = (LuaFunction)io_type;
            io.input = (LuaFunction)io_input;
            io.output = (LuaFunction)io_output;
            io.temp = (LuaFunction)io_temp;
            io.flush = (LuaFunction)io_flush;
            io.write = (LuaFunction)io_write;
            io.read = (LuaFunction)io_read;

            currentInput = CreateFileObject(Console.OpenStandardInput());
            currentOutput = CreateFileObject(Console.OpenStandardOutput(), true);
            io.stdin = currentInput;
            io.stdout = currentOutput;
            io.stderr = CreateFileObject(Console.OpenStandardError(), true);

            Context.Set("io", io);
        }
示例#2
0
        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());
        }
示例#3
0
        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));
        }
示例#4
0
        static LuaObject EvalTableConstructor(TableConstructor tctor, LuaContext Context)
        {
            Dictionary <LuaObject, LuaObject> table = new Dictionary <LuaObject, LuaObject>();
            int i = 0;

            foreach (KeyValuePair <IExpression, IExpression> pair in tctor.Values)
            {
                if (i == tctor.Values.Count - 1 && (pair.Value is FunctionCall || pair.Value is VarargsLiteral))
                // This is the last element, and this is a function call or varargs, thus we will add
                // every return value to the table
                {
                    LuaObject key = EvalExpression(pair.Key, Context)[0];
                    if (key.IsNumber)
                    {
                        LuaArguments values = EvalExpression(pair.Value, Context);

                        double k = key;
                        foreach (LuaObject v in values)
                        {
                            table.Add(k, v);
                            k++;
                        }
                    }
                    else
                    {
                        LuaObject value = EvalExpression(pair.Value, Context)[0];

                        table.Add(key, value);
                    }
                }
                else
                {
                    LuaObject key   = EvalExpression(pair.Key, Context)[0];
                    LuaObject value = EvalExpression(pair.Value, Context)[0];

                    table.Add(key, value);
                }
                i++;
            }
            return(LuaObject.FromTable(table));
        }
示例#5
0
        static LuaObject EvalFunctionDefinition(FunctionDefinition fdef, LuaContext Context)
        {
            LuaObject obj = LuaObject.FromFunction(delegate(LuaArguments args)
            {
                LuaContext ctx = new LuaContext(Context);
                LuaReturnStatus ret;
                for (int i = 0; i < args.Length; i++)
                {
                    if (i < fdef.Arguments.Count)
                    {
                        ctx.SetLocal(fdef.Arguments[i].Name, args[i]);
                    }
                    else
                    {
                        ctx.Varargs.Add(args[i]);
                    }
                }
                return(EvalBlock(fdef.Body, ctx, out ret));
            });

            return(obj);
        }
示例#6
0
        internal static LuaArguments EvalBlock(Block Block, LuaContext Context, out LuaReturnStatus returned)
        {
            returned.broke    = false;
            returned.returned = false;
            LuaArguments obj = new LuaObject[] { LuaObject.Nil };

            foreach (IStatement stat in Block.Statements)
            {
                if (stat is Assignment)
                {
                    Assignment   assign = stat as Assignment;
                    LuaArguments values = null;
                    foreach (IExpression expr in assign.Expressions)
                    {
                        if (values == null)
                        {
                            values = EvalExpression(expr, Context);
                        }
                        else
                        {
                            values.Concat(EvalExpression(expr, Context));
                        }
                    }
                    for (int i = 0; i < assign.Variables.Count; i++)
                    {
                        SetAssignable(assign.Variables[i], values[i], Context);
                    }
                }
                else if (stat is LocalAssignment)
                {
                    LocalAssignment assign = stat as LocalAssignment;
                    LuaArguments    values = null;
                    foreach (IExpression expr in assign.Values)
                    {
                        if (values == null)
                        {
                            values = EvalExpression(expr, Context);
                        }
                        else
                        {
                            values.Concat(EvalExpression(expr, Context));
                        }
                    }
                    for (int i = 0; i < assign.Names.Count; i++)
                    {
                        Context.SetLocal(assign.Names[i], values[i]);
                    }
                }
                else if (stat is ReturnStat)
                {
                    ReturnStat ret = stat as ReturnStat;
                    returned.returned = true;
                    List <LuaObject> values = new List <LuaObject>();
                    int i = 0;
                    foreach (IExpression expr in ret.Expressions)
                    {
                        if (i == ret.Expressions.Count - 1)
                        {
                            values.AddRange(EvalExpression(expr, Context));
                        }
                        else
                        {
                            values.Add(EvalExpression(expr, Context)[0]);
                        }
                        i++;
                    }
                    return(values.ToArray());
                }
                else if (stat is FunctionCall)
                {
                    FunctionCall call = stat as FunctionCall;
                    EvalFunctionCall(call, Context);
                }
                else if (stat is Block)
                {
                    Block      block = stat as Block;
                    LuaContext ctx   = new LuaContext(Context);
                    obj = EvalBlock(block, ctx, out returned);
                    if (returned.returned)
                    {
                        return(obj);
                    }
                }
                else if (stat is IfStat)
                {
                    obj = EvalIf(stat as IfStat, Context, out returned);
                    if (returned.returned)
                    {
                        return(obj);
                    }
                }
                else if (stat is WhileStat)
                {
                    obj = EvalWhile(stat as WhileStat, Context, out returned);
                    if (returned.returned)
                    {
                        return(obj);
                    }
                }
                else if (stat is RepeatStat)
                {
                    obj = EvalRepeat(stat as RepeatStat, Context, out returned);
                    if (returned.returned)
                    {
                        return(obj);
                    }
                }
                else if (stat is BreakStat)
                {
                    returned.returned = false;
                    returned.broke    = true;
                    return(Lua.Return(LuaObject.Nil));
                }
                else if (stat is NumericFor)
                {
                    obj = EvalNumericFor(stat as NumericFor, Context, out returned);
                    if (returned.returned)
                    {
                        return(obj);
                    }
                }
                else
                {
                    obj = EvalGenericFor(stat as GenericFor, Context, out returned);
                    if (returned.returned)
                    {
                        return(obj);
                    }
                }
            }

            return(obj);
        }
示例#7
0
 static void SetTable(TableAccess Expression, LuaObject Value, LuaContext Context)
 {
     EvalExpression(Expression.Expression, Context)[0][EvalExpression(Expression.Index, Context)[0]] = Value;
 }
示例#8
0
 static LuaArguments EvalVarargs(LuaContext Context)
 {
     return(Context.Varargs);
 }
示例#9
0
 /// <summary>
 /// Used to create scopes
 /// </summary>
 public LuaContext(LuaContext Parent)
 {
     parent    = Parent;
     variables = new Dictionary <string, LuaObject>();
     varargs   = new LuaArguments(new LuaObject[] { });
 }
示例#10
0
        public static void AddMathLibrary(LuaContext Context)
        {
            dynamic math = LuaObject.NewTable();
            math.abs = (LuaFunction)math_abs;
            math.acos = (LuaFunction)math_acos;
            math.asin = (LuaFunction)math_asin;
            math.atan = (LuaFunction)math_atan;
            math.atan2 = (LuaFunction)math_atan2;
            math.ceil = (LuaFunction)math_ceil;
            math.cos = (LuaFunction)math_cos;
            math.cosh = (LuaFunction)math_cosh;
            math.exp = (LuaFunction)math_exp;
            math.floor = (LuaFunction)math_floor;
            math.log = (LuaFunction)math_log;
            math.max = (LuaFunction)math_max;
            math.min = (LuaFunction)math_min;
            math.pow = (LuaFunction)math_pow;
            math.sin = (LuaFunction)math_sin;
            math.sinh = (LuaFunction)math_sinh;
            math.sqrt = (LuaFunction)math_sqrt;
            math.tan = (LuaFunction)math_tan;
            math.tanh = (LuaFunction)math_tanh;

            math.pi = Math.PI;

            Context.Set("math", math);
        }
示例#11
0
 /// <summary>
 /// Used to create scopes
 /// </summary>
 public LuaContext(LuaContext Parent)
 {
     parent = Parent;
     variables = new Dictionary<string, LuaObject>();
     varargs = new LuaArguments(new LuaObject[] { });
 }