示例#1
0
        public void TestValidCall()
        {
            var module = new RuntimeIshtarModule(AppVault.CurrentVault, _module.Name);

            var b1 = new RuntimeIshtarClass("tst%global::foo/bar1", VeinTypeCode.TYPE_OBJECT.AsRuntimeClass(), module);

            var m1 = b1.DefineMethod("soq", VeinTypeCode.TYPE_VOID.AsRuntimeClass(), MethodFlags.Public | MethodFlags.Virtual);

            m1.PIInfo = PInvokeInfo.New(((delegate * < void >) & Foo1));

            var b2 = new RuntimeIshtarClass("tst%global::foo/bar2", b1, module);

            var m2 = b2.DefineMethod("soq", VeinTypeCode.TYPE_VOID.AsRuntimeClass(), MethodFlags.Public | MethodFlags.Override);

            m2.PIInfo = PInvokeInfo.New(((delegate * < void >) & Foo2));

            b2.init_vtable();


            ((delegate * < void >)b2.Method["soq()"].PIInfo.Addr)();



            var result = IshtarGC.AllocObject(b2);

            var pointer = result->vtable[m2.vtable_offset];

            var d2 = IshtarUnsafe.AsRef <RuntimeIshtarMethod>(pointer);

            ((delegate * < void >)d2.PIInfo.Addr)();
        }
示例#2
0
        protected IshtarTestBase()
        {
            if (VM.watcher is DefaultWatchDog)
            {
                VM.watcher = new TestWatchDog();
            }
            AppVault.CurrentVault ??= new AppVault("<test-app>");
            lock (guarder)
            {
                if (!isInited)
                {
                    VeinCore.Init();

                    IshtarGC.INIT();
                    FFI.INIT();
                    _corlib = LoadCorLib();
                    IshtarCore.INIT_ADDITIONAL_MAPPING();
                    foreach (var @class in VeinCore.All.OfType <RuntimeIshtarClass>())
                    {
                        @class.init_vtable();
                    }
                    // ReSharper disable once VirtualMemberCallInConstructor
                    StartUp();
                    isInited = true;
                }
            }
        }
示例#3
0
    public void AllocateType()
    {
        var ctx   = CreateContext();
        var frame = ctx.Execute((generator, o) => generator.Emit(OpCodes.RET));
        var obj   = IshtarGC.AllocTypeInfoObject(T.STRING, frame);

        IshtarGC.FreeObject(&obj, frame);
    }
示例#4
0
    public void AllocateField()
    {
        var ctx   = CreateContext();
        var frame = ctx.Execute((generator, o) => generator.Emit(OpCodes.RET));
        var obj   = IshtarGC.AllocFieldInfoObject(T.STRING.Field["Length"], frame);

        new IshtarLayerField(obj, frame);
        IshtarGC.FreeObject(&obj, frame);
    }
示例#5
0
    public void AllocateMethod()
    {
        var ctx   = CreateContext();
        var frame = ctx.Execute((generator, o) => generator.Emit(OpCodes.RET));
        var obj   = IshtarGC.AllocMethodInfoObject(T.STRING.Method["op_Equal(String,String)"], frame);
        var fn    = new IshtarLayerFunction(obj, frame);

        Assert.AreEqual("op_Equal", fn.Name);
        IshtarGC.FreeObject(&obj, frame);
    }
示例#6
0
        public unsafe void CorrectAllocateArray()
        {
            if (VM.watcher is DefaultWatchDog)
            {
                VM.watcher = new TestWatchDog();
            }

            var array = IshtarGC.AllocArray(VeinTypeCode.TYPE_I4.AsRuntimeClass(), 10, 1);

            Assert.AreEqual(10UL, array->length);
            Assert.AreEqual(1UL, array->rank);

            foreach (var i in..10)
            {
                array->Set((uint)i, IshtarMarshal.ToIshtarObject(88 * i));
            }

            foreach (var i in..10)
            {
                var obj = array->Get((uint)i);
                Assert.AreEqual(i * 88, IshtarMarshal.ToDotnetInt32(obj, null));
            }
        }
示例#7
0
        public unsafe void CorrectAllocateValue()
        {
            var result = IshtarGC.AllocValue();

            result = null;
        }
示例#8
0
        public unsafe void CorrectAllocateString()
        {
            var result = IshtarMarshal.ToIshtarObject("foo");

            IshtarGC.FreeObject(&result, new CallFrame());
        }
示例#9
0
        public unsafe void CorrectAllocateObject()
        {
            var result = IshtarGC.AllocObject(VeinTypeCode.TYPE_I8.AsRuntimeClass());

            IshtarGC.FreeObject(&result, new CallFrame());
        }
示例#10
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);
        }