diff --git a/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java b/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java index d88185a..ae09cd1 100644 --- a/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java +++ b/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java @@ -16,7 +16,6 @@ package de.inetsoftware.jwebassembly.module; import java.io.IOException; -import java.util.List; import javax.annotation.Nonnull; @@ -126,11 +125,11 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder { addConstInstruction( Integer.valueOf( byteCode.readShort() ), ValueType.i32, codePos, lineNumber ); break; case 18: // ldc - addConstInstruction( (Number)constantPool.get( byteCode.readUnsignedByte() ), codePos, lineNumber ); + addConstInstruction( constantPool.get( byteCode.readUnsignedByte() ), codePos, lineNumber ); break; case 19: // ldc_w case 20: // ldc2_w - addConstInstruction( (Number)constantPool.get( byteCode.readUnsignedShort() ), codePos, lineNumber ); + addConstInstruction( constantPool.get( byteCode.readUnsignedShort() ), codePos, lineNumber ); break; case 21: // iload addLoadStoreInstruction( ValueType.i32, true, byteCode.readUnsignedIndex( wide ), codePos, lineNumber ); diff --git a/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java b/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java index 073394c..946292d 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java @@ -17,7 +17,9 @@ package de.inetsoftware.jwebassembly.module; import java.io.IOException; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.function.Function; import javax.annotation.Nonnegative; @@ -59,6 +61,8 @@ public abstract class WasmCodeBuilder { private WasmOptions options; + private Map strings = new LinkedHashMap<>(); + /** * Initialize the code builder; * @@ -308,8 +312,17 @@ public abstract class WasmCodeBuilder { * @param lineNumber * the line number in the Java source code */ - protected void addConstInstruction( Number value, int javaCodePos, int lineNumber ) { - instructions.add( new WasmConstInstruction( value, javaCodePos, lineNumber ) ); + 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 = getNonGC( "stringConstant", lineNumber ); + addCallInstruction( name, javaCodePos, lineNumber ); + } else { + instructions.add( new WasmConstInstruction( (Number)value, javaCodePos, lineNumber ) ); + } } /**