mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-25 15:37:52 +01:00
fix the stack inspector for catch blocks
This commit is contained in:
parent
5b04573469
commit
d6a7ead579
@ -117,7 +117,7 @@ class BranchManger {
|
|||||||
* the compare instruction
|
* the compare instruction
|
||||||
*/
|
*/
|
||||||
void addIfOperator( int startPosition, int offset, int lineNumber, WasmNumericInstruction instr ) {
|
void addIfOperator( int startPosition, int offset, int lineNumber, WasmNumericInstruction instr ) {
|
||||||
JumpInstruction jump = new JumpInstruction( startPosition + offset, 1, startPosition, lineNumber );
|
JumpInstruction jump = new JumpInstruction( startPosition + offset, 1, null, startPosition, lineNumber );
|
||||||
instructions.add( jump );
|
instructions.add( jump );
|
||||||
allParsedOperations.add( new IfParsedBlock( startPosition, offset, lineNumber, instr, jump ) );
|
allParsedOperations.add( new IfParsedBlock( startPosition, offset, lineNumber, instr, jump ) );
|
||||||
}
|
}
|
||||||
@ -927,7 +927,7 @@ class BranchManger {
|
|||||||
// add a "if $exception instanceof type" check to the WASM code
|
// add a "if $exception instanceof type" check to the WASM code
|
||||||
StructType type = options.types.valueOf( tryCatch.getType().getName() );
|
StructType type = options.types.valueOf( tryCatch.getType().getName() );
|
||||||
FunctionName instanceOf = options.getInstanceOf();
|
FunctionName instanceOf = options.getInstanceOf();
|
||||||
int instrPos = findIdxOfCodePos( catchPos );
|
int instrPos = findIdxOfCodePos( catchPos ) + 1;
|
||||||
WasmLoadStoreInstruction storeException = (WasmLoadStoreInstruction)instructions.get( instrPos );
|
WasmLoadStoreInstruction storeException = (WasmLoadStoreInstruction)instructions.get( instrPos );
|
||||||
int lineNumber = storeException.getLineNumber();
|
int lineNumber = storeException.getLineNumber();
|
||||||
|
|
||||||
|
@ -228,7 +228,13 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder {
|
|||||||
addLoadStoreInstruction( ValueType.f64, false, byteCode.readUnsignedIndex( wide ), codePos, lineNumber );
|
addLoadStoreInstruction( ValueType.f64, false, byteCode.readUnsignedIndex( wide ), codePos, lineNumber );
|
||||||
break;
|
break;
|
||||||
case 58: // astore
|
case 58: // astore
|
||||||
addLoadStoreInstruction( ValueType.anyref, false, byteCode.readUnsignedIndex( wide ), codePos, lineNumber );
|
if( branchManager.isCatch( codePos ) ) {
|
||||||
|
addJumpPlaceholder( codePos, 0, ValueType.anyref, codePos, lineNumber );
|
||||||
|
storeType = ValueType.anyref; // for the catch there are no previous instructions
|
||||||
|
} else {
|
||||||
|
storeType = findValueTypeFromStack( 1, codePos );
|
||||||
|
}
|
||||||
|
addLoadStoreInstruction( storeType, false, byteCode.readUnsignedIndex( wide ), codePos, lineNumber );
|
||||||
break;
|
break;
|
||||||
case 59: // istore_0
|
case 59: // istore_0
|
||||||
case 60: // istore_1
|
case 60: // istore_1
|
||||||
@ -259,6 +265,7 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder {
|
|||||||
case 77: // astore_2
|
case 77: // astore_2
|
||||||
case 78: // astore_3
|
case 78: // astore_3
|
||||||
if( branchManager.isCatch( codePos ) ) {
|
if( branchManager.isCatch( codePos ) ) {
|
||||||
|
addJumpPlaceholder( codePos, 0, ValueType.anyref, codePos, lineNumber );
|
||||||
storeType = ValueType.anyref; // for the catch there are no previous instructions
|
storeType = ValueType.anyref; // for the catch there are no previous instructions
|
||||||
} else {
|
} else {
|
||||||
storeType = findValueTypeFromStack( 1, codePos );
|
storeType = findValueTypeFromStack( 1, codePos );
|
||||||
@ -530,7 +537,7 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder {
|
|||||||
case 167: // goto
|
case 167: // goto
|
||||||
int offset = byteCode.readShort();
|
int offset = byteCode.readShort();
|
||||||
branchManager.addGotoOperator( codePos, offset, byteCode.getCodePosition(), lineNumber );
|
branchManager.addGotoOperator( codePos, offset, byteCode.getCodePosition(), lineNumber );
|
||||||
addJumpPlaceholder( codePos + offset, 0, codePos, lineNumber ); // marker of the line number for the branch manager
|
addJumpPlaceholder( codePos + offset, 0, null, codePos, lineNumber ); // marker of the line number for the branch manager
|
||||||
break;
|
break;
|
||||||
case 168: // jsr
|
case 168: // jsr
|
||||||
case 169: // ret
|
case 169: // ret
|
||||||
|
@ -30,9 +30,11 @@ import de.inetsoftware.jwebassembly.wasm.AnyType;
|
|||||||
*/
|
*/
|
||||||
class JumpInstruction extends WasmInstruction {
|
class JumpInstruction extends WasmInstruction {
|
||||||
|
|
||||||
private int jumpPos;
|
private int jumpPos;
|
||||||
|
|
||||||
private int popCount;
|
private int popCount;
|
||||||
|
|
||||||
|
private AnyType pushValueType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an instance of a nop instruction
|
* Create an instance of a nop instruction
|
||||||
@ -41,15 +43,18 @@ class JumpInstruction extends WasmInstruction {
|
|||||||
* the position of the jump
|
* the position of the jump
|
||||||
* @param popCount
|
* @param popCount
|
||||||
* the the count of values that are removed from the stack.
|
* the the count of values that are removed from the stack.
|
||||||
|
* @param pushValueType
|
||||||
|
* optional type of a push value
|
||||||
* @param javaCodePos
|
* @param javaCodePos
|
||||||
* the code position/offset in the Java method
|
* the code position/offset in the Java method
|
||||||
* @param lineNumber
|
* @param lineNumber
|
||||||
* the line number in the Java source code
|
* the line number in the Java source code
|
||||||
*/
|
*/
|
||||||
JumpInstruction( int jumpPos, int popCount, int javaCodePos, int lineNumber ) {
|
JumpInstruction( int jumpPos, int popCount, AnyType pushValueType, int javaCodePos, int lineNumber ) {
|
||||||
super( javaCodePos, lineNumber );
|
super( javaCodePos, lineNumber );
|
||||||
this.jumpPos = jumpPos;
|
this.jumpPos = jumpPos;
|
||||||
this.popCount = popCount;
|
this.popCount = popCount;
|
||||||
|
this.pushValueType = pushValueType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -71,7 +76,7 @@ class JumpInstruction extends WasmInstruction {
|
|||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
AnyType getPushValueType() {
|
AnyType getPushValueType() {
|
||||||
return null;
|
return pushValueType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -591,13 +591,15 @@ public abstract class WasmCodeBuilder {
|
|||||||
* the position of the jump
|
* the position of the jump
|
||||||
* @param popCount
|
* @param popCount
|
||||||
* the the count of values that are removed from the stack.
|
* the the count of values that are removed from the stack.
|
||||||
|
* @param pushValueType
|
||||||
|
* optional type of a push value
|
||||||
* @param javaCodePos
|
* @param javaCodePos
|
||||||
* the code position/offset in the Java method
|
* the code position/offset in the Java method
|
||||||
* @param lineNumber
|
* @param lineNumber
|
||||||
* the line number in the Java source code
|
* the line number in the Java source code
|
||||||
*/
|
*/
|
||||||
protected void addJumpPlaceholder( int jumpPos, int popCount, int javaCodePos, int lineNumber ) {
|
protected void addJumpPlaceholder( int jumpPos, int popCount, AnyType pushValueType, int javaCodePos, int lineNumber ) {
|
||||||
instructions.add( new JumpInstruction( jumpPos, popCount, javaCodePos, lineNumber ) );
|
instructions.add( new JumpInstruction( jumpPos, popCount, pushValueType, javaCodePos, lineNumber ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user