diff --git a/src/de/inetsoftware/jwebassembly/module/BranchManager.java b/src/de/inetsoftware/jwebassembly/module/BranchManager.java index 4fd81a0..bc88b9a 100644 --- a/src/de/inetsoftware/jwebassembly/module/BranchManager.java +++ b/src/de/inetsoftware/jwebassembly/module/BranchManager.java @@ -1246,6 +1246,7 @@ class BranchManager { calculate( tryNode, parsedOperations.subList( 0, idx ) ); BranchNode catchNode = new BranchNode( catchPos, endPos, WasmBlockOperator.CATCH, WasmBlockOperator.END, 0 ); + catchNode.tryPos = startPos; parent.add( catchNode ); // Create a block/end structure for every CATCH without the first CATCH @@ -1419,7 +1420,7 @@ class BranchManager { int startPos = parent.startPos; while( parent != null && parent.endPos < gotoEndPos ) { deep++; - startPos = parent.startPos; + startPos = parent.startOp == WasmBlockOperator.CATCH ? parent.tryPos : parent.startPos; parent = parent.parent; } @@ -1727,6 +1728,10 @@ class BranchManager { */ private int startIdx; + /** + * Position of related TRY block for CATCH block. + */ + private int tryPos; /** * Create a new description. diff --git a/test/de/inetsoftware/jwebassembly/runtime/Exceptions.java b/test/de/inetsoftware/jwebassembly/runtime/Exceptions.java index 2c768d0..51fd2b3 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/Exceptions.java +++ b/test/de/inetsoftware/jwebassembly/runtime/Exceptions.java @@ -60,6 +60,7 @@ public class Exceptions extends AbstractBaseTest { addParam( list, script, "tryReturn" ); addParam( list, script, "whileTrueTryFinally" ); addParam( list, script, "ifMultipleInFinally" ); + addParam( list, script, "catchWithContinue" ); } rule.setTestParameters( list ); rule.setProperty( JWebAssembly.WASM_USE_EH, "true" ); @@ -292,6 +293,21 @@ public class Exceptions extends AbstractBaseTest { return pos; } + @Export + static private int catchWithContinue() { + int val = 0; + + for( int i = 0; i < 10; i++ ) { + try { + val = 42; + } catch( Throwable ex ) { + continue; + } + val = 13; + } + return val; + } + // @Export // static int npe() { // Object obj = new NullPointerException();