Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
df99a0f2
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
df99a0f2
编写于
3月 25, 2014
作者:
V
vlivanov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8036117: MethodHandles.catchException doesn't handle VarargsCollector right (8034120 failed)
Reviewed-by: jrose, twisti
上级
db483d08
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
65 addition
and
10 deletion
+65
-10
src/share/classes/java/lang/invoke/MethodHandleImpl.java
src/share/classes/java/lang/invoke/MethodHandleImpl.java
+4
-3
test/java/lang/invoke/MethodHandles/TestCatchException.java
test/java/lang/invoke/MethodHandles/TestCatchException.java
+61
-7
未找到文件。
src/share/classes/java/lang/invoke/MethodHandleImpl.java
浏览文件 @
df99a0f2
...
...
@@ -712,16 +712,17 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
@LambdaForm
.
Hidden
static
Object
guardWithCatch
(
MethodHandle
target
,
Class
<?
extends
Throwable
>
exType
,
MethodHandle
catcher
,
Object
...
av
)
throws
Throwable
{
// Use asFixedArity() to avoid unnecessary boxing of last argument for VarargsCollector case.
try
{
return
target
.
invokeWithArguments
(
av
);
return
target
.
asFixedArity
().
invokeWithArguments
(
av
);
}
catch
(
Throwable
t
)
{
if
(!
exType
.
isInstance
(
t
))
throw
t
;
Object
[]
args
=
prepend
(
t
,
av
);
return
catcher
.
invokeWithArguments
(
args
);
return
catcher
.
asFixedArity
().
invokeWithArguments
(
prepend
(
t
,
av
));
}
}
/** Prepend an element {@code elem} to an {@code array}. */
@LambdaForm
.
Hidden
private
static
Object
[]
prepend
(
Object
elem
,
Object
[]
array
)
{
Object
[]
newArray
=
new
Object
[
array
.
length
+
1
];
newArray
[
0
]
=
elem
;
...
...
test/java/lang/invoke/MethodHandles/TestCatchException.java
浏览文件 @
df99a0f2
...
...
@@ -72,19 +72,55 @@ public class TestCatchException {
assertEquals
(
x
,
17
);
}
final
static
Object
masterParam
=
new
Object
();
final
static
Object
[]
masterTail
=
new
Object
[]
{
"str"
};
static
Exception
masterEx
=
new
Exception
();
public
static
Object
m1
(
Object
o1
,
Object
o2
,
Object
o3
,
Object
o4
,
Object
o5
,
Object
o6
,
Object
o7
,
Object
o8
,
Object
...
tail
)
{
assertEquals
(
masterParam
,
o1
);
assertEquals
(
masterParam
,
o2
);
assertEquals
(
masterParam
,
o3
);
assertEquals
(
masterParam
,
o4
);
assertEquals
(
masterParam
,
o5
);
assertEquals
(
masterParam
,
o6
);
assertEquals
(
masterParam
,
o7
);
assertEquals
(
masterParam
,
o8
);
assertEquals
(
masterTail
,
tail
);
return
tail
;
}
public
static
Object
m2
(
Exception
e
,
Object
o1
,
Object
o2
,
Object
o3
,
Object
o4
,
Object
o5
,
Object
o6
,
Object
o7
,
Object
o8
,
Object
...
tail
)
{
assertEquals
(
masterEx
,
e
);
assertEquals
(
masterParam
,
o1
);
assertEquals
(
masterParam
,
o2
);
assertEquals
(
masterParam
,
o3
);
assertEquals
(
masterParam
,
o4
);
assertEquals
(
masterParam
,
o5
);
assertEquals
(
masterParam
,
o6
);
assertEquals
(
masterParam
,
o7
);
assertEquals
(
masterParam
,
o8
);
assertEquals
(
masterTail
,
tail
);
return
tail
;
}
public
static
Object
throwEx
(
Object
o1
,
Object
o2
,
Object
o3
,
Object
o4
,
Object
o5
,
Object
o6
,
Object
o7
,
Object
o8
,
Object
...
tail
)
throws
Exception
{
assertEquals
(
masterParam
,
o1
);
assertEquals
(
masterParam
,
o2
);
assertEquals
(
masterParam
,
o3
);
assertEquals
(
masterParam
,
o4
);
assertEquals
(
masterParam
,
o5
);
assertEquals
(
masterParam
,
o6
);
assertEquals
(
masterParam
,
o7
);
assertEquals
(
masterParam
,
o8
);
assertEquals
(
masterTail
,
tail
);
throw
masterEx
;
}
@Test
public
void
testVarargsCollector
()
throws
Throwable
{
public
void
testVarargsCollector
NoThrow
()
throws
Throwable
{
MethodType
t1
=
MethodType
.
methodType
(
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
[].
class
);
...
...
@@ -92,17 +128,34 @@ public class TestCatchException {
MethodHandle
target
=
LOOKUP
.
findStatic
(
TestCatchException
.
class
,
"m1"
,
t1
)
.
asVarargsCollector
(
Object
[].
class
);
MethodHandle
catcher
=
LOOKUP
.
findStatic
(
TestCatchException
.
class
,
"m2"
,
t2
)
.
asVarargsCollector
(
Object
[].
class
);
MethodHandle
gwc
=
MethodHandles
.
catchException
(
target
,
Exception
.
class
,
catcher
);
Object
o
=
masterParam
;
Object
[]
obj1
=
masterTail
;
Object
r2
=
gwc
.
invokeExact
(
o
,
o
,
o
,
o
,
o
,
o
,
o
,
o
,
obj1
);
assertEquals
(
r2
,
obj1
);
}
MethodHandle
catcher
=
LOOKUP
.
findStatic
(
TestCatchException
.
class
,
"m2"
,
t2
);
@Test
public
void
testVarargsCollectorThrow
()
throws
Throwable
{
MethodType
t1
=
MethodType
.
methodType
(
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
.
class
,
Object
[].
class
);
MethodType
t2
=
t1
.
insertParameterTypes
(
0
,
Exception
.
class
);
MethodHandle
target
=
LOOKUP
.
findStatic
(
TestCatchException
.
class
,
"throwEx"
,
t1
)
.
asVarargsCollector
(
Object
[].
class
);
MethodHandle
catcher
=
LOOKUP
.
findStatic
(
TestCatchException
.
class
,
"m2"
,
t2
)
.
asVarargsCollector
(
Object
[].
class
);
MethodHandle
gwc
=
MethodHandles
.
catchException
(
target
,
Exception
.
class
,
catcher
);
Object
o
=
new
Object
()
;
Object
[]
obj1
=
new
Object
[]
{
"str"
}
;
Object
o
=
masterParam
;
Object
[]
obj1
=
masterTail
;
Object
r1
=
target
.
invokeExact
(
o
,
o
,
o
,
o
,
o
,
o
,
o
,
o
,
obj1
);
Object
r2
=
gwc
.
invokeExact
(
o
,
o
,
o
,
o
,
o
,
o
,
o
,
o
,
obj1
);
assertEquals
(
r1
,
obj1
);
assertEquals
(
r2
,
obj1
);
}
...
...
@@ -110,7 +163,8 @@ public class TestCatchException {
TestCatchException
test
=
new
TestCatchException
();
test
.
testNoThrowPath
();
test
.
testThrowPath
();
test
.
testVarargsCollector
();
test
.
testVarargsCollectorNoThrow
();
test
.
testVarargsCollectorThrow
();
System
.
out
.
println
(
"TEST PASSED"
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录