106 type##Oop obj() const { return (type##Oop)Handle::obj(); } \
107 type##Oop non_null_obj() const { return (type##Oop)Handle::non_null_obj(); } \
108 \
109 public: \
110 /* Constructors */ \
111 type##Handle () : Handle() {} \
112 type##Handle (type##Oop obj) : Handle((oop)obj) { \
113 assert(is_null() || ((oop)obj)->is_a(), \
114 "illegal type"); \
115 } \
116 type##Handle (Thread* thread, type##Oop obj) : Handle(thread, (oop)obj) { \
117 assert(is_null() || ((oop)obj)->is_a(), "illegal type"); \
118 } \
119 \
120 /* Operators for ease of use */ \
121 type##Oop operator () () const { return obj(); } \
122 type##Oop operator -> () const { return non_null_obj(); } \
123 };
124
125
126 DEF_HANDLE(instance , is_instance )
127 DEF_HANDLE(array , is_array )
128 DEF_HANDLE(objArray , is_objArray )
129 DEF_HANDLE(typeArray , is_typeArray )
130
131 //------------------------------------------------------------------------------------------------------------------------
132
133 // Metadata Handles. Unlike oop Handles these are needed to prevent metadata
134 // from being reclaimed by RedefineClasses.
135
136 // Specific Handles for different oop types
137 #define DEF_METADATA_HANDLE(name, type) \
138 class name##Handle; \
139 class name##Handle : public StackObj { \
140 type* _value; \
141 Thread* _thread; \
142 protected: \
143 type* obj() const { return _value; } \
144 type* non_null_obj() const { assert(_value != NULL, "resolving NULL _value"); return _value; } \
145 \
146 public: \
147 /* Constructors */ \
148 name##Handle () : _value(NULL), _thread(NULL) {} \
149 name##Handle (type* obj); \
|
106 type##Oop obj() const { return (type##Oop)Handle::obj(); } \
107 type##Oop non_null_obj() const { return (type##Oop)Handle::non_null_obj(); } \
108 \
109 public: \
110 /* Constructors */ \
111 type##Handle () : Handle() {} \
112 type##Handle (type##Oop obj) : Handle((oop)obj) { \
113 assert(is_null() || ((oop)obj)->is_a(), \
114 "illegal type"); \
115 } \
116 type##Handle (Thread* thread, type##Oop obj) : Handle(thread, (oop)obj) { \
117 assert(is_null() || ((oop)obj)->is_a(), "illegal type"); \
118 } \
119 \
120 /* Operators for ease of use */ \
121 type##Oop operator () () const { return obj(); } \
122 type##Oop operator -> () const { return non_null_obj(); } \
123 };
124
125
126 DEF_HANDLE(instance , is_instance_noinline )
127 DEF_HANDLE(array , is_array_noinline )
128 DEF_HANDLE(objArray , is_objArray_noinline )
129 DEF_HANDLE(typeArray , is_typeArray_noinline )
130
131 //------------------------------------------------------------------------------------------------------------------------
132
133 // Metadata Handles. Unlike oop Handles these are needed to prevent metadata
134 // from being reclaimed by RedefineClasses.
135
136 // Specific Handles for different oop types
137 #define DEF_METADATA_HANDLE(name, type) \
138 class name##Handle; \
139 class name##Handle : public StackObj { \
140 type* _value; \
141 Thread* _thread; \
142 protected: \
143 type* obj() const { return _value; } \
144 type* non_null_obj() const { assert(_value != NULL, "resolving NULL _value"); return _value; } \
145 \
146 public: \
147 /* Constructors */ \
148 name##Handle () : _value(NULL), _thread(NULL) {} \
149 name##Handle (type* obj); \
|