From 5eed2c2e79abddd6edcd1f28d21d1c7bb89f9c29 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Sat, 7 Mar 2020 18:35:52 +0100 Subject: [PATCH] write the class name of all classes in the wasm file for later use --- .../jwebassembly/module/StringManager.java | 15 +++++++++++++++ .../jwebassembly/module/TypeManager.java | 7 +++++-- .../jwebassembly/module/WasmCodeBuilder.java | 3 --- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/module/StringManager.java b/src/de/inetsoftware/jwebassembly/module/StringManager.java index 0f3a82e..bbe833d 100644 --- a/src/de/inetsoftware/jwebassembly/module/StringManager.java +++ b/src/de/inetsoftware/jwebassembly/module/StringManager.java @@ -57,6 +57,21 @@ class StringManager extends LinkedHashMap { this.functions = options.functions; } + /** + * Get the positive id for the string. + * + * @param str + * the string + * @return the id + */ + public Integer get( @Nonnull Object str ) { + Integer id = super.get( str ); + if( id == null ) { + put( (String)str, id = size() ); + } + return id; + } + /** * Get the function name object for the {@link #stringConstant(int)}. * diff --git a/src/de/inetsoftware/jwebassembly/module/TypeManager.java b/src/de/inetsoftware/jwebassembly/module/TypeManager.java index 085a136..0e0e927 100644 --- a/src/de/inetsoftware/jwebassembly/module/TypeManager.java +++ b/src/de/inetsoftware/jwebassembly/module/TypeManager.java @@ -57,7 +57,7 @@ public class TypeManager { *
  • offset of interface call table (itable) *
  • offset of instanceof list */ - private static final int VTABLE_FIRST_FUNCTION_INDEX = 2; + private static final int VTABLE_FIRST_FUNCTION_INDEX = 3; private Map structTypes = new LinkedHashMap<>(); @@ -220,7 +220,7 @@ public class TypeManager { * * @author Volker Berlin */ - public static class StructType implements AnyType { + public class StructType implements AnyType { private final String name; @@ -446,6 +446,9 @@ public class TypeManager { data.writeInt32( type.getClassIndex() ); } + int classNameIdx = options.strings.get( getName().replace( '/', '.' ) ); + header.writeInt32( classNameIdx ); // string id of the className + data.writeTo( dataStream ); } diff --git a/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java b/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java index 4bd2afd..e2cc439 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java @@ -395,9 +395,6 @@ public abstract class WasmCodeBuilder { protected void addConstInstruction( Object value, int javaCodePos, int lineNumber ) { if( value.getClass() == String.class ) { Integer id = strings.get( value ); - if( id == null ) { - strings.put( (String)value, id = strings.size() ); - } FunctionName name = strings.getStringConstantFunction(); instructions.add( new WasmConstInstruction( id, ValueType.i32, javaCodePos, lineNumber ) ); addCallInstruction( name, javaCodePos, lineNumber );