Esempio n. 1
0
    public static DyNativeFunction Create(FunSym sym, int unitId, int funcId, FastList <DyObject[]> captures, DyObject[] locals, int varArgIndex = -1)
    {
        var vars = new FastList <DyObject[]>(captures)
        {
            locals
        };

        return(new(sym, unitId, funcId, vars, varArgIndex));
    }
Esempio n. 2
0
        private static void ReadSymbols(BinaryReader reader, Unit unit)
        {
            var di = new DebugInfo();

            unit.Symbols = di;
            di.File      = reader.ReadString();

            var scopes = reader.ReadInt32();

            for (var i = 0; i < scopes; i++)
            {
                var s = new ScopeSym();
                s.Index       = reader.ReadInt32();
                s.ParentIndex = reader.ReadInt32();
                s.StartOffset = reader.ReadInt32();
                s.EndOffset   = reader.ReadInt32();
                s.StartLine   = reader.ReadInt32();
                s.StartColumn = reader.ReadInt32();
                s.EndLine     = reader.ReadInt32();
                s.EndColumn   = reader.ReadInt32();
                di.Scopes.Add(s);
            }

            var lines = reader.ReadInt32();

            for (var i = 0; i < lines; i++)
            {
                var l = new LineSym();
                l.Offset = reader.ReadInt32();
                l.Line   = reader.ReadInt32();
                l.Column = reader.ReadInt32();
                di.Lines.Add(l);
            }

            var vars = reader.ReadInt32();

            for (var i = 0; i < vars; i++)
            {
                var v = new VarSym();
                v.Name    = reader.ReadString();
                v.Address = reader.ReadInt32();
                v.Offset  = reader.ReadInt32();
                v.Scope   = reader.ReadInt32();
                v.Flags   = reader.ReadInt32();
                v.Data    = reader.ReadInt32();
                di.Vars.Add(v);
            }

            var funs = reader.ReadInt32();

            for (var i = 0; i < funs; i++)
            {
                var f = new FunSym();
                f.Name        = reader.ReadString();
                f.Handle      = reader.ReadInt32();
                f.StartOffset = reader.ReadInt32();
                f.EndOffset   = reader.ReadInt32();

                var pars = reader.ReadInt32();
                f.Parameters = new Par[pars];
                for (var j = 0; j < pars; j++)
                {
                    var name  = reader.ReadString();
                    var va    = reader.ReadBoolean();
                    var value = ObjectFile.DeserializeObject(reader);
                    var p     = new Par(name, value, va);
                    f.Parameters[j] = p;
                }

                di.Functions.Add(f.Handle, f);
            }
        }
Esempio n. 3
0
 private static string GetFunName(FunSym funSym)
 {
     if (funSym.Name is not null && funSym.TypeName is not null)
     {
         return($"{funSym.TypeName}.{funSym.Name}");
     }
Esempio n. 4
0
        private CodeFrame Read(BinaryReader bw)
        {
            var frame = new CodeFrame();

            frame.GlobalScope = new Scope(false, null);
            var v = bw.ReadInt32();

            if (v != Version)
            {
                throw new ElaLinkerException(Strings.GetMessage("InvalidObjectFile", Version), null);
            }

            bw.ReadInt32(); //Version: Major
            bw.ReadInt32(); //Version: Minor
            bw.ReadInt32(); //Version: Build
            bw.ReadInt32(); //Version: Revision
            bw.ReadInt64(); //Version: Date stamp

            var c = bw.ReadInt32();

            for (var i = 0; i < c; i++)
            {
                var alias   = bw.ReadString();
                var modName = bw.ReadString();
                var dllName = bw.ReadString();
                dllName = dllName.Length == 0 ? null : dllName;
                var qual = bw.ReadBoolean();
                var pl   = bw.ReadInt32();
                var list = new string[pl];

                for (var j = 0; j < pl; j++)
                {
                    list[j] = bw.ReadString();
                }

                var lh = bw.ReadInt32();
                frame.AddReference(alias, new ModuleReference(frame, modName, dllName, list, 0, 0, qual, lh));
            }

            c = bw.ReadInt32();

            for (var i = 0; i < c; i++)
            {
                frame.GlobalScope.Locals.Add(bw.ReadString(),
                                             new ScopeVar((ElaVariableFlags)bw.ReadInt32(), bw.ReadInt32(), bw.ReadInt32()));
            }

            c = bw.ReadInt32();

            for (var i = 0; i < c; i++)
            {
                frame.LateBounds.Add(new LateBoundSymbol(
                                         bw.ReadString(), bw.ReadInt32(), bw.ReadInt32(), bw.ReadInt32(), bw.ReadInt32(),
                                         bw.ReadInt32()));
            }

            c = bw.ReadInt32();

            for (var i = 0; i < c; i++)
            {
                var l = new MemoryLayout(bw.ReadInt32(), bw.ReadInt32(), bw.ReadInt32());
                frame.Layouts.Add(l);
            }

            c = bw.ReadInt32();

            for (var i = 0; i < c; i++)
            {
                frame.Strings.Add(bw.ReadString());
            }

            c = bw.ReadInt32();

            for (var i = 0; i < c; i++)
            {
                var opCode = (Op)bw.ReadByte();
                frame.Ops.Add(opCode);
                frame.OpData.Add(OpSizeHelper.OpSize[(Int32)opCode] > 1 ? bw.ReadInt32() : 0);
            }

            c = bw.ReadInt32();

            for (var i = 0; i < c; i++)
            {
                frame.InternalTypes.Add(bw.ReadString(), bw.ReadInt32());
            }

            c = bw.ReadInt32();

            for (var i = 0; i < c; i++)
            {
                var k   = bw.ReadString();
                var cc  = bw.ReadInt32();
                var mbr = new ElaClassMember[cc];

                for (var j = 0; j < cc; j++)
                {
                    var m = new ElaClassMember();
                    m.Components = bw.ReadInt32();
                    m.Mask       = bw.ReadInt32();
                    m.Name       = bw.ReadString();
                    mbr[j]       = m;
                }

                frame.InternalClasses.Add(k, new ClassData(mbr));
            }

            c = bw.ReadInt32();

            for (var i = 0; i < c; i++)
            {
                frame.InternalInstances.Add(new InstanceData(
                                                bw.ReadString(),
                                                bw.ReadString(),
                                                bw.ReadInt32(),
                                                bw.ReadInt32(),
                                                bw.ReadInt32(),
                                                bw.ReadInt32()));
            }

            c = bw.ReadInt32();

            for (var i = 0; i < c; i++)
            {
                var ct = new ConstructorData
                {
                    Code         = -1,
                    Name         = bw.ReadString(),
                    TypeName     = bw.ReadString(),
                    TypeModuleId = bw.ReadInt32()
                };
                var cc = bw.ReadInt32();

                if (cc > 0)
                {
                    ct.Parameters = new List <String>();

                    for (var j = 0; j < cc; j++)
                    {
                        ct.Parameters.Add(bw.ReadString());
                    }
                }

                frame.InternalConstructors.Add(ct);
            }

            var di = bw.ReadBoolean();

            if (di)
            {
                var sym = new DebugInfo();

                c = bw.ReadInt32();

                for (var i = 0; i < c; i++)
                {
                    var ln = new LineSym(bw.ReadInt32(), bw.ReadInt32(), bw.ReadInt32());
                    sym.Lines.Add(ln);
                }

                c = bw.ReadInt32();

                for (var i = 0; i < c; i++)
                {
                    var fn = new FunSym(bw.ReadString(), bw.ReadInt32(), bw.ReadInt32());
                    fn.Handle    = bw.ReadInt32();
                    fn.EndOffset = bw.ReadInt32();
                    sym.Functions.Add(fn);
                }

                frame.Symbols = sym;
            }

            return(frame);
        }