提交 774fb5c3 编写于 作者: A asaha

Merge

......@@ -983,6 +983,7 @@ e48302d521d59c2fe62f874f1f5d34bc46517da7 jdk8u151-b04
507af6ef977a5d0306a8723dec66e34befc1ae81 jdk8u151-b05
e1dc36cddcbc36b78e3d0558f87bbf459191e479 jdk8u151-b06
e2a930243efa63b0a789e85a523e69574d53ac92 jdk8u151-b07
158904fa31b28f1e027dc5b5a833ee673e89a84b jdk8u151-b08
5aa8c4ca51f0e666d368a4f119ed734d3ac59d7c jdk8u122-b00
2198ef7e1c1702b3506b95b5d8c886ad5a12bbe5 jdk8u122-b01
58d961f47dd4ee1d516512b7744e0f1fc83d8f52 jdk8u122-b02
......
......@@ -540,6 +540,42 @@ void LinkResolver::resolve_method_statically(methodHandle& resolved_method, Klas
}
}
void LinkResolver::check_method_loader_constraints(methodHandle& resolved_method,
KlassHandle resolved_klass,
Symbol* method_name,
Symbol* method_signature,
KlassHandle current_klass,
const char* method_type, TRAPS) {
Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
{
ResourceMark rm(THREAD);
Symbol* failed_type_symbol =
SystemDictionary::check_signature_loaders(method_signature, loader,
class_loader, true, CHECK);
if (failed_type_symbol != NULL) {
const char* msg = "loader constraint violation: when resolving %s"
" \"%s\" the class loader (instance of %s) of the current class, %s,"
" and the class loader (instance of %s) for the method's defining class, %s, have"
" different Class objects for the type %s used in the signature";
char* sig = Method::name_and_sig_as_C_string(resolved_klass(), method_name, method_signature);
const char* loader1 = SystemDictionary::loader_name(loader());
char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
const char* loader2 = SystemDictionary::loader_name(class_loader());
char* target = InstanceKlass::cast(resolved_method->method_holder())
->name()->as_C_string();
char* failed_type_name = failed_type_symbol->as_C_string();
size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
strlen(current) + strlen(loader2) + strlen(target) +
strlen(failed_type_name) + strlen(method_type) + 1;
char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
jio_snprintf(buf, buflen, msg, method_type, sig, loader1, current, loader2,
target, failed_type_name);
THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
}
}
}
void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
Symbol* method_name, Symbol* method_signature,
KlassHandle current_klass, bool check_access,
......@@ -596,34 +632,8 @@ void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle res
CHECK);
// check loader constraints
Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
{
ResourceMark rm(THREAD);
Symbol* failed_type_symbol =
SystemDictionary::check_signature_loaders(method_signature, loader,
class_loader, true, CHECK);
if (failed_type_symbol != NULL) {
const char* msg = "loader constraint violation: when resolving method"
" \"%s\" the class loader (instance of %s) of the current class, %s,"
" and the class loader (instance of %s) for the method's defining class, %s, have"
" different Class objects for the type %s used in the signature";
char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
const char* loader1 = SystemDictionary::loader_name(loader());
char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
const char* loader2 = SystemDictionary::loader_name(class_loader());
char* target = InstanceKlass::cast(resolved_method->method_holder())
->name()->as_C_string();
char* failed_type_name = failed_type_symbol->as_C_string();
size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
strlen(current) + strlen(loader2) + strlen(target) +
strlen(failed_type_name) + 1;
char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
target, failed_type_name);
THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
}
}
check_method_loader_constraints(resolved_method, resolved_klass, method_name,
method_signature, current_klass, "method", CHECK);
}
}
......@@ -672,36 +682,8 @@ void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
resolved_method,
CHECK);
HandleMark hm(THREAD);
Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
{
ResourceMark rm(THREAD);
Symbol* failed_type_symbol =
SystemDictionary::check_signature_loaders(method_signature, loader,
class_loader, true, CHECK);
if (failed_type_symbol != NULL) {
const char* msg = "loader constraint violation: when resolving "
"interface method \"%s\" the class loader (instance of %s) of the "
"current class, %s, and the class loader (instance of %s) for "
"the method's defining class, %s, have different Class objects for the type %s "
"used in the signature";
char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
const char* loader1 = SystemDictionary::loader_name(loader());
char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
const char* loader2 = SystemDictionary::loader_name(class_loader());
char* target = InstanceKlass::cast(resolved_method->method_holder())
->name()->as_C_string();
char* failed_type_name = failed_type_symbol->as_C_string();
size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
strlen(current) + strlen(loader2) + strlen(target) +
strlen(failed_type_name) + 1;
char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
target, failed_type_name);
THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
}
}
check_method_loader_constraints(resolved_method, resolved_klass, method_name,
method_signature, current_klass, "interface method", CHECK);
}
if (nostatics && resolved_method->is_static()) {
......@@ -1051,6 +1033,10 @@ void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle
Method::name_and_sig_as_C_string(resolved_klass(),
resolved_method->name(),
resolved_method->signature()));
} else if (sel_method() != resolved_method()) {
check_method_loader_constraints(sel_method, resolved_klass,
sel_method->name(), sel_method->signature(),
current_klass, "method", CHECK);
}
}
......
/*
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -135,6 +135,9 @@ class LinkResolver: AllStatic {
static void resolve_pool (KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature, KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS);
static void resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool nostatics, TRAPS);
static void check_method_loader_constraints(methodHandle& resolved_method, KlassHandle resolved_klass,
Symbol* method_name, Symbol* method_signature,
KlassHandle current_klass, const char* method_type, TRAPS);
static void resolve_method (methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool require_methodref, TRAPS);
static void linktime_resolve_static_method (methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册