Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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
            });
        }
Esempio n. 5
0
        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);
        }