65 }
66
67 inline frame::frame(intptr_t* sp, intptr_t* fp, address pc) {
68 init(sp, fp, pc);
69 }
70
71 inline frame::frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc) {
72 intptr_t a = intptr_t(sp);
73 intptr_t b = intptr_t(fp);
74 _sp = sp;
75 _unextended_sp = unextended_sp;
76 _fp = fp;
77 _pc = pc;
78 assert(pc != NULL, "no pc?");
79 _cb = CodeCache::find_blob(pc);
80 adjust_unextended_sp();
81
82 address original_pc = CompiledMethod::get_deopt_original_pc(this);
83 if (original_pc != NULL) {
84 _pc = original_pc;
85 assert(((CompiledMethod*)_cb)->insts_contains(_pc), "original PC must be in CompiledMethod");
86 _deopt_state = is_deoptimized;
87 } else {
88 _deopt_state = not_deoptimized;
89 }
90 }
91
92 inline frame::frame(intptr_t* sp, intptr_t* fp) {
93 intptr_t a = intptr_t(sp);
94 intptr_t b = intptr_t(fp);
95 _sp = sp;
96 _unextended_sp = sp;
97 _fp = fp;
98 _pc = (address)(sp[-1]);
99
100 // Here's a sticky one. This constructor can be called via AsyncGetCallTrace
101 // when last_Java_sp is non-null but the pc fetched is junk. If we are truly
102 // unlucky the junk value could be to a zombied method and we'll die on the
103 // find_blob call. This is also why we can have no asserts on the validity
104 // of the pc we find here. AsyncGetCallTrace -> pd_get_top_frame_for_signal_handler
105 // -> pd_last_frame should use a specialized version of pd_last_frame which could
|
65 }
66
67 inline frame::frame(intptr_t* sp, intptr_t* fp, address pc) {
68 init(sp, fp, pc);
69 }
70
71 inline frame::frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc) {
72 intptr_t a = intptr_t(sp);
73 intptr_t b = intptr_t(fp);
74 _sp = sp;
75 _unextended_sp = unextended_sp;
76 _fp = fp;
77 _pc = pc;
78 assert(pc != NULL, "no pc?");
79 _cb = CodeCache::find_blob(pc);
80 adjust_unextended_sp();
81
82 address original_pc = CompiledMethod::get_deopt_original_pc(this);
83 if (original_pc != NULL) {
84 _pc = original_pc;
85 assert(_cb->as_compiled_method()->insts_contains_inclusive(_pc),
86 "original PC must be in the main code section of the the compiled method (or must be immediately following it)");
87 _deopt_state = is_deoptimized;
88 } else {
89 _deopt_state = not_deoptimized;
90 }
91 }
92
93 inline frame::frame(intptr_t* sp, intptr_t* fp) {
94 intptr_t a = intptr_t(sp);
95 intptr_t b = intptr_t(fp);
96 _sp = sp;
97 _unextended_sp = sp;
98 _fp = fp;
99 _pc = (address)(sp[-1]);
100
101 // Here's a sticky one. This constructor can be called via AsyncGetCallTrace
102 // when last_Java_sp is non-null but the pc fetched is junk. If we are truly
103 // unlucky the junk value could be to a zombied method and we'll die on the
104 // find_blob call. This is also why we can have no asserts on the validity
105 // of the pc we find here. AsyncGetCallTrace -> pd_get_top_frame_for_signal_handler
106 // -> pd_last_frame should use a specialized version of pd_last_frame which could
|