get_i32 must mark as used if used for field access

This commit is contained in:
Volker Berlin 2019-12-23 20:56:12 +01:00
parent 5c3536ffd3
commit 371cde8c0e
2 changed files with 11 additions and 2 deletions

View File

@ -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 );

View File

@ -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<WasmInstruction> 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() );
}
}
/**