From cc4a5e7858692af4ff792ae075dad957d5382467 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Wed, 11 Mar 2020 19:55:59 +0100 Subject: [PATCH] add table for classes --- .../binary/BinaryModuleWriter.java | 18 ++++++++++++++++-- .../jwebassembly/module/TypeManager.java | 9 +++++++++ .../jwebassembly/module/WasmOptions.java | 2 +- .../jwebassembly/text/TextModuleWriter.java | 7 +++++++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java index 45f501d..91c2a81 100644 --- a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java @@ -169,16 +169,23 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod */ private void writeTableSection() throws IOException { int stringCount = getStringCount(); + int typeCount = options.types.size(); if( !callIndirect && stringCount == 0 ) { return; } - int elemCount = callIndirect ? imports.size() + functions.size() : 0; WasmOutputStream stream = new WasmOutputStream(); - int count = stringCount == 0 ? 1 : 2; + int count = 1; + if( stringCount > 0 ) { + count++; + } + if( typeCount > 0 ) { + count++; + } stream.writeVaruint32( count ); // count of tables // indirect function table + int elemCount = callIndirect ? imports.size() + functions.size() : 0; stream.writeValueType( ValueType.funcref ); // the type of elements stream.writeVaruint32( 0 ); // flags; 1-maximum is available, 0-no maximum value available stream.writeVaruint32( elemCount ); // initial length @@ -191,6 +198,13 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod stream.writeVaruint32( stringCount ); // initial length } + // table with classes + if( count >= 3 ) { + stream.writeValueType( ValueType.anyref ); // the type of elements + stream.writeVaruint32( 0 ); // flags; 1-maximum is available, 0-no maximum value available + stream.writeVaruint32( typeCount ); // initial length + } + wasm.writeSection( SectionType.Table, stream ); } diff --git a/src/de/inetsoftware/jwebassembly/module/TypeManager.java b/src/de/inetsoftware/jwebassembly/module/TypeManager.java index 1bbf816..82c82d1 100644 --- a/src/de/inetsoftware/jwebassembly/module/TypeManager.java +++ b/src/de/inetsoftware/jwebassembly/module/TypeManager.java @@ -82,6 +82,15 @@ public class TypeManager { this.options = options; } + /** + * Count of used types + * + * @return the count + */ + public int size() { + return structTypes.size(); + } + /** * Finish the prepare and write the types. Now no new types and functions should be added. * diff --git a/src/de/inetsoftware/jwebassembly/module/WasmOptions.java b/src/de/inetsoftware/jwebassembly/module/WasmOptions.java index 0335ac7..da59b4d 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmOptions.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmOptions.java @@ -37,7 +37,7 @@ public class WasmOptions { final FunctionManager functions = new FunctionManager(); - final TypeManager types = new TypeManager( this ); + public final TypeManager types = new TypeManager( this ); final StringManager strings = new StringManager( this ); diff --git a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java index 54aa3c1..d0d0d8e 100644 --- a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java @@ -157,6 +157,13 @@ public class TextModuleWriter extends ModuleWriter { textOutput.append( "(table " ).append( Integer.toString( stringCount ) ).append( " anyref)" ); } + // table with classes + int typeCount = options.types.size(); + if( typeCount > 0 ) { + newline( textOutput ); + textOutput.append( "(table " ).append( Integer.toString( typeCount ) ).append( " anyref)" ); + } + int dataSize = dataStream.size(); if( dataSize > 0 ) { int pages = (dataSize + 0xFFFF) / 0x10000;