From 91287c9fd327746c2df915a41e12dd157b143e90 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Tue, 8 May 2018 22:35:44 +0200 Subject: [PATCH] some Java compiler use lookupswitch for a switch with one case --- .../jwebassembly/module/ModuleWriter.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java index 2daf4d2..9872af5 100644 --- a/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java +++ b/src/de/inetsoftware/jwebassembly/module/ModuleWriter.java @@ -746,23 +746,30 @@ public abstract class ModuleWriter implements Closeable { startPosition--; byteCode.readInt(); + boolean writeFirstKey; + int low = 0; if( op == 171 ) { // lookupswitch int count = byteCode.readInt(); + writeFirstKey = count == 1; for( int i = 0; i < count; i++ ) { - byteCode.readInt(); + int key = byteCode.readInt(); + if( i== 0 ) { + low = key; + } byteCode.readInt(); } } else { - int low = byteCode.readInt(); - if( low != 0 ) { // the br_table starts ever with the value 0. That we need to subtract the start value if it different - writeConstInt( low ); - writeNumericOperator( NumericOperator.sub, ValueType.i32 ); - } + low = byteCode.readInt(); + writeFirstKey = true; int count = byteCode.readInt() - low + 1; for( int i = 0; i < count; i++ ) { byteCode.readInt(); } } + if( writeFirstKey && low != 0 ) { // the br_table starts ever with the value 0. That we need to subtract the start value if it different + writeConstInt( low ); + writeNumericOperator( NumericOperator.sub, ValueType.i32 ); + } break; case 172: // ireturn case 173: // lreturn