mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-25 07:27:52 +01:00
fix concatenated conditional operators
This commit is contained in:
parent
db2444340e
commit
27faeada39
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2018 - 2021 Volker Berlin (i-net software)
|
Copyright 2018 - 2022 Volker Berlin (i-net software)
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@ -409,7 +409,7 @@ class BranchManger {
|
|||||||
// OR concatenation (|| operator)
|
// OR concatenation (|| operator)
|
||||||
int pos = startBlock.startPosition + 2; // startBlock.startPosition is the position of the compare operation which need before this if construct
|
int pos = startBlock.startPosition + 2; // startBlock.startPosition is the position of the compare operation which need before this if construct
|
||||||
main.add( new BranchNode( pos, startBlock.nextPosition, WasmBlockOperator.IF, null ) );
|
main.add( new BranchNode( pos, startBlock.nextPosition, WasmBlockOperator.IF, null ) );
|
||||||
BranchNode node = new BranchNode( startBlock.nextPosition, positions.thenPos, WasmBlockOperator.ELSE, WasmBlockOperator.END );
|
BranchNode node = new BranchNode( startBlock.nextPosition, positions.thenPos - 1, WasmBlockOperator.ELSE, WasmBlockOperator.END );
|
||||||
main.add( node );
|
main.add( node );
|
||||||
main = node;
|
main = node;
|
||||||
insertConstBeforePosition( 1, pos + 1, startBlock.lineNumber ); // 1 --> TRUE for the next if expression
|
insertConstBeforePosition( 1, pos + 1, startBlock.lineNumber ); // 1 --> TRUE for the next if expression
|
||||||
@ -466,7 +466,7 @@ class BranchManger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( branch == null ) {
|
if( branch == null ) {
|
||||||
branch = new BranchNode( startPos, endPos, WasmBlockOperator.IF, WasmBlockOperator.END, ValueType.empty );
|
branch = new BranchNode( startPos - 1, endPos, WasmBlockOperator.IF, WasmBlockOperator.END, ValueType.empty );
|
||||||
parent.add( branch );
|
parent.add( branch );
|
||||||
if( startBlock.endPosition > parent.endPos ) {
|
if( startBlock.endPosition > parent.endPos ) {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
@ -485,9 +485,9 @@ class BranchManger {
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
if( count == 0 ) {
|
if( count == 0 ) {
|
||||||
// we jump outside the parent and there are no instructions. This is lie a conditional break
|
// we jump outside the parent and there are no instructions. This is like a conditional break
|
||||||
//TODO should be BR_IF
|
//TODO should be BR_IF
|
||||||
breakOperations.add( new BreakBlock( branch, branch.endPos, startBlock.endPosition ) );
|
breakOperations.add( new BreakBlock( branch, endPos, startBlock.endPosition ) );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1289,21 +1289,42 @@ class BranchManger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( parent != null && parent.elseEndPos > gotoEndPos ) {
|
if( parent != null && parent.elseEndPos > gotoEndPos ) {
|
||||||
|
|
||||||
|
// check if we break into an ELSE block which is possible in Java with a GOTO, occur with concatenated conditional operators
|
||||||
|
for( int i = 1; i < parent.size(); i++ ) {
|
||||||
|
BranchNode node = parent.get( i );
|
||||||
|
System.err.println( node.startOp + " " + node.startPos + " " + node.endPos );
|
||||||
|
if( gotoEndPos == node.startPos ) {
|
||||||
|
if( node.startOp == WasmBlockOperator.ELSE ) {
|
||||||
|
// we can't break into an else block that we break to the IF and push a zero to the stack
|
||||||
|
node = parent.get( i - 1 ); // should be the IF to the ELSE
|
||||||
|
breakBlock.endPosition = node.startPos;
|
||||||
|
breakBlock.breakToElseBlock = true;
|
||||||
|
calculateBreak( breakBlock );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BranchNode middleNode = new BranchNode( parent.startPos, gotoEndPos, WasmBlockOperator.BLOCK, WasmBlockOperator.END );
|
BranchNode middleNode = new BranchNode( parent.startPos, gotoEndPos, WasmBlockOperator.BLOCK, WasmBlockOperator.END );
|
||||||
for( Iterator<BranchNode> it = parent.iterator(); it.hasNext(); ) {
|
while( !parent.isEmpty() ) {
|
||||||
BranchNode child = it.next();
|
BranchNode child = parent.get( 0 );
|
||||||
if( child.endPos > gotoEndPos ) {
|
if( child.endPos > gotoEndPos ) {
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
middleNode.add( child );
|
middleNode.add( child );
|
||||||
it.remove();
|
parent.remove( 0 );
|
||||||
}
|
}
|
||||||
parent.add( middleNode );
|
parent.add( 0, middleNode );
|
||||||
//deep++;
|
|
||||||
parent = middleNode;
|
parent = middleNode;
|
||||||
patchBrDeep( middleNode );
|
patchBrDeep( middleNode );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( breakBlock.breakToElseBlock ) {
|
||||||
|
// push zero that we switch into the ELSE block
|
||||||
|
insertConstBeforePosition( 0, breakBlock.breakPos, -1 );
|
||||||
|
}
|
||||||
BranchNode breakNode = new BranchNode( breakBlock.breakPos, breakBlock.breakPos, WasmBlockOperator.BR, null, deep + 1 );
|
BranchNode breakNode = new BranchNode( breakBlock.breakPos, breakBlock.breakPos, WasmBlockOperator.BR, null, deep + 1 );
|
||||||
branch.add( breakNode );
|
branch.add( breakNode );
|
||||||
}
|
}
|
||||||
@ -1626,7 +1647,8 @@ class BranchManger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( instr.getType() == Type.Block ) {
|
if( instr.getType() == Type.Block ) {
|
||||||
switch( ((WasmBlockInstruction)instr).getOperation() ) {
|
WasmBlockInstruction blockInstr = (WasmBlockInstruction)instr;
|
||||||
|
switch( blockInstr.getOperation() ) {
|
||||||
case RETURN:
|
case RETURN:
|
||||||
// set "empty" block type
|
// set "empty" block type
|
||||||
while( stack.size() > 1 ) {
|
while( stack.size() > 1 ) {
|
||||||
@ -1643,6 +1665,17 @@ class BranchManger {
|
|||||||
case END:
|
case END:
|
||||||
case ELSE:
|
case ELSE:
|
||||||
break INSTRUCTIONS;
|
break INSTRUCTIONS;
|
||||||
|
case BR:
|
||||||
|
Integer data = (Integer)blockInstr.getData();
|
||||||
|
if( data > 0 ) {
|
||||||
|
// TODO we should check the ELSE block in this case if there is any
|
||||||
|
// set "empty" block type
|
||||||
|
while( stack.size() > 1 ) {
|
||||||
|
stack.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break INSTRUCTIONS;
|
||||||
|
default:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1708,10 +1741,12 @@ class BranchManger {
|
|||||||
|
|
||||||
private final int breakPos;
|
private final int breakPos;
|
||||||
|
|
||||||
private final int endPosition;
|
private int endPosition;
|
||||||
|
|
||||||
private final BranchNode branch;
|
private final BranchNode branch;
|
||||||
|
|
||||||
|
private boolean breakToElseBlock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create Break
|
* Create Break
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2018 - 2021 Volker Berlin (i-net software)
|
* Copyright 2018 - 2022 Volker Berlin (i-net software)
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -55,6 +55,7 @@ public class ControlFlowOperators extends AbstractBaseTest {
|
|||||||
addParam( list, script, "conditionalOperator" );
|
addParam( list, script, "conditionalOperator" );
|
||||||
addParam( list, script, "conditionalOperator2" );
|
addParam( list, script, "conditionalOperator2" );
|
||||||
addParam( list, script, "conditionalOperatorConcated" );
|
addParam( list, script, "conditionalOperatorConcated" );
|
||||||
|
addParam( list, script, "conditionalOperatorConcated2" );
|
||||||
addParam( list, script, "redifineVariable" );
|
addParam( list, script, "redifineVariable" );
|
||||||
addParam( list, script, "ifAnd_0" );
|
addParam( list, script, "ifAnd_0" );
|
||||||
addParam( list, script, "ifAnd_3" );
|
addParam( list, script, "ifAnd_3" );
|
||||||
@ -381,6 +382,14 @@ public class ControlFlowOperators extends AbstractBaseTest {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Export
|
||||||
|
static int conditionalOperatorConcated2() {
|
||||||
|
int a = 7;
|
||||||
|
int b = 13;
|
||||||
|
int c = 42;
|
||||||
|
return (a < 0 ? a != b : a != c ) && (b < 0 ? false : b == c ) ? 17 : 18;
|
||||||
|
}
|
||||||
|
|
||||||
@Export
|
@Export
|
||||||
static double redifineVariable() {
|
static double redifineVariable() {
|
||||||
int x = 42;
|
int x = 42;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user