fix AtomicReferenceFieldUpdater.compareAndSet

This commit is contained in:
Volker Berlin 2023-02-27 10:21:03 +01:00
parent 810e40aeb1
commit ef2720537d
No known key found for this signature in database
GPG Key ID: 988423EF815BE4CB
2 changed files with 15 additions and 3 deletions

View File

@ -502,13 +502,14 @@ class UnsafeManager {
if( type.isRefType() ) {
type = ValueType.ref;
}
int paramOffset = "java/util/concurrent/atomic/AtomicReferenceFieldUpdater".equals( name.className ) ? -1 : 0;
return "local.get 1" // THIS
+ " struct.get " + state.typeName + ' ' + state.fieldName //
+ " local.get 3 " // expected
+ type + ".eq" //
+ " local.get " + (3 + paramOffset) // expected
+ " " + type + ".eq" //
+ " if" //
+ " local.get 1" // THIS
+ " local.get 4" // update
+ " local.get " + (4 + paramOffset) // update
+ " struct.set " + state.typeName + ' ' + state.fieldName //
+ " i32.const 1" //
+ " return" //

View File

@ -15,6 +15,8 @@
*/
package de.inetsoftware.jwebassembly.runtime;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicInteger;
@ -55,6 +57,7 @@ public class UnsafeTest extends AbstractBaseTest {
addParam( list, script, "compareAndSwapReference" );
addParam( list, script, "getAndSetReference" );
addParam( list, script, "lazySetReference" );
addParam( list, script, "atomicReferenceFieldUpdater" );
}
rule.setTestParameters( list );
@ -168,5 +171,13 @@ public class UnsafeTest extends AbstractBaseTest {
obj.lazySet( 42 );
return obj.get();
}
@Export
static int atomicReferenceFieldUpdater() throws Throwable {
ByteArrayInputStream input = new ByteArrayInputStream( new byte[0] );
BufferedInputStream stream = new BufferedInputStream( input );
stream.close();
return 42;
}
}
}