src/share/vm/runtime/vframe.cpp

Print this page
rev 6212 : 8038624: interpretedVFrame::expressions() must respect InterpreterOopMap for liveness
Reviewed-by:


 305 
 306   assert(length == values->size(), "Mismatch between actual stack format and supplied data");
 307 
 308   // handle locals
 309   for (int i = 0; i < length; i++) {
 310     // Find stack location
 311     intptr_t *addr = locals_addr_at(i);
 312 
 313     // Depending on oop/int put it in the right package
 314     StackValue *sv = values->at(i);
 315     assert(sv != NULL, "sanity check");
 316     if (sv->type() == T_OBJECT) {
 317       *(oop *) addr = (sv->get_obj())();
 318     } else {                   // integer
 319       *addr = sv->get_int();
 320     }
 321   }
 322 }
 323 
 324 StackValueCollection*  interpretedVFrame::expressions() const {
 325   int length = fr().interpreter_frame_expression_stack_size();
 326   if (method()->is_native()) {
 327     // If the method is native, there is no expression stack
 328     length = 0;
 329   }
 330 
 331   int nof_locals = method()->max_locals();
 332   StackValueCollection* result = new StackValueCollection(length);
 333 
 334   InterpreterOopMap oop_mask;


 335   // Get oopmap describing oops and int for current bci
 336   if (TraceDeoptimization && Verbose) {
 337     methodHandle m_h(method());
 338     OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask);
 339   } else {
 340     method()->mask_for(bci(), &oop_mask);
 341   }















 342   // handle expressions
 343   for(int i=0; i < length; i++) {
 344     // Find stack location
 345     intptr_t *addr = fr().interpreter_frame_expression_stack_at(i);
 346 
 347     // Depending on oop/int put it in the right package
 348     StackValue *sv;
 349     if (oop_mask.is_oop(i + nof_locals)) {
 350       // oop value
 351       Handle h(*(oop *)addr);
 352       sv = new StackValue(h);
 353     } else {
 354       // integer
 355       sv = new StackValue(*addr);
 356     }
 357     assert(sv != NULL, "sanity check");
 358     result->add(sv);
 359   }
 360   return result;
 361 }




 305 
 306   assert(length == values->size(), "Mismatch between actual stack format and supplied data");
 307 
 308   // handle locals
 309   for (int i = 0; i < length; i++) {
 310     // Find stack location
 311     intptr_t *addr = locals_addr_at(i);
 312 
 313     // Depending on oop/int put it in the right package
 314     StackValue *sv = values->at(i);
 315     assert(sv != NULL, "sanity check");
 316     if (sv->type() == T_OBJECT) {
 317       *(oop *) addr = (sv->get_obj())();
 318     } else {                   // integer
 319       *addr = sv->get_int();
 320     }
 321   }
 322 }
 323 
 324 StackValueCollection* interpretedVFrame::expressions() const {








 325 
 326   InterpreterOopMap oop_mask;
 327 
 328   if (!method()->is_native()) {
 329     // Get oopmap describing oops and int for current bci
 330     if (TraceDeoptimization && Verbose) {
 331       methodHandle m_h(method());
 332       OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask);
 333     } else {
 334       method()->mask_for(bci(), &oop_mask);
 335     }
 336   }
 337 
 338   int length = oop_mask.expression_stack_size();
 339 
 340   assert(fr().interpreter_frame_expression_stack_size() >= length,
 341     "error in expression stack!");
 342 
 343   StackValueCollection* result = new StackValueCollection(length);
 344 
 345   if (0 == length) {
 346     return result;
 347   }
 348 
 349   int nof_locals = method()->max_locals();
 350 
 351   // handle expressions
 352   for(int i=0; i < length; i++) {
 353     // Find stack location
 354     intptr_t *addr = fr().interpreter_frame_expression_stack_at(i);
 355 
 356     // Depending on oop/int put it in the right package
 357     StackValue *sv;
 358     if (oop_mask.is_oop(i + nof_locals)) {
 359       // oop value
 360       Handle h(*(oop *)addr);
 361       sv = new StackValue(h);
 362     } else {
 363       // integer
 364       sv = new StackValue(*addr);
 365     }
 366     assert(sv != NULL, "sanity check");
 367     result->add(sv);
 368   }
 369   return result;
 370 }