diff --git a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java index bba5636..41374fd 100644 --- a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java @@ -1435,6 +1435,11 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod case NEW_WITH_RTT: opCode = STRUCT_NEW_DEFAULT; break; + case CAST: + codeStream.writeOpCode( REF_CAST ); + codeStream.writeValueType( options.types.valueOf( "java/lang/Object" ) ); + codeStream.writeValueType( type ); + return; default: throw new Error( "Unknown operator: " + op ); } diff --git a/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java b/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java index 9242c72..00d0517 100644 --- a/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java +++ b/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java @@ -513,4 +513,6 @@ interface InstructionOpcodes { static final int ARRAY_LEN = 0xFB17; static final int RTT_CANON = 0xFB30; + + static final int REF_CAST = 0xFB41; } diff --git a/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java b/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java index c81852a..a782431 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java @@ -228,6 +228,10 @@ class WasmStructInstruction extends WasmInstruction { writer.writeConst( idx, ValueType.i32 ); } writer.writeFunctionCall( functionName, null ); + if( op == StructOperator.CAST && options.useGC() ) { + writer.writeStructOperator( StructOperator.RTT_CANON, type, null, -1 ); + writer.writeStructOperator( op, type, null, -1 ); + } } else { writer.writeStructOperator( op, type, fieldName, idx ); } diff --git a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java index 7e2b5a4..f08f2e8 100644 --- a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java @@ -915,6 +915,9 @@ public class TextModuleWriter extends ModuleWriter { case NEW_WITH_RTT: operation = "struct.new_with_rtt"; break; + case CAST: + operation = "ref.cast $java/lang/Object"; + break; default: throw new Error( "Unknown operator: " + op ); }