changeset 1013:a469b20018d9

2008-08-13 Gary Benson <gbenson@redhat.com> * ports/hotspot/src/cpu/zero/vm/stackPrinter_zero.hpp (print_word): Recognise non-header parts of Shark frames.
author Gary Benson <gbenson@redhat.com>
date Wed, 13 Aug 2008 15:46:18 +0100
parents c7c621c16a15
children 288bdc0696ff cd5c0ea5fe82
files ChangeLog ports/hotspot/src/cpu/zero/vm/stackPrinter_zero.hpp
diffstat 2 files changed, 36 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Aug 13 08:53:38 2008 +0100
+++ b/ChangeLog	Wed Aug 13 15:46:18 2008 +0100
@@ -1,3 +1,8 @@
+2008-08-13  Gary Benson  <gbenson@redhat.com>
+
+	* ports/hotspot/src/cpu/zero/vm/stackPrinter_zero.hpp
+	(print_word): Recognise non-header parts of Shark frames.
+
 2008-08-13  Gary Benson  <gbenson@redhat.com>
 
 	PR icedtea/184:
--- a/ports/hotspot/src/cpu/zero/vm/stackPrinter_zero.hpp	Wed Aug 13 08:53:38 2008 +0100
+++ b/ports/hotspot/src/cpu/zero/vm/stackPrinter_zero.hpp	Wed Aug 13 15:46:18 2008 +0100
@@ -195,6 +195,37 @@
           if (method->is_oop())
             value = method->name_and_sig_as_C_string(_buf, _buflen);
         }
+        else {
+          SharkFrame *sf = (SharkFrame *) frame;
+          intptr_t *monitor_base =
+            (intptr_t *) frame - SharkFrame::header_words + 1;
+          intptr_t *stack_base =
+            sf->unextended_sp() + sf->method()->max_stack();
+
+          if (addr >= stack_base && addr < monitor_base) {
+            int monitor_size = frame::interpreter_frame_monitor_size();
+            int last_index = (monitor_base - stack_base) / monitor_size - 1;
+            int index = last_index - (addr - stack_base) / monitor_size;
+            intptr_t monitor =
+              (intptr_t) ((BasicObjectLock *) monitor_base - 1 - index);
+            intptr_t offset = (intptr_t) addr - monitor;
+
+            if (offset == BasicObjectLock::obj_offset_in_bytes()) {
+              snprintf(_buf, _buflen, "monitor[%d]->_obj", index);
+              field = _buf;
+            }
+            else if (offset ==  BasicObjectLock::lock_offset_in_bytes()) {
+              snprintf(_buf, _buflen, "monitor[%d]->_lock", index);
+              field = _buf;
+            }
+          }
+          else {
+            snprintf(_buf, _buflen, "%s[%d]",
+                     top_frame ? "stack_word" : "local",
+                     stack_base - addr - 1);
+            field = _buf;
+          }
+        }
       }
     }