From 0822d9af8c99440528b08664a2fdf5aa671f2167 Mon Sep 17 00:00:00 2001 From: Volker Date: Fri, 10 Aug 2018 20:35:17 +0200 Subject: [PATCH] END can not be outside of parent block --- .../inetsoftware/jwebassembly/module/BranchManger.java | 9 ++++++--- .../jwebassembly/runtime/ControlFlowOperators.java | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/module/BranchManger.java b/src/de/inetsoftware/jwebassembly/module/BranchManger.java index 749e873..5709f6b 100644 --- a/src/de/inetsoftware/jwebassembly/module/BranchManger.java +++ b/src/de/inetsoftware/jwebassembly/module/BranchManger.java @@ -260,10 +260,13 @@ class BranchManger { if( i > 0 ) { calculate( branch, parsedOperations.subList( 0, i ) ); } - branch.data = calculateBlockType( startPos, branch.endPos ); - endPos = parsedBlock.endPosition; + ValueType blockType = calculateBlockType( startPos, branch.endPos ); + branch.data = blockType; + // end position can not be outside of the parent + endPos = Math.min( parsedBlock.endPosition, parent.endPos ); - int breakDeep = calculateBreakDeep( parent, endPos ); + // if with block type signature must have an else block + int breakDeep = blockType == ValueType.empty ? calculateBreakDeep( parent, endPos ) : -1; if( breakDeep >= 0 ) { branch.endOp = WasmBlockOperator.END; branch.add( new BranchNode( startBlock.endPosition, endPos, WasmBlockOperator.BR, null, breakDeep + 1 ) ); diff --git a/test/de/inetsoftware/jwebassembly/runtime/ControlFlowOperators.java b/test/de/inetsoftware/jwebassembly/runtime/ControlFlowOperators.java index 7849cfa..3e23d7d 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/ControlFlowOperators.java +++ b/test/de/inetsoftware/jwebassembly/runtime/ControlFlowOperators.java @@ -299,7 +299,7 @@ public class ControlFlowOperators extends AbstractBaseTest { @Export static int conditionalOperator () { int condition = 4; - return condition >= 4 ? 1 : 2; + return condition >= 4 ? condition < 4 ? 1 : 2 : condition == 4 ? 3 : 4; } } }