Esempio n. 1
0
        protected override bool UsesVirtualDispatch(IJavaPeerable value, Type declaringType)
        {
            var peerType  = GetThresholdType (value);
            if (peerType != null) {
                return peerType == value.GetType ();
            }

            return base.UsesVirtualDispatch (value, declaringType);
        }
Esempio n. 2
0
 static Type GetThresholdType(IJavaPeerable value)
 {
     var o = value as Java.Lang.Object;
     if (o != null) {
         return o.GetThresholdType ();
     }
     var t = value as Java.Lang.Throwable;
     if (t != null) {
         return t.GetThresholdType ();
     }
     return null;
 }
Esempio n. 3
0
 static IntPtr GetThresholdClass(IJavaPeerable value)
 {
     var o = value as Java.Lang.Object;
     if (o != null) {
         return o.GetThresholdClass ();
     }
     var t = value as Java.Lang.Throwable;
     if (t != null) {
         return t.GetThresholdClass ();
     }
     return IntPtr.Zero;
 }
Esempio n. 4
0
        protected override JniPeerMembers GetPeerMembers(IJavaPeerable value)
        {
            var peerType = GetThresholdType (value);
            if (peerType == null || value.JniPeerMembers.ManagedPeerType == peerType) {
                return base.GetPeerMembers (value);
            };

            var jniClass  = Java.Interop.TypeManager.GetClassName (GetThresholdClass (value));
            lock (LegacyPeerMembers) {
                JniPeerMembers members;
                if (!LegacyPeerMembers.TryGetValue (jniClass, out members)) {
                    members = new XAPeerMembers (jniClass, peerType);
                    LegacyPeerMembers.Add (jniClass, members);
                }
                return members;
            }
        }
Esempio n. 5
0
 public override void RemovePeer(IJavaPeerable value)
 {
 }
Esempio n. 6
0
 public override void AddPeer(IJavaPeerable value)
 {
 }
Esempio n. 7
0
 static IntPtr GetThresholdClass(IJavaPeerable value)
 {
     return(IntPtr.Zero);
 }
Esempio n. 8
0
 protected virtual bool UsesVirtualDispatch(IJavaPeerable value, Type declaringType)
 {
     return(value.GetType() == declaringType ||
            declaringType == null ||
            value.GetType() == value.JniPeerMembers.ManagedPeerType);
 }
Esempio n. 9
0
 public abstract void AddPeer(IJavaPeerable value);
Esempio n. 10
0
 public override void Remove(IJavaPeerable reference)
 {
 }
Esempio n. 11
0
        public override void AddPeer(IJavaPeerable value)
        {
            if (RegisteredInstances == null)
            {
                throw new ObjectDisposedException(nameof(MonoRuntimeValueManager));
            }

            var r = value.PeerReference;

            if (!r.IsValid)
            {
                throw new ObjectDisposedException(value.GetType().FullName);
            }
            var o = PeekPeer(value.PeerReference);

            if (o != null)
            {
                return;
            }

            if (r.Type != JniObjectReferenceType.Global)
            {
                value.SetPeerReference(r.NewGlobalRef());
                JniObjectReference.Dispose(ref r, JniObjectReferenceOptions.CopyAndDispose);
            }
            int key = value.JniIdentityHashCode;

            lock (RegisteredInstances) {
                List <WeakReference <IJavaPeerable> > peers;
                if (!RegisteredInstances.TryGetValue(key, out peers))
                {
                    peers = new List <WeakReference <IJavaPeerable> > ()
                    {
                        new WeakReference <IJavaPeerable>(value, trackResurrection: true),
                    };
                    RegisteredInstances.Add(key, peers);
                    return;
                }

                for (int i = peers.Count - 1; i >= 0; i--)
                {
                    var           wp = peers [i];
                    IJavaPeerable p;
                    if (!wp.TryGetTarget(out p))
                    {
                        // Peer was collected
                        peers.RemoveAt(i);
                        continue;
                    }
                    if (!JniEnvironment.Types.IsSameObject(p.PeerReference, value.PeerReference))
                    {
                        continue;
                    }
                    if (Replaceable(p))
                    {
                        peers [i] = new WeakReference <IJavaPeerable>(value, trackResurrection: true);
                    }
                    else
                    {
                        WarnNotReplacing(key, value, p);
                    }
                    return;
                }
                peers.Add(new WeakReference <IJavaPeerable> (value, trackResurrection: true));
            }
        }
Esempio n. 12
0
 public override void FinalizePeer(IJavaPeerable value)
 {
     throw new NotImplementedException();
 }
Esempio n. 13
0
 public override void RemovePeer(IJavaPeerable peer)
 {
 }
Esempio n. 14
0
 public override void FinalizePeer(IJavaPeerable peer)
 {
 }
Esempio n. 15
0
 public override void AddPeer(IJavaPeerable peer)
 {
 }
 public abstract void Finalize(IJavaPeerable value);
Esempio n. 17
0
 protected virtual JniPeerMembers GetPeerMembers(IJavaPeerable value)
 {
     return(value.JniPeerMembers);
 }
Esempio n. 18
0
 public override void FinalizePeer(IJavaPeerable value)
 {
 }
Esempio n. 19
0
 public override void Add(IJavaPeerable reference)
 {
 }
Esempio n. 20
0
 public static WeakReference <IJavaPeerable> CreateWeakReference(IJavaPeerable value)
 {
     return(new WeakReference <IJavaPeerable> (value, trackResurrection: true));
 }
Esempio n. 21
0
 public override void Finalize(IJavaPeerable reference)
 {
 }
Esempio n. 22
0
 public IdentityHashTargets(IJavaPeerable value)
 {
     first = CreateWeakReference(value);
 }
Esempio n. 23
0
 public abstract void RemovePeer(IJavaPeerable value);
Esempio n. 24
0
 protected virtual JniPeerMembers GetPeerMembers(IJavaPeerable value)
 {
     return(isInterface ? this : value.JniPeerMembers);
 }
Esempio n. 25
0
 protected override bool UsesVirtualDispatch(IJavaPeerable value, Type declaringType)
 {
     return(false);
 }
Esempio n. 26
0
        bool ShouldReplaceMapping(WeakReference <IJavaPeerable> current, JniObjectReference reference, out IJavaPeerable target)
        {
            target = null;

            if (current == null)
            {
                return(true);
            }

            // Target has been GC'd; see also FIXME, above, in finalizer
            if (!current.TryGetTarget(out target) || target == null)
            {
                return(true);
            }

            // It's possible that the instance was GC'd, but the finalizer
            // hasn't executed yet, so the `instances` entry is stale.
            if (!target.PeerReference.IsValid)
            {
                return(true);
            }

            if (!JniEnvironment.Types.IsSameObject(target.PeerReference, reference))
            {
                return(false);
            }

            // JNIEnv.NewObject/JNIEnv.CreateInstance() compatibility.
            // When two MCW's are created for one Java instance [0],
            // we want the 2nd MCW to replace the 1st, as the 2nd is
            // the one the dev created; the 1st is an implicit intermediary.
            //
            // [0]: If Java ctor invokes overridden virtual method, we'll
            // transition into managed code w/o a registered instance, and
            // thus will create an "intermediary" via
            // (IntPtr, JniHandleOwnership) .ctor.
            if ((target.JniManagedPeerState & JniManagedPeerStates.Replaceable) == JniManagedPeerStates.Replaceable)
            {
                return(true);
            }

            return(false);
        }
Esempio n. 27
0
 static Type GetThresholdType(IJavaPeerable value)
 {
     return(null);
 }
Esempio n. 28
0
 public static string?GetJniTypeName(this IJavaPeerable self)
 {
     JniPeerMembers.AssertSelf(self);
     return(JniEnvironment.Types.GetJniTypeNameFromInstance(self.PeerReference));
 }