Esempio n. 1
0
        public static tAsyncCall *set_Target(tJITCallNative *pCallNative, byte *pThis_, byte *pParams, byte *pReturnValue)
        {
            tWeakRef *         pThis  = (tWeakRef *)pThis_;
            /*HEAP_PTR*/ byte *target = ((/*HEAP_PTR*/ byte **)pParams)[0];

            if (pThis->target != null)
            {
                tWeakRef **ppWeakRef = (tWeakRef **)Heap.GetWeakRefAddress(pThis->target);
                while (*ppWeakRef != null)
                {
                    tWeakRef *pWeakRef = *ppWeakRef;
                    if (pWeakRef == pThis)
                    {
                        *ppWeakRef = pWeakRef->pNextWeakRef;
                        Heap.RemovedWeakRefTarget(pWeakRef->target);
                        goto foundOK;
                    }
                    ppWeakRef = &(pWeakRef->pNextWeakRef);
                }
                Sys.Crash("WeakRef.set_Target() Error: cannot find weak-ref target for removal");
                foundOK :;
            }
            pThis->target = target;
            if (target != null)
            {
                pThis->pNextWeakRef = (tWeakRef *)Heap.SetWeakRefTarget(target, (/*HEAP_PTR*/ byte *)pThis);
            }

            return(null);
        }
Esempio n. 2
0
        public static void TargetGone(/*HEAP_PTR*/ byte **ppWeakRef_, uint removeLongRefs)
        {
            tWeakRef **ppWeakRef = (tWeakRef **)ppWeakRef_;
            tWeakRef * pWeakRef  = *ppWeakRef;

            while (pWeakRef != null)
            {
                if (removeLongRefs != 0 || pWeakRef->trackRes == 0)
                {
                    // Really remove it
                    pWeakRef->target = null;
                }
                else
                {
                    // Long ref, so keep it
                    *ppWeakRef = pWeakRef;
                    ppWeakRef = &(pWeakRef->pNextWeakRef);
                }
                pWeakRef = pWeakRef->pNextWeakRef;
            }
            *ppWeakRef = null;
        }