From 776cf133bc668f0372531aa49b4f75280341def0 Mon Sep 17 00:00:00 2001 From: Volker Date: Fri, 27 Jul 2018 17:51:36 +0200 Subject: [PATCH] Use UNREACHABLE operation after endless loop. --- .../jwebassembly/binary/BinaryModuleWriter.java | 3 +++ .../jwebassembly/binary/InstructionOpcodes.java | 2 ++ .../jwebassembly/module/ModuleGenerator.java | 17 +---------------- .../jwebassembly/module/WasmBlockOperator.java | 1 + .../jwebassembly/text/TextModuleWriter.java | 3 +++ 5 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java index 30901f9..4a1e5eb 100644 --- a/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/binary/BinaryModuleWriter.java @@ -727,6 +727,9 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod codeStream.write( LOOP ); codeStream.write( 0x40 ); // void; the return type of the loop. currently we does not use it break; + case UNREACHABLE: + codeStream.write( UNREACHABLE ); + break; default: throw new Error( "Unknown block: " + op ); } diff --git a/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java b/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java index fa6b349..a97d0d7 100644 --- a/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java +++ b/src/de/inetsoftware/jwebassembly/binary/InstructionOpcodes.java @@ -25,6 +25,8 @@ package de.inetsoftware.jwebassembly.binary; */ interface InstructionOpcodes { + static final int UNREACHABLE = 0x00; + static final int NOP = 0x01; // === Control flow operators ==== diff --git a/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java b/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java index 9f161e9..a2567b2 100644 --- a/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java +++ b/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java @@ -910,22 +910,7 @@ public class ModuleGenerator { // if a method ends with a loop without a break then code after the loop is no reachable // Java does not need a return byte code in this case // But WebAssembly need the dead code to validate - switch( returnType ) { - case i32: - instructions.add( new WasmConstInstruction( 0, byteCode.getCodePosition() ) ); - break; - case i64: - instructions.add( new WasmConstInstruction( 0L, byteCode.getCodePosition() ) ); - break; - case f32: - instructions.add( new WasmConstInstruction( 0F, byteCode.getCodePosition() ) ); - break; - case f64: - instructions.add( new WasmConstInstruction( 0D, byteCode.getCodePosition() ) ); - break; - default: - } - instructions.add( new WasmBlockInstruction( WasmBlockOperator.RETURN, null, byteCode.getCodePosition() ) ); + instructions.add( new WasmBlockInstruction( WasmBlockOperator.UNREACHABLE, null, byteCode.getCodePosition() ) ); } } catch( WasmException ex ) { throw ex; diff --git a/src/de/inetsoftware/jwebassembly/module/WasmBlockOperator.java b/src/de/inetsoftware/jwebassembly/module/WasmBlockOperator.java index 8a6b14a..60fc2ba 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmBlockOperator.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmBlockOperator.java @@ -33,4 +33,5 @@ public enum WasmBlockOperator { BR_IF, BR_TABLE, LOOP, + UNREACHABLE, } diff --git a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java index 61ae1e0..a835fe8 100644 --- a/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/text/TextModuleWriter.java @@ -311,6 +311,9 @@ public class TextModuleWriter extends ModuleWriter { name = "loop"; insetAfter++; break; + case UNREACHABLE: + name = "unreachable"; + break; default: throw new Error( "Unknown block: " + op ); }