changeset 6719:ae676f06c967

8049324: interpretedVFrame::expressions to index oopmap correctly Reviewed-by: sspitsyn, coleenp
author mgronlun
date Sat, 05 Jul 2014 20:05:29 +0200
parents a041ecca3717
children b784c85d436d
files src/share/vm/runtime/vframe.cpp
diffstat 1 files changed, 10 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/runtime/vframe.cpp	Thu Jul 03 16:55:57 2014 -0700
+++ b/src/share/vm/runtime/vframe.cpp	Sat Jul 05 20:05:29 2014 +0200
@@ -263,6 +263,10 @@
 static StackValue* create_stack_value_from_oop_map(const InterpreterOopMap& oop_mask,
                                                    int index,
                                                    const intptr_t* const addr) {
+
+  assert(index >= 0 &&
+         index < oop_mask.number_of_entries(), "invariant");
+
   // categorize using oop_mask
   if (oop_mask.is_oop(index)) {
     // reference (oop) "r"
@@ -307,6 +311,7 @@
 
 static void stack_expressions(StackValueCollection* result,
                               int length,
+                              int max_locals,
                               const InterpreterOopMap& oop_mask,
                               const frame& fr) {
 
@@ -319,7 +324,10 @@
       // Need to ensure no bogus escapes.
       addr = NULL;
     }
-    StackValue* const sv = create_stack_value_from_oop_map(oop_mask, i, addr);
+
+    StackValue* const sv = create_stack_value_from_oop_map(oop_mask,
+                                                           i + max_locals,
+                                                           addr);
     assert(sv != NULL, "sanity check");
 
     result->add(sv);
@@ -375,7 +383,7 @@
   }
 
   if (expressions) {
-    stack_expressions(result, length, oop_mask, fr());
+    stack_expressions(result, length, max_locals, oop_mask, fr());
   } else {
     stack_locals(result, length, oop_mask, fr());
   }