Пример #1
0
        public Roblox.Function AnalizeBytecode()
        {
            Roblox.Function RobloxFunc = new Roblox.Function();

            RobloxFunc.Instructions = ReadInstructions();
            RobloxFunc.Constants    = ReadConstants();

            return(RobloxFunc);
        }
Пример #2
0
        public string Construct(Roblox.Function Function)
        {
            for (int i = 0; i < Function.Instructions.Count; i++)
            {
                switch (Function.Instructions[i].Code)
                {
                case Roblox.Instruction.OpCode.GetGlobal:
                    Console.WriteLine($"OpCode: GETGLOBAL");

                    var b = Function.Constants.Pop().ToString().Trim('"');
                    Console.WriteLine(b);
                    PublicStack.Push(new Roblox.RuntimeData()
                    {
                        Value = b,
                        Type  = Roblox.RuntimeData.DataType.Function
                    });

                    break;

                case Roblox.Instruction.OpCode.ClearStack:
                    Console.WriteLine($"OpCode: CLEARSTACK");
                    PublicStack.Clear();
                    break;

                case Roblox.Instruction.OpCode.Closure:
                    // TODO: Check if closure is in spawn or not
                    // If it is then just pass it as a parameter
                    // else write it
                    break;

                case Roblox.Instruction.OpCode.LoadNumber:
                    Console.WriteLine($"OpCode: LOADNUMBER");

                    PublicStack.Push(new Roblox.RuntimeData()
                    {
                        Value = Function.Constants.Pop().ToString(),
                        Type  = Roblox.RuntimeData.DataType.Number
                    });
                    break;

                case Roblox.Instruction.OpCode.Loadk:
                    Console.WriteLine($"OpCode: LOADK");

                    PublicStack.Push(new Roblox.RuntimeData()
                    {
                        Value = Function.Constants.Pop().ToString(),
                        Type  = Roblox.RuntimeData.DataType.Constant
                    });
                    break;

                case Roblox.Instruction.OpCode.GetTablek:
                    Console.WriteLine($"OpCode: GETTABLEK");

                    var Previous = PublicStack.Pop();

                    if (Previous.Type == Roblox.RuntimeData.DataType.Table)
                    {
                        IList <string> Table = ((List <string>)Previous.Value);
                        var            a     = Function.Constants.Pop().ToString().Trim('"');
                        Table.Add(a);

                        PublicStack.Push(new Roblox.RuntimeData()
                        {
                            Value = Table,
                            Type  = Roblox.RuntimeData.DataType.Table
                        });
                    }
                    else
                    {
                        IList <string> NewTable = new List <string>();
                        var            a        = Function.Constants.Pop().ToString().Trim('"');
                        NewTable.Add(Previous.Value.ToString());
                        NewTable.Add(a);
                        PublicStack.Push(new Roblox.RuntimeData()
                        {
                            Value = NewTable,
                            Type  = Roblox.RuntimeData.DataType.Table
                        });
                    }

                    break;

                case Roblox.Instruction.OpCode.Call:
                    Console.WriteLine($"OpCode: CALL");
                    EmitCall(Function.Instructions[i]);
                    break;

                case Roblox.Instruction.OpCode.Return:
                    break;
                }
            }
            Console.WriteLine("\n" + Script.ToString());
            return(Script.ToString());
        }