improve NonGC polyfill

This commit is contained in:
Volker Berlin 2019-09-14 15:22:25 +02:00
parent 9293bfa9f2
commit c8e8c09a8e
3 changed files with 17 additions and 4 deletions

View File

@ -20,10 +20,13 @@ import java.io.IOException;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import de.inetsoftware.jwebassembly.javascript.JavaScriptSyntheticFunctionName;
import de.inetsoftware.jwebassembly.module.TypeManager.StructType; import de.inetsoftware.jwebassembly.module.TypeManager.StructType;
import de.inetsoftware.jwebassembly.wasm.NamedStorageType; import de.inetsoftware.jwebassembly.wasm.NamedStorageType;
import de.inetsoftware.jwebassembly.wasm.StructOperator; import de.inetsoftware.jwebassembly.wasm.StructOperator;
import de.inetsoftware.jwebassembly.wasm.ValueType;
import de.inetsoftware.jwebassembly.wasm.VariableOperator; import de.inetsoftware.jwebassembly.wasm.VariableOperator;
import de.inetsoftware.jwebassembly.wasm.WasmOptions;
/** /**
* WasmInstruction for a function call. * WasmInstruction for a function call.
@ -44,6 +47,8 @@ class WasmCallIndirectInstruction extends WasmCallInstruction {
private final LocaleVariableManager localVariables; private final LocaleVariableManager localVariables;
private final WasmOptions options;
/** /**
* Create an instance of a function call instruction * Create an instance of a function call instruction
* *
@ -59,11 +64,12 @@ class WasmCallIndirectInstruction extends WasmCallInstruction {
* @param types * @param types
* the type manager * the type manager
*/ */
WasmCallIndirectInstruction( FunctionName name, LocaleVariableManager localVariables, int javaCodePos, int lineNumber, TypeManager types ) { WasmCallIndirectInstruction( FunctionName name, LocaleVariableManager localVariables, int javaCodePos, int lineNumber, TypeManager types, WasmOptions options ) {
super( name, javaCodePos, lineNumber, types ); super( name, javaCodePos, lineNumber, types );
this.type = types.valueOf( name.className ); this.type = types.valueOf( name.className );
this.tempVar = localVariables.getTempVariable( type, javaCodePos, javaCodePos + 1 ); this.tempVar = localVariables.getTempVariable( type, javaCodePos, javaCodePos + 1 );
this.localVariables = localVariables; this.localVariables = localVariables;
this.options = options;
} }
/** /**
@ -97,7 +103,12 @@ class WasmCallIndirectInstruction extends WasmCallInstruction {
writer.writeLocal( VariableOperator.tee, tempVarIdx ); writer.writeLocal( VariableOperator.tee, tempVarIdx );
writer.writeLocal( VariableOperator.get, tempVarIdx ); writer.writeLocal( VariableOperator.get, tempVarIdx );
writer.writeStructOperator( StructOperator.GET, type, new NamedStorageType( type, "", "vtable" ), 0 ); // vtable is ever on position 0 if( options.useGC() ) {
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.writeLoadI32( virtualFunctionIdx * 4 ); writer.writeLoadI32( virtualFunctionIdx * 4 );
writer.writeVirtualFunctionCall( getFunctionName(), type ); writer.writeVirtualFunctionCall( getFunctionName(), type );
} }

View File

@ -306,7 +306,7 @@ public abstract class WasmCodeBuilder {
* the line number in the Java source code * the line number in the Java source code
*/ */
protected void addCallVirtualInstruction( FunctionName name, int javaCodePos, int lineNumber ) { protected void addCallVirtualInstruction( FunctionName name, int javaCodePos, int lineNumber ) {
instructions.add( new WasmCallIndirectInstruction( name, localVariables, javaCodePos, lineNumber, types ) ); instructions.add( new WasmCallIndirectInstruction( name, localVariables, javaCodePos, lineNumber, types, options ) );
} }
/** /**

View File

@ -157,7 +157,9 @@ class WasmStructInstruction extends WasmInstruction {
} }
} }
if( functionName != null ) { // nonGC if( functionName != null ) { // nonGC
//TODO idx if( fieldName != null ) {
writer.writeConst( idx, ValueType.i32 );
}
writer.writeFunctionCall( functionName ); writer.writeFunctionCall( functionName );
} else { } else {
writer.writeStructOperator( op, type, fieldName, idx ); writer.writeStructOperator( op, type, fieldName, idx );