< prev index next >

src/hotspot/share/oops/oopsHierarchy.hpp

optimized_oop

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) {}                                \
< prev index next >