47#if !IMPORTER && !FIRST_PASS && !EXPORTER
48 volatile java.lang.reflect.Field reflectionField;
51 RuntimeJavaType fieldType;
64 base(declaringType, name, sig,
modifiers, flags)
67 throw new ArgumentNullException();
69 throw new ArgumentNullException();
71 this.fieldType = fieldType;
74 UpdateNonPublicTypeInSignatureFlag();
78 DeclaringType.IsPublic &&
79 !DeclaringType.IsInterface &&
80 (IsPublic || (IsProtected && !DeclaringType.IsFinal)) &&
81 !DeclaringType.ClassLoader.StrictFinalFieldSemantics &&
82 DeclaringType.IsDynamic &&
101 this(declaringType, fieldType, name, sig,
modifiers.Modifiers, field, (modifiers.IsInternal ? MemberFlags.InternalAccess :
MemberFlags.None))
106 void UpdateNonPublicTypeInSignatureFlag()
108 if ((IsPublic || IsProtected) && fieldType !=
null && !IsAccessStub)
110 if (!fieldType.IsPublic && !fieldType.IsUnloadable)
130 [Conditional(
"DEBUG")]
131 internal void AssertLinked()
133 if (fieldType ==
null)
134 throw new InternalException($
"Field is not linked: {DeclaringType.Name}::{Name} ({Signature})");
136 Debug.Assert(fieldType !=
null, this.DeclaringType.Name +
"::" +
this.Name +
" (" +
this.Signature +
")");
139#if !IMPORTER && !EXPORTER
149 throw new NotImplementedException();
151 int slot = field._slot();
155 foreach (var fw
in RuntimeJavaType.FromClass(field.getDeclaringClass()).GetFields())
156 if (fw.Name == field.getName())
160 return RuntimeJavaType.FromClass(field.getDeclaringClass()).GetFields()[slot];
164 internal object ToField(
bool copy)
166 return ToField(copy,
null);
169 internal object ToField(
bool copy,
int? fieldIndex)
172 throw new NotImplementedException();
174 java.lang.reflect.Field field = reflectionField;
177 const Modifiers ReflectionFieldModifiersMask = Modifiers.Public | Modifiers.Private | Modifiers.Protected | Modifiers.Static | Modifiers.Final | Modifiers.Volatile | Modifiers.Transient | Modifiers.Synthetic |
Modifiers.Enum;
179 field =
new java.
lang.reflect.Field(
180 DeclaringType.ClassObject,
182 FieldTypeWrapper.EnsureLoadable(DeclaringType.ClassLoader).ClassObject,
183 (
int)(
Modifiers & ReflectionFieldModifiersMask) | (IsInternal ? 0x40000000 : 0),
184 fieldIndex ?? Array.IndexOf(DeclaringType.GetFields(),
this),
185 DeclaringType.GetGenericFieldSignature(
this),
192 if (reflectionField ==
null)
193 reflectionField = field;
195 field = reflectionField;
199 field = field.copy();
212 [
System.Security.SecurityCritical]
218 internal RuntimeJavaType FieldTypeWrapper
243 protected abstract void EmitGetImpl(
CodeEmitter il);
252 EmitUnsafeGetImpl(il);
259 protected virtual void EmitUnsafeGetImpl(
CodeEmitter il)
268 internal void EmitUnsafeVolatileGet(
CodeEmitter il)
271 EmitUnsafeVolatileGetImpl(il);
278 protected virtual void EmitUnsafeVolatileGetImpl(
CodeEmitter il)
280 throw new NotSupportedException();
297 protected abstract void EmitSetImpl(
CodeEmitter il);
313 protected virtual void EmitUnsafeSetImpl(
CodeEmitter il)
322 internal void EmitUnsafeVolatileSet(
CodeEmitter il)
325 EmitUnsafeVolatileSetImpl(il);
332 protected virtual void EmitUnsafeVolatileSetImpl(
CodeEmitter il)
334 throw new NotSupportedException();
342 internal void EmitUnsafeCompareAndSwap(
CodeEmitter il)
345 EmitUnsafeCompareAndSwapImpl(il);
353 protected virtual void EmitUnsafeCompareAndSwapImpl(
CodeEmitter il)
355 throw new NotSupportedException();
362 internal bool IsLinked
364 get {
return fieldType !=
null; }
377 if (fieldType !=
null)
380 var fld = DeclaringType.ClassLoader.FieldTypeWrapperFromSig(
Signature, mode);
390 if (fieldType ==
null)
393 UpdateNonPublicTypeInSignatureFlag();
397 field = this.DeclaringType.LinkField(
this);
411 internal bool IsVolatile
419 internal bool IsSerialVersionUID
425 &&
Name ==
"serialVersionUID"
443#if !IMPORTER && !EXPORTER
444 internal virtual void ResolveField()
446 var fb = field as FieldBuilder;
450 field = fb.DeclaringType.Module.ResolveField(fb.GetToken().Token);
452 BindingFlags flags = BindingFlags.DeclaredOnly;
453 flags |= fb.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic;
454 flags |= fb.IsStatic ? BindingFlags.Static : BindingFlags.Instance;
455 field = DeclaringType.TypeAsTBD.GetField(fb.Name, flags);
467 internal abstract object GetValue(
object obj);
474 internal abstract void SetValue(
object obj,
object value);
476 Delegate unsafeGetValueDelegate;
477 Delegate unsafeSetValueDelegate;
478 Delegate unsafeVolatileGetDelegate;
479 Delegate unsafeVolatileSetDelegate;
480 Delegate unsafeCompareExchangeDelegate;
487 internal virtual TField UnsafeGetValue<TField>(
object obj)
489 return ((Func<object, TField>)GetUnsafeGetDelegate())(obj);
496 Delegate GetUnsafeGetDelegate()
498 if (unsafeGetValueDelegate ==
null)
499 Interlocked.CompareExchange(
ref unsafeGetValueDelegate, CreateUnsafeGetDelegate(),
null);
501 return unsafeGetValueDelegate;
508 Delegate CreateUnsafeGetDelegate()
510 DeclaringType.Finish();
511 FieldTypeWrapper.Finish();
514 var ft = FieldTypeWrapper.IsPrimitive ? FieldTypeWrapper.TypeAsSignatureType : typeof(
object);
515 var dm =
DynamicMethodUtil.Create($
"__<UnsafeGet>__{DeclaringType.Name.Replace(".
", "_
")}__{Name}", DeclaringType.TypeAsTBD,
true, ft,
new[] { typeof(object) });
518 if (IsStatic ==
false)
519 il.Emit(OpCodes.Ldarg_0);
523 il.Emit(OpCodes.Ret);
525 return dm.CreateDelegate(typeof(Func<,>).MakeGenericType(typeof(
object), ft));
534 internal virtual void UnsafeSetValue<TField>(
object obj, TField value)
536 ((Action<object, TField>)GetUnsafeSetDelegate())(obj, value);
543 Delegate GetUnsafeSetDelegate()
545 if (unsafeSetValueDelegate ==
null)
546 Interlocked.CompareExchange(
ref unsafeSetValueDelegate, CreateUnsafeSetDelegate(),
null);
548 return unsafeSetValueDelegate;
555 Delegate CreateUnsafeSetDelegate()
557 DeclaringType.Finish();
558 FieldTypeWrapper.Finish();
561 var ft = FieldTypeWrapper.IsPrimitive ? FieldTypeWrapper.TypeAsSignatureType : typeof(
object);
562 var dm =
DynamicMethodUtil.Create($
"__<UnsafeSet>__{DeclaringType.Name.Replace(".
", "_
")}__{Name}", DeclaringType.TypeAsTBD,
true, typeof(
void),
new[] { typeof(
object), ft });
565 if (IsStatic ==
false)
566 il.Emit(OpCodes.Ldarg_0);
568 il.Emit(OpCodes.Ldarg_1);
571 il.Emit(OpCodes.Ret);
573 return dm.CreateDelegate(typeof(Action<,>).MakeGenericType(typeof(
object), ft));
582 internal virtual TField UnsafeVolatileGet<TField>(
object obj)
584 return ((Func<object, TField>)GetUnsafeVolatileGetDelegate())(obj);
591 Delegate GetUnsafeVolatileGetDelegate()
593 if (unsafeVolatileGetDelegate ==
null)
594 Interlocked.CompareExchange(
ref unsafeVolatileGetDelegate, CreateUnsafeVolatileGetDelegate(),
null);
596 return unsafeVolatileGetDelegate;
603 Delegate CreateUnsafeVolatileGetDelegate()
606 var ft = FieldTypeWrapper.IsPrimitive ? FieldTypeWrapper.TypeAsSignatureType : typeof(
object);
607 var dm =
new DynamicMethod($
"__<UnsafeVolatileGet>__{DeclaringType.Name.Replace(".
", "_
")}__{Name}", ft,
new[] { typeof(
object) }, DeclaringType.TypeAsTBD.Module,
true);
610 if (IsStatic ==
false)
611 il.Emit(OpCodes.Ldarg_0);
613 EmitUnsafeVolatileGet(il);
615 il.Emit(OpCodes.Ret);
617 return dm.CreateDelegate(typeof(Func<,>).MakeGenericType(typeof(
object), ft));
627 internal virtual void UnsafeVolatileSet<TField>(
object obj, TField value)
629 ((Action<object, TField>)GetUnsafeVolatileSetDelegate())(obj, value);
636 Delegate GetUnsafeVolatileSetDelegate()
638 if (unsafeVolatileSetDelegate ==
null)
639 Interlocked.CompareExchange(
ref unsafeVolatileSetDelegate, CreateUnsafeVolatileSetDelegate(),
null);
641 return unsafeVolatileSetDelegate;
648 Delegate CreateUnsafeVolatileSetDelegate()
651 var ft = FieldTypeWrapper.IsPrimitive ? FieldTypeWrapper.TypeAsSignatureType : typeof(
object);
652 var dm =
DynamicMethodUtil.Create($
"__<UnsafeVolatileSet>__{DeclaringType.Name.Replace(".
", "_
")}__{Name}", DeclaringType.TypeAsTBD,
true, typeof(
void),
new[] { typeof(
object), ft });
655 if (IsStatic ==
false)
656 il.Emit(OpCodes.Ldarg_0);
658 il.Emit(OpCodes.Ldarg_1);
659 EmitUnsafeVolatileSet(il);
661 il.Emit(OpCodes.Ret);
663 return dm.CreateDelegate(typeof(Action<,>).MakeGenericType(typeof(
object), ft));
674 internal virtual bool UnsafeCompareAndSwap<TField>(
object obj, TField expected, TField value)
676 return ((Func<object, TField, TField, bool>)GetUnsafeCompareAndSwapDelegate())(obj, expected, value);
684 Delegate GetUnsafeCompareAndSwapDelegate()
686 if (unsafeCompareExchangeDelegate ==
null)
687 Interlocked.CompareExchange(
ref unsafeCompareExchangeDelegate, CreateUnsafeCompareAndSwapDelegate(),
null);
689 return unsafeCompareExchangeDelegate;
696 Delegate CreateUnsafeCompareAndSwapDelegate()
699 var ft = FieldTypeWrapper.IsPrimitive ? FieldTypeWrapper.TypeAsSignatureType : typeof(
object);
700 var dm =
DynamicMethodUtil.Create($
"__<UnsafeCompareAndSwap>__{DeclaringType.Name.Replace(".
", "_
")}__{Name}", DeclaringType.TypeAsTBD,
true, typeof(
bool),
new[] { typeof(
object), ft, ft });
703 if (IsStatic ==
false)
704 il.Emit(OpCodes.Ldarg_0);
706 il.Emit(OpCodes.Ldarg_1);
707 il.Emit(OpCodes.Ldarg_2);
708 EmitUnsafeCompareAndSwap(il);
710 il.Emit(OpCodes.Ret);
712 return dm.CreateDelegate(typeof(Func<,,,>).MakeGenericType(typeof(
object), ft, ft, typeof(
bool)));