示例#1
0
        public void TestIL()
        {
            var module = new VeinModuleBuilder("xuy");
            var clazz  = module.DefineClass("global::vein/lang/svack_pidars");

            clazz.Flags = ClassFlags.Public | ClassFlags.Static;
            var method = clazz.DefineMethod("insert_dick_into_svack", MethodFlags.Public, VeinTypeCode.TYPE_VOID.AsClass(), ("x", VeinTypeCode.TYPE_STRING));

            method.Flags = MethodFlags.Public | MethodFlags.Static;
            var body = method.GetGenerator();

            body.Emit(OpCodes.LDC_I4_S, 1448);
            body.Emit(OpCodes.LDC_I4_S, 228);
            body.Emit(OpCodes.ADD);
            body.Emit(OpCodes.LDC_I4_S, 2);
            body.Emit(OpCodes.XOR);
            body.Emit(OpCodes.RESERVED_0);
            body.Emit(OpCodes.LDF, "x");
            body.Emit(OpCodes.RET);


            var body_module = module.BakeByteArray();


            var asm = new IshtarAssembly();

            asm.AddSegment((".code", body_module));

            //IshtarAssembly.WriteTo(asm, new DirectoryInfo(@"C:\Users\ls-mi\Desktop\"));
        }
示例#2
0
文件: ElfTest.cs 项目: 0xF6/mana_lang
    public void ElfReadTest()
    {
        var file = GetTempFile();
        var asm  = new IshtarAssembly
        {
            Name = "wave_test"
        };

        asm.AddSegment((".code", Encoding.ASCII.GetBytes("IL_CODE")));
        IshtarAssembly.WriteTo(asm, file);
        var result = IshtarAssembly.LoadFromFile(file);

        var(_, body) = result.Sections[0];
        Assert.AreEqual("IL_CODE", Encoding.ASCII.GetString(body));
        var f_mem = new MemoryStream(File.ReadAllBytes(file));

        f_mem.Seek(f_mem.Capacity - (sizeof(uint) * 2), SeekOrigin.Begin);
        var bin    = new BinaryReader(f_mem);
        var len    = bin.ReadUInt32();
        var offset = bin.ReadUInt32();

        f_mem.Seek(offset, SeekOrigin.Begin);
        var bytes = bin.ReadBytes((int)len);

        Assert.AreEqual("IL_CODE", Encoding.ASCII.GetString(bytes));
        File.Delete(file);
    }
示例#3
0
        public void ManualGenCallExternFunction()
        {
            var module = new VeinModuleBuilder("hello_world");
            var clazz  = module.DefineClass("hello_world%global::wave/lang/program");

            clazz.Flags = ClassFlags.Public | ClassFlags.Static;


            var method = clazz.DefineMethod("master", MethodFlags.Public | MethodFlags.Static,
                                            VeinTypeCode.TYPE_VOID.AsClass());
            var body = method.GetGenerator();

            var @while = body.DefineLabel();

            body.UseLabel(@while);
            body.Emit(OpCodes.NOP);
            body.Emit(OpCodes.NEWOBJ, VeinCore.StringClass);
            body.Emit(OpCodes.RESERVED_2);
            body.Emit(OpCodes.JMP, @while);
            body.Emit(OpCodes.RET);


            var body_module = module.BakeByteArray();


            var asm = new IshtarAssembly {
                Name = module.Name
            };

            asm.AddSegment((".code", body_module));

            IshtarAssembly.WriteTo(asm, new DirectoryInfo(@"C:\Users\ls-mi\Desktop\"));
            File.WriteAllText($@"C:\Users\ls-mi\Desktop\{module.Name}.wvil", module.BakeDebugString());
        }
示例#4
0
文件: ElfTest.cs 项目: 0xF6/mana_lang
    public void ElfReadManual()
    {
        var file = @"C:\Users\ls-mi\Desktop\wave.elf";
        var asm  = new IshtarAssembly
        {
            Name = "wave_test"
        };

        asm.AddSegment((".code", Encoding.ASCII.GetBytes("IL_CODE")));
        IshtarAssembly.WriteTo(asm, file);
        var result = IshtarAssembly.LoadFromFile(file);
    }
示例#5
0
文件: Program.cs 项目: 0xF6/mana_lang
        private AssemblyBundle UnpackAssemblies()
        {
            Assemblies = new List <IshtarAssembly>();


            var offset_bytes = MainModuleBytes.SkipLast(sizeof(short)).TakeLast(sizeof(int)).ToArray();
            var offset       = BitConverter.ToInt32(offset_bytes);

            var input = MainModuleBytes.SkipLast(sizeof(short) + sizeof(int)).Skip(offset).ToArray();

            using var mem = new MemoryStream(input); // todo multiple modules
            Assemblies.Add(IshtarAssembly.LoadFromMemory(mem));

            return(this);
        }
示例#6
0
        public void Test()
        {
            var module = new VeinModuleBuilder("xuy");
            var clazz  = module.DefineClass("xuy%global::vein/lang/svack_pidars");

            clazz.Flags = ClassFlags.Public | ClassFlags.Static;
            var method = clazz.DefineMethod("insert_dick_into_svack", MethodFlags.Public, VeinTypeCode.TYPE_VOID.AsClass(), ("x", VeinTypeCode.TYPE_STRING));

            method.Flags = MethodFlags.Public | MethodFlags.Static;
            var gen = method.GetGenerator();

            var l1 = gen.DefineLabel();
            var l2 = gen.DefineLabel();

            gen.Emit(OpCodes.ADD);
            gen.Emit(OpCodes.LDC_I4_S, 228);
            gen.Emit(OpCodes.ADD);
            gen.Emit(OpCodes.JMP_HQ, l2);
            gen.Emit(OpCodes.LDC_I4_S, 228);
            gen.Emit(OpCodes.ADD);
            gen.Emit(OpCodes.LDC_I4_S, 228);
            gen.Emit(OpCodes.LDC_I4_S, 228);
            gen.Emit(OpCodes.ADD);
            gen.Emit(OpCodes.JMP_HQ, l1);
            gen.UseLabel(l1);
            gen.Emit(OpCodes.SUB);
            gen.Emit(OpCodes.SUB);
            gen.UseLabel(l2);
            gen.Emit(OpCodes.SUB);
            gen.Emit(OpCodes.SUB);


            module.BakeDebugString();


            //File.WriteAllText(@"C:\Users\ls-mi\Desktop\mana.il",
            //    module.BakeDebugString());

            var asm = new IshtarAssembly {
                Name = "woodo"
            };

            asm.AddSegment((".code", method.BakeByteArray()));

            //IshtarAssembly.WriteTo(asm, new DirectoryInfo(@"C:\Users\ls-mi\Desktop\"));
        }
示例#7
0
        public void WriteTest()
        {
            var verSR    = new Version(2, 2, 2, 2);
            var moduleSR = new VeinModuleBuilder("set1", verSR);
            {
                moduleSR.Deps.AddRange(GetDeps());


                var @class = moduleSR.DefineClass("set1%global::wave/lang/SR");


                @class.Flags = ClassFlags.Public | ClassFlags.Static;
                var method = @class.DefineMethod("blank", MethodFlags.Public | MethodFlags.Static,
                                                 VeinTypeCode.TYPE_VOID.AsClass());

                var gen = method.GetGenerator();

                gen.Emit(OpCodes.NOP);

                moduleSR.BakeByteArray();
                moduleSR.BakeDebugString();

                var blank = new IshtarAssembly(moduleSR)
                {
                    Name = "set1", Version = verSR
                };


                IshtarAssembly.WriteTo(blank, new DirectoryInfo("C:/wavelib"));
            }


            {
                var ver    = new Version(2, 2, 2, 2);
                var module = new VeinModuleBuilder("set2", ver);
                module.Deps.AddRange(GetDeps());


                var @class = module.DefineClass("set2%global::wave/lang/DR");


                @class.Flags = ClassFlags.Public | ClassFlags.Static;
                var method = @class.DefineMethod("blank", MethodFlags.Public | MethodFlags.Static,
                                                 VeinTypeCode.TYPE_VOID.AsClass());

                var gen = method.GetGenerator();

                gen.Emit(OpCodes.NOP);

                module.BakeByteArray();
                module.BakeDebugString();

                module.Deps.Add(moduleSR);

                var blank = new IshtarAssembly(module)
                {
                    Name = "set2", Version = ver
                };


                IshtarAssembly.WriteTo(blank, new DirectoryInfo("C:/wavelib"));
            }
        }
示例#8
0
        public void ManualGen()
        {
            var module = new VeinModuleBuilder("satl");
            var clazz  = module.DefineClass("satl%global::wave/lang/program");

            clazz.Flags = ClassFlags.Public | ClassFlags.Static;


            var fib = clazz.DefineMethod("fib",
                                         MethodFlags.Public | MethodFlags.Static,
                                         VeinTypeCode.TYPE_I8.AsClass(), ("x", VeinTypeCode.TYPE_I8));

            var fibGen = fib.GetGenerator();

            //fibGen.Emit(OpCodes.LDC_I8_1);
            //fibGen.Emit(OpCodes.LDC_I8_1);
            //fibGen.Emit(OpCodes.EQL);
            //fibGen.Emit(OpCodes.RET);

            var label_if_1 = fibGen.DefineLabel();
            var label_if_2 = fibGen.DefineLabel();
            var for_1      = fibGen.DefineLabel();
            var for_body   = fibGen.DefineLabel();

            // if (x == 0) return 0;
            fibGen.Emit(OpCodes.LDARG_1);
            fibGen.Emit(OpCodes.JMP_T, label_if_1);
            fibGen.Emit(OpCodes.LDC_I4_0);
            fibGen.Emit(OpCodes.RET);
            fibGen.UseLabel(label_if_1);
            // if (x == 1) return 1;
            fibGen.Emit(OpCodes.LDARG_1);
            fibGen.Emit(OpCodes.LDC_I4_1);
            fibGen.Emit(OpCodes.JMP_NN, label_if_2);
            fibGen.Emit(OpCodes.LDC_I4_1);
            fibGen.Emit(OpCodes.RET);
            fibGen.UseLabel(label_if_2);
            // var first, second, nth, i = 0;
            fibGen.EnsureLocal("first", VeinTypeCode.TYPE_I4.AsClass());
            fibGen.EnsureLocal("second", VeinTypeCode.TYPE_I4.AsClass());
            fibGen.EnsureLocal("nth", VeinTypeCode.TYPE_I4.AsClass());
            fibGen.EnsureLocal("i", VeinTypeCode.TYPE_I4.AsClass());
            // second, nth = 1; i = 2;
            fibGen.Emit(OpCodes.LDC_I4_1); fibGen.Emit(OpCodes.STLOC_1);
            fibGen.Emit(OpCodes.LDC_I4_1); fibGen.Emit(OpCodes.STLOC_2);
            fibGen.Emit(OpCodes.LDC_I4_2); fibGen.Emit(OpCodes.STLOC_3);

            // for
            //
            fibGen.Emit(OpCodes.JMP, for_1);
            fibGen.UseLabel(for_body);
            fibGen.Emit(OpCodes.LDLOC_0);
            fibGen.Emit(OpCodes.LDLOC_1);
            fibGen.Emit(OpCodes.ADD);
            fibGen.Emit(OpCodes.STLOC_2);

            fibGen.Emit(OpCodes.LDLOC_1);
            fibGen.Emit(OpCodes.STLOC_0);

            fibGen.Emit(OpCodes.LDLOC_2);
            fibGen.Emit(OpCodes.STLOC_1);

            // i++
            fibGen.Emit(OpCodes.LDLOC_3);
            fibGen.Emit(OpCodes.LDC_I4_1);
            fibGen.Emit(OpCodes.ADD);
            fibGen.Emit(OpCodes.STLOC_3);

            // var exceptionType =
            //    module.FindType(new QualityTypeName("std%global::wave/lang/Exception")).AsClass();

            //fibGen.Emit(OpCodes.NEWOBJ, exceptionType.FullName);
            //fibGen.Emit(OpCodes.CALL, exceptionType.FindMethod("ctor()"));
            //fibGen.Emit(OpCodes.THROW);


            // i <= n
            fibGen.UseLabel(for_1);
            fibGen.Emit(OpCodes.NOP);
            fibGen.Emit(OpCodes.LDARG_1);
            fibGen.Emit(OpCodes.LDLOC_3);
            fibGen.Emit(OpCodes.JMP_LQ, for_body);
            // return nth;
            fibGen.Emit(OpCodes.LDLOC_2);
            fibGen.Emit(OpCodes.RET);

            var method = clazz.DefineMethod("master", MethodFlags.Public | MethodFlags.Static,
                                            VeinTypeCode.TYPE_VOID.AsClass());
            var body = method.GetGenerator();



            body.Emit(OpCodes.LDC_I4_S, 120 /**/);
            body.Emit(OpCodes.CALL, fib);
            body.Emit(OpCodes.RESERVED_0);
            body.Emit(OpCodes.RESERVED_1);
            body.Emit(OpCodes.RET);
            //body.Emit(OpCodes.CALL);


            var body_module = module.BakeByteArray();


            var asm = new IshtarAssembly {
                Name = module.Name
            };

            asm.AddSegment((".code", body_module));

            IshtarAssembly.WriteTo(asm, new DirectoryInfo(@"C:\Users\ls-mi\Desktop\"));
            File.WriteAllText($@"C:\Users\ls-mi\Desktop\{module.Name}.wvil", module.BakeDebugString());
        }
示例#9
0
文件: Program.cs 项目: 0xF6/mana_lang
        public static unsafe int Main(string[] args)
        {
            ishtar.Trace.init();
            //while (!Debugger.IsAttached)
            //    Thread.Sleep(200);
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                Console.OutputEncoding = Encoding.Unicode;
            }
            IshtarCore.INIT();
            INIT_VTABLES();
            IshtarGC.INIT();
            FFI.INIT();

            AppVault.CurrentVault = new AppVault("app");

            var masterModule = default(IshtarAssembly);
            var resolver     = default(AssemblyResolver);

            if (AssemblyBundle.IsBundle(out var bundle))
            {
                resolver     = AppVault.CurrentVault.GetResolver();
                masterModule = bundle.Assemblies.First();
                resolver.AddInMemory(bundle);
            }
            else
            {
                if (args.Length < 1)
                {
                    return(-1);
                }
                var entry = new FileInfo(args.First());
                if (!entry.Exists)
                {
                    return(-2);
                }
                AppVault.CurrentVault.WorkDirecotry = entry.Directory;
                resolver     = AppVault.CurrentVault.GetResolver();
                masterModule = IshtarAssembly.LoadFromFile(entry);
                resolver.AddSearchPath(entry.Directory);
            }


            var module = resolver.Resolve(masterModule);

            foreach (var @class in module.class_table.OfType <RuntimeIshtarClass>())
            {
                @class.init_vtable();
                VM.ValidateLastError();
            }

            var entry_point = module.GetEntryPoint();

            if (entry_point is null)
            {
                VM.FastFail(WNE.MISSING_METHOD, $"Entry point in '{module.Name}' module is not defined.", IshtarFrames.EntryPoint);
                VM.ValidateLastError();
                return(-280);
            }

            var args_ = stackalloc stackval[1];

            var frame = new CallFrame
            {
                args   = args_,
                method = entry_point,
                level  = 0
            };

            {// i don't know why
                IshtarCore.INIT_ADDITIONAL_MAPPING();
                INIT_VTABLES();
            }



            var watcher = Stopwatch.StartNew();

            VM.exec_method(frame);

            if (frame.exception is not null)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine($"unhandled exception '{frame.exception.value->decodeClass().Name}' was thrown. \n" +
                                  $"{frame.exception.stack_trace}");
                Console.ForegroundColor = ConsoleColor.White;
            }

            watcher.Stop();
            Console.WriteLine($"Elapsed: {watcher.Elapsed}");

            return(0);
        }