Beispiel #1
0
        /*      private class EdgeCounter : FieldTraverser
                {
                    private int count = 0;
                    public override void DoTraversal(Object field)
                    {
                        throw new ApplicationException("EdgePrinter should never traverse non Ptrs");
                    }
                    public override void DoTraversal(Pointer ptr)
                    {
                        if(ptr == 0u) return;
                        count ++;
                    }
                    public void reset(){count = 0;}
                    public int edgeCount(){return count;}
                }

        */
        public static void TraverseHeap(StateImpl state, FieldTraverser edge, FieldTraverser node)
        {
            heapQueue = new Queue();
            seen = new Hashtable();

            ReferenceTraverser et = new ReferenceTraverser(state, edge);

            state.TraverseGlobalReferences(et);

            for (int i = 0; i < state.NumProcesses; i++)
            {
                Process p = state.GetProcess(i);
                for (ZingMethod m = p.TopOfStack; m != null; m = m.Caller)
                {
                    m.TraverseFields(et);
                }
            }

            while (heapQueue.Count > 0)
            {
                Pointer ptr = (Pointer)heapQueue.Dequeue();
                if (node != null) node.DoTraversal(ptr);
                HeapEntry he = (HeapEntry)state.Heap[ptr];
                he.heList.TraverseFields(et);
            }
        }