140 // Return true if the frame is younger (more recent activation) than the frame represented by id 141 inline bool frame::is_younger(intptr_t* id) const { assert(this->id() != NULL && id != NULL, "NULL frame id"); 142 return this->id() < id ; } 143 144 // Return true if the frame is older (less recent activation) than the frame represented by id 145 inline bool frame::is_older(intptr_t* id) const { assert(this->id() != NULL && id != NULL, "NULL frame id"); 146 return this->id() > id ; } 147 148 149 150 inline intptr_t* frame::link() const { return (intptr_t*) *(intptr_t **)addr_at(link_offset); } 151 152 153 inline intptr_t* frame::unextended_sp() const { return _unextended_sp; } 154 155 // Return address: 156 157 inline address* frame::sender_pc_addr() const { return (address*) addr_at( return_addr_offset); } 158 inline address frame::sender_pc() const { return *sender_pc_addr(); } 159 160 #ifdef CC_INTERP 161 162 inline interpreterState frame::get_interpreterState() const { 163 return ((interpreterState)addr_at( -((int)sizeof(BytecodeInterpreter))/wordSize )); 164 } 165 166 inline intptr_t* frame::sender_sp() const { 167 // Hmm this seems awfully expensive QQQ, is this really called with interpreted frames? 168 if (is_interpreted_frame()) { 169 assert(false, "should never happen"); 170 return get_interpreterState()->sender_sp(); 171 } else { 172 return addr_at(sender_sp_offset); 173 } 174 } 175 176 inline intptr_t** frame::interpreter_frame_locals_addr() const { 177 assert(is_interpreted_frame(), "must be interpreted"); 178 return &(get_interpreterState()->_locals); 179 } 180 181 inline intptr_t* frame::interpreter_frame_bcx_addr() const { 182 assert(is_interpreted_frame(), "must be interpreted"); 183 return (intptr_t*) &(get_interpreterState()->_bcp); 184 } 185 186 187 // Constant pool cache 188 189 inline constantPoolCacheOop* frame::interpreter_frame_cache_addr() const { 190 assert(is_interpreted_frame(), "must be interpreted"); 191 return &(get_interpreterState()->_constants); 192 } 193 194 // Method 195 196 inline methodOop* frame::interpreter_frame_method_addr() const { 197 assert(is_interpreted_frame(), "must be interpreted"); 198 return &(get_interpreterState()->_method); 199 } 200 201 inline intptr_t* frame::interpreter_frame_mdx_addr() const { 202 assert(is_interpreted_frame(), "must be interpreted"); 203 return (intptr_t*) &(get_interpreterState()->_mdx); 204 } 205 206 // top of expression stack 207 inline intptr_t* frame::interpreter_frame_tos_address() const { 208 assert(is_interpreted_frame(), "wrong frame type"); 209 return get_interpreterState()->_stack + 1; 210 } 211 212 #else /* asm interpreter */ 213 inline intptr_t* frame::sender_sp() const { return addr_at( sender_sp_offset); } 214 215 inline intptr_t** frame::interpreter_frame_locals_addr() const { 216 return (intptr_t**)addr_at(interpreter_frame_locals_offset); 217 } 218 219 inline intptr_t* frame::interpreter_frame_last_sp() const { 220 return *(intptr_t**)addr_at(interpreter_frame_last_sp_offset); 221 } 222 223 inline intptr_t* frame::interpreter_frame_bcp_addr() const { 224 return (intptr_t*)addr_at(interpreter_frame_bcp_offset); 225 } 226 227 inline intptr_t* frame::interpreter_frame_mdp_addr() const { 228 return (intptr_t*)addr_at(interpreter_frame_mdp_offset); 229 } 230 231 232 // Constant pool cache 241 return (Method**)addr_at(interpreter_frame_method_offset); 242 } 243 244 // top of expression stack 245 inline intptr_t* frame::interpreter_frame_tos_address() const { 246 intptr_t* last_sp = interpreter_frame_last_sp(); 247 if (last_sp == NULL) { 248 return sp(); 249 } else { 250 // sp() may have been extended or shrunk by an adapter. At least 251 // check that we don't fall behind the legal region. 252 // For top deoptimized frame last_sp == interpreter_frame_monitor_end. 253 assert(last_sp <= (intptr_t*) interpreter_frame_monitor_end(), "bad tos"); 254 return last_sp; 255 } 256 } 257 258 inline oop* frame::interpreter_frame_temp_oop_addr() const { 259 return (oop *)(fp() + interpreter_frame_oop_temp_offset); 260 } 261 262 #endif /* CC_INTERP */ 263 264 inline int frame::pd_oop_map_offset_adjustment() const { 265 return 0; 266 } 267 268 inline int frame::interpreter_frame_monitor_size() { 269 return BasicObjectLock::size(); 270 } 271 272 273 // expression stack 274 // (the max_stack arguments are used by the GC; see class FrameClosure) 275 276 inline intptr_t* frame::interpreter_frame_expression_stack() const { 277 intptr_t* monitor_end = (intptr_t*) interpreter_frame_monitor_end(); 278 return monitor_end-1; 279 } 280 281 282 inline jint frame::interpreter_frame_expression_stack_direction() { return -1; } | 140 // Return true if the frame is younger (more recent activation) than the frame represented by id 141 inline bool frame::is_younger(intptr_t* id) const { assert(this->id() != NULL && id != NULL, "NULL frame id"); 142 return this->id() < id ; } 143 144 // Return true if the frame is older (less recent activation) than the frame represented by id 145 inline bool frame::is_older(intptr_t* id) const { assert(this->id() != NULL && id != NULL, "NULL frame id"); 146 return this->id() > id ; } 147 148 149 150 inline intptr_t* frame::link() const { return (intptr_t*) *(intptr_t **)addr_at(link_offset); } 151 152 153 inline intptr_t* frame::unextended_sp() const { return _unextended_sp; } 154 155 // Return address: 156 157 inline address* frame::sender_pc_addr() const { return (address*) addr_at( return_addr_offset); } 158 inline address frame::sender_pc() const { return *sender_pc_addr(); } 159 160 inline intptr_t* frame::sender_sp() const { return addr_at( sender_sp_offset); } 161 162 inline intptr_t** frame::interpreter_frame_locals_addr() const { 163 return (intptr_t**)addr_at(interpreter_frame_locals_offset); 164 } 165 166 inline intptr_t* frame::interpreter_frame_last_sp() const { 167 return *(intptr_t**)addr_at(interpreter_frame_last_sp_offset); 168 } 169 170 inline intptr_t* frame::interpreter_frame_bcp_addr() const { 171 return (intptr_t*)addr_at(interpreter_frame_bcp_offset); 172 } 173 174 inline intptr_t* frame::interpreter_frame_mdp_addr() const { 175 return (intptr_t*)addr_at(interpreter_frame_mdp_offset); 176 } 177 178 179 // Constant pool cache 188 return (Method**)addr_at(interpreter_frame_method_offset); 189 } 190 191 // top of expression stack 192 inline intptr_t* frame::interpreter_frame_tos_address() const { 193 intptr_t* last_sp = interpreter_frame_last_sp(); 194 if (last_sp == NULL) { 195 return sp(); 196 } else { 197 // sp() may have been extended or shrunk by an adapter. At least 198 // check that we don't fall behind the legal region. 199 // For top deoptimized frame last_sp == interpreter_frame_monitor_end. 200 assert(last_sp <= (intptr_t*) interpreter_frame_monitor_end(), "bad tos"); 201 return last_sp; 202 } 203 } 204 205 inline oop* frame::interpreter_frame_temp_oop_addr() const { 206 return (oop *)(fp() + interpreter_frame_oop_temp_offset); 207 } 208 209 inline int frame::pd_oop_map_offset_adjustment() const { 210 return 0; 211 } 212 213 inline int frame::interpreter_frame_monitor_size() { 214 return BasicObjectLock::size(); 215 } 216 217 218 // expression stack 219 // (the max_stack arguments are used by the GC; see class FrameClosure) 220 221 inline intptr_t* frame::interpreter_frame_expression_stack() const { 222 intptr_t* monitor_end = (intptr_t*) interpreter_frame_monitor_end(); 223 return monitor_end-1; 224 } 225 226 227 inline jint frame::interpreter_frame_expression_stack_direction() { return -1; } |