diff --git a/src/de/inetsoftware/jwebassembly/module/WasmCallIndirectInstruction.java b/src/de/inetsoftware/jwebassembly/module/WasmCallIndirectInstruction.java index 66c8baa..81c427f 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmCallIndirectInstruction.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmCallIndirectInstruction.java @@ -20,7 +20,6 @@ import java.io.IOException; import javax.annotation.Nonnull; -import de.inetsoftware.jwebassembly.javascript.JavaScriptSyntheticFunctionName; import de.inetsoftware.jwebassembly.module.TypeManager.StructType; import de.inetsoftware.jwebassembly.wasm.MemoryOperator; import de.inetsoftware.jwebassembly.wasm.NamedStorageType; @@ -123,7 +122,7 @@ class WasmCallIndirectInstruction extends WasmCallInstruction { writer.writeStructOperator( StructOperator.GET, type, new NamedStorageType( type, "", "vtable" ), 0 ); // vtable is ever on position 0 } else { writer.writeConst( 0, ValueType.i32 ); // vtable is ever on position 0 - writer.writeFunctionCall( new JavaScriptSyntheticFunctionName( "NonGC", "get_i32", () -> "(a,i) => a[i]", ValueType.anyref, ValueType.i32, null, ValueType.i32 ) ); + writer.writeFunctionCall( WasmCodeBuilder.GET_I32 ); } writer.writeMemoryOperator( MemoryOperator.load, ValueType.i32, virtualFunctionIdx * 4, 2 ); writer.writeVirtualFunctionCall( getFunctionName(), type ); diff --git a/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java b/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java index 896f3a0..c1d06f3 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmCodeBuilder.java @@ -29,6 +29,7 @@ import de.inetsoftware.classparser.LocalVariableTable; import de.inetsoftware.classparser.Member; import de.inetsoftware.classparser.MethodInfo; import de.inetsoftware.jwebassembly.WasmException; +import de.inetsoftware.jwebassembly.javascript.JavaScriptSyntheticFunctionName; import de.inetsoftware.jwebassembly.javascript.NonGC; import de.inetsoftware.jwebassembly.module.WasmInstruction.Type; import de.inetsoftware.jwebassembly.wasm.AnyType; @@ -50,6 +51,11 @@ import de.inetsoftware.jwebassembly.wasm.WasmOptions; */ public abstract class WasmCodeBuilder { + /** + * declare for frequently use of virtual call with non GC mode. + */ + static final SyntheticFunctionName GET_I32 = new JavaScriptSyntheticFunctionName( "NonGC", "get_i32", () -> "(a,i) => a[i]", ValueType.anyref, ValueType.i32, null, ValueType.i32 ); + private final LocaleVariableManager localVariables = new LocaleVariableManager(); private final List instructions = new ArrayList<>(); @@ -486,6 +492,10 @@ public abstract class WasmCodeBuilder { } virtualCall.setVariableIndexOfThis( varIndex ); instructions.add( virtualCall ); + if( !options.useGC() ) { + functions.markAsNeeded( GET_I32, true ); + functions.markAsImport( GET_I32, GET_I32.getAnnotation() ); + } } /**