1 /*
   2  * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/javaClasses.inline.hpp"
  27 #include "classfile/systemDictionary.hpp"
  28 #include "classfile/vmSymbols.hpp"
  29 #include "code/codeCache.hpp"
  30 #include "code/debugInfoRec.hpp"
  31 #include "code/nmethod.hpp"
  32 #include "code/pcDesc.hpp"
  33 #include "code/scopeDesc.hpp"
  34 #include "interpreter/interpreter.hpp"
  35 #include "interpreter/oopMapCache.hpp"
  36 #include "memory/resourceArea.hpp"
  37 #include "oops/instanceKlass.hpp"
  38 #include "oops/oop.inline.hpp"
  39 #include "runtime/frame.inline.hpp"
  40 #include "runtime/handles.inline.hpp"
  41 #include "runtime/objectMonitor.hpp"
  42 #include "runtime/objectMonitor.inline.hpp"
  43 #include "runtime/signature.hpp"
  44 #include "runtime/stubRoutines.hpp"
  45 #include "runtime/synchronizer.hpp"
  46 #include "runtime/thread.inline.hpp"
  47 #include "runtime/vframe.inline.hpp"
  48 #include "runtime/vframeArray.hpp"
  49 #include "runtime/vframe_hp.hpp"
  50 
  51 vframe::vframe(const frame* fr, const RegisterMap* reg_map, JavaThread* thread)
  52 : _reg_map(reg_map), _thread(thread) {
  53   assert(fr != NULL, "must have frame");
  54   _fr = *fr;
  55 }
  56 
  57 vframe::vframe(const frame* fr, JavaThread* thread)
  58 : _reg_map(thread), _thread(thread) {
  59   assert(fr != NULL, "must have frame");
  60   _fr = *fr;
  61 }
  62 
  63 vframe* vframe::new_vframe(const frame* f, const RegisterMap* reg_map, JavaThread* thread) {
  64   // Interpreter frame
  65   if (f->is_interpreted_frame()) {
  66     return new interpretedVFrame(f, reg_map, thread);
  67   }
  68 
  69   // Compiled frame
  70   CodeBlob* cb = f->cb();
  71   if (cb != NULL) {
  72     if (cb->is_compiled()) {
  73       CompiledMethod* nm = (CompiledMethod*)cb;
  74       return new compiledVFrame(f, reg_map, thread, nm);
  75     }
  76 
  77     if (f->is_runtime_frame()) {
  78       // Skip this frame and try again.
  79       RegisterMap temp_map = *reg_map;
  80       frame s = f->sender(&temp_map);
  81       return new_vframe(&s, &temp_map, thread);
  82     }
  83   }
  84 
  85   // External frame
  86   return new externalVFrame(f, reg_map, thread);
  87 }
  88 
  89 vframe* vframe::sender() const {
  90   RegisterMap temp_map = *register_map();
  91   assert(is_top(), "just checking");
  92   if (_fr.is_entry_frame() && _fr.is_first_frame()) return NULL;
  93   frame s = _fr.real_sender(&temp_map);
  94   if (s.is_first_frame()) return NULL;
  95   return vframe::new_vframe(&s, &temp_map, thread());
  96 }
  97 
  98 vframe* vframe::top() const {
  99   vframe* vf = (vframe*) this;
 100   while (!vf->is_top()) vf = vf->sender();
 101   return vf;
 102 }
 103 
 104 
 105 javaVFrame* vframe::java_sender() const {
 106   vframe* f = sender();
 107   while (f != NULL) {
 108     if (f->is_java_frame()) return javaVFrame::cast(f);
 109     f = f->sender();
 110   }
 111   return NULL;
 112 }
 113 
 114 // ------------- javaVFrame --------------
 115 
 116 GrowableArray<MonitorInfo*>* javaVFrame::locked_monitors() {
 117   assert(SafepointSynchronize::is_at_safepoint() || JavaThread::current() == thread(),
 118          "must be at safepoint or it's a java frame of the current thread");
 119 
 120   GrowableArray<MonitorInfo*>* mons = monitors();
 121   GrowableArray<MonitorInfo*>* result = new GrowableArray<MonitorInfo*>(mons->length());
 122   if (mons->is_empty()) return result;
 123 
 124   bool found_first_monitor = false;
 125   // The ObjectMonitor* can't be async deflated since we are either
 126   // at a safepoint or the calling thread is operating on itself so
 127   // it cannot exit the ObjectMonitor so it remains busy.
 128   ObjectMonitor *waiting_monitor = thread()->current_waiting_monitor();
 129   ObjectMonitor *pending_monitor = NULL;
 130   if (waiting_monitor == NULL) {
 131     pending_monitor = thread()->current_pending_monitor();
 132   }
 133   oop pending_obj = (pending_monitor != NULL ? (oop) pending_monitor->object() : (oop) NULL);
 134   oop waiting_obj = (waiting_monitor != NULL ? (oop) waiting_monitor->object() : (oop) NULL);
 135 
 136   for (int index = (mons->length()-1); index >= 0; index--) {
 137     MonitorInfo* monitor = mons->at(index);
 138     if (monitor->eliminated() && is_compiled_frame()) continue; // skip eliminated monitor
 139     oop obj = monitor->owner();
 140     if (obj == NULL) continue; // skip unowned monitor
 141     //
 142     // Skip the monitor that the thread is blocked to enter or waiting on
 143     //
 144     if (!found_first_monitor && (obj == pending_obj || obj == waiting_obj)) {
 145       continue;
 146     }
 147     found_first_monitor = true;
 148     result->append(monitor);
 149   }
 150   return result;
 151 }
 152 
 153 void javaVFrame::print_locked_object_class_name(outputStream* st, Handle obj, const char* lock_state) {
 154   if (obj.not_null()) {
 155     st->print("\t- %s <" INTPTR_FORMAT "> ", lock_state, p2i(obj()));
 156     if (obj->klass() == SystemDictionary::Class_klass()) {
 157       st->print_cr("(a java.lang.Class for %s)", java_lang_Class::as_external_name(obj()));
 158     } else {
 159       Klass* k = obj->klass();
 160       st->print_cr("(a %s)", k->external_name());
 161     }
 162   }
 163 }
 164 
 165 void javaVFrame::print_lock_info_on(outputStream* st, int frame_count) {
 166   Thread* THREAD = Thread::current();
 167   ResourceMark rm(THREAD);
 168 
 169   // If this is the first frame and it is java.lang.Object.wait(...)
 170   // then print out the receiver. Locals are not always available,
 171   // e.g., compiled native frames have no scope so there are no locals.
 172   if (frame_count == 0) {
 173     if (method()->name() == vmSymbols::wait_name() &&
 174         method()->method_holder()->name() == vmSymbols::java_lang_Object()) {
 175       const char *wait_state = "waiting on"; // assume we are waiting
 176       // If earlier in the output we reported java.lang.Thread.State ==
 177       // "WAITING (on object monitor)" and now we report "waiting on", then
 178       // we are still waiting for notification or timeout. Otherwise if
 179       // we earlier reported java.lang.Thread.State == "BLOCKED (on object
 180       // monitor)", then we are actually waiting to re-lock the monitor.
 181       StackValueCollection* locs = locals();
 182       if (!locs->is_empty()) {
 183         StackValue* sv = locs->at(0);
 184         if (sv->type() == T_OBJECT) {
 185           Handle o = locs->at(0)->get_obj();
 186           if (java_lang_Thread::get_thread_status(thread()->threadObj()) ==
 187                                 java_lang_Thread::BLOCKED_ON_MONITOR_ENTER) {
 188             wait_state = "waiting to re-lock in wait()";
 189           }
 190           print_locked_object_class_name(st, o, wait_state);
 191         }
 192       } else {
 193         st->print_cr("\t- %s <no object reference available>", wait_state);
 194       }
 195     } else if (thread()->current_park_blocker() != NULL) {
 196       oop obj = thread()->current_park_blocker();
 197       Klass* k = obj->klass();
 198       st->print_cr("\t- %s <" INTPTR_FORMAT "> (a %s)", "parking to wait for ", p2i(obj), k->external_name());
 199     }
 200     else if (thread()->osthread()->get_state() == OBJECT_WAIT) {
 201       // We are waiting on an Object monitor but Object.wait() isn't the
 202       // top-frame, so we should be waiting on a Class initialization monitor.
 203       InstanceKlass* k = thread()->class_to_be_initialized();
 204       if (k != NULL) {
 205         st->print_cr("\t- waiting on the Class initialization monitor for %s", k->external_name());
 206       }
 207     }
 208   }
 209 
 210   // Print out all monitors that we have locked, or are trying to lock,
 211   // including re-locking after being notified or timing out in a wait().
 212   GrowableArray<MonitorInfo*>* mons = monitors();
 213   if (!mons->is_empty()) {
 214     bool found_first_monitor = false;
 215     for (int index = (mons->length()-1); index >= 0; index--) {
 216       MonitorInfo* monitor = mons->at(index);
 217       if (monitor->eliminated() && is_compiled_frame()) { // Eliminated in compiled code
 218         if (monitor->owner_is_scalar_replaced()) {
 219           Klass* k = java_lang_Class::as_Klass(monitor->owner_klass());
 220           st->print("\t- eliminated <owner is scalar replaced> (a %s)", k->external_name());
 221         } else {
 222           Handle obj(THREAD, monitor->owner());
 223           if (obj() != NULL) {
 224             print_locked_object_class_name(st, obj, "eliminated");
 225           }
 226         }
 227         continue;
 228       }
 229       if (monitor->owner() != NULL) {
 230         // the monitor is associated with an object, i.e., it is locked
 231 
 232         const char *lock_state = "locked"; // assume we have the monitor locked
 233         if (!found_first_monitor && frame_count == 0) {
 234           // If this is the first frame and we haven't found an owned
 235           // monitor before, then we need to see if we have completed
 236           // the lock or if we are blocked trying to acquire it. Only
 237           // an inflated monitor that is first on the monitor list in
 238           // the first frame can block us on a monitor enter.
 239           markWord mark = monitor->owner()->mark();
 240           // The first stage of async deflation does not affect any field
 241           // used by this comparison so the ObjectMonitor* is usable here.
 242           if (mark.has_monitor() &&
 243               ( // we have marked ourself as pending on this monitor
 244                 mark.monitor() == thread()->current_pending_monitor() ||
 245                 // we are not the owner of this monitor
 246                 !mark.monitor()->is_entered(thread())
 247               )) {
 248             lock_state = "waiting to lock";
 249           }
 250         }
 251         print_locked_object_class_name(st, Handle(THREAD, monitor->owner()), lock_state);
 252 
 253         found_first_monitor = true;
 254       }
 255     }
 256   }
 257 }
 258 
 259 // ------------- interpretedVFrame --------------
 260 
 261 u_char* interpretedVFrame::bcp() const {
 262   return fr().interpreter_frame_bcp();
 263 }
 264 
 265 void interpretedVFrame::set_bcp(u_char* bcp) {
 266   fr().interpreter_frame_set_bcp(bcp);
 267 }
 268 
 269 intptr_t* interpretedVFrame::locals_addr_at(int offset) const {
 270   assert(fr().is_interpreted_frame(), "frame should be an interpreted frame");
 271   return fr().interpreter_frame_local_at(offset);
 272 }
 273 
 274 
 275 GrowableArray<MonitorInfo*>* interpretedVFrame::monitors() const {
 276   GrowableArray<MonitorInfo*>* result = new GrowableArray<MonitorInfo*>(5);
 277   for (BasicObjectLock* current = (fr().previous_monitor_in_interpreter_frame(fr().interpreter_frame_monitor_begin()));
 278        current >= fr().interpreter_frame_monitor_end();
 279        current = fr().previous_monitor_in_interpreter_frame(current)) {
 280     result->push(new MonitorInfo(current->obj(), current->lock(), false, false));
 281   }
 282   return result;
 283 }
 284 
 285 int interpretedVFrame::bci() const {
 286   return method()->bci_from(bcp());
 287 }
 288 
 289 Method* interpretedVFrame::method() const {
 290   return fr().interpreter_frame_method();
 291 }
 292 
 293 static StackValue* create_stack_value_from_oop_map(const InterpreterOopMap& oop_mask,
 294                                                    int index,
 295                                                    const intptr_t* const addr) {
 296 
 297   assert(index >= 0 &&
 298          index < oop_mask.number_of_entries(), "invariant");
 299 
 300   // categorize using oop_mask
 301   if (oop_mask.is_oop(index)) {
 302     // reference (oop) "r"
 303     Handle h(Thread::current(), addr != NULL ? (*(oop*)addr) : (oop)NULL);
 304     return new StackValue(h);
 305   }
 306   // value (integer) "v"
 307   return new StackValue(addr != NULL ? *addr : 0);
 308 }
 309 
 310 static bool is_in_expression_stack(const frame& fr, const intptr_t* const addr) {
 311   assert(addr != NULL, "invariant");
 312 
 313   // Ensure to be 'inside' the expresion stack (i.e., addr >= sp for Intel).
 314   // In case of exceptions, the expression stack is invalid and the sp
 315   // will be reset to express this condition.
 316   if (frame::interpreter_frame_expression_stack_direction() > 0) {
 317     return addr <= fr.interpreter_frame_tos_address();
 318   }
 319 
 320   return addr >= fr.interpreter_frame_tos_address();
 321 }
 322 
 323 static void stack_locals(StackValueCollection* result,
 324                          int length,
 325                          const InterpreterOopMap& oop_mask,
 326                          const frame& fr) {
 327 
 328   assert(result != NULL, "invariant");
 329 
 330   for (int i = 0; i < length; ++i) {
 331     const intptr_t* const addr = fr.interpreter_frame_local_at(i);
 332     assert(addr != NULL, "invariant");
 333     assert(addr >= fr.sp(), "must be inside the frame");
 334 
 335     StackValue* const sv = create_stack_value_from_oop_map(oop_mask, i, addr);
 336     assert(sv != NULL, "sanity check");
 337 
 338     result->add(sv);
 339   }
 340 }
 341 
 342 static void stack_expressions(StackValueCollection* result,
 343                               int length,
 344                               int max_locals,
 345                               const InterpreterOopMap& oop_mask,
 346                               const frame& fr) {
 347 
 348   assert(result != NULL, "invariant");
 349 
 350   for (int i = 0; i < length; ++i) {
 351     const intptr_t* addr = fr.interpreter_frame_expression_stack_at(i);
 352     assert(addr != NULL, "invariant");
 353     if (!is_in_expression_stack(fr, addr)) {
 354       // Need to ensure no bogus escapes.
 355       addr = NULL;
 356     }
 357 
 358     StackValue* const sv = create_stack_value_from_oop_map(oop_mask,
 359                                                            i + max_locals,
 360                                                            addr);
 361     assert(sv != NULL, "sanity check");
 362 
 363     result->add(sv);
 364   }
 365 }
 366 
 367 StackValueCollection* interpretedVFrame::locals() const {
 368   return stack_data(false);
 369 }
 370 
 371 StackValueCollection* interpretedVFrame::expressions() const {
 372   return stack_data(true);
 373 }
 374 
 375 /*
 376  * Worker routine for fetching references and/or values
 377  * for a particular bci in the interpretedVFrame.
 378  *
 379  * Returns data for either "locals" or "expressions",
 380  * using bci relative oop_map (oop_mask) information.
 381  *
 382  * @param expressions  bool switch controlling what data to return
 383                        (false == locals / true == expression)
 384  *
 385  */
 386 StackValueCollection* interpretedVFrame::stack_data(bool expressions) const {
 387 
 388   InterpreterOopMap oop_mask;
 389   method()->mask_for(bci(), &oop_mask);
 390   const int mask_len = oop_mask.number_of_entries();
 391 
 392   // If the method is native, method()->max_locals() is not telling the truth.
 393   // For our purposes, max locals instead equals the size of parameters.
 394   const int max_locals = method()->is_native() ?
 395     method()->size_of_parameters() : method()->max_locals();
 396 
 397   assert(mask_len >= max_locals, "invariant");
 398 
 399   const int length = expressions ? mask_len - max_locals : max_locals;
 400   assert(length >= 0, "invariant");
 401 
 402   StackValueCollection* const result = new StackValueCollection(length);
 403 
 404   if (0 == length) {
 405     return result;
 406   }
 407 
 408   if (expressions) {
 409     stack_expressions(result, length, max_locals, oop_mask, fr());
 410   } else {
 411     stack_locals(result, length, oop_mask, fr());
 412   }
 413 
 414   assert(length == result->size(), "invariant");
 415 
 416   return result;
 417 }
 418 
 419 void interpretedVFrame::set_locals(StackValueCollection* values) const {
 420   if (values == NULL || values->size() == 0) return;
 421 
 422   // If the method is native, max_locals is not telling the truth.
 423   // maxlocals then equals the size of parameters
 424   const int max_locals = method()->is_native() ?
 425     method()->size_of_parameters() : method()->max_locals();
 426 
 427   assert(max_locals == values->size(), "Mismatch between actual stack format and supplied data");
 428 
 429   // handle locals
 430   for (int i = 0; i < max_locals; i++) {
 431     // Find stack location
 432     intptr_t *addr = locals_addr_at(i);
 433 
 434     // Depending on oop/int put it in the right package
 435     const StackValue* const sv = values->at(i);
 436     assert(sv != NULL, "sanity check");
 437     if (sv->type() == T_OBJECT) {
 438       *(oop *) addr = (sv->get_obj())();
 439     } else {                   // integer
 440       *addr = sv->get_int();
 441     }
 442   }
 443 }
 444 
 445 // ------------- cChunk --------------
 446 
 447 entryVFrame::entryVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread)
 448 : externalVFrame(fr, reg_map, thread) {}
 449 
 450 #ifdef ASSERT
 451 void vframeStreamCommon::found_bad_method_frame() const {
 452   // 6379830 Cut point for an assertion that occasionally fires when
 453   // we are using the performance analyzer.
 454   // Disable this assert when testing the analyzer with fastdebug.
 455   // -XX:SuppressErrorAt=vframe.cpp:XXX (XXX=following line number)
 456   fatal("invalid bci or invalid scope desc");
 457 }
 458 #endif
 459 
 460 // top-frame will be skipped
 461 vframeStream::vframeStream(JavaThread* thread, frame top_frame,
 462   bool stop_at_java_call_stub) : vframeStreamCommon(thread) {
 463   _stop_at_java_call_stub = stop_at_java_call_stub;
 464 
 465   // skip top frame, as it may not be at safepoint
 466   _prev_frame = top_frame;
 467   _frame  = top_frame.sender(&_reg_map);
 468   while (!fill_from_frame()) {
 469     _prev_frame = _frame;
 470     _frame = _frame.sender(&_reg_map);
 471   }
 472 }
 473 
 474 
 475 // Step back n frames, skip any pseudo frames in between.
 476 // This function is used in Class.forName, Class.newInstance, Method.Invoke,
 477 // AccessController.doPrivileged.
 478 void vframeStreamCommon::security_get_caller_frame(int depth) {
 479   assert(depth >= 0, "invalid depth: %d", depth);
 480   for (int n = 0; !at_end(); security_next()) {
 481     if (!method()->is_ignored_by_security_stack_walk()) {
 482       if (n == depth) {
 483         // We have reached the desired depth; return.
 484         return;
 485       }
 486       n++;  // this is a non-skipped frame; count it against the depth
 487     }
 488   }
 489   // NOTE: At this point there were not enough frames on the stack
 490   // to walk to depth.  Callers of this method have to check for at_end.
 491 }
 492 
 493 
 494 void vframeStreamCommon::security_next() {
 495   if (method()->is_prefixed_native()) {
 496     skip_prefixed_method_and_wrappers();  // calls next()
 497   } else {
 498     next();
 499   }
 500 }
 501 
 502 
 503 void vframeStreamCommon::skip_prefixed_method_and_wrappers() {
 504   ResourceMark rm;
 505   HandleMark hm;
 506 
 507   int    method_prefix_count = 0;
 508   char** method_prefixes = JvmtiExport::get_all_native_method_prefixes(&method_prefix_count);
 509   Klass* prefixed_klass = method()->method_holder();
 510   const char* prefixed_name = method()->name()->as_C_string();
 511   size_t prefixed_name_len = strlen(prefixed_name);
 512   int prefix_index = method_prefix_count-1;
 513 
 514   while (!at_end()) {
 515     next();
 516     if (method()->method_holder() != prefixed_klass) {
 517       break; // classes don't match, can't be a wrapper
 518     }
 519     const char* name = method()->name()->as_C_string();
 520     size_t name_len = strlen(name);
 521     size_t prefix_len = prefixed_name_len - name_len;
 522     if (prefix_len <= 0 || strcmp(name, prefixed_name + prefix_len) != 0) {
 523       break; // prefixed name isn't prefixed version of method name, can't be a wrapper
 524     }
 525     for (; prefix_index >= 0; --prefix_index) {
 526       const char* possible_prefix = method_prefixes[prefix_index];
 527       size_t possible_prefix_len = strlen(possible_prefix);
 528       if (possible_prefix_len == prefix_len &&
 529           strncmp(possible_prefix, prefixed_name, prefix_len) == 0) {
 530         break; // matching prefix found
 531       }
 532     }
 533     if (prefix_index < 0) {
 534       break; // didn't find the prefix, can't be a wrapper
 535     }
 536     prefixed_name = name;
 537     prefixed_name_len = name_len;
 538   }
 539 }
 540 
 541 
 542 void vframeStreamCommon::skip_reflection_related_frames() {
 543   while (!at_end() &&
 544           (method()->method_holder()->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass()) ||
 545            method()->method_holder()->is_subclass_of(SystemDictionary::reflect_ConstructorAccessorImpl_klass()))) {
 546     next();
 547   }
 548 }
 549 
 550 javaVFrame* vframeStreamCommon::asJavaVFrame() {
 551   javaVFrame* result = NULL;
 552   if (_mode == compiled_mode) {
 553     guarantee(_frame.is_compiled_frame(), "expected compiled Java frame");
 554 
 555     // lazy update to register map
 556     bool update_map = true;
 557     RegisterMap map(_thread, update_map);
 558     frame f = _prev_frame.sender(&map);
 559 
 560     guarantee(f.is_compiled_frame(), "expected compiled Java frame");
 561 
 562     compiledVFrame* cvf = compiledVFrame::cast(vframe::new_vframe(&f, &map, _thread));
 563 
 564     guarantee(cvf->cb() == cb(), "wrong code blob");
 565 
 566     // get the same scope as this stream
 567     cvf = cvf->at_scope(_decode_offset, _vframe_id);
 568 
 569     guarantee(cvf->scope()->decode_offset() == _decode_offset, "wrong scope");
 570     guarantee(cvf->scope()->sender_decode_offset() == _sender_decode_offset, "wrong scope");
 571     guarantee(cvf->vframe_id() == _vframe_id, "wrong vframe");
 572 
 573     result = cvf;
 574   } else {
 575     result = javaVFrame::cast(vframe::new_vframe(&_frame, &_reg_map, _thread));
 576   }
 577   guarantee(result->method() == method(), "wrong method");
 578   return result;
 579 }
 580 
 581 
 582 #ifndef PRODUCT
 583 void vframe::print() {
 584   if (WizardMode) _fr.print_value_on(tty,NULL);
 585 }
 586 
 587 
 588 void vframe::print_value() const {
 589   ((vframe*)this)->print();
 590 }
 591 
 592 
 593 void entryVFrame::print_value() const {
 594   ((entryVFrame*)this)->print();
 595 }
 596 
 597 void entryVFrame::print() {
 598   vframe::print();
 599   tty->print_cr("C Chunk inbetween Java");
 600   tty->print_cr("C     link " INTPTR_FORMAT, p2i(_fr.link()));
 601 }
 602 
 603 
 604 // ------------- javaVFrame --------------
 605 
 606 static void print_stack_values(const char* title, StackValueCollection* values) {
 607   if (values->is_empty()) return;
 608   tty->print_cr("\t%s:", title);
 609   values->print();
 610 }
 611 
 612 
 613 void javaVFrame::print() {
 614   ResourceMark rm;
 615   vframe::print();
 616   tty->print("\t");
 617   method()->print_value();
 618   tty->cr();
 619   tty->print_cr("\tbci:    %d", bci());
 620 
 621   print_stack_values("locals",      locals());
 622   print_stack_values("expressions", expressions());
 623 
 624   GrowableArray<MonitorInfo*>* list = monitors();
 625   if (list->is_empty()) return;
 626   tty->print_cr("\tmonitor list:");
 627   for (int index = (list->length()-1); index >= 0; index--) {
 628     MonitorInfo* monitor = list->at(index);
 629     tty->print("\t  obj\t");
 630     if (monitor->owner_is_scalar_replaced()) {
 631       Klass* k = java_lang_Class::as_Klass(monitor->owner_klass());
 632       tty->print("( is scalar replaced %s)", k->external_name());
 633     } else if (monitor->owner() == NULL) {
 634       tty->print("( null )");
 635     } else {
 636       monitor->owner()->print_value();
 637       tty->print("(owner=" INTPTR_FORMAT ")", p2i(monitor->owner()));
 638     }
 639     if (monitor->eliminated()) {
 640       if(is_compiled_frame()) {
 641         tty->print(" ( lock is eliminated in compiled frame )");
 642       } else {
 643         tty->print(" ( lock is eliminated, frame not compiled )");
 644       }
 645     }
 646     tty->cr();
 647     tty->print("\t  ");
 648     monitor->lock()->print_on(tty);
 649     tty->cr();
 650   }
 651 }
 652 
 653 
 654 void javaVFrame::print_value() const {
 655   Method*    m = method();
 656   InstanceKlass*     k = m->method_holder();
 657   tty->print_cr("frame( sp=" INTPTR_FORMAT ", unextended_sp=" INTPTR_FORMAT ", fp=" INTPTR_FORMAT ", pc=" INTPTR_FORMAT ")",
 658                 p2i(_fr.sp()),  p2i(_fr.unextended_sp()), p2i(_fr.fp()), p2i(_fr.pc()));
 659   tty->print("%s.%s", k->internal_name(), m->name()->as_C_string());
 660 
 661   if (!m->is_native()) {
 662     Symbol*  source_name = k->source_file_name();
 663     int        line_number = m->line_number_from_bci(bci());
 664     if (source_name != NULL && (line_number != -1)) {
 665       tty->print("(%s:%d)", source_name->as_C_string(), line_number);
 666     }
 667   } else {
 668     tty->print("(Native Method)");
 669   }
 670   // Check frame size and print warning if it looks suspiciously large
 671   if (fr().sp() != NULL) {
 672     RegisterMap map = *register_map();
 673     uint size = fr().frame_size(&map);
 674 #ifdef _LP64
 675     if (size > 8*K) warning("SUSPICIOUSLY LARGE FRAME (%d)", size);
 676 #else
 677     if (size > 4*K) warning("SUSPICIOUSLY LARGE FRAME (%d)", size);
 678 #endif
 679   }
 680 }
 681 
 682 
 683 bool javaVFrame::structural_compare(javaVFrame* other) {
 684   // Check static part
 685   if (method() != other->method()) return false;
 686   if (bci()    != other->bci())    return false;
 687 
 688   // Check locals
 689   StackValueCollection *locs = locals();
 690   StackValueCollection *other_locs = other->locals();
 691   assert(locs->size() == other_locs->size(), "sanity check");
 692   int i;
 693   for(i = 0; i < locs->size(); i++) {
 694     // it might happen the compiler reports a conflict and
 695     // the interpreter reports a bogus int.
 696     if (       is_compiled_frame() &&       locs->at(i)->type() == T_CONFLICT) continue;
 697     if (other->is_compiled_frame() && other_locs->at(i)->type() == T_CONFLICT) continue;
 698 
 699     if (!locs->at(i)->equal(other_locs->at(i)))
 700       return false;
 701   }
 702 
 703   // Check expressions
 704   StackValueCollection* exprs = expressions();
 705   StackValueCollection* other_exprs = other->expressions();
 706   assert(exprs->size() == other_exprs->size(), "sanity check");
 707   for(i = 0; i < exprs->size(); i++) {
 708     if (!exprs->at(i)->equal(other_exprs->at(i)))
 709       return false;
 710   }
 711 
 712   return true;
 713 }
 714 
 715 
 716 void javaVFrame::print_activation(int index) const {
 717   // frame number and method
 718   tty->print("%2d - ", index);
 719   ((vframe*)this)->print_value();
 720   tty->cr();
 721 
 722   if (WizardMode) {
 723     ((vframe*)this)->print();
 724     tty->cr();
 725   }
 726 }
 727 
 728 
 729 void javaVFrame::verify() const {
 730 }
 731 
 732 
 733 void interpretedVFrame::verify() const {
 734 }
 735 
 736 
 737 // ------------- externalVFrame --------------
 738 
 739 void externalVFrame::print() {
 740   _fr.print_value_on(tty,NULL);
 741 }
 742 
 743 
 744 void externalVFrame::print_value() const {
 745   ((vframe*)this)->print();
 746 }
 747 #endif // PRODUCT