6889869: assert(!Interpreter::bytecode_should_reexecute(code),"should not reexecute")
authornever
Wed, 14 Oct 2009 10:36:57 -0700
changeset 4017 0cb087a2b9a9
parent 4016 9c11d6d519f7
child 4018 a73b8aa8e89d
6889869: assert(!Interpreter::bytecode_should_reexecute(code),"should not reexecute") Reviewed-by: jrose, kvn, cfang, twisti
hotspot/src/share/vm/code/debugInfoRec.cpp
hotspot/src/share/vm/code/pcDesc.hpp
--- a/hotspot/src/share/vm/code/debugInfoRec.cpp	Tue Oct 13 22:32:31 2009 -0700
+++ b/hotspot/src/share/vm/code/debugInfoRec.cpp	Wed Oct 14 10:36:57 2009 -0700
@@ -356,8 +356,7 @@
     // search forward until it finds last.
     // In addition, it does not matter if the last PcDesc
     // is for a safepoint or not.
-    if (_prev_safepoint_pc < prev->pc_offset() &&
-        prev->scope_decode_offset() == last->scope_decode_offset()) {
+    if (_prev_safepoint_pc < prev->pc_offset() && prev->is_same_info(last)) {
       assert(prev == last-1, "sane");
       prev->set_pc_offset(pc_offset);
       _pcs_length -= 1;
--- a/hotspot/src/share/vm/code/pcDesc.hpp	Tue Oct 13 22:32:31 2009 -0700
+++ b/hotspot/src/share/vm/code/pcDesc.hpp	Wed Oct 14 10:36:57 2009 -0700
@@ -39,6 +39,7 @@
     struct {
       unsigned int reexecute: 1;
     } bits;
+    bool operator ==(const PcDescFlags& other) { return word == other.word; }
   } _flags;
 
  public:
@@ -64,6 +65,13 @@
   bool     should_reexecute()              const { return _flags.bits.reexecute; }
   void set_should_reexecute(bool z)              { _flags.bits.reexecute = z;    }
 
+  // Does pd refer to the same information as pd?
+  bool is_same_info(const PcDesc* pd) {
+    return _scope_decode_offset == pd->_scope_decode_offset &&
+      _obj_decode_offset == pd->_obj_decode_offset &&
+      _flags == pd->_flags;
+  }
+
   // Returns the real pc
   address real_pc(const nmethod* code) const;