Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjfrijters <jfrijters>2015-01-09 12:28:29 +0300
committerjfrijters <jfrijters>2015-01-09 12:28:29 +0300
commit4f46a61f21757d3319b00ffebe9976f9907ed894 (patch)
tree6a2983224a11643890f0aaf5edeae1be6706d879
parent4a53dc7a7c038d9e5f2e41d94afdb56d455cf0d5 (diff)
Bug fix. Unsafe.compareAndSwapObject should resolve field before passing it to MakeTypedReference.
-rw-r--r--runtime/openjdk/sun.misc.cs16
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
}