Beispiel #1
0
        //Compiles class member - function or constant
        private void CompileMember(ElaClassMember m)
        {
            //Each class function should a mask with at least one entry of a type parameter
            if (m.Mask == 0)
            {
                AddError(ElaCompilerError.InvalidMemberSignature, m, m.Name);
            }

            //Class member can be a constant or a function
            var isConst = m.Components == 1;

            //m.Components are function arguments plus return type.
            var addr = AddVariable(m.Name, m, ElaVariableFlags.ClassFun | (m.Components > 1?ElaVariableFlags.Function:ElaVariableFlags.None)
                                   | (isConst ? ElaVariableFlags.Polyadric : ElaVariableFlags.None), m.Components - 1);

            if (!isConst) //This is a function
            {
                cw.Emit(Op.PushI4, m.Components - 1);
                cw.Emit(Op.PushI4, m.Mask);
                cw.Emit(Op.Newfunc, AddString(m.Name));
            }
            else //This is a polymorphic constant
            {
                cw.Emit(Op.Newconst, AddString(m.Name));
            }

            PopVar(addr);
        }
Beispiel #2
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);
        }