Mercurial > hg > graal-jvmci-8
comparison src/share/vm/oops/oopsHierarchy.hpp @ 12355:cefad50507d8
Merge with hs25-b53
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Fri, 11 Oct 2013 10:38:03 +0200 |
parents | 190899198332 |
children |
comparison
equal
deleted
inserted
replaced
12058:ccb4f2af2319 | 12355:cefad50507d8 |
---|---|
53 // When CHECK_UNHANDLED_OOPS is defined, an "oop" is a class with a | 53 // When CHECK_UNHANDLED_OOPS is defined, an "oop" is a class with a |
54 // carefully chosen set of constructors and conversion operators to go | 54 // carefully chosen set of constructors and conversion operators to go |
55 // to and from the underlying oopDesc pointer type. | 55 // to and from the underlying oopDesc pointer type. |
56 // | 56 // |
57 // Because oop and its subclasses <type>Oop are class types, arbitrary | 57 // Because oop and its subclasses <type>Oop are class types, arbitrary |
58 // conversions are not accepted by the compiler, and you may get a message | 58 // conversions are not accepted by the compiler. Applying a cast to |
59 // about overloading ambiguity (between long and int is common when converting | 59 // an oop will cause the best matched conversion operator to be |
60 // from a constant in 64 bit mode), or unable to convert from type to 'oop'. | 60 // invoked returning the underlying oopDesc* type if appropriate. |
61 // Applying a cast to one of these conversion operators first will get to the | 61 // No copy constructors, explicit user conversions or operators of |
62 // underlying oopDesc* type if appropriate. | 62 // numerical type should be defined within the oop class. Most C++ |
63 // compilers will issue a compile time error concerning the overloading | |
64 // ambiguity between operators of numerical and pointer types. If | |
65 // a conversion to or from an oop to a numerical type is needed, | |
66 // use the inline template methods, cast_*_oop, defined below. | |
67 // | |
63 // Converting NULL to oop to Handle implicit is no longer accepted by the | 68 // Converting NULL to oop to Handle implicit is no longer accepted by the |
64 // compiler because there are too many steps in the conversion. Use Handle() | 69 // compiler because there are too many steps in the conversion. Use Handle() |
65 // instead, which generates less code anyway. | 70 // instead, which generates less code anyway. |
66 | 71 |
67 class Thread; | 72 class Thread; |
81 if (CheckUnhandledOops) register_oop(); | 86 if (CheckUnhandledOops) register_oop(); |
82 } | 87 } |
83 void raw_set_obj(const void* p) { _o = (oopDesc*)p; } | 88 void raw_set_obj(const void* p) { _o = (oopDesc*)p; } |
84 | 89 |
85 oop() { set_obj(NULL); } | 90 oop() { set_obj(NULL); } |
91 oop(const oop& o) { set_obj(o.obj()); } | |
86 oop(const volatile oop& o) { set_obj(o.obj()); } | 92 oop(const volatile oop& o) { set_obj(o.obj()); } |
87 oop(const void* p) { set_obj(p); } | 93 oop(const void* p) { set_obj(p); } |
88 oop(intptr_t i) { set_obj((void *)i); } | |
89 #ifdef _LP64 | |
90 oop(int i) { set_obj((void *)i); } | |
91 #endif | |
92 ~oop() { | 94 ~oop() { |
93 if (CheckUnhandledOops) unregister_oop(); | 95 if (CheckUnhandledOops) unregister_oop(); |
94 } | 96 } |
95 | 97 |
96 oopDesc* obj() const volatile { return _o; } | 98 oopDesc* obj() const volatile { return _o; } |
99 oopDesc* operator->() const { return obj(); } | 101 oopDesc* operator->() const { return obj(); } |
100 bool operator==(const oop o) const { return obj() == o.obj(); } | 102 bool operator==(const oop o) const { return obj() == o.obj(); } |
101 bool operator==(void *p) const { return obj() == p; } | 103 bool operator==(void *p) const { return obj() == p; } |
102 bool operator!=(const volatile oop o) const { return obj() != o.obj(); } | 104 bool operator!=(const volatile oop o) const { return obj() != o.obj(); } |
103 bool operator!=(void *p) const { return obj() != p; } | 105 bool operator!=(void *p) const { return obj() != p; } |
104 bool operator==(intptr_t p) const { return obj() == (oopDesc*)p; } | |
105 bool operator!=(intptr_t p) const { return obj() != (oopDesc*)p; } | |
106 | 106 |
107 bool operator<(oop o) const { return obj() < o.obj(); } | 107 bool operator<(oop o) const { return obj() < o.obj(); } |
108 bool operator>(oop o) const { return obj() > o.obj(); } | 108 bool operator>(oop o) const { return obj() > o.obj(); } |
109 bool operator<=(oop o) const { return obj() <= o.obj(); } | 109 bool operator<=(oop o) const { return obj() <= o.obj(); } |
110 bool operator>=(oop o) const { return obj() >= o.obj(); } | 110 bool operator>=(oop o) const { return obj() >= o.obj(); } |
111 bool operator!() const { return !obj(); } | 111 bool operator!() const { return !obj(); } |
112 | 112 |
113 // Cast | 113 // Assignment |
114 oop& operator=(const oop& o) { _o = o.obj(); return *this; } | |
115 #ifndef SOLARIS | |
116 volatile oop& operator=(const oop& o) volatile { _o = o.obj(); return *this; } | |
117 #endif | |
118 volatile oop& operator=(const volatile oop& o) volatile { _o = o.obj(); return *this; } | |
119 | |
120 // Explict user conversions | |
114 operator void* () const { return (void *)obj(); } | 121 operator void* () const { return (void *)obj(); } |
122 #ifndef SOLARIS | |
123 operator void* () const volatile { return (void *)obj(); } | |
124 #endif | |
115 operator HeapWord* () const { return (HeapWord*)obj(); } | 125 operator HeapWord* () const { return (HeapWord*)obj(); } |
116 operator oopDesc* () const { return obj(); } | 126 operator oopDesc* () const { return obj(); } |
117 operator intptr_t* () const { return (intptr_t*)obj(); } | 127 operator intptr_t* () const { return (intptr_t*)obj(); } |
118 operator PromotedObject* () const { return (PromotedObject*)obj(); } | 128 operator PromotedObject* () const { return (PromotedObject*)obj(); } |
119 operator markOop () const { return markOop(obj()); } | 129 operator markOop () const { return markOop(obj()); } |
120 | 130 |
121 operator address () const { return (address)obj(); } | 131 operator address () const { return (address)obj(); } |
122 operator intptr_t () const volatile { return (intptr_t)obj(); } | |
123 | 132 |
124 // from javaCalls.cpp | 133 // from javaCalls.cpp |
125 operator jobject () const { return (jobject)obj(); } | 134 operator jobject () const { return (jobject)obj(); } |
126 // from javaClasses.cpp | 135 // from javaClasses.cpp |
127 operator JavaThread* () const { return (JavaThread*)obj(); } | 136 operator JavaThread* () const { return (JavaThread*)obj(); } |
139 #define DEF_OOP(type) \ | 148 #define DEF_OOP(type) \ |
140 class type##OopDesc; \ | 149 class type##OopDesc; \ |
141 class type##Oop : public oop { \ | 150 class type##Oop : public oop { \ |
142 public: \ | 151 public: \ |
143 type##Oop() : oop() {} \ | 152 type##Oop() : oop() {} \ |
153 type##Oop(const oop& o) : oop(o) {} \ | |
144 type##Oop(const volatile oop& o) : oop(o) {} \ | 154 type##Oop(const volatile oop& o) : oop(o) {} \ |
145 type##Oop(const void* p) : oop(p) {} \ | 155 type##Oop(const void* p) : oop(p) {} \ |
146 operator type##OopDesc* () const { return (type##OopDesc*)obj(); } \ | 156 operator type##OopDesc* () const { return (type##OopDesc*)obj(); } \ |
147 type##OopDesc* operator->() const { \ | 157 type##OopDesc* operator->() const { \ |
148 return (type##OopDesc*)obj(); \ | 158 return (type##OopDesc*)obj(); \ |
149 } \ | 159 } \ |
160 type##Oop& operator=(const type##Oop& o) { \ | |
161 oop::operator=(o); \ | |
162 return *this; \ | |
163 } \ | |
164 NOT_SOLARIS( \ | |
165 volatile type##Oop& operator=(const type##Oop& o) volatile { \ | |
166 (void)const_cast<oop&>(oop::operator=(o)); \ | |
167 return *this; \ | |
168 }) \ | |
169 volatile type##Oop& operator=(const volatile type##Oop& o) volatile {\ | |
170 (void)const_cast<oop&>(oop::operator=(o)); \ | |
171 return *this; \ | |
172 } \ | |
150 }; | 173 }; |
151 | 174 |
152 DEF_OOP(instance); | 175 DEF_OOP(instance); |
153 DEF_OOP(array); | 176 DEF_OOP(array); |
154 DEF_OOP(objArray); | 177 DEF_OOP(objArray); |
155 DEF_OOP(typeArray); | 178 DEF_OOP(typeArray); |
156 | 179 |
157 #endif // CHECK_UNHANDLED_OOPS | 180 #endif // CHECK_UNHANDLED_OOPS |
181 | |
182 // For CHECK_UNHANDLED_OOPS, it is ambiguous C++ behavior to have the oop | |
183 // structure contain explicit user defined conversions of both numerical | |
184 // and pointer type. Define inline methods to provide the numerical conversions. | |
185 template <class T> inline oop cast_to_oop(T value) { | |
186 return (oop)(CHECK_UNHANDLED_OOPS_ONLY((void *))(value)); | |
187 } | |
188 template <class T> inline T cast_from_oop(oop o) { | |
189 return (T)(CHECK_UNHANDLED_OOPS_ONLY((void*))o); | |
190 } | |
158 | 191 |
159 // The metadata hierarchy is separate from the oop hierarchy | 192 // The metadata hierarchy is separate from the oop hierarchy |
160 | 193 |
161 // class MetaspaceObj | 194 // class MetaspaceObj |
162 class ConstMethod; | 195 class ConstMethod; |