diff --git a/src/de/inetsoftware/jwebassembly/module/UnsafeManager.java b/src/de/inetsoftware/jwebassembly/module/UnsafeManager.java index 800e060..1d86522 100644 --- a/src/de/inetsoftware/jwebassembly/module/UnsafeManager.java +++ b/src/de/inetsoftware/jwebassembly/module/UnsafeManager.java @@ -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" // diff --git a/test/de/inetsoftware/jwebassembly/runtime/UnsafeTest.java b/test/de/inetsoftware/jwebassembly/runtime/UnsafeTest.java index 238b8df..aea9756 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/UnsafeTest.java +++ b/test/de/inetsoftware/jwebassembly/runtime/UnsafeTest.java @@ -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; + } } }