From 5410764249f70d3a20c12bdfc867890ae633516b Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Sat, 1 Feb 2020 20:29:29 +0100 Subject: [PATCH] implement CAST operation, WIP --- .../module/JavaMethodWasmCodeBuilder.java | 8 +++++--- .../module/WasmStructInstruction.java | 2 ++ .../jwebassembly/wasm/StructOperator.java | 1 + .../jwebassembly/runtime/RuntimeErrors.java | 15 +++++++++++++-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java b/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java index 15fec3d..438d3f1 100644 --- a/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java +++ b/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java @@ -653,10 +653,12 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder { case 191: // athrow addBlockInstruction( WasmBlockOperator.THROW, null, codePos, lineNumber ); break; - //TODO case 192: // checkcast + case 192: // checkcast + name = ((ConstantClass)constantPool.get( byteCode.readUnsignedShort() )).getName(); + addStructInstruction( StructOperator.CAST, name, null, codePos, lineNumber ); + break; case 193: // instanceof - idx = byteCode.readUnsignedShort(); - name = ((ConstantClass)constantPool.get( idx )).getName(); + name = ((ConstantClass)constantPool.get( byteCode.readUnsignedShort() )).getName(); addStructInstruction( StructOperator.INSTANCEOF, name, null, codePos, lineNumber ); break; case 194: // monitorenter diff --git a/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java b/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java index ec9a420..8e72152 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java @@ -203,6 +203,7 @@ class WasmStructInstruction extends WasmInstruction { return ValueType.anyref; case NEW: case NEW_DEFAULT: + case CAST: return type; case GET: return fieldName.getType(); @@ -223,6 +224,7 @@ class WasmStructInstruction extends WasmInstruction { switch( op ) { case GET: case INSTANCEOF: + case CAST: return 1; case SET: return 2; diff --git a/src/de/inetsoftware/jwebassembly/wasm/StructOperator.java b/src/de/inetsoftware/jwebassembly/wasm/StructOperator.java index d086e98..96bdcba 100644 --- a/src/de/inetsoftware/jwebassembly/wasm/StructOperator.java +++ b/src/de/inetsoftware/jwebassembly/wasm/StructOperator.java @@ -27,5 +27,6 @@ public enum StructOperator { GET, SET, NULL, + CAST, INSTANCEOF, } \ No newline at end of file diff --git a/test/de/inetsoftware/jwebassembly/runtime/RuntimeErrors.java b/test/de/inetsoftware/jwebassembly/runtime/RuntimeErrors.java index c50d4ac..97c5e69 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/RuntimeErrors.java +++ b/test/de/inetsoftware/jwebassembly/runtime/RuntimeErrors.java @@ -76,7 +76,6 @@ public class RuntimeErrors { } } - @Test public void nonStaticImport() throws IOException { compileErrorTest( "Import method must be static:", NonStaticImport.class ); @@ -127,7 +126,6 @@ public class RuntimeErrors { } } - @Test public void instanceofCall() throws IOException { compileErrorTest( "Unknown operator: INSTANCEOF", InstanceofMethod.class ); @@ -140,4 +138,17 @@ public class RuntimeErrors { return obj instanceof Integer; } } + + @Test + public void checkcast() throws IOException { + compileErrorTest( "Unknown operator: CAST", CheckcastMethod.class ); + } + + static class CheckcastMethod { + @Export + static Integer runnable() { + Object obj = new Integer(0); + return (Integer)obj; + } + } }