aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortwisti <none@none>2011-10-11 02:19:37 -0700
committertwisti <none@none>2011-10-11 02:19:37 -0700
commitf225a7316e4bd01969c05957f596931fdbdd5a16 (patch)
tree28a9d917bed0875031a00f611d9aa1aecfa66bf1
parent199a6055552e73fe16c2c5f4d10c6700f45f7b88 (diff)
7081938: JSR292: assert(magic_number_2() == MAGIC_NUMBER_2) failed
Reviewed-by: never, bdelsart
-rw-r--r--src/cpu/x86/vm/frame_x86.cpp9
-rw-r--r--src/cpu/x86/vm/methodHandles_x86.cpp4
-rw-r--r--src/cpu/x86/vm/methodHandles_x86.hpp5
3 files changed, 11 insertions, 7 deletions
diff --git a/src/cpu/x86/vm/frame_x86.cpp b/src/cpu/x86/vm/frame_x86.cpp
index 3d82d0622..511e344ba 100644
--- a/src/cpu/x86/vm/frame_x86.cpp
+++ b/src/cpu/x86/vm/frame_x86.cpp
@@ -232,11 +232,13 @@ bool frame::safe_for_sender(JavaThread *thread) {
void frame::patch_pc(Thread* thread, address pc) {
+ address* pc_addr = &(((address*) sp())[-1]);
if (TracePcPatching) {
- tty->print_cr("patch_pc at address" INTPTR_FORMAT " [" INTPTR_FORMAT " -> " INTPTR_FORMAT "] ",
- &((address *)sp())[-1], ((address *)sp())[-1], pc);
+ tty->print_cr("patch_pc at address " INTPTR_FORMAT " [" INTPTR_FORMAT " -> " INTPTR_FORMAT "] ",
+ pc_addr, *pc_addr, pc);
}
- ((address *)sp())[-1] = pc;
+ assert(_pc == *pc_addr, err_msg("must be: " INTPTR_FORMAT " == " INTPTR_FORMAT, _pc, *pc_addr));
+ *pc_addr = pc;
_cb = CodeCache::find_blob(pc);
address original_pc = nmethod::get_deopt_original_pc(this);
if (original_pc != NULL) {
@@ -671,4 +673,3 @@ intptr_t *frame::initial_deoptimization_info() {
// used to reset the saved FP
return fp();
}
-
diff --git a/src/cpu/x86/vm/methodHandles_x86.cpp b/src/cpu/x86/vm/methodHandles_x86.cpp
index dd741fda0..b998fa50d 100644
--- a/src/cpu/x86/vm/methodHandles_x86.cpp
+++ b/src/cpu/x86/vm/methodHandles_x86.cpp
@@ -410,8 +410,8 @@ void MethodHandles::RicochetFrame::verify_offsets() {
void MethodHandles::RicochetFrame::verify() const {
verify_offsets();
- assert(magic_number_1() == MAGIC_NUMBER_1, "");
- assert(magic_number_2() == MAGIC_NUMBER_2, "");
+ assert(magic_number_1() == MAGIC_NUMBER_1, err_msg(PTR_FORMAT " == " PTR_FORMAT, magic_number_1(), MAGIC_NUMBER_1));
+ assert(magic_number_2() == MAGIC_NUMBER_2, err_msg(PTR_FORMAT " == " PTR_FORMAT, magic_number_2(), MAGIC_NUMBER_2));
if (!Universe::heap()->is_gc_active()) {
if (saved_args_layout() != NULL) {
assert(saved_args_layout()->is_method(), "must be valid oop");
diff --git a/src/cpu/x86/vm/methodHandles_x86.hpp b/src/cpu/x86/vm/methodHandles_x86.hpp
index bf85c33c7..bc8fc3690 100644
--- a/src/cpu/x86/vm/methodHandles_x86.hpp
+++ b/src/cpu/x86/vm/methodHandles_x86.hpp
@@ -132,7 +132,10 @@ class RicochetFrame {
intptr_t* sender_link() const { return _sender_link; }
address sender_pc() const { return _sender_pc; }
- intptr_t* extended_sender_sp() const { return saved_args_base(); }
+ intptr_t* extended_sender_sp() const {
+ // The extended sender SP is above the current RicochetFrame.
+ return (intptr_t*) (((address) this) + sizeof(RicochetFrame));
+ }
intptr_t return_value_slot_number() const {
return adapter_conversion_vminfo(conversion());