From 1dd644b67ac4c748a7f8760c166c020524b79e05 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Sat, 2 Nov 2019 18:59:09 +0100 Subject: [PATCH] Generalize the writing of the export section for future improvements --- .../binary/BinaryModuleWriter.java | 30 +--------- .../jwebassembly/binary/ExportEntry.java | 59 +++++++++++++++++++ 2 files changed, 62 insertions(+), 27 deletions(-) create mode 100644 src/de/inetsoftware/jwebassembly/binary/ExportEntry.java diff --git a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java index f003855..2ed8258 100644 --- a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java @@ -74,7 +74,7 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod private Map globals = new LinkedHashMap<>(); - private Map exports = new LinkedHashMap<>(); + private List exports = new ArrayList<>(); private Map imports = new LinkedHashMap<>(); @@ -129,7 +129,7 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod writeMemorySection(); writeSection( SectionType.Global, globals.values() ); writeEventSection(); - writeExportSection(); + writeSection( SectionType.Export, exports ); writeElementSection(); writeCodeSection(); writeDataSection(); @@ -225,30 +225,6 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod } } - /** - * Write the export section to the output. This section contains a mapping from the external index to the type signature index. - * - * @throws IOException - * if any I/O error occur - */ - private void writeExportSection() throws IOException { - int count = exports.size(); - if( count > 0 ) { - WasmOutputStream stream = new WasmOutputStream(); - stream.writeVaruint32( count ); - for( Map.Entry entry : exports.entrySet() ) { - String exportName = entry.getKey(); - byte[] bytes = exportName.getBytes( StandardCharsets.UTF_8 ); - stream.writeVaruint32( bytes.length ); - stream.write( bytes ); - stream.writeVaruint32( ExternalKind.Function.ordinal() ); - int id = functions.get( entry.getValue() ).id; - stream.writeVaruint32( id ); - } - wasm.writeSection( SectionType.Export, stream ); - } - } - /** * Write element section. This section create a matching between direct and indirect function call IDs. * @@ -514,7 +490,7 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod */ @Override protected void writeExport( FunctionName name, String exportName ) throws IOException { - exports.put( exportName, name.signatureName ); + exports.add( new ExportEntry( exportName, ExternalKind.Function, getFunction( name ).id ) ); } /** diff --git a/src/de/inetsoftware/jwebassembly/binary/ExportEntry.java b/src/de/inetsoftware/jwebassembly/binary/ExportEntry.java new file mode 100644 index 0000000..8f9f9dd --- /dev/null +++ b/src/de/inetsoftware/jwebassembly/binary/ExportEntry.java @@ -0,0 +1,59 @@ +/* + * Copyright 2019 Volker Berlin (i-net software) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.inetsoftware.jwebassembly.binary; + +import java.io.IOException; + +/** + * An entry in the function section of the WebAssembly. + * + * @author Volker Berlin + */ +class ExportEntry extends SectionEntry { + + private String name; + + private ExternalKind kind; + + private int id; + + /** + * Create an entry for the export section. This section contains a mapping from the external index to the type + * signature index. + * + * @param name + * the exported name + * @param kind + * the type of exported object + * @param id + * the id inside the list of the related type + */ + ExportEntry( String name, ExternalKind kind, int id ) { + this.name = name; + this.kind = kind; + this.id = id; + } + + /** + * {@inheritDoc} + */ + @Override + void writeSectionEntry( WasmOutputStream stream ) throws IOException { + stream.writeString( name ); + stream.writeVaruint32( kind.ordinal() ); + stream.writeVaruint32( id ); + } +}