mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
7188911: nightly failures after JSR 292 lazy method handle update (round 2)
Reviewed-by: kvn, jrose
This commit is contained in:
parent
e409ee94ae
commit
e622fcdc27
11 changed files with 147 additions and 109 deletions
|
@ -164,52 +164,58 @@ void Exceptions::_throw(Thread* thread, const char* file, int line, Handle h_exc
|
|||
}
|
||||
|
||||
|
||||
void Exceptions::_throw_msg(Thread* thread, const char* file, int line, Symbol* h_name, const char* message, Handle h_loader, Handle h_protection_domain) {
|
||||
void Exceptions::_throw_msg(Thread* thread, const char* file, int line, Symbol* name, const char* message,
|
||||
Handle h_loader, Handle h_protection_domain) {
|
||||
// Check for special boot-strapping/vm-thread handling
|
||||
if (special_exception(thread, file, line, h_name, message)) return;
|
||||
if (special_exception(thread, file, line, name, message)) return;
|
||||
// Create and throw exception
|
||||
Handle h_cause(thread, NULL);
|
||||
Handle h_exception = new_exception(thread, h_name, message, h_cause, h_loader, h_protection_domain);
|
||||
Handle h_exception = new_exception(thread, name, message, h_cause, h_loader, h_protection_domain);
|
||||
_throw(thread, file, line, h_exception, message);
|
||||
}
|
||||
|
||||
// Throw an exception with a message and a cause
|
||||
void Exceptions::_throw_msg_cause(Thread* thread, const char* file, int line, Symbol* h_name, const char* message, Handle h_cause, Handle h_loader, Handle h_protection_domain) {
|
||||
void Exceptions::_throw_msg_cause(Thread* thread, const char* file, int line, Symbol* name, const char* message, Handle h_cause,
|
||||
Handle h_loader, Handle h_protection_domain) {
|
||||
// Check for special boot-strapping/vm-thread handling
|
||||
if (special_exception(thread, file, line, h_name, message)) return;
|
||||
if (special_exception(thread, file, line, name, message)) return;
|
||||
// Create and throw exception and init cause
|
||||
Handle h_exception = new_exception(thread, h_name, message, h_cause, h_loader, h_protection_domain);
|
||||
Handle h_exception = new_exception(thread, name, message, h_cause, h_loader, h_protection_domain);
|
||||
_throw(thread, file, line, h_exception, message);
|
||||
}
|
||||
|
||||
// This version already has a handle for name
|
||||
void Exceptions::_throw_msg(Thread* thread, const char* file, int line,
|
||||
Symbol* name, const char* message) {
|
||||
Handle h_loader(thread, NULL);
|
||||
Handle h_protection_domain(thread, NULL);
|
||||
Exceptions::_throw_msg(thread, file, line, name, message, h_loader, h_protection_domain);
|
||||
}
|
||||
|
||||
// This version already has a handle for name
|
||||
void Exceptions::_throw_msg_cause(Thread* thread, const char* file, int line,
|
||||
Symbol* name, const char* message, Handle cause) {
|
||||
Handle h_loader(thread, NULL);
|
||||
Handle h_protection_domain(thread, NULL);
|
||||
Exceptions::_throw_msg_cause(thread, file, line, name, message, cause, h_loader, h_protection_domain);
|
||||
}
|
||||
|
||||
void Exceptions::_throw_args(Thread* thread, const char* file, int line, Symbol* h_name, Symbol* h_signature, JavaCallArguments *args) {
|
||||
void Exceptions::_throw_cause(Thread* thread, const char* file, int line, Symbol* name, Handle h_cause,
|
||||
Handle h_loader, Handle h_protection_domain) {
|
||||
// Check for special boot-strapping/vm-thread handling
|
||||
if (special_exception(thread, file, line, h_name, NULL)) return;
|
||||
if (special_exception(thread, file, line, h_cause)) return;
|
||||
// Create and throw exception
|
||||
Handle h_exception = new_exception(thread, name, h_cause, h_loader, h_protection_domain);
|
||||
_throw(thread, file, line, h_exception, NULL);
|
||||
}
|
||||
|
||||
void Exceptions::_throw_args(Thread* thread, const char* file, int line, Symbol* name, Symbol* signature, JavaCallArguments *args) {
|
||||
// Check for special boot-strapping/vm-thread handling
|
||||
if (special_exception(thread, file, line, name, NULL)) return;
|
||||
// Create and throw exception
|
||||
Handle h_loader(thread, NULL);
|
||||
Handle h_prot(thread, NULL);
|
||||
Handle h_cause(thread, NULL);
|
||||
Handle exception = new_exception(thread, h_name, h_signature, args, h_cause, h_loader, h_prot);
|
||||
Handle exception = new_exception(thread, name, signature, args, h_loader, h_prot);
|
||||
_throw(thread, file, line, exception);
|
||||
}
|
||||
|
||||
|
||||
// Methods for default parameters.
|
||||
// NOTE: These must be here (and not in the header file) because of include circularities.
|
||||
void Exceptions::_throw_msg_cause(Thread* thread, const char* file, int line, Symbol* name, const char* message, Handle h_cause) {
|
||||
_throw_msg_cause(thread, file, line, name, message, h_cause, Handle(thread, NULL), Handle(thread, NULL));
|
||||
}
|
||||
void Exceptions::_throw_msg(Thread* thread, const char* file, int line, Symbol* name, const char* message) {
|
||||
_throw_msg(thread, file, line, name, message, Handle(thread, NULL), Handle(thread, NULL));
|
||||
}
|
||||
void Exceptions::_throw_cause(Thread* thread, const char* file, int line, Symbol* name, Handle h_cause) {
|
||||
_throw_cause(thread, file, line, name, h_cause, Handle(thread, NULL), Handle(thread, NULL));
|
||||
}
|
||||
|
||||
|
||||
void Exceptions::throw_stack_overflow_exception(Thread* THREAD, const char* file, int line, methodHandle method) {
|
||||
Handle exception;
|
||||
if (!THREAD->has_pending_exception()) {
|
||||
|
@ -240,12 +246,9 @@ void Exceptions::fthrow(Thread* thread, const char* file, int line, Symbol* h_na
|
|||
|
||||
// Creates an exception oop, calls the <init> method with the given signature.
|
||||
// and returns a Handle
|
||||
// Initializes the cause if cause non-null
|
||||
Handle Exceptions::new_exception(Thread *thread, Symbol* h_name,
|
||||
Symbol* signature,
|
||||
JavaCallArguments *args,
|
||||
Handle h_cause, Handle h_loader,
|
||||
Handle h_protection_domain) {
|
||||
Handle Exceptions::new_exception(Thread *thread, Symbol* name,
|
||||
Symbol* signature, JavaCallArguments *args,
|
||||
Handle h_loader, Handle h_protection_domain) {
|
||||
assert(Universe::is_fully_initialized(),
|
||||
"cannot be called during initialization");
|
||||
assert(thread->is_Java_thread(), "can only be called by a Java thread");
|
||||
|
@ -254,8 +257,8 @@ Handle Exceptions::new_exception(Thread *thread, Symbol* h_name,
|
|||
Handle h_exception;
|
||||
|
||||
// Resolve exception klass
|
||||
klassOop ik = SystemDictionary::resolve_or_fail(h_name, h_loader, h_protection_domain, true, thread);
|
||||
instanceKlassHandle klass (thread, ik);
|
||||
klassOop ik = SystemDictionary::resolve_or_fail(name, h_loader, h_protection_domain, true, thread);
|
||||
instanceKlassHandle klass(thread, ik);
|
||||
|
||||
if (!thread->has_pending_exception()) {
|
||||
assert(klass.not_null(), "klass must exist");
|
||||
|
@ -273,24 +276,8 @@ Handle Exceptions::new_exception(Thread *thread, Symbol* h_name,
|
|||
signature,
|
||||
args,
|
||||
thread);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Future: object initializer should take a cause argument
|
||||
if (h_cause() != NULL) {
|
||||
assert(h_cause->is_a(SystemDictionary::Throwable_klass()),
|
||||
"exception cause is not a subclass of java/lang/Throwable");
|
||||
JavaValue result1(T_OBJECT);
|
||||
JavaCallArguments args1;
|
||||
args1.set_receiver(h_exception);
|
||||
args1.push_oop(h_cause);
|
||||
JavaCalls::call_virtual(&result1, klass,
|
||||
vmSymbols::initCause_name(),
|
||||
vmSymbols::throwable_throwable_signature(),
|
||||
&args1,
|
||||
thread);
|
||||
}
|
||||
}
|
||||
|
||||
// Check if another exception was thrown in the process, if so rethrow that one
|
||||
|
@ -301,12 +288,60 @@ Handle Exceptions::new_exception(Thread *thread, Symbol* h_name,
|
|||
return h_exception;
|
||||
}
|
||||
|
||||
// Creates an exception oop, calls the <init> method with the given signature.
|
||||
// and returns a Handle
|
||||
// Initializes the cause if cause non-null
|
||||
Handle Exceptions::new_exception(Thread *thread, Symbol* name,
|
||||
Symbol* signature, JavaCallArguments *args,
|
||||
Handle h_cause,
|
||||
Handle h_loader, Handle h_protection_domain) {
|
||||
Handle h_exception = new_exception(thread, name, signature, args, h_loader, h_protection_domain);
|
||||
|
||||
// Future: object initializer should take a cause argument
|
||||
if (h_cause.not_null()) {
|
||||
assert(h_cause->is_a(SystemDictionary::Throwable_klass()),
|
||||
"exception cause is not a subclass of java/lang/Throwable");
|
||||
JavaValue result1(T_OBJECT);
|
||||
JavaCallArguments args1;
|
||||
args1.set_receiver(h_exception);
|
||||
args1.push_oop(h_cause);
|
||||
JavaCalls::call_virtual(&result1, h_exception->klass(),
|
||||
vmSymbols::initCause_name(),
|
||||
vmSymbols::throwable_throwable_signature(),
|
||||
&args1,
|
||||
thread);
|
||||
}
|
||||
|
||||
// Check if another exception was thrown in the process, if so rethrow that one
|
||||
if (thread->has_pending_exception()) {
|
||||
h_exception = Handle(thread, thread->pending_exception());
|
||||
thread->clear_pending_exception();
|
||||
}
|
||||
return h_exception;
|
||||
}
|
||||
|
||||
// Convenience method. Calls either the <init>() or <init>(Throwable) method when
|
||||
// creating a new exception
|
||||
Handle Exceptions::new_exception(Thread* thread, Symbol* name,
|
||||
Handle h_cause,
|
||||
Handle h_loader, Handle h_protection_domain,
|
||||
ExceptionMsgToUtf8Mode to_utf8_safe) {
|
||||
JavaCallArguments args;
|
||||
Symbol* signature = NULL;
|
||||
if (h_cause.is_null()) {
|
||||
signature = vmSymbols::void_method_signature();
|
||||
} else {
|
||||
signature = vmSymbols::throwable_void_signature();
|
||||
args.push_oop(h_cause);
|
||||
}
|
||||
return new_exception(thread, name, signature, &args, h_loader, h_protection_domain);
|
||||
}
|
||||
|
||||
// Convenience method. Calls either the <init>() or <init>(String) method when
|
||||
// creating a new exception
|
||||
Handle Exceptions::new_exception(Thread* thread, Symbol* h_name,
|
||||
Handle Exceptions::new_exception(Thread* thread, Symbol* name,
|
||||
const char* message, Handle h_cause,
|
||||
Handle h_loader,
|
||||
Handle h_protection_domain,
|
||||
Handle h_loader, Handle h_protection_domain,
|
||||
ExceptionMsgToUtf8Mode to_utf8_safe) {
|
||||
JavaCallArguments args;
|
||||
Symbol* signature = NULL;
|
||||
|
@ -320,7 +355,7 @@ Handle Exceptions::new_exception(Thread* thread, Symbol* h_name,
|
|||
// the exception we are trying to build, or the pending exception.
|
||||
// This is sort of like what PRESERVE_EXCEPTION_MARK does, except
|
||||
// for the preferencing and the early returns.
|
||||
Handle incoming_exception (thread, NULL);
|
||||
Handle incoming_exception(thread, NULL);
|
||||
if (thread->has_pending_exception()) {
|
||||
incoming_exception = Handle(thread, thread->pending_exception());
|
||||
thread->clear_pending_exception();
|
||||
|
@ -344,7 +379,7 @@ Handle Exceptions::new_exception(Thread* thread, Symbol* h_name,
|
|||
args.push_oop(msg);
|
||||
signature = vmSymbols::string_void_signature();
|
||||
}
|
||||
return new_exception(thread, h_name, signature, &args, h_cause, h_loader, h_protection_domain);
|
||||
return new_exception(thread, name, signature, &args, h_cause, h_loader, h_protection_domain);
|
||||
}
|
||||
|
||||
// Another convenience method that creates handles for null class loaders and
|
||||
|
@ -355,8 +390,7 @@ Handle Exceptions::new_exception(Thread* thread, Symbol* h_name,
|
|||
// encoding scheme of the string into account. One thing we should do at some
|
||||
// point is to push this flag down to class java_lang_String since other
|
||||
// classes may need similar functionalities.
|
||||
Handle Exceptions::new_exception(Thread* thread,
|
||||
Symbol* name,
|
||||
Handle Exceptions::new_exception(Thread* thread, Symbol* name,
|
||||
const char* message,
|
||||
ExceptionMsgToUtf8Mode to_utf8_safe) {
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue