mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-15 02:44:47 +01:00
add branch operation after the creating the in memory model and not on
parsing.
This commit is contained in:
parent
949e3d2aa2
commit
bab58acebe
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package de.inetsoftware.jwebassembly.module;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
@ -441,7 +440,17 @@ class BranchManger {
|
||||
* the byte code stream
|
||||
*/
|
||||
void handle( CodeInputStream byteCode ) {
|
||||
root.handle( byteCode.getCodePosition(), instructions );
|
||||
int codePosition = -1;
|
||||
for( int idx = 0; idx < instructions.size(); idx++ ) {
|
||||
int nextCodePosition = instructions.get( idx ).getCodePosition();
|
||||
if( nextCodePosition <= codePosition ) {
|
||||
continue;
|
||||
} else {
|
||||
codePosition = nextCodePosition;
|
||||
}
|
||||
idx = root.handle( codePosition, instructions, idx );
|
||||
}
|
||||
root.handle( byteCode.getCodePosition(), instructions, instructions.size() );
|
||||
}
|
||||
|
||||
/**
|
||||
@ -549,24 +558,28 @@ class BranchManger {
|
||||
/**
|
||||
* Handle branches on the current codePosition
|
||||
*
|
||||
* @param codePositions
|
||||
* @param codePosition
|
||||
* current code position
|
||||
* @param instructions
|
||||
* the target for instructions
|
||||
* @param idx
|
||||
* index in the current instruction
|
||||
* @return the new index in the instructions
|
||||
*/
|
||||
void handle( int codePositions, List<WasmInstruction> instructions ) {
|
||||
if( codePositions < startPos || codePositions > endPos ) {
|
||||
return;
|
||||
int handle( int codePosition, List<WasmInstruction> instructions, int idx ) {
|
||||
if( codePosition < startPos || codePosition > endPos ) {
|
||||
return idx;
|
||||
}
|
||||
if( codePositions == startPos && startOp != null ) {
|
||||
instructions.add( new WasmBlockInstruction( startOp, data, codePositions ) );
|
||||
if( codePosition == startPos && startOp != null ) {
|
||||
instructions.add( idx++, new WasmBlockInstruction( startOp, data, codePosition ) );
|
||||
}
|
||||
for( BranchNode branch : this ) {
|
||||
branch.handle( codePositions, instructions );
|
||||
idx = branch.handle( codePosition, instructions, idx );
|
||||
}
|
||||
if( codePositions == endPos && endOp != null ) {
|
||||
instructions.add( new WasmBlockInstruction( endOp, null, codePositions ) );
|
||||
if( codePosition == endPos && endOp != null ) {
|
||||
instructions.add( idx++, new WasmBlockInstruction( endOp, null, codePosition ) );
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -530,7 +530,6 @@ public class ModuleGenerator {
|
||||
while( byteCode.available() > 0 ) {
|
||||
WasmInstruction instr = null;
|
||||
int codePos = byteCode.getCodePosition();
|
||||
branchManager.handle( byteCode );
|
||||
endWithReturn = false;
|
||||
int op = byteCode.readUnsignedByte();
|
||||
switch( op ) {
|
||||
@ -879,6 +878,7 @@ public class ModuleGenerator {
|
||||
//TODO case 165: // if_acmpeq
|
||||
//TODO case 166: // if_acmpne
|
||||
case 167: // goto
|
||||
instr = new WasmNopInstruction( codePos ); // marker of the line number for the branch manager
|
||||
byteCode.skip(2); // handle in the branch manager
|
||||
break;
|
||||
case 170: // tableswitch
|
||||
@ -905,7 +905,7 @@ public class ModuleGenerator {
|
||||
instructions.add( instr );
|
||||
}
|
||||
}
|
||||
branchManager.handle( byteCode ); // write the last end operators
|
||||
branchManager.handle( byteCode ); // add branch operations
|
||||
if( !endWithReturn && returnType != null ) {
|
||||
// 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
|
||||
|
Loading…
x
Reference in New Issue
Block a user