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)(); }
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; } } }
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); }
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); }
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); }
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)); } }
public unsafe void CorrectAllocateValue() { var result = IshtarGC.AllocValue(); result = null; }
public unsafe void CorrectAllocateString() { var result = IshtarMarshal.ToIshtarObject("foo"); IshtarGC.FreeObject(&result, new CallFrame()); }
public unsafe void CorrectAllocateObject() { var result = IshtarGC.AllocObject(VeinTypeCode.TYPE_I8.AsRuntimeClass()); IshtarGC.FreeObject(&result, new CallFrame()); }
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); }