Exemple #1
0
        public void Write(SwfWriter writer)
        {
            writer.ABC = this;
            var ver = Version;

            writer.WriteUInt16((ushort)ver.Minor);
            writer.WriteUInt16((ushort)ver.Major);
            if (ver.Major == CurrentMajor && ver.Minor == CurrentMinor)
            {
                IntPool.Write(writer);
                UIntPool.Write(writer);
                DoublePool.Write(writer);
                StringPool.Write(writer);
                Namespaces.Write(writer);
                NamespaceSets.Write(writer);
                Multinames.Write(writer);

                Methods.Write(writer);
                Metadata.Write(writer);

                int n = Instances.Count;
                writer.WriteUIntEncoded((uint)n);
                Instances.Write(writer);
                Classes.Write(writer);

                Scripts.Write(writer);
                MethodBodies.Write(writer);
            }
            else
            {
                throw new NotImplementedException();
            }
        }
Exemple #2
0
        public void AddMethod(AbcMethod method)
        {
            if (method == null)
            {
                throw new ArgumentNullException("method");
            }
            Methods.Add(method);
            var body = method.Body;

            if (body != null)
            {
                MethodBodies.Add(body);
            }
        }
Exemple #3
0
        public void Read(SwfReader reader)
        {
            reader.ABC = this;
            int minor = reader.ReadUInt16();
            int major = reader.ReadUInt16();

            _version = new Version(major, minor);
            if (minor == CurrentMinor && major == CurrentMajor)
            {
                //NOTE: The "0" entry of each constant pool is not used.  If the count for a given pool says there are
                //NOTE: "n" entries in the pool, there are "n-1" entries in the file, corresponding to indices 1..(n-1).
                IntPool.Read(reader);
                UIntPool.Read(reader);

                SwfReader.CheckU30 = true;
                DoublePool.Read(reader);
                StringPool.Read(reader);
                Namespaces.Read(reader);
                NamespaceSets.Read(reader);
                Multinames.Read(reader);
                Methods.Read(reader);
                Metadata.Read(reader);

                int n = (int)reader.ReadUIntEncoded();
                Instances.Read(n, reader);
                Classes.Read(n, reader);
                for (int i = 0; i < n; ++i)
                {
                    var klass    = Classes[i];
                    var instance = Instances[i];
                    instance.Class             = klass;
                    klass.Instance             = instance;
                    klass.Initializer.Instance = instance;
                }

                Scripts.Read(reader);
                MethodBodies.Read(reader);
                SwfReader.CheckU30 = false;
            }
            else
            {
                throw new NotImplementedException();
            }
        }
Exemple #4
0
        public IEnumerable <AbcTrait> GetTraits(AbcTraitOwner owners)
        {
            var allTraits = Enumerable.Empty <AbcTrait>();

            if ((owners & AbcTraitOwner.Instance) != 0)
            {
                var traits = Instances.SelectMany(x => x.Traits.Concat(x.Class.Traits));
                allTraits = allTraits.Concat(traits);
            }
            if ((owners & AbcTraitOwner.Script) != 0)
            {
                var traits = Scripts.SelectMany(x => x.Traits);
                allTraits = allTraits.Concat(traits);
            }
            if ((owners & AbcTraitOwner.MethodBody) != 0)
            {
                var traits = MethodBodies.SelectMany(x => x.Traits);
                allTraits = allTraits.Concat(traits);
            }
            return(allTraits);
        }
Exemple #5
0
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                _input.Dispose();
                _classesCache.Clear();

                Methods.Clear();
                Metadata.Clear();
                Instances.Clear();
                Classes.Clear();
                Scripts.Clear();
                MethodBodies.Clear();

                Pool.Integers.Clear();
                Pool.UIntegers.Clear();
                Pool.Doubles.Clear();
                Pool.Strings.Clear();
                Pool.Namespaces.Clear();
                Pool.NamespaceSets.Clear();
                Pool.Multinames.Clear();
            }
        }
Exemple #6
0
        private AbcMethodBody ImportMethodBody(AbcMethodBody from, AbcMethod method)
        {
            if (from.ImportedBody != null)
            {
                return(from.ImportedBody);
            }

            var body = new AbcMethodBody(method);

            from.ImportedBody  = body;
            body.MaxStackDepth = from.MaxStackDepth;
            body.LocalCount    = from.LocalCount;
            body.MinScopeDepth = from.MinScopeDepth;
            body.MaxScopeDepth = from.MaxScopeDepth;
            MethodBodies.Add(body);

            ImportTraits(from, body);
            ImportExceptions(body, from);
            ImportIL(body, from);
            body.TranslateIndices();
            body.ResolveExceptionOffsets(this);

            return(body);
        }
Exemple #7
0
        private void BuildMethod(IMethodSymbol method, CCodeUnit unit)
        {
            if (method.MethodKind == MethodKind.Ordinary && method.IsStatic && method.Name == "Main")
            {
                unit.MainMethod = method;
            }

            var key = ((MethodSymbol)method).ToKeyString();
            SourceMethodSymbol sourceMethod;
            var            sourceMethodFound = this.SourceMethodByMethodSymbol.TryGetValue(key, out sourceMethod);
            BoundStatement boundStatement;
            var            boundStatementFound = this.BoundBodyByMethodSymbol.TryGetValue(key, out boundStatement);

            if (!sourceMethodFound && !boundStatementFound && method.MethodKind == MethodKind.Constructor)
            {
                // ignore empty constructor as they should call Object.ctor() only which is empty
                unit.Declarations.Add(new CCodeMethodDeclaration(unit.Type, method));
                unit.Definitions.Add(new CCodeMethodDefinition(method));
                return;
            }

            Debug.Assert(sourceMethodFound || boundStatementFound, "MethodBodyOpt information can't be found");

            unit.Declarations.Add(new CCodeMethodDeclaration(unit.Type, method));
            var methodSymbol       = sourceMethodFound ? sourceMethod : method;
            var requiresCompletion = sourceMethod != null && sourceMethod.RequiresCompletion;

            // so in case of Delegates you need to complete methods yourself
            if (boundStatement != null && !ExcludeBodies(method))
            {
                unit.Definitions.Add(new CCodeMethodDefinition(method)
                {
                    BoundBody = boundStatement
                });
            }
            else if (requiresCompletion && methodSymbol.ContainingType.TypeKind == TypeKind.Delegate && !methodSymbol.IsAbstract)
            {
                MethodBody body;
                switch (methodSymbol.Name)
                {
                case "BeginInvoke":
                    body = MethodBodies.ReturnNull(method);
                    break;

                case "Invoke":
                    body = MethodBodies.ReturnDefault(method);
                    break;

                case "EndInvoke":
                    body = MethodBodies.ReturnDefault(method);
                    break;

                default:
                    body = MethodBodies.Throw(method);
                    break;
                }

                unit.Definitions.Add(
                    new CCodeMethodDefinition(method)
                {
                    MethodBodyOpt = body
                });
            }
            else
            {
#if GENERATE_STUBS
                if (methodSymbol.ContainingType.TypeKind != TypeKind.Interface &&
                    !methodSymbol.IsAbstract &&
                    !methodSymbol.IsExternDeclaration())
                {
                    unit.Definitions.Add(
                        new CCodeMethodDefinition(method)
                    {
                        IsStub        = true,
                        MethodBodyOpt = MethodBodies.Throw(method)
                    });
                }
#endif
            }
        }