1 /* |
1 /* |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
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 |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
31 // OBJECT hierarchy |
31 // OBJECT hierarchy |
32 // This hierarchy is a representation hierarchy, i.e. if A is a superclass |
32 // This hierarchy is a representation hierarchy, i.e. if A is a superclass |
33 // of B, A's representation is a prefix of B's representation. |
33 // of B, A's representation is a prefix of B's representation. |
34 |
34 |
35 typedef juint narrowOop; // Offset instead of address for an oop within a java object |
35 typedef juint narrowOop; // Offset instead of address for an oop within a java object |
36 typedef class klassOopDesc* wideKlassOop; // to keep SA happy and unhandled oop |
|
37 // detector happy. |
|
38 typedef void* OopOrNarrowOopStar; |
36 typedef void* OopOrNarrowOopStar; |
|
37 typedef class markOopDesc* markOop; |
39 |
38 |
40 #ifndef CHECK_UNHANDLED_OOPS |
39 #ifndef CHECK_UNHANDLED_OOPS |
41 |
40 |
42 typedef class oopDesc* oop; |
41 typedef class oopDesc* oop; |
43 typedef class instanceOopDesc* instanceOop; |
42 typedef class instanceOopDesc* instanceOop; |
44 typedef class methodOopDesc* methodOop; |
|
45 typedef class constMethodOopDesc* constMethodOop; |
|
46 typedef class methodDataOopDesc* methodDataOop; |
|
47 typedef class arrayOopDesc* arrayOop; |
43 typedef class arrayOopDesc* arrayOop; |
48 typedef class objArrayOopDesc* objArrayOop; |
44 typedef class objArrayOopDesc* objArrayOop; |
49 typedef class typeArrayOopDesc* typeArrayOop; |
45 typedef class typeArrayOopDesc* typeArrayOop; |
50 typedef class constantPoolOopDesc* constantPoolOop; |
|
51 typedef class constantPoolCacheOopDesc* constantPoolCacheOop; |
|
52 typedef class klassOopDesc* klassOop; |
|
53 typedef class markOopDesc* markOop; |
|
54 typedef class compiledICHolderOopDesc* compiledICHolderOop; |
|
55 |
46 |
56 #else |
47 #else |
57 |
|
58 |
48 |
59 // When CHECK_UNHANDLED_OOPS is defined, an "oop" is a class with a |
49 // When CHECK_UNHANDLED_OOPS is defined, an "oop" is a class with a |
60 // carefully chosen set of constructors and conversion operators to go |
50 // carefully chosen set of constructors and conversion operators to go |
61 // to and from the underlying oopDesc pointer type. |
51 // to and from the underlying oopDesc pointer type. |
62 // |
52 // |
104 |
93 |
105 // General access |
94 // General access |
106 oopDesc* operator->() const { return obj(); } |
95 oopDesc* operator->() const { return obj(); } |
107 bool operator==(const oop o) const { return obj() == o.obj(); } |
96 bool operator==(const oop o) const { return obj() == o.obj(); } |
108 bool operator==(void *p) const { return obj() == p; } |
97 bool operator==(void *p) const { return obj() == p; } |
109 bool operator!=(const oop o) const { return obj() != o.obj(); } |
98 bool operator!=(const volatile oop o) const { return obj() != o.obj(); } |
110 bool operator!=(void *p) const { return obj() != p; } |
99 bool operator!=(void *p) const { return obj() != p; } |
111 bool operator==(intptr_t p) const { return obj() == (oopDesc*)p; } |
100 bool operator==(intptr_t p) const { return obj() == (oopDesc*)p; } |
112 bool operator!=(intptr_t p) const { return obj() != (oopDesc*)p; } |
101 bool operator!=(intptr_t p) const { return obj() != (oopDesc*)p; } |
113 |
102 |
114 bool operator<(oop o) const { return obj() < o.obj(); } |
103 bool operator<(oop o) const { return obj() < o.obj(); } |
124 operator intptr_t* () const { return (intptr_t*)obj(); } |
113 operator intptr_t* () const { return (intptr_t*)obj(); } |
125 operator PromotedObject* () const { return (PromotedObject*)obj(); } |
114 operator PromotedObject* () const { return (PromotedObject*)obj(); } |
126 operator markOop () const { return markOop(obj()); } |
115 operator markOop () const { return markOop(obj()); } |
127 |
116 |
128 operator address () const { return (address)obj(); } |
117 operator address () const { return (address)obj(); } |
129 operator intptr_t () const { return (intptr_t)obj(); } |
118 operator intptr_t () const volatile { return (intptr_t)obj(); } |
130 |
119 |
131 // from javaCalls.cpp |
120 // from javaCalls.cpp |
132 operator jobject () const { return (jobject)obj(); } |
121 operator jobject () const { return (jobject)obj(); } |
133 // from javaClasses.cpp |
122 // from javaClasses.cpp |
134 operator JavaThread* () const { return (JavaThread*)obj(); } |
123 operator JavaThread* () const { return (JavaThread*)obj(); } |
137 // from jvm.cpp |
126 // from jvm.cpp |
138 operator jlong* () const { return (jlong*)obj(); } |
127 operator jlong* () const { return (jlong*)obj(); } |
139 #endif |
128 #endif |
140 |
129 |
141 // from parNewGeneration and other things that want to get to the end of |
130 // from parNewGeneration and other things that want to get to the end of |
142 // an oop for stuff (like constMethodKlass.cpp, objArrayKlass.cpp) |
131 // an oop for stuff (like objArrayKlass.cpp) |
143 operator oop* () const { return (oop *)obj(); } |
132 operator oop* () const { return (oop *)obj(); } |
144 }; |
133 }; |
145 |
134 |
146 #define DEF_OOP(type) \ |
135 #define DEF_OOP(type) \ |
147 class type##OopDesc; \ |
136 class type##OopDesc; \ |
152 type##Oop(const void* p) : oop(p) {} \ |
141 type##Oop(const void* p) : oop(p) {} \ |
153 operator type##OopDesc* () const { return (type##OopDesc*)obj(); } \ |
142 operator type##OopDesc* () const { return (type##OopDesc*)obj(); } \ |
154 type##OopDesc* operator->() const { \ |
143 type##OopDesc* operator->() const { \ |
155 return (type##OopDesc*)obj(); \ |
144 return (type##OopDesc*)obj(); \ |
156 } \ |
145 } \ |
157 }; \ |
146 }; |
158 |
147 |
159 DEF_OOP(instance); |
148 DEF_OOP(instance); |
160 DEF_OOP(method); |
|
161 DEF_OOP(methodData); |
|
162 DEF_OOP(array); |
149 DEF_OOP(array); |
163 DEF_OOP(constMethod); |
|
164 DEF_OOP(constantPool); |
|
165 DEF_OOP(constantPoolCache); |
|
166 DEF_OOP(objArray); |
150 DEF_OOP(objArray); |
167 DEF_OOP(typeArray); |
151 DEF_OOP(typeArray); |
168 DEF_OOP(klass); |
|
169 DEF_OOP(compiledICHolder); |
|
170 |
152 |
171 #endif // CHECK_UNHANDLED_OOPS |
153 #endif // CHECK_UNHANDLED_OOPS |
|
154 |
|
155 // The metadata hierarchy is separate from the oop hierarchy |
|
156 |
|
157 // class MetaspaceObj |
|
158 class ConstMethod; |
|
159 class ConstantPoolCache; |
|
160 class MethodData; |
|
161 // class Metadata |
|
162 class Method; |
|
163 class ConstantPool; |
|
164 // class CHeapObj |
|
165 class CompiledICHolder; |
|
166 |
172 |
167 |
173 // The klass hierarchy is separate from the oop hierarchy. |
168 // The klass hierarchy is separate from the oop hierarchy. |
174 |
169 |
175 class Klass; |
170 class Klass; |
176 class instanceKlass; |
171 class InstanceKlass; |
177 class instanceMirrorKlass; |
172 class instanceMirrorKlass; |
|
173 class instanceClassLoaderKlass; |
178 class instanceRefKlass; |
174 class instanceRefKlass; |
179 class methodKlass; |
|
180 class constMethodKlass; |
|
181 class methodDataKlass; |
|
182 class klassKlass; |
|
183 class instanceKlassKlass; |
|
184 class arrayKlassKlass; |
|
185 class objArrayKlassKlass; |
|
186 class typeArrayKlassKlass; |
|
187 class arrayKlass; |
175 class arrayKlass; |
188 class objArrayKlass; |
176 class objArrayKlass; |
189 class typeArrayKlass; |
177 class typeArrayKlass; |
190 class constantPoolKlass; |
|
191 class constantPoolCacheKlass; |
|
192 class compiledICHolderKlass; |
|
193 |
178 |
194 #endif // SHARE_VM_OOPS_OOPSHIERARCHY_HPP |
179 #endif // SHARE_VM_OOPS_OOPSHIERARCHY_HPP |