diff --git a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java index a5490c3..38e8a19 100644 --- a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java @@ -1385,6 +1385,8 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod switch(op) { case NEW: case NEW_DEFAULT: + codeStream.writeOpCode( RTT_CANON ); + codeStream.writeValueType( type ); opCode = STRUCT_NEW; break; case GET: diff --git a/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java b/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java index fea2862..03ef26e 100644 --- a/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java +++ b/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java @@ -487,22 +487,22 @@ interface InstructionOpcodes { static final int TABLE_FILL = 0xFC11; - // === GC opcodes (unofficial, experimental) ===== https://github.com/lars-t-hansen/moz-gc-experiments/blob/master/version2.md + // === GC opcodes - static final int STRUCT_NEW = 0xFC50; + static final int STRUCT_NEW = 0xFB01; - static final int STRUCT_GET = 0xFC51; + static final int STRUCT_GET = 0xFB03; - static final int STRUCT_SET = 0xFC52; - - static final int STRUCT_NARROW = 0xFC53; + static final int STRUCT_SET = 0xFB06; - static final int ARRAY_NEW = 0xFC60; + static final int ARRAY_NEW = 0xFB11; - static final int ARRAY_GET = 0xFC61; + static final int ARRAY_GET = 0xFB13; - static final int ARRAY_SET = 0xFC62; + static final int ARRAY_SET = 0xFB16; - static final int ARRAY_LEN = 0xFC63; + static final int ARRAY_LEN = 0xFB17; + + static final int RTT_CANON = 0xFB30; } diff --git a/src/de/inetsoftware/jwebassembly/binary/WasmOutputStream.java b/src/de/inetsoftware/jwebassembly/binary/WasmOutputStream.java index 8106a40..629f4be 100644 --- a/src/de/inetsoftware/jwebassembly/binary/WasmOutputStream.java +++ b/src/de/inetsoftware/jwebassembly/binary/WasmOutputStream.java @@ -137,7 +137,7 @@ class WasmOutputStream extends LittleEndianOutputStream { } } else { writeOpCode( InstructionOpcodes.REF_NULL ); - writeValueType( ValueType.externref ); + writeValueType( type ); } } diff --git a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java index cc21ef3..477df19 100644 --- a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java @@ -852,6 +852,8 @@ public class TextModuleWriter extends ModuleWriter { switch( op ) { case NEW: case NEW_DEFAULT: + newline( methodOutput ); + methodOutput.append( "rtt.canon" ).append( ' ' ).append( normalizeName( type.toString() ) ); operation = "struct.new"; break; case GET: diff --git a/test/de/inetsoftware/jwebassembly/runtime/StructsGC.java b/test/de/inetsoftware/jwebassembly/runtime/StructsGC.java index 76ba90b..ccc5798 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/StructsGC.java +++ b/test/de/inetsoftware/jwebassembly/runtime/StructsGC.java @@ -39,7 +39,7 @@ public class StructsGC extends AbstractBaseTest { @Parameters( name = "{0}-{1}" ) public static Collection data() { ArrayList list = new ArrayList<>(); - ScriptEngine[] engines = { ScriptEngine.SpiderMonkeyGC, ScriptEngine.SpiderMonkeyWatGC, ScriptEngine.NodeJsGC, ScriptEngine.NodeWatGC }; + ScriptEngine[] engines = { ScriptEngine.SpiderMonkeyGC, ScriptEngine.SpiderMonkeyWatGC, ScriptEngine.NodeJsGC/*, ScriptEngine.NodeWatGC*/ }; for( ScriptEngine script : engines ) { addParam( list, script, "isNull" ); addParam( list, script, "isNotNull" ); @@ -57,7 +57,7 @@ public class StructsGC extends AbstractBaseTest { @Test public void test() { - Assume.assumeFalse( true ); //TODO + Assume.assumeFalse( getScriptEngine().name().startsWith( "SpiderMonkey" ) ); //TODO super.test(); }