Пример #1
0
        internal static GreenNode?TryGetNode(
            int kind,
            GreenNode?child1,
            GreenNode?child2,
            GreenNode?child3,
            GreenNode.NodeFlags flags,
            out int hash
            )
        {
            if (CanBeCached(child1, child2, child3))
            {
                GreenStats.ItemCacheable();

                int h   = hash = GetCacheHash(kind, flags, child1, child2, child3);
                int idx = h & CacheMask;
                var e   = s_cache[idx];
                if (
                    e.hash == h &&
                    e.node != null &&
                    e.node.IsCacheEquivalent(kind, flags, child1, child2, child3)
                    )
                {
                    GreenStats.CacheHit();
                    return(e.node);
                }
            }
            else
            {
                hash = -1;
            }

            return(null);
        }
Пример #2
0
        internal static void AddNode(GreenNode node, int hash)
        {
            if (AllChildrenInCache(node) && !node.IsMissing)
            {
                GreenStats.ItemAdded();

                Debug.Assert(node.GetCacheHash() == hash);

                var idx = hash & CacheMask;
                s_cache[idx] = new Entry(hash, node);
            }
        }