Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
dc3bdc8c
D
dragonwell8_hotspot
项目概览
openanolis
/
dragonwell8_hotspot
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_hotspot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
dc3bdc8c
编写于
8月 01, 2017
作者:
H
hseigel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8180711: Better invokespecial checks
Reviewed-by: acorn, ahgross, rhalade Contributed-by: harold.seigel@oracle.com
上级
0cd0a5a7
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
48 addition
and
59 deletion
+48
-59
src/share/vm/interpreter/linkResolver.cpp
src/share/vm/interpreter/linkResolver.cpp
+44
-58
src/share/vm/interpreter/linkResolver.hpp
src/share/vm/interpreter/linkResolver.hpp
+4
-1
未找到文件。
src/share/vm/interpreter/linkResolver.cpp
浏览文件 @
dc3bdc8c
...
@@ -538,6 +538,42 @@ void LinkResolver::resolve_method_statically(methodHandle& resolved_method, Klas
...
@@ -538,6 +538,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
,
void
LinkResolver
::
resolve_method
(
methodHandle
&
resolved_method
,
KlassHandle
resolved_klass
,
Symbol
*
method_name
,
Symbol
*
method_signature
,
Symbol
*
method_name
,
Symbol
*
method_signature
,
KlassHandle
current_klass
,
bool
check_access
,
KlassHandle
current_klass
,
bool
check_access
,
...
@@ -594,34 +630,8 @@ void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle res
...
@@ -594,34 +630,8 @@ void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle res
CHECK
);
CHECK
);
// check loader constraints
// check loader constraints
Handle
loader
(
THREAD
,
InstanceKlass
::
cast
(
current_klass
())
->
class_loader
());
check_method_loader_constraints
(
resolved_method
,
resolved_klass
,
method_name
,
Handle
class_loader
(
THREAD
,
resolved_method
->
method_holder
()
->
class_loader
());
method_signature
,
current_klass
,
"method"
,
CHECK
);
{
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
);
}
}
}
}
}
}
...
@@ -670,36 +680,8 @@ void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
...
@@ -670,36 +680,8 @@ void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
resolved_method
,
resolved_method
,
CHECK
);
CHECK
);
HandleMark
hm
(
THREAD
);
check_method_loader_constraints
(
resolved_method
,
resolved_klass
,
method_name
,
Handle
loader
(
THREAD
,
InstanceKlass
::
cast
(
current_klass
())
->
class_loader
());
method_signature
,
current_klass
,
"interface method"
,
CHECK
);
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
);
}
}
}
}
if
(
nostatics
&&
resolved_method
->
is_static
())
{
if
(
nostatics
&&
resolved_method
->
is_static
())
{
...
@@ -1049,6 +1031,10 @@ void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle
...
@@ -1049,6 +1031,10 @@ void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle
Method
::
name_and_sig_as_C_string
(
resolved_klass
(),
Method
::
name_and_sig_as_C_string
(
resolved_klass
(),
resolved_method
->
name
(),
resolved_method
->
name
(),
resolved_method
->
signature
()));
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
);
}
}
}
}
...
...
src/share/vm/interpreter/linkResolver.hpp
浏览文件 @
dc3bdc8c
/*
/*
* Copyright (c) 1997, 201
6
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
7
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -135,6 +135,9 @@ class LinkResolver: AllStatic {
...
@@ -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_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
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
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
);
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录