Example #1
0
        /// <summary>
        /// Writes a textual representation of this WebAssembly file to the given text writer.
        /// Note that this representation is intended as a human-readable debugging format that may
        /// change at any time, not as a first-class textual WebAssembly module encoding.
        /// </summary>
        /// <param name="writer">The text writer use.</param>
        public void Dump(TextWriter writer)
        {
            writer.Write(
                "WebAssembly module; magic number: {0}, version number: {1}",
                DumpHelpers.FormatHex(Header.Magic),
                Header.Version);

            foreach (var section in Sections)
            {
                writer.WriteLine();
                section.Dump(writer);
            }
        }
Example #2
0
        /// <summary>
        /// Writes a textual representation of this global variable definition to the given writer.
        /// </summary>
        /// <param name="writer">The writer to which text is written.</param>
        public void Dump(TextWriter writer)
        {
            writer.Write("- Type: ");
            Type.Dump(writer);
            writer.WriteLine();
            writer.Write("- Initial value:");
            var indentedWriter = DumpHelpers.CreateIndentedTextWriter(writer);

            foreach (var instruction in InitialValue.BodyInstructions)
            {
                indentedWriter.WriteLine();
                instruction.Dump(indentedWriter);
            }
        }
Example #3
0
 /// <summary>
 /// Writes a textual representation of this name entry to the given writer.
 /// </summary>
 /// <param name="Writer">The text writer.</param>
 public virtual void Dump(TextWriter Writer)
 {
     using (var memStream = new MemoryStream())
     {
         using (var binaryWriter = new BinaryWriter(memStream))
         {
             WritePayloadTo(new BinaryWasmWriter(binaryWriter));
             memStream.Seek(0, SeekOrigin.Begin);
             Writer.WriteLine("entry kind '{0}', payload size: {1}", Kind, memStream.Length);
             var instructionWriter = DumpHelpers.CreateIndentedTextWriter(Writer);
             DumpHelpers.DumpStream(memStream, Writer);
         }
     }
 }
Example #4
0
 /// <inheritdoc/>
 public override void Dump(TextWriter writer)
 {
     writer.Write(Name.ToString());
     writer.Write("; entry point: function #");
     writer.Write(StartFunctionIndex);
     writer.WriteLine();
     if (ExtraPayload.Length > 0)
     {
         writer.Write("Extra payload size: ");
         writer.Write(ExtraPayload.Length);
         writer.WriteLine();
         DumpHelpers.DumpBytes(ExtraPayload, writer);
         writer.WriteLine();
     }
 }
Example #5
0
        /// <summary>
        /// Verifies that this version header is a WebAssembly version header for a known
        /// version.
        /// </summary>
        public void Verify()
        {
            if (Magic != WasmMagic)
            {
                throw new BadHeaderException(
                          this,
                          string.Format(
                              "Invalid magic number. Got '{0}', expected '{1}'.",
                              DumpHelpers.FormatHex(Magic),
                              DumpHelpers.FormatHex(WasmMagic)));
            }

            if (Version != PreMvpVersion && Version != MvpVersion)
            {
                throw new BadHeaderException(this, "Invalid version number '" + Version + "'.");
            }
        }
Example #6
0
        /// <summary>
        /// Writes a textual representation of this exported value to the given writer.
        /// </summary>
        /// <param name="Writer">The writer to which text is written.</param>
        public void Dump(TextWriter Writer)
        {
            Writer.Write("- Memory index: ");
            Writer.Write(MemoryIndex);
            Writer.WriteLine();
            Writer.Write("- Offset:");
            var indentedWriter = DumpHelpers.CreateIndentedTextWriter(Writer);

            foreach (var instruction in Offset.BodyInstructions)
            {
                indentedWriter.WriteLine();
                instruction.Dump(indentedWriter);
            }
            Writer.WriteLine();
            Writer.Write("- Data:");
            indentedWriter.WriteLine();
            DumpHelpers.DumpBytes(Data, indentedWriter);
        }
Example #7
0
        /// <summary>
        /// Writes a textual representation of this function body to the given writer.
        /// </summary>
        /// <param name="Writer">The writer to which text is written.</param>
        public void Dump(TextWriter Writer)
        {
            if (Locals.Count > 0)
            {
                Writer.Write("- Local entries:");
                var varEntryWriter = DumpHelpers.CreateIndentedTextWriter(Writer);
                for (int i = 0; i < Locals.Count; i++)
                {
                    varEntryWriter.WriteLine();
                    varEntryWriter.Write("#{0}: ", i);
                    Locals[i].Dump(varEntryWriter);
                }
                Writer.WriteLine();
            }
            else
            {
                Writer.WriteLine("- No local entries");
            }

            if (BodyInstructions.Count > 0)
            {
                Writer.Write("- Function body:");
                var instructionWriter = DumpHelpers.CreateIndentedTextWriter(Writer);
                foreach (var instr in BodyInstructions)
                {
                    instructionWriter.WriteLine();
                    instr.Dump(instructionWriter);
                }
                Writer.WriteLine();
            }
            else
            {
                Writer.WriteLine("- Empty function body");
            }

            if (HasExtraPayload)
            {
                Writer.Write("- Extra payload size: ");
                Writer.Write(ExtraPayload.Length);
                Writer.WriteLine();
                DumpHelpers.DumpBytes(ExtraPayload, Writer);
                Writer.WriteLine();
            }
        }
Example #8
0
        /// <summary>
        /// Writes a textual representation of this element segment to the given writer.
        /// </summary>
        /// <param name="Writer">The writer to which text is written.</param>
        public void Dump(TextWriter Writer)
        {
            Writer.Write("- Table index: ");
            Writer.Write(TableIndex);
            Writer.WriteLine();
            Writer.Write("- Offset:");
            var indentedWriter = DumpHelpers.CreateIndentedTextWriter(Writer);

            foreach (var instruction in Offset.BodyInstructions)
            {
                indentedWriter.WriteLine();
                instruction.Dump(indentedWriter);
            }
            Writer.WriteLine();
            Writer.Write("- Elements:");
            for (int i = 0; i < Elements.Count; i++)
            {
                indentedWriter.WriteLine();
                indentedWriter.Write("#{0} -> func #{1}", i, Elements[i]);
            }
        }
Example #9
0
 /// <inheritdoc/>
 public override void Dump(TextWriter writer)
 {
     writer.Write(Name.ToString());
     writer.Write("; number of entries: ");
     writer.Write(FunctionTypes.Count);
     writer.WriteLine();
     for (int i = 0; i < FunctionTypes.Count; i++)
     {
         writer.Write("#");
         writer.Write(i);
         writer.Write(" -> ");
         FunctionTypes[i].Dump(writer);
         writer.WriteLine();
     }
     if (ExtraPayload.Length > 0)
     {
         writer.Write("Extra payload size: ");
         writer.Write(ExtraPayload.Length);
         writer.WriteLine();
         DumpHelpers.DumpBytes(ExtraPayload, writer);
         writer.WriteLine();
     }
 }
Example #10
0
 /// <inheritdoc/>
 public override void Dump(TextWriter Writer)
 {
     Writer.Write(Name.ToString());
     Writer.Write("; number of entries: ");
     Writer.Write(Memories.Count);
     Writer.WriteLine();
     for (int i = 0; i < Memories.Count; i++)
     {
         Writer.Write("#");
         Writer.Write(i);
         Writer.Write(" -> ");
         Memories[i].Dump(Writer);
         Writer.WriteLine();
     }
     if (ExtraPayload.Length > 0)
     {
         Writer.Write("Extra payload size: ");
         Writer.Write(ExtraPayload.Length);
         Writer.WriteLine();
         DumpHelpers.DumpBytes(ExtraPayload, Writer);
         Writer.WriteLine();
     }
 }
Example #11
0
        /// <inheritdoc/>
        public override void Dump(TextWriter Writer)
        {
            Writer.Write(Name.ToString());
            Writer.Write("; number of entries: ");
            Writer.Write(Bodies.Count);
            Writer.WriteLine();
            var indentedWriter = DumpHelpers.CreateIndentedTextWriter(Writer);

            for (int i = 0; i < Bodies.Count; i++)
            {
                Writer.Write("#{0}: ", i);
                indentedWriter.WriteLine();
                Bodies[i].Dump(indentedWriter);
            }
            if (ExtraPayload.Length > 0)
            {
                Writer.Write("Extra payload size: ");
                Writer.Write(ExtraPayload.Length);
                Writer.WriteLine();
                DumpHelpers.DumpBytes(ExtraPayload, Writer);
                Writer.WriteLine();
            }
        }
Example #12
0
        /// <summary>
        /// Writes a textual representation of this exported value to the given writer.
        /// </summary>
        /// <param name="writer">The writer to which text is written.</param>
        public void Dump(TextWriter writer)
        {
            writer.Write("func(");
            for (int i = 0; i < ParameterTypes.Count; i++)
            {
                if (i > 0)
                {
                    writer.Write(", ");
                }

                DumpHelpers.DumpWasmType(ParameterTypes[i], writer);
            }
            writer.Write(") returns (");
            for (int i = 0; i < ReturnTypes.Count; i++)
            {
                if (i > 0)
                {
                    writer.Write(", ");
                }

                DumpHelpers.DumpWasmType(ReturnTypes[i], writer);
            }
            writer.Write(")");
        }
Example #13
0
 /// <summary>
 /// Writes a textual representation of this local entry to the given writer.
 /// </summary>
 /// <param name="Writer">The writer to which text is written.</param>
 public void Dump(TextWriter Writer)
 {
     Writer.Write(LocalCount);
     Writer.Write(" x ");
     DumpHelpers.DumpWasmType(LocalType, Writer);
 }