0
|
1 /*
|
|
2 * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved.
|
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
4 *
|
|
5 * This code is free software; you can redistribute it and/or modify it
|
|
6 * under the terms of the GNU General Public License version 2 only, as
|
|
7 * published by the Free Software Foundation.
|
|
8 *
|
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT
|
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
12 * version 2 for more details (a copy is included in the LICENSE file that
|
|
13 * accompanied this code).
|
|
14 *
|
|
15 * You should have received a copy of the GNU General Public License version
|
|
16 * 2 along with this work; if not, write to the Free Software Foundation,
|
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18 *
|
|
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
20 * CA 95054 USA or visit www.sun.com if you need additional information or
|
|
21 * have any questions.
|
|
22 *
|
|
23 */
|
|
24
|
|
25 package sun.jvm.hotspot.utilities;
|
|
26
|
|
27 import java.io.*;
|
|
28 import java.util.*;
|
|
29 import sun.jvm.hotspot.oops.*;
|
|
30
|
|
31 /** Describes a path from an object back to the root which is keeping
|
|
32 it alive. Elements of the path are (object, field) pairs, where
|
|
33 the object is expressed as a @link{sun.jvm.hotspot.oops.Oop}, and
|
|
34 where the field is expressed as a
|
|
35 @link{sun.jvm.hotspot.oops.FieldIdentifier}. If the element
|
|
36 reflects a root, the Oop will be null. If the element is the end
|
|
37 of the path, the FieldIdentifier will be null. */
|
|
38
|
|
39 public class LivenessPath {
|
|
40 LivenessPath() {
|
|
41 stack = new Stack();
|
|
42 }
|
|
43
|
|
44 /** Number of elements in the path */
|
|
45 public int size() {
|
|
46 return stack.size();
|
|
47 }
|
|
48
|
|
49 /** Fetch the element at the given index; 0-based */
|
|
50 public LivenessPathElement get(int index) throws ArrayIndexOutOfBoundsException {
|
|
51 return (LivenessPathElement) stack.get(index);
|
|
52 }
|
|
53
|
|
54 public void printOn(PrintStream tty) {
|
|
55 for (int j = 0; j < size(); j++) {
|
|
56 LivenessPathElement el = get(j);
|
|
57 tty.print(" - ");
|
|
58 if (el.getObj() != null) {
|
|
59 Oop.printOopValueOn(el.getObj(), tty);
|
|
60 }
|
|
61 if (el.getField() != null) {
|
|
62 if (el.getObj() != null) {
|
|
63 tty.print(", field ");
|
|
64 }
|
|
65 tty.print(el.getField().getName());
|
|
66 }
|
|
67 tty.println();
|
|
68 }
|
|
69 }
|
|
70
|
|
71 /** Indicates whether this path is "complete", i.e., whether the
|
|
72 last element is a root. Convenience routine for LivenessAnalysis. */
|
|
73 boolean isComplete() {
|
|
74 if (size() == 0)
|
|
75 return false;
|
|
76 return peek().isRoot();
|
|
77 }
|
|
78
|
|
79 // Convenience routine for LivenessAnalysis
|
|
80 LivenessPathElement peek() {
|
|
81 return (LivenessPathElement) stack.peek();
|
|
82 }
|
|
83
|
|
84 // Convenience routine for LivenessAnalysis
|
|
85 void push(LivenessPathElement el) {
|
|
86 stack.push(el);
|
|
87 }
|
|
88
|
|
89 // Convenience routine for LivenessAnalysis
|
|
90 void pop() {
|
|
91 stack.pop();
|
|
92 }
|
|
93
|
|
94 // Make a copy of the contents of the path -- the
|
|
95 // LivenessPathElements are not duplicated, only the containing path
|
|
96 LivenessPath copy() {
|
|
97 LivenessPath dup = new LivenessPath();
|
|
98 for (int i = 0; i < stack.size(); i++) {
|
|
99 dup.stack.push(stack.get(i));
|
|
100 }
|
|
101 return dup;
|
|
102 }
|
|
103
|
|
104 //---------------------------------------------------------------------------
|
|
105 // Internals only below this point
|
|
106 //
|
|
107 private Stack stack;
|
|
108 }
|