mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-25 23:47:51 +01:00
Consume the THIS parameter from Unsafe calls
This commit is contained in:
parent
bf96823c27
commit
3cccd27b35
@ -502,13 +502,13 @@ class UnsafeManager {
|
|||||||
if( type.isRefType() ) {
|
if( type.isRefType() ) {
|
||||||
type = ValueType.ref;
|
type = ValueType.ref;
|
||||||
}
|
}
|
||||||
return "local.get 0" // THIS
|
return "local.get 1" // THIS
|
||||||
+ " struct.get " + state.typeName + ' ' + state.fieldName //
|
+ " struct.get " + state.typeName + ' ' + state.fieldName //
|
||||||
+ " local.get 2 " // expected
|
+ " local.get 3 " // expected
|
||||||
+ type + ".eq" //
|
+ type + ".eq" //
|
||||||
+ " if" //
|
+ " if" //
|
||||||
+ " local.get 0" // THIS
|
+ " local.get 1" // THIS
|
||||||
+ " local.get 3" // update
|
+ " local.get 4" // update
|
||||||
+ " struct.set " + state.typeName + ' ' + state.fieldName //
|
+ " struct.set " + state.typeName + ' ' + state.fieldName //
|
||||||
+ " i32.const 1" //
|
+ " i32.const 1" //
|
||||||
+ " return" //
|
+ " return" //
|
||||||
@ -518,23 +518,23 @@ class UnsafeManager {
|
|||||||
|
|
||||||
case "getAndAddInt":
|
case "getAndAddInt":
|
||||||
case "getAndAddLong":
|
case "getAndAddLong":
|
||||||
return "local.get 0" // THIS
|
return "local.get 1" // THIS
|
||||||
+ " local.get 0" // THIS
|
+ " local.get 1" // THIS
|
||||||
+ " struct.get " + state.typeName + ' ' + state.fieldName //
|
+ " struct.get " + state.typeName + ' ' + state.fieldName //
|
||||||
+ " local.tee 3" // temp
|
+ " local.tee 4" // temp
|
||||||
+ " local.get 2 " // delta
|
+ " local.get 3 " // delta
|
||||||
+ paramTypes[3] + ".add" //
|
+ paramTypes[3] + ".add" //
|
||||||
+ " struct.set " + state.typeName + ' ' + state.fieldName //
|
+ " struct.set " + state.typeName + ' ' + state.fieldName //
|
||||||
+ " local.get 3" // temp
|
+ " local.get 4" // temp
|
||||||
+ " return";
|
+ " return";
|
||||||
|
|
||||||
case "getAndSetInt":
|
case "getAndSetInt":
|
||||||
case "getAndSetLong":
|
case "getAndSetLong":
|
||||||
case "getAndSetObject":
|
case "getAndSetObject":
|
||||||
return "local.get 0" // THIS
|
return "local.get 1" // THIS
|
||||||
+ " struct.get " + state.typeName + ' ' + state.fieldName //
|
+ " struct.get " + state.typeName + ' ' + state.fieldName //
|
||||||
+ " local.get 0" // THIS
|
+ " local.get 1" // THIS
|
||||||
+ " local.get 2" // newValue
|
+ " local.get 3" // newValue
|
||||||
+ " struct.set " + state.typeName + ' ' + state.fieldName //
|
+ " struct.set " + state.typeName + ' ' + state.fieldName //
|
||||||
+ " return";
|
+ " return";
|
||||||
|
|
||||||
@ -545,15 +545,15 @@ class UnsafeManager {
|
|||||||
case "putOrderedObject":
|
case "putOrderedObject":
|
||||||
case "putObjectVolatile":
|
case "putObjectVolatile":
|
||||||
case "putObject":
|
case "putObject":
|
||||||
return "local.get 0" // THIS
|
return "local.get 1" // THIS
|
||||||
+ " local.get 2" // x
|
+ " local.get 3" // x
|
||||||
+ " struct.set " + state.typeName + ' ' + state.fieldName;
|
+ " struct.set " + state.typeName + ' ' + state.fieldName;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new RuntimeException( name.signatureName );
|
throw new RuntimeException( name.signatureName );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
functions.markAsNeeded( func, false );
|
functions.markAsNeeded( func, true ); // original function has an THIS parameter of the Unsafe instance, we need to consume it
|
||||||
WasmCallInstruction call = new WasmCallInstruction( func, callInst.getCodePosition(), callInst.getLineNumber(), callInst.getTypeManager(), false );
|
WasmCallInstruction call = new WasmCallInstruction( func, callInst.getCodePosition(), callInst.getLineNumber(), callInst.getTypeManager(), false );
|
||||||
instructions.set( idx, call );
|
instructions.set( idx, call );
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user