85 // use the inline template methods, cast_*_oop, defined below.
86 //
87 // Converting NULL to oop to Handle implicit is no longer accepted by the
88 // compiler because there are too many steps in the conversion. Use Handle()
89 // instead, which generates less code anyway.
90
91 class Thread;
92 class PromotedObject;
93
94
95 class oop {
96 oopDesc* _o;
97
98 #ifdef CHECK_UNHANDLED_OOPS
99 void register_oop();
100 void unregister_oop();
101 #endif
102
103 // friend class markOop;
104 public:
105 void set_obj(const void* p) {
106 raw_set_obj(p);
107 CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) register_oop();)
108 }
109 void raw_set_obj(const void* p) { _o = (oopDesc*)p; }
110
111 oop() { set_obj(NULL); }
112 oop(const oop& o) { set_obj(o.obj()); }
113 oop(const volatile oop& o) { set_obj(o.obj()); }
114 oop(const void* p) { set_obj(p); }
115 ~oop() {
116 CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) unregister_oop();)
117 }
118
119 oopDesc* obj() const volatile { return _o; }
120
121 // General access
122 oopDesc* operator->() const { return obj(); }
123 bool operator==(const oop o) const { return obj() == o.obj(); }
124 bool operator==(void *p) const { return obj() == p; }
125 bool operator!=(const volatile oop o) const { return obj() != o.obj(); }
126 bool operator!=(void *p) const { return obj() != p; }
127
128 // Assignment
129 oop& operator=(const oop& o) { _o = o.obj(); return *this; }
130 volatile oop& operator=(const oop& o) volatile { _o = o.obj(); return *this; }
131 volatile oop& operator=(const volatile oop& o) volatile { _o = o.obj(); return *this; }
132
133 // Explict user conversions
134 operator void* () const { return (void *)obj(); }
135 #ifndef SOLARIS
136 operator void* () const volatile { return (void *)obj(); }
137 #endif
138 operator HeapWord* () const { return (HeapWord*)obj(); }
139 operator oopDesc* () const volatile { return obj(); }
140 operator intptr_t* () const { return (intptr_t*)obj(); }
141 operator PromotedObject* () const { return (PromotedObject*)obj(); }
142 operator markOop () const volatile { return markOop(obj()); }
143 operator address () const { return (address)obj(); }
144
145 // from javaCalls.cpp
146 operator jobject () const { return (jobject)obj(); }
147
148 // from parNewGeneration and other things that want to get to the end of
149 // an oop for stuff (like ObjArrayKlass.cpp)
150 operator oop* () const { return (oop *)obj(); }
151 };
152
153 template<>
154 struct PrimitiveConversions::Translate<oop> : public TrueType {
155 typedef oop Value;
156 typedef oopDesc* Decayed;
157
158 static Decayed decay(Value x) { return x.obj(); }
159 static Value recover(Decayed x) { return oop(x); }
160 };
161
162 #define DEF_OOP(type) \
163 class type##OopDesc; \
164 class type##Oop : public oop { \
165 public: \
166 type##Oop() : oop() {} \
167 type##Oop(const oop& o) : oop(o) {} \
168 type##Oop(const volatile oop& o) : oop(o) {} \
169 type##Oop(const void* p) : oop(p) {} \
|
85 // use the inline template methods, cast_*_oop, defined below.
86 //
87 // Converting NULL to oop to Handle implicit is no longer accepted by the
88 // compiler because there are too many steps in the conversion. Use Handle()
89 // instead, which generates less code anyway.
90
91 class Thread;
92 class PromotedObject;
93
94
95 class oop {
96 oopDesc* _o;
97
98 #ifdef CHECK_UNHANDLED_OOPS
99 void register_oop();
100 void unregister_oop();
101 #endif
102
103 // friend class markOop;
104 public:
105 oop() : _o(NULL) { CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) register_oop();) }
106 oop(const oop& o) : _o(o._o) { CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) register_oop();) }
107 oop(const volatile oop& o) : _o(o._o) { CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) register_oop();) }
108 oop(const void* p) : _o((oopDesc*)p) { CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) register_oop();) }
109 ~oop() {
110 CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) unregister_oop();)
111 }
112
113 oopDesc* obj() const { return _o; }
114
115 // General access
116 oopDesc* operator->() const { return _o; }
117 bool operator==(const oop o) const { return _o == o._o; }
118 bool operator==(void *p) const { return _o == p; }
119 bool operator!=(const oop o) const { return _o != o._o; }
120 bool operator!=(void *p) const { return _o != p; }
121
122 // Assignment
123 oop& operator=(const oop& o) { _o = o._o; return *this; }
124 volatile oop& operator=(const oop& o) volatile { _o = o._o; return *this; }
125 volatile oop& operator=(const volatile oop& o) volatile { _o = o._o; return *this; }
126
127 // Explict user conversions
128 operator void* () const { return (void *)_o; }
129 operator HeapWord* () const { return (HeapWord*)_o; }
130 operator oopDesc* () const { return _o; }
131 operator intptr_t* () const { return (intptr_t*)_o; }
132 operator PromotedObject* () const { return (PromotedObject*)_o; }
133 operator markOop () const { return markOop(_o); }
134 operator address () const { return (address)_o; }
135
136 // from javaCalls.cpp
137 operator jobject () const { return (jobject)_o; }
138
139 // from parNewGeneration and other things that want to get to the end of
140 // an oop for stuff (like ObjArrayKlass.cpp)
141 operator oop* () const { return (oop *)_o; }
142 };
143
144 template<>
145 struct PrimitiveConversions::Translate<oop> : public TrueType {
146 typedef oop Value;
147 typedef oopDesc* Decayed;
148
149 static Decayed decay(Value x) { return x.obj(); }
150 static Value recover(Decayed x) { return oop(x); }
151 };
152
153 #define DEF_OOP(type) \
154 class type##OopDesc; \
155 class type##Oop : public oop { \
156 public: \
157 type##Oop() : oop() {} \
158 type##Oop(const oop& o) : oop(o) {} \
159 type##Oop(const volatile oop& o) : oop(o) {} \
160 type##Oop(const void* p) : oop(p) {} \
|