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() ) { if( type.isRefType() ) {
type = ValueType.ref; type = ValueType.ref;
} }
int paramOffset = "java/util/concurrent/atomic/AtomicReferenceFieldUpdater".equals( name.className ) ? -1 : 0;
return "local.get 1" // THIS return "local.get 1" // THIS
+ " struct.get " + state.typeName + ' ' + state.fieldName // + " struct.get " + state.typeName + ' ' + state.fieldName //
+ " local.get 3 " // expected + " local.get " + (3 + paramOffset) // expected
+ type + ".eq" // + " " + type + ".eq" //
+ " if" // + " if" //
+ " local.get 1" // THIS + " local.get 1" // THIS
+ " local.get 4" // update + " local.get " + (4 + paramOffset) // update
+ " struct.set " + state.typeName + ' ' + state.fieldName // + " struct.set " + state.typeName + ' ' + state.fieldName //
+ " i32.const 1" // + " i32.const 1" //
+ " return" // + " return" //

View File

@ -15,6 +15,8 @@
*/ */
package de.inetsoftware.jwebassembly.runtime; package de.inetsoftware.jwebassembly.runtime;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -55,6 +57,7 @@ public class UnsafeTest extends AbstractBaseTest {
addParam( list, script, "compareAndSwapReference" ); addParam( list, script, "compareAndSwapReference" );
addParam( list, script, "getAndSetReference" ); addParam( list, script, "getAndSetReference" );
addParam( list, script, "lazySetReference" ); addParam( list, script, "lazySetReference" );
addParam( list, script, "atomicReferenceFieldUpdater" );
} }
rule.setTestParameters( list ); rule.setTestParameters( list );
@ -168,5 +171,13 @@ public class UnsafeTest extends AbstractBaseTest {
obj.lazySet( 42 ); obj.lazySet( 42 );
return obj.get(); 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;
}
} }
} }