Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
7e6ce77b
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看板
提交
7e6ce77b
编写于
2月 16, 2016
作者:
P
poonam
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
cd4c9654
36dcd911
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
79 addition
and
3 deletion
+79
-3
src/share/vm/opto/callGenerator.cpp
src/share/vm/opto/callGenerator.cpp
+4
-3
test/compiler/jsr292/LongReferenceCastingTest.java
test/compiler/jsr292/LongReferenceCastingTest.java
+75
-0
未找到文件。
src/share/vm/opto/callGenerator.cpp
浏览文件 @
7e6ce77b
...
@@ -829,17 +829,18 @@ CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod*
...
@@ -829,17 +829,18 @@ CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod*
}
}
}
}
// Cast reference arguments to its type.
// Cast reference arguments to its type.
for
(
int
i
=
0
;
i
<
signature
->
count
();
i
++
)
{
for
(
int
i
=
0
,
j
=
0
;
i
<
signature
->
count
();
i
++
)
{
ciType
*
t
=
signature
->
type_at
(
i
);
ciType
*
t
=
signature
->
type_at
(
i
);
if
(
t
->
is_klass
())
{
if
(
t
->
is_klass
())
{
Node
*
arg
=
kit
.
argument
(
receiver_skip
+
i
);
Node
*
arg
=
kit
.
argument
(
receiver_skip
+
j
);
const
TypeOopPtr
*
arg_type
=
arg
->
bottom_type
()
->
isa_oopptr
();
const
TypeOopPtr
*
arg_type
=
arg
->
bottom_type
()
->
isa_oopptr
();
const
Type
*
sig_type
=
TypeOopPtr
::
make_from_klass
(
t
->
as_klass
());
const
Type
*
sig_type
=
TypeOopPtr
::
make_from_klass
(
t
->
as_klass
());
if
(
arg_type
!=
NULL
&&
!
arg_type
->
higher_equal
(
sig_type
))
{
if
(
arg_type
!=
NULL
&&
!
arg_type
->
higher_equal
(
sig_type
))
{
Node
*
cast_obj
=
gvn
.
transform
(
new
(
C
)
CheckCastPPNode
(
kit
.
control
(),
arg
,
sig_type
));
Node
*
cast_obj
=
gvn
.
transform
(
new
(
C
)
CheckCastPPNode
(
kit
.
control
(),
arg
,
sig_type
));
kit
.
set_argument
(
receiver_skip
+
i
,
cast_obj
);
kit
.
set_argument
(
receiver_skip
+
j
,
cast_obj
);
}
}
}
}
j
+=
t
->
size
();
// long and double take two slots
}
}
// Try to get the most accurate receiver type
// Try to get the most accurate receiver type
...
...
test/compiler/jsr292/LongReferenceCastingTest.java
0 → 100644
浏览文件 @
7e6ce77b
/*
* Copyright (c) 2016, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
import
java.lang.invoke.*
;
/**
* @test
* @bug 8148752
* @summary Test correct casting of MH arguments during inlining.
* @run main LongReferenceCastingTest
*/
public
class
LongReferenceCastingTest
{
static
final
String
MY_STRING
=
"myString"
;
static
final
MethodHandle
MH
;
static
{
try
{
MethodHandles
.
Lookup
lookup
=
MethodHandles
.
lookup
();
MethodType
mt
=
MethodType
.
methodType
(
String
.
class
,
long
.
class
,
Object
.
class
,
String
.
class
);
MH
=
lookup
.
findVirtual
(
LongReferenceCastingTest
.
class
,
"myMethod"
,
mt
);
}
catch
(
Exception
e
)
{
throw
new
Error
(
e
);
}
}
public
String
myMethod
(
long
l
,
Object
o
,
String
s
)
{
// The long argument occupies two stack slots, causing C2 to treat it as
// two arguments and casting the fist one two long and the second one to Object.
// As a result, Object o is casted to String and the o.toString() call is
// inlined as String::toString(). We fail at runtime because 'o' is not a String.
return
o
.
toString
();
}
public
String
toString
()
{
return
MY_STRING
;
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
LongReferenceCastingTest
test
=
new
LongReferenceCastingTest
();
try
{
for
(
int
i
=
0
;
i
<
20_000
;
++
i
)
{
if
(!
test
.
invoke
().
equals
(
MY_STRING
))
{
throw
new
RuntimeException
(
"Invalid string"
);
}
}
}
catch
(
Throwable
t
)
{
throw
new
RuntimeException
(
"Test failed"
,
t
);
}
}
public
String
invoke
()
throws
Throwable
{
return
(
String
)
MH
.
invokeExact
(
this
,
0L
,
(
Object
)
this
,
MY_STRING
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录