diff options
author | jfrijters <jfrijters> | 2015-01-09 12:28:29 +0300 |
---|---|---|
committer | jfrijters <jfrijters> | 2015-01-09 12:28:29 +0300 |
commit | 4f46a61f21757d3319b00ffebe9976f9907ed894 (patch) | |
tree | 6a2983224a11643890f0aaf5edeae1be6706d879 | |
parent | 4a53dc7a7c038d9e5f2e41d94afdb56d455cf0d5 (diff) |
Bug fix. Unsafe.compareAndSwapObject should resolve field before passing it to MakeTypedReference.
-rw-r--r-- | runtime/openjdk/sun.misc.cs | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/runtime/openjdk/sun.misc.cs b/runtime/openjdk/sun.misc.cs index 7b70b59f..384941a2 100644 --- a/runtime/openjdk/sun.misc.cs +++ b/runtime/openjdk/sun.misc.cs @@ -548,10 +548,7 @@ static class Java_sun_misc_Unsafe #if !FIRST_PASS private static Delegate CreateCompareExchange(long fieldOffset) { - FieldWrapper fw = FieldWrapper.FromField(sun.misc.Unsafe.getField(fieldOffset)); - fw.Link(); - fw.ResolveField(); - FieldInfo field = fw.GetField(); + FieldInfo field = GetFieldInfo(fieldOffset); DynamicMethod dm = new DynamicMethod("CompareExchange", field.FieldType, new Type[] { typeof(object), field.FieldType, field.FieldType }, field.DeclaringType); ILGenerator ilgen = dm.GetILGenerator(); ilgen.Emit(OpCodes.Ldarg_0); @@ -563,6 +560,14 @@ static class Java_sun_misc_Unsafe ilgen.Emit(OpCodes.Ret); return dm.CreateDelegate(field.FieldType == typeof(int) ? typeof(CompareExchangeInt32) : typeof(CompareExchangeInt64)); } + + private static FieldInfo GetFieldInfo(long offset) + { + FieldWrapper fw = FieldWrapper.FromField(sun.misc.Unsafe.getField(offset)); + fw.Link(); + fw.ResolveField(); + return fw.GetField(); + } #endif public static bool compareAndSwapObject(object thisUnsafe, object obj, long offset, object expect, object update) @@ -579,8 +584,7 @@ static class Java_sun_misc_Unsafe else { Stats.Log("compareAndSwapObject.", offset); - FieldInfo field = FieldWrapper.FromField(sun.misc.Unsafe.getField(offset)).GetField(); - return Atomic.CompareExchange(obj, new FieldInfo[] { field }, update, expect) == expect; + return Atomic.CompareExchange(obj, new FieldInfo[] { GetFieldInfo(offset) }, update, expect) == expect; } #endif } |