Adapt some GC changes

This commit is contained in:
Volker Berlin 2020-06-13 19:51:33 +02:00
parent 9469d6d334
commit 890b3ec0df
10 changed files with 30 additions and 14 deletions

View File

@ -1394,7 +1394,7 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod
break; break;
case NULL: case NULL:
opCode = REF_NULL; opCode = REF_NULL;
type = ValueType.externref; type = options.useGC() ? ValueType.anyref : ValueType.externref;
break; break;
default: default:
throw new Error( "Unknown operator: " + op ); throw new Error( "Unknown operator: " + op );

View File

@ -459,7 +459,7 @@ interface InstructionOpcodes {
/** converts a nullable reference to a non-nullable one or branches if null */ /** converts a nullable reference to a non-nullable one or branches if null */
static final int BR_ON_NULL = 0xD4; static final int BR_ON_NULL = 0xD4;
static final int REF_EQ = 0xF0; static final int REF_EQ = 0xD5;
// === Non-trapping float-to-int conversions ====== https://github.com/WebAssembly/design/issues/1143 // === Non-trapping float-to-int conversions ====== https://github.com/WebAssembly/design/issues/1143

View File

@ -98,7 +98,8 @@ class WasmOutputStream extends LittleEndianOutputStream {
public void writeRefValueType( AnyType type ) throws IOException { public void writeRefValueType( AnyType type ) throws IOException {
if( type.isRefType() ) { if( type.isRefType() ) {
if( options.useGC() ) { if( options.useGC() ) {
writeValueType( ValueType.ref_type ); //TODO writeValueType( ValueType.ref_type );
type = ValueType.anyref;
} else { } else {
type = ValueType.externref; type = ValueType.externref;
} }

View File

@ -275,11 +275,15 @@ public class ModuleGenerator {
*/ */
public void prepareFinish() throws IOException { public void prepareFinish() throws IOException {
int functCount; int functCount;
int typeCount = 0;
do { do {
scanFunctions(); scanFunctions();
functCount = functions.size(); // scan the functions can find new needed types functCount = functions.size(); // scan the functions can find new needed types
scanForClinit(); scanForClinit();
types.scanTypeHierarchy( classFileLoader ); // scan the type hierarchy can find new functions if( typeCount < types.size() ) {
types.scanTypeHierarchy( classFileLoader ); // scan the type hierarchy can find new functions
typeCount = types.size();
}
} while( functCount < functions.size() ); } while( functCount < functions.size() );
// write only the needed imports to the output // write only the needed imports to the output
@ -318,7 +322,13 @@ public class ModuleGenerator {
writeMethodSignature( name, FunctionType.Abstract, null ); writeMethodSignature( name, FunctionType.Abstract, null );
} }
JWebAssembly.LOGGER.fine( "scan finsih" ); // scan again if there are new types
if( typeCount < types.size() ) {
types.scanTypeHierarchy( classFileLoader );
typeCount = types.size();
}
JWebAssembly.LOGGER.fine( "scan finish" );
types.prepareFinish( writer, classFileLoader ); types.prepareFinish( writer, classFileLoader );
functions.prepareFinish(); functions.prepareFinish();
strings.prepareFinish( writer ); strings.prepareFinish( writer );

View File

@ -99,7 +99,7 @@ public class TypeManager {
private boolean isFinish; private boolean isFinish;
private final WasmOptions options; final WasmOptions options;
private int typeTableOffset; private int typeTableOffset;
@ -783,7 +783,7 @@ public class TypeManager {
@Override @Override
public boolean isSubTypeOf( AnyType type ) { public boolean isSubTypeOf( AnyType type ) {
//TODO if type is StructType (class or interface) //TODO if type is StructType (class or interface)
return type == this || type == ValueType.externref; return type == this || type == ValueType.externref || type == ValueType.anyref;
} }
/** /**

View File

@ -46,6 +46,8 @@ class WasmStructInstruction extends WasmInstruction {
private SyntheticFunctionName functionName; private SyntheticFunctionName functionName;
private final WasmOptions options;
/** /**
* Create an instance of numeric operation. * Create an instance of numeric operation.
* *
@ -70,6 +72,7 @@ class WasmStructInstruction extends WasmInstruction {
if( type != null && fieldName != null ) { if( type != null && fieldName != null ) {
type.useFieldName( fieldName ); type.useFieldName( fieldName );
} }
this.options = types.options;
} }
/** /**
@ -200,7 +203,7 @@ class WasmStructInstruction extends WasmInstruction {
AnyType getPushValueType() { AnyType getPushValueType() {
switch( op ) { switch( op ) {
case NULL: case NULL:
return ValueType.externref; return options.useGC() ? ValueType.anyref : ValueType.externref;
case NEW: case NEW:
case NEW_DEFAULT: case NEW_DEFAULT:
case CAST: case CAST:

View File

@ -316,7 +316,8 @@ public class TextModuleWriter extends ModuleWriter {
if( !type.isRefType() ) { if( !type.isRefType() ) {
output.append( type.toString() ); output.append( type.toString() );
} else if( options.useGC() ) { } else if( options.useGC() ) {
output.append( "(optref " ).append( normalizeName( type.toString() ) ).append( ')' ); output.append( ValueType.anyref.toString() );
//TODO output.append( "(optref " ).append( normalizeName( type.toString() ) ).append( ')' );
} else { } else {
output.append( ValueType.externref.toString() ); output.append( ValueType.externref.toString() );
} }
@ -858,7 +859,7 @@ public class TextModuleWriter extends ModuleWriter {
operation = "struct.set"; operation = "struct.set";
break; break;
case NULL: case NULL:
operation = "ref.null extern"; operation = options.useGC() ? "ref.null any" : "ref.null extern";
type = null; type = null;
break; break;
default: default:

View File

@ -28,6 +28,7 @@ public enum ValueType implements AnyType {
i16(-0x07), //TODO dummy value for https://github.com/WebAssembly/gc i16(-0x07), //TODO dummy value for https://github.com/WebAssembly/gc
funcref(-0x10), funcref(-0x10),
externref(-0x11), externref(-0x11),
anyref(-0x12),
ref_type(-0x13 ), // 0x6D https://github.com/lars-t-hansen/moz-gc-experiments/blob/master/version2.md ref_type(-0x13 ), // 0x6D https://github.com/lars-t-hansen/moz-gc-experiments/blob/master/version2.md
exnref(-0x18), // https://github.com/WebAssembly/exception-handling/blob/master/proposals/Exceptions.md exnref(-0x18), // https://github.com/WebAssembly/exception-handling/blob/master/proposals/Exceptions.md
func(-0x20), func(-0x20),

View File

@ -29,9 +29,9 @@ import de.inetsoftware.jwebassembly.module.TypeManager;
public class ValueTypeParser implements Iterator<AnyType> { public class ValueTypeParser implements Iterator<AnyType> {
private final String sig; private final String sig;
private int idx; private int idx;
private TypeManager types; private final TypeManager types;
/** /**
* Create a new parser. * Create a new parser.
@ -85,7 +85,7 @@ public class ValueTypeParser implements Iterator<AnyType> {
int idx2 = sig.indexOf( ';', idx ); int idx2 = sig.indexOf( ';', idx );
String name = sig.substring( idx, idx2 ); String name = sig.substring( idx, idx2 );
idx = idx2 + 1; idx = idx2 + 1;
return "java/lang/Object".equals( name ) ? ValueType.externref : types.valueOf( name ); return types.valueOf( name );
case 'Z': // boolean case 'Z': // boolean
case 'B': // byte case 'B': // byte
return isArray ? ValueType.i8 : ValueType.i32; return isArray ? ValueType.i8 : ValueType.i32;

View File

@ -57,7 +57,7 @@ public class StructsGC extends AbstractBaseTest {
@Test @Test
public void test() { public void test() {
Assume.assumeFalse( getScriptEngine().name().startsWith( "SpiderMonkey" ) ); //TODO Assume.assumeFalse( true ); //TODO
super.test(); super.test();
} }