Merge
This commit is contained in:
commit
0032ebd4ef
@ -1026,9 +1026,21 @@ JRT_ENTRY(void, Runtime1::patch_code(JavaThread* thread, Runtime1::StubID stub_i
|
|||||||
// first replace the tail, then the call
|
// first replace the tail, then the call
|
||||||
#ifdef ARM
|
#ifdef ARM
|
||||||
if(stub_id == Runtime1::load_klass_patching_id && !VM_Version::supports_movw()) {
|
if(stub_id == Runtime1::load_klass_patching_id && !VM_Version::supports_movw()) {
|
||||||
|
nmethod* nm = CodeCache::find_nmethod(instr_pc);
|
||||||
|
oop* oop_addr = NULL;
|
||||||
|
assert(nm != NULL, "invalid nmethod_pc");
|
||||||
|
RelocIterator oops(nm, copy_buff, copy_buff + 1);
|
||||||
|
while (oops.next()) {
|
||||||
|
if (oops.type() == relocInfo::oop_type) {
|
||||||
|
oop_Relocation* r = oops.oop_reloc();
|
||||||
|
oop_addr = r->oop_addr();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(oop_addr != NULL, "oop relocation must exist");
|
||||||
copy_buff -= *byte_count;
|
copy_buff -= *byte_count;
|
||||||
NativeMovConstReg* n_copy2 = nativeMovConstReg_at(copy_buff);
|
NativeMovConstReg* n_copy2 = nativeMovConstReg_at(copy_buff);
|
||||||
n_copy2->set_data((intx) (load_klass()), instr_pc);
|
n_copy2->set_pc_relative_offset((address)oop_addr, instr_pc);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1357,7 +1357,7 @@ class BacktraceBuilder: public StackObj {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void java_lang_Throwable::fill_in_stack_trace(Handle throwable, TRAPS) {
|
void java_lang_Throwable::fill_in_stack_trace(Handle throwable, methodHandle method, TRAPS) {
|
||||||
if (!StackTraceInThrowable) return;
|
if (!StackTraceInThrowable) return;
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(THREAD);
|
||||||
|
|
||||||
@ -1374,6 +1374,16 @@ void java_lang_Throwable::fill_in_stack_trace(Handle throwable, TRAPS) {
|
|||||||
JavaThread* thread = (JavaThread*)THREAD;
|
JavaThread* thread = (JavaThread*)THREAD;
|
||||||
BacktraceBuilder bt(CHECK);
|
BacktraceBuilder bt(CHECK);
|
||||||
|
|
||||||
|
// If there is no Java frame just return the method that was being called
|
||||||
|
// with bci 0
|
||||||
|
if (!thread->has_last_Java_frame()) {
|
||||||
|
if (max_depth >= 1 && method() != NULL) {
|
||||||
|
bt.push(method(), 0, CHECK);
|
||||||
|
set_backtrace(throwable(), bt.backtrace());
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Instead of using vframe directly, this version of fill_in_stack_trace
|
// Instead of using vframe directly, this version of fill_in_stack_trace
|
||||||
// basically handles everything by hand. This significantly improved the
|
// basically handles everything by hand. This significantly improved the
|
||||||
// speed of this method call up to 28.5% on Solaris sparc. 27.1% on Windows.
|
// speed of this method call up to 28.5% on Solaris sparc. 27.1% on Windows.
|
||||||
@ -1477,7 +1487,7 @@ void java_lang_Throwable::fill_in_stack_trace(Handle throwable, TRAPS) {
|
|||||||
set_backtrace(throwable(), bt.backtrace());
|
set_backtrace(throwable(), bt.backtrace());
|
||||||
}
|
}
|
||||||
|
|
||||||
void java_lang_Throwable::fill_in_stack_trace(Handle throwable) {
|
void java_lang_Throwable::fill_in_stack_trace(Handle throwable, methodHandle method) {
|
||||||
// No-op if stack trace is disabled
|
// No-op if stack trace is disabled
|
||||||
if (!StackTraceInThrowable) {
|
if (!StackTraceInThrowable) {
|
||||||
return;
|
return;
|
||||||
@ -1491,7 +1501,7 @@ void java_lang_Throwable::fill_in_stack_trace(Handle throwable) {
|
|||||||
PRESERVE_EXCEPTION_MARK;
|
PRESERVE_EXCEPTION_MARK;
|
||||||
|
|
||||||
JavaThread* thread = JavaThread::active();
|
JavaThread* thread = JavaThread::active();
|
||||||
fill_in_stack_trace(throwable, thread);
|
fill_in_stack_trace(throwable, method, thread);
|
||||||
// ignore exceptions thrown during stack trace filling
|
// ignore exceptions thrown during stack trace filling
|
||||||
CLEAR_PENDING_EXCEPTION;
|
CLEAR_PENDING_EXCEPTION;
|
||||||
}
|
}
|
||||||
|
@ -440,8 +440,8 @@ class java_lang_Throwable: AllStatic {
|
|||||||
static void fill_in_stack_trace_of_preallocated_backtrace(Handle throwable);
|
static void fill_in_stack_trace_of_preallocated_backtrace(Handle throwable);
|
||||||
|
|
||||||
// Fill in current stack trace, can cause GC
|
// Fill in current stack trace, can cause GC
|
||||||
static void fill_in_stack_trace(Handle throwable, TRAPS);
|
static void fill_in_stack_trace(Handle throwable, methodHandle method, TRAPS);
|
||||||
static void fill_in_stack_trace(Handle throwable);
|
static void fill_in_stack_trace(Handle throwable, methodHandle method = methodHandle());
|
||||||
// Programmatic access to stack trace
|
// Programmatic access to stack trace
|
||||||
static oop get_stack_trace_element(oop throwable, int index, TRAPS);
|
static oop get_stack_trace_element(oop throwable, int index, TRAPS);
|
||||||
static int get_stack_trace_depth(oop throwable, TRAPS);
|
static int get_stack_trace_depth(oop throwable, TRAPS);
|
||||||
|
@ -389,7 +389,7 @@ void JavaCalls::call_helper(JavaValue* result, methodHandle* m, JavaCallArgument
|
|||||||
// to Java
|
// to Java
|
||||||
if (!os::stack_shadow_pages_available(THREAD, method)) {
|
if (!os::stack_shadow_pages_available(THREAD, method)) {
|
||||||
// Throw stack overflow exception with preinitialized exception.
|
// Throw stack overflow exception with preinitialized exception.
|
||||||
Exceptions::throw_stack_overflow_exception(THREAD, __FILE__, __LINE__);
|
Exceptions::throw_stack_overflow_exception(THREAD, __FILE__, __LINE__, method);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
// Touch pages checked if the OS needs them to be touched to be mapped.
|
// Touch pages checked if the OS needs them to be touched to be mapped.
|
||||||
|
@ -207,7 +207,7 @@ void Exceptions::_throw_args(Thread* thread, const char* file, int line, Symbol*
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Exceptions::throw_stack_overflow_exception(Thread* THREAD, const char* file, int line) {
|
void Exceptions::throw_stack_overflow_exception(Thread* THREAD, const char* file, int line, methodHandle method) {
|
||||||
Handle exception;
|
Handle exception;
|
||||||
if (!THREAD->has_pending_exception()) {
|
if (!THREAD->has_pending_exception()) {
|
||||||
klassOop k = SystemDictionary::StackOverflowError_klass();
|
klassOop k = SystemDictionary::StackOverflowError_klass();
|
||||||
@ -215,13 +215,13 @@ void Exceptions::throw_stack_overflow_exception(Thread* THREAD, const char* file
|
|||||||
exception = Handle(THREAD, e); // fill_in_stack trace does gc
|
exception = Handle(THREAD, e); // fill_in_stack trace does gc
|
||||||
assert(instanceKlass::cast(k)->is_initialized(), "need to increase min_stack_allowed calculation");
|
assert(instanceKlass::cast(k)->is_initialized(), "need to increase min_stack_allowed calculation");
|
||||||
if (StackTraceInThrowable) {
|
if (StackTraceInThrowable) {
|
||||||
java_lang_Throwable::fill_in_stack_trace(exception);
|
java_lang_Throwable::fill_in_stack_trace(exception, method());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if prior exception, throw that one instead
|
// if prior exception, throw that one instead
|
||||||
exception = Handle(THREAD, THREAD->pending_exception());
|
exception = Handle(THREAD, THREAD->pending_exception());
|
||||||
}
|
}
|
||||||
_throw_oop(THREAD, file, line, exception());
|
_throw(THREAD, file, line, exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Exceptions::fthrow(Thread* thread, const char* file, int line, Symbol* h_name, const char* format, ...) {
|
void Exceptions::fthrow(Thread* thread, const char* file, int line, Symbol* h_name, const char* format, ...) {
|
||||||
|
@ -144,7 +144,7 @@ class Exceptions {
|
|||||||
const char* message,
|
const char* message,
|
||||||
ExceptionMsgToUtf8Mode to_utf8_safe = safe_to_utf8);
|
ExceptionMsgToUtf8Mode to_utf8_safe = safe_to_utf8);
|
||||||
|
|
||||||
static void throw_stack_overflow_exception(Thread* thread, const char* file, int line);
|
static void throw_stack_overflow_exception(Thread* thread, const char* file, int line, methodHandle method);
|
||||||
|
|
||||||
// for AbortVMOnException flag
|
// for AbortVMOnException flag
|
||||||
NOT_PRODUCT(static void debug_check_abort(Handle exception, const char* message = NULL);)
|
NOT_PRODUCT(static void debug_check_abort(Handle exception, const char* message = NULL);)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user