public static void InitTable(Dictionary <string, RuntimeIshtarMethod> table) { new RuntimeIshtarMethod("i_call_String_Concat", Private | Static | Extern, ("v1", TYPE_STRING), ("v2", TYPE_STRING)) .AsNative((delegate * < CallFrame, IshtarObject * *, IshtarObject * >) & Concat) .AddInto(table, x => x.Name); new RuntimeIshtarMethod("i_call_String_Equal", Private | Static | Extern, ("v1", TYPE_STRING), ("v2", TYPE_STRING)) .AsNative((delegate * < CallFrame, IshtarObject * *, IshtarObject * >) & StrEqual) .AddInto(table, x => x.Name); new RuntimeIshtarMethod("i_call_String_Trim_Start", Private | Static | Extern, ("v1", TYPE_STRING)) .AsNative((delegate * < CallFrame, IshtarObject * *, IshtarObject * >) & TrimStart) .AddInto(table, x => x.Name); new RuntimeIshtarMethod("i_call_String_Trim_End", Private | Static | Extern, ("v1", TYPE_STRING)) .AsNative((delegate * < CallFrame, IshtarObject * *, IshtarObject * >) & TrimEnd) .AddInto(table, x => x.Name); new RuntimeIshtarMethod("i_call_String_fmt", Private | Static | Extern, ("template", TYPE_STRING), ("array", TYPE_ARRAY)) .AsNative((delegate * < CallFrame, IshtarObject * *, IshtarObject * >) & Fmt) .AddInto(table, x => x.Name); }
public static void InitTable(Dictionary <string, RuntimeIshtarMethod> table) { new RuntimeIshtarMethod("@_println", Public | Static | Extern, ("val", TYPE_STRING)) .AsNative((delegate * < CallFrame, IshtarObject * *, IshtarObject * >) & FPrintLn) .AddInto(table, x => x.Name); new RuntimeIshtarMethod("@_readline", Public | Static | Extern, TYPE_STRING.AsClass()) .AsNative((delegate * < CallFrame, IshtarObject * *, IshtarObject * >) & FReadLine) .AddInto(table, x => x.Name); }
public static unsafe RuntimeIshtarMethod DecodeMethod(byte[] arr, VeinClass @class, RuntimeIshtarModule ishtarModule) { using var mem = new MemoryStream(arr); using var binary = new BinaryReader(mem); var idx = binary.ReadInt32(); var flags = (MethodFlags)binary.ReadInt16(); var bodysize = binary.ReadInt32(); var stacksize = binary.ReadByte(); var locals = binary.ReadByte(); var retType = binary.ReadTypeName(ishtarModule); var args = ReadArguments(binary, ishtarModule); var body = binary.ReadBytes(bodysize); var mth = new RuntimeIshtarMethod(ishtarModule.GetConstStringByIndex(idx), flags, ishtarModule.FindType(retType, true, false), @class, args.ToArray()); if (mth.IsExtern) { return(mth); } ConstructIL(mth, body, stacksize, ishtarModule); return(mth); }
internal static unsafe void ConstructIL(RuntimeIshtarMethod method, byte[] body, short stacksize, RuntimeIshtarModule module) { var offset = 0; var body_r = ILReader.Deconstruct(body, &offset, method); var labels = ILReader.DeconstructLabels(body, &offset); var exceptions = ILReader.DeconstructExceptions(body, offset, module); method.Header.max_stack = stacksize; method.Header.exception_handler_list = exceptions; method.Header.code = (uint *)Marshal.AllocHGlobal(sizeof(uint) * body_r.opcodes.Count); for (var i = 0; i != body_r.opcodes.Count; i++) { method.Header.code[i] = body_r.opcodes[i]; } method.Header.code_size = (uint)body_r.opcodes.Count; method.Header.labels = labels; method.Header.labels_map = body_r.map.ToDictionary(x => x.Key, x => new ILLabel { opcode = x.Value.opcode, pos = x.Value.pos }); }
internal RuntimeIshtarMethod DefineMethod(string name, VeinClass returnType, MethodFlags flags, params VeinArgumentRef[] args) { var method = new RuntimeIshtarMethod(name, flags, returnType, this, args); method.Arguments.AddRange(args); if (Methods.Any(x => x.Name.Equals(method.Name))) { throw new Exception(); } Methods.Add(method); return(method); }