59 base(declaringType, fieldType, name, sig,
modifiers, fi)
64#if !IMPORTER && !EXPORTER && !FIRST_PASS
66 internal override object GetValue(
object obj)
68 return GetField().GetValue(obj);
71 internal override void SetValue(
object obj,
object value)
73 GetField().SetValue(obj, value);
85 if (IsStatic ==
false && DeclaringType.IsNonPrimitiveValueType)
86 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsLocalOrStackType);
91 il.EmitMemoryBarrier();
92 il.Emit(OpCodes.Volatile);
96 il.Emit(OpCodes.Ldsfld, fi);
98 il.Emit(OpCodes.Ldfld, fi);
102 protected override void EmitSetImpl(
CodeEmitter il)
106 if (IsStatic ==
false && DeclaringType.IsNonPrimitiveValueType)
108 var value = il.DeclareLocal(FieldTypeWrapper.TypeAsLocalOrStackType);
109 il.Emit(OpCodes.Stloc, value);
110 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsLocalOrStackType);
111 il.Emit(OpCodes.Ldloc, value);
116 il.Emit(OpCodes.Volatile);
119 il.Emit(OpCodes.Stsfld, fi);
121 il.Emit(OpCodes.Stfld, fi);
124 il.EmitMemoryBarrier();
128 protected override void EmitUnsafeGetImpl(
CodeEmitter il)
136 il.Emit(OpCodes.Ldsflda, fi);
137 il.Emit(OpCodes.Call, DeclaringType.Context.
Resolver.ResolveRuntimeType(typeof(
RuntimeSimpleJavaField).FullName).AsReflection().GetMethod(nameof(UnsafeGetImplByRefNoInline), BindingFlags.Static | BindingFlags.NonPublic).MakeGenericMethod(fi.FieldType));
141 il.Emit(OpCodes.Ldsfld, fi);
146 if (DeclaringType.IsNonPrimitiveValueType)
147 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsLocalOrStackType);
149 il.Emit(OpCodes.Ldfld, fi);
159 [MethodImpl(MethodImplOptions.NoInlining)]
160 static T UnsafeGetImplByRefNoInline<T>(
ref T r)
166 protected override void EmitUnsafeSetImpl(
CodeEmitter il)
170 if (IsStatic ==
false && DeclaringType.IsNonPrimitiveValueType)
172 var value = il.DeclareLocal(FieldTypeWrapper.TypeAsLocalOrStackType);
173 il.Emit(OpCodes.Stloc, value);
174 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsTBD);
175 il.Emit(OpCodes.Ldloc, value);
180 il.Emit(OpCodes.Stsfld, fi);
184 il.Emit(OpCodes.Stfld, fi);
189 protected override void EmitUnsafeVolatileGetImpl(
CodeEmitter il)
195 il.Emit(OpCodes.Ldsflda, fi);
199 if (DeclaringType.IsNonPrimitiveValueType)
200 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsLocalOrStackType);
202 il.Emit(OpCodes.Ldflda, fi);
223 il.EmitMemoryBarrier();
224 il.Emit(OpCodes.Volatile);
225 FieldTypeWrapper.EmitLdind(il);
230 protected override void EmitUnsafeVolatileSetImpl(
CodeEmitter il)
234 var value = il.DeclareLocal(FieldTypeWrapper.TypeAsLocalOrStackType);
235 il.Emit(OpCodes.Stloc, value);
239 il.Emit(OpCodes.Ldsflda, fi);
243 if (DeclaringType.IsNonPrimitiveValueType)
244 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsLocalOrStackType);
246 il.Emit(OpCodes.Ldflda, fi);
249 il.Emit(OpCodes.Ldloc, value);
269 il.Emit(OpCodes.Volatile);
270 FieldTypeWrapper.EmitStind(il);
271 il.EmitMemoryBarrier();
275 protected override void EmitUnsafeCompareAndSwapImpl(
CodeEmitter il)
279 var update = il.AllocTempLocal(FieldTypeWrapper.TypeAsLocalOrStackType);
280 var expect = il.AllocTempLocal(FieldTypeWrapper.TypeAsLocalOrStackType);
282 il.Emit(OpCodes.Stloc, update);
283 il.Emit(OpCodes.Stloc, expect);
287 il.Emit(OpCodes.Ldsflda, fi);
291 if (DeclaringType.IsNonPrimitiveValueType)
292 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsLocalOrStackType);
294 il.Emit(OpCodes.Ldflda, fi);
297 il.Emit(OpCodes.Ldloc, expect);
298 il.Emit(OpCodes.Ldloc, update);
300 if (FieldTypeWrapper.IsPrimitive)
324 il.ReleaseTempLocal(expect);
325 il.ReleaseTempLocal(update);