Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
8cd530d6
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看板
提交
8cd530d6
编写于
7月 16, 2011
作者:
J
jrose
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
7058651: JSR 292 unit tests need a refresh
Summary: Enhancements to unit tests. Reviewed-by: never, twisti
上级
0059e8b2
变更
4
展开全部
隐藏空白更改
内联
并排
Showing
4 changed file
with
692 addition
and
89 deletion
+692
-89
test/java/lang/invoke/JavaDocExamplesTest.java
test/java/lang/invoke/JavaDocExamplesTest.java
+42
-0
test/java/lang/invoke/MethodHandlesTest.java
test/java/lang/invoke/MethodHandlesTest.java
+364
-89
test/java/lang/invoke/RicochetTest.java
test/java/lang/invoke/RicochetTest.java
+57
-0
test/java/lang/invoke/ThrowExceptionsTest.java
test/java/lang/invoke/ThrowExceptionsTest.java
+229
-0
未找到文件。
test/java/lang/invoke/JavaDocExamplesTest.java
浏览文件 @
8cd530d6
...
...
@@ -69,6 +69,7 @@ public class JavaDocExamplesTest {
testDropArguments
();
testFilterArguments
();
testFoldArguments
();
testFoldArguments2
();
testMethodHandlesSummary
();
testAsSpreader
();
testAsCollector
();
...
...
@@ -490,6 +491,47 @@ assertEquals("hodmet", (String) worker.invokeExact("met", "hod"));
}}
}
@Test
public
void
testFoldArguments2
()
throws
Throwable
{
{{
{}
/// JAVADOC
// argument-based dispatch for methods of the form boolean x.___(y: String)
Lookup
lookup
=
publicLookup
();
// first, a tracing hack:
MethodHandle
println
=
lookup
.
findVirtual
(
java
.
io
.
PrintStream
.
class
,
"println"
,
methodType
(
void
.
class
,
String
.
class
));
MethodHandle
arrayToString
=
lookup
.
findStatic
(
Arrays
.
class
,
"toString"
,
methodType
(
String
.
class
,
Object
[].
class
));
MethodHandle
concat
=
lookup
.
findVirtual
(
String
.
class
,
"concat"
,
methodType
(
String
.
class
,
String
.
class
));
MethodHandle
arrayToString_DIS
=
filterReturnValue
(
arrayToString
,
concat
.
bindTo
(
"DIS:"
));
MethodHandle
arrayToString_INV
=
filterReturnValue
(
arrayToString
,
concat
.
bindTo
(
"INV:"
));
MethodHandle
printArgs_DIS
=
filterReturnValue
(
arrayToString_DIS
,
println
.
bindTo
(
System
.
out
)).
asVarargsCollector
(
Object
[].
class
);
MethodHandle
printArgs_INV
=
filterReturnValue
(
arrayToString_INV
,
println
.
bindTo
(
System
.
out
)).
asVarargsCollector
(
Object
[].
class
);
// metaobject protocol:
MethodType
mtype
=
methodType
(
boolean
.
class
,
String
.
class
);
MethodHandle
findVirtual
=
lookup
.
findVirtual
(
Lookup
.
class
,
"findVirtual"
,
methodType
(
MethodHandle
.
class
,
Class
.
class
,
String
.
class
,
MethodType
.
class
));
MethodHandle
getClass
=
lookup
.
findVirtual
(
Object
.
class
,
"getClass"
,
methodType
(
Class
.
class
));
MethodHandle
dispatch
=
findVirtual
;
dispatch
=
filterArguments
(
dispatch
,
1
,
getClass
);
dispatch
=
insertArguments
(
dispatch
,
3
,
mtype
);
dispatch
=
dispatch
.
bindTo
(
lookup
);
assertEquals
(
methodType
(
MethodHandle
.
class
,
Object
.
class
,
String
.
class
),
dispatch
.
type
());
MethodHandle
invoker
=
invoker
(
mtype
.
insertParameterTypes
(
0
,
Object
.
class
));
// wrap tracing around the dispatch and invoke steps:
dispatch
=
foldArguments
(
dispatch
,
printArgs_DIS
.
asType
(
dispatch
.
type
().
changeReturnType
(
void
.
class
)));
invoker
=
foldArguments
(
invoker
,
printArgs_INV
.
asType
(
invoker
.
type
().
changeReturnType
(
void
.
class
)));
invoker
=
dropArguments
(
invoker
,
2
,
String
.
class
);
// ignore selector
// compose the dispatcher and the invoker:
MethodHandle
invokeDispatched
=
foldArguments
(
invoker
,
dispatch
);
Object
x
=
"football"
,
y
=
new
java
.
util
.
Scanner
(
"bar"
);
assert
(
(
boolean
)
invokeDispatched
.
invokeExact
(
x
,
"startsWith"
,
"foo"
));
assert
(!(
boolean
)
invokeDispatched
.
invokeExact
(
x
,
"startsWith"
,
"#"
));
assert
(
(
boolean
)
invokeDispatched
.
invokeExact
(
x
,
"endsWith"
,
"all"
));
assert
(!(
boolean
)
invokeDispatched
.
invokeExact
(
x
,
"endsWith"
,
"foo"
));
assert
(
(
boolean
)
invokeDispatched
.
invokeExact
(
y
,
"hasNext"
,
"[abc]+[rst]"
));
assert
(!(
boolean
)
invokeDispatched
.
invokeExact
(
y
,
"hasNext"
,
"[123]+[789]"
));
}}
}
/* ---- TEMPLATE ----
@Test public void testFoo() throws Throwable {
{{
...
...
test/java/lang/invoke/MethodHandlesTest.java
浏览文件 @
8cd530d6
此差异已折叠。
点击以展开。
test/java/lang/invoke/RicochetTest.java
浏览文件 @
8cd530d6
...
...
@@ -82,6 +82,7 @@ public class RicochetTest {
testLongSpreads
();
testIntCollects
();
testReturns
();
testRecursion
();
}
@Test
...
...
@@ -371,6 +372,61 @@ public class RicochetTest {
//System.out.println("faultCount="+faultCount);
}
@Test
public
void
testRecursion
()
throws
Throwable
{
if
(!
startTest
(
"testRecursion"
))
return
;
final
int
LIMIT
=
10
;
for
(
int
i
=
0
;
i
<
LIMIT
;
i
++)
{
RFCB
rfcb
=
new
RFCB
(
i
);
Object
x
=
"x"
,
y
=
"y"
;
Object
result
=
rfcb
.
recursiveFunction
(
x
,
y
);
verbose
(
1
,
result
);
}
}
/** Recursive Function Control Block */
private
static
class
RFCB
{
java
.
util
.
Random
random
;
final
MethodHandle
[]
fns
;
int
depth
;
RFCB
(
int
seed
)
throws
Throwable
{
this
.
random
=
new
java
.
util
.
Random
(
seed
);
this
.
fns
=
new
MethodHandle
[
Math
.
max
(
29
,
(
1
<<
MAX_DEPTH
-
2
)/
3
)];
java
.
util
.
Arrays
.
fill
(
fns
,
lookup
().
bind
(
this
,
"recursiveFunction"
,
genericMethodType
(
2
)));
for
(
int
i
=
5
;
i
<
fns
.
length
;
i
++)
{
switch
(
i
%
4
)
{
case
0
:
fns
[
i
]
=
filterArguments
(
fns
[
i
-
5
],
0
,
insertArguments
(
fns
[
i
-
4
],
1
,
"."
));
break
;
case
1
:
fns
[
i
]
=
filterArguments
(
fns
[
i
-
5
],
1
,
insertArguments
(
fns
[
i
-
3
],
1
,
"."
));
break
;
case
2
:
fns
[
i
]
=
filterReturnValue
(
fns
[
i
-
5
],
insertArguments
(
fns
[
i
-
2
],
1
,
"."
));
break
;
}
}
}
Object
recursiveFunction
(
Object
x
,
Object
y
)
throws
Throwable
{
depth
++;
try
{
final
int
ACTION_COUNT
=
11
;
switch
(
random
.
nextInt
(
ACTION_COUNT
))
{
case
1
:
Throwable
ex
=
new
RuntimeException
();
ex
.
fillInStackTrace
();
if
(
VERBOSITY
>=
2
)
ex
.
printStackTrace
();
x
=
"ST; "
+
x
;
break
;
case
2
:
System
.
gc
();
x
=
"GC; "
+
x
;
break
;
}
boolean
isLeaf
=
(
depth
>=
MAX_DEPTH
);
if
(
isLeaf
)
{
return
Arrays
.
asList
(
x
,
y
).
toString
();
}
return
fns
[
random
.
nextInt
(
fns
.
length
)].
invokeExact
(
x
,
y
);
}
finally
{
depth
--;
}
}
}
private
static
MethodHandle
sequence
(
MethodHandle
mh1
,
MethodHandle
...
mhs
)
{
MethodHandle
res
=
mh1
;
for
(
MethodHandle
mh2
:
mhs
)
...
...
@@ -536,6 +592,7 @@ public class RicochetTest {
}
// stress modes:
private
static
final
int
MAX_DEPTH
=
getProperty
(
"MAX_DEPTH"
,
5
);
private
static
final
int
REPEAT
=
getProperty
(
"REPEAT"
,
0
);
private
static
final
int
STRESS
=
getProperty
(
"STRESS"
,
0
);
private
static
/*v*/
int
STRESS_COUNT
;
...
...
test/java/lang/invoke/ThrowExceptionsTest.java
0 → 100644
浏览文件 @
8cd530d6
/*
* Copyright (c) 2011, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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.
*/
/* @test
* @summary unit tests for method handles which permute their arguments
* @run junit test.java.lang.invoke.ThrowExceptionsTest
*/
package
test.java.lang.invoke
;
import
org.junit.*
;
import
java.util.*
;
import
java.lang.reflect.*
;
import
java.lang.invoke.*
;
import
static
java
.
lang
.
invoke
.
MethodHandles
.*;
import
static
java
.
lang
.
invoke
.
MethodType
.*;
public
class
ThrowExceptionsTest
{
private
static
final
Class
CLASS
=
ThrowExceptionsTest
.
class
;
private
static
final
Lookup
LOOKUP
=
lookup
();
public
static
void
main
(
String
argv
[])
throws
Throwable
{
new
ThrowExceptionsTest
().
testAll
((
argv
.
length
==
0
?
null
:
Arrays
.
asList
(
argv
).
toString
()));
}
@Test
public
void
testWMT
()
throws
Throwable
{
// mostly call testWMTCallee, but sometimes call its void-returning variant
MethodHandle
mh
=
testWMTCallee
();
MethodHandle
mh1
=
mh
.
asType
(
mh
.
type
().
changeReturnType
(
void
.
class
));
assert
(
mh1
!=
mh
);
testWMT
(
mh
,
mh1
,
1000
);
}
@Test
public
void
testBoundWMT
()
throws
Throwable
{
// mostly call exactInvoker.bindTo(testWMTCallee), but sometimes call its void-returning variant
MethodHandle
callee
=
testWMTCallee
();
MethodHandle
callee1
=
callee
.
asType
(
callee
.
type
().
changeReturnType
(
void
.
class
));
MethodHandle
invoker
=
exactInvoker
(
callee
.
type
());
MethodHandle
mh
=
invoker
.
bindTo
(
callee
);
MethodHandle
mh1
=
invoker
.
bindTo
(
callee1
);
testWMT
(
mh
,
mh1
,
1000
);
}
@Test
public
void
testFoldWMT
()
throws
Throwable
{
// mostly call exactInvoker.fold(constant(testWMTCallee)), but sometimes call its void-returning variant
MethodHandle
callee
=
testWMTCallee
();
MethodHandle
callee1
=
callee
.
asType
(
callee
.
type
().
changeReturnType
(
void
.
class
));
MethodHandle
invoker
=
exactInvoker
(
callee
.
type
());
MethodHandle
mh
=
foldArguments
(
invoker
,
constant
(
MethodHandle
.
class
,
callee
));
MethodHandle
mh1
=
foldArguments
(
invoker
,
constant
(
MethodHandle
.
class
,
callee1
));
testWMT
(
mh
,
mh1
,
1000
);
}
@Test
public
void
testFoldCCE
()
throws
Throwable
{
MethodHandle
callee
=
testWMTCallee
();
MethodHandle
callee1
=
callee
.
asType
(
callee
.
type
().
changeParameterType
(
1
,
Number
.
class
)).
asType
(
callee
.
type
());
MethodHandle
invoker
=
exactInvoker
(
callee
.
type
());
MethodHandle
mh
=
foldArguments
(
invoker
,
constant
(
MethodHandle
.
class
,
callee
));
MethodHandle
mh1
=
foldArguments
(
invoker
,
constant
(
MethodHandle
.
class
,
callee1
));
testWMT
(
mh
,
mh1
,
1000
);
}
@Test
public
void
testStackOverflow
()
throws
Throwable
{
MethodHandle
callee
=
testWMTCallee
();
MethodHandle
callee1
=
makeStackOverflow
().
asType
(
callee
.
type
());
MethodHandle
invoker
=
exactInvoker
(
callee
.
type
());
MethodHandle
mh
=
foldArguments
(
invoker
,
constant
(
MethodHandle
.
class
,
callee
));
MethodHandle
mh1
=
foldArguments
(
invoker
,
constant
(
MethodHandle
.
class
,
callee1
));
for
(
int
i
=
0
;
i
<
REPEAT
;
i
++)
{
try
{
testWMT
(
mh
,
mh1
,
1000
);
}
catch
(
StackOverflowError
ex
)
{
// OK, try again
}
}
}
private
static
MethodHandle
makeStackOverflow
()
{
MethodType
cellType
=
methodType
(
void
.
class
);
MethodHandle
[]
cell
=
{
null
};
// recursion point
MethodHandle
getCell
=
insertArguments
(
arrayElementGetter
(
cell
.
getClass
()),
0
,
cell
,
0
);
MethodHandle
invokeCell
=
foldArguments
(
exactInvoker
(
cellType
),
getCell
);
assert
(
invokeCell
.
type
()
==
cellType
);
cell
[
0
]
=
invokeCell
;
// make it conformable to any type:
invokeCell
=
dropArguments
(
invokeCell
,
0
,
Object
[].
class
).
asVarargsCollector
(
Object
[].
class
);
return
invokeCell
;
}
static
int
testCases
;
private
void
testAll
(
String
match
)
throws
Throwable
{
testCases
=
0
;
Lookup
lookup
=
lookup
();
for
(
Method
m
:
CLASS
.
getDeclaredMethods
())
{
String
name
=
m
.
getName
();
if
(
name
.
startsWith
(
"test"
)
&&
(
match
==
null
||
match
.
contains
(
name
.
substring
(
"test"
.
length
())))
&&
m
.
getParameterTypes
().
length
==
0
&&
Modifier
.
isPublic
(
m
.
getModifiers
())
&&
!
Modifier
.
isStatic
(
m
.
getModifiers
()))
{
System
.
out
.
println
(
"["
+
name
+
"]"
);
int
tc
=
testCases
;
try
{
m
.
invoke
(
this
);
}
catch
(
Throwable
ex
)
{
System
.
out
.
println
(
"*** "
+
ex
);
ex
.
printStackTrace
();
}
if
(
testCases
==
tc
)
testCases
++;
}
}
if
(
testCases
==
0
)
throw
new
RuntimeException
(
"no test cases found"
);
System
.
out
.
println
(
"ran a total of "
+
testCases
+
" test cases"
);
}
private
static
MethodHandle
findStatic
(
String
name
)
{
return
findMethod
(
name
,
true
);
}
private
static
MethodHandle
findVirtual
(
String
name
)
{
return
findMethod
(
name
,
false
);
}
private
static
MethodHandle
findMethod
(
String
name
,
boolean
isStatic
)
{
MethodHandle
mh
=
null
;
for
(
Method
m
:
CLASS
.
getDeclaredMethods
())
{
if
(
m
.
getName
().
equals
(
name
)
&&
Modifier
.
isStatic
(
m
.
getModifiers
())
==
isStatic
)
{
if
(
mh
!=
null
)
throw
new
RuntimeException
(
"duplicate methods: "
+
name
);
try
{
mh
=
LOOKUP
.
unreflect
(
m
);
}
catch
(
ReflectiveOperationException
ex
)
{
throw
new
RuntimeException
(
ex
);
}
}
}
if
(
mh
==
null
)
throw
new
RuntimeException
(
"no method: "
+
name
);
return
mh
;
}
int
testWMTCallee
;
private
int
testWMTCallee
(
String
x
)
{
return
testWMTCallee
++;
}
private
static
MethodHandle
testWMTCallee
()
{
MethodHandle
callee
=
findVirtual
(
"testWMTCallee"
);
// FIXME: should not have to retype callee
callee
=
callee
.
asType
(
callee
.
type
().
changeParameterType
(
0
,
Object
.
class
));
return
callee
;
}
private
Exception
testWMT
(
MethodHandle
[]
mhs
,
int
reps
)
throws
Throwable
{
testCases
+=
1
;
testWMTCallee
=
0
;
int
catches
=
0
;
Exception
savedEx
=
null
;
for
(
int
i
=
0
;
i
<
reps
;
i
++)
{
MethodHandle
mh
=
mhs
[
i
%
mhs
.
length
];
int
n
;
try
{
// FIXME: should not have to retype this
n
=
(
int
)
mh
.
invokeExact
((
Object
)
this
,
"x"
);
assertEquals
(
n
,
i
-
catches
);
// Using the exact type for this causes endless deopt due to
// 'non_cached_result' in SystemDictionary::find_method_handle_invoke.
// The problem is that the compiler thread needs to access a cached
// invoke method, but invoke methods are not cached if one of the
// component types is not on the BCP.
}
catch
(
Exception
ex
)
{
savedEx
=
ex
;
catches
++;
}
}
//VERBOSE: System.out.println("reps="+reps+" catches="+catches);
return
savedEx
;
}
private
static
final
int
REPEAT
=
Integer
.
getInteger
(
CLASS
.
getSimpleName
()+
".REPEAT"
,
10
);
private
Exception
testWMT
(
MethodHandle
mh
,
MethodHandle
mh1
,
int
reps
)
throws
Throwable
{
//VERBOSE: System.out.println("mh="+mh+" mh1="+mh1);
MethodHandle
[]
mhs
=
new
MethodHandle
[
100
];
Arrays
.
fill
(
mhs
,
mh
);
int
patch
=
mhs
.
length
-
1
;
Exception
savedEx
=
null
;
for
(
int
i
=
0
;
i
<
REPEAT
;
i
++)
{
mhs
[
patch
]
=
mh
;
testWMT
(
mhs
,
10000
);
mhs
[
patch
]
=
mh1
;
savedEx
=
testWMT
(
mhs
,
reps
);
}
return
savedEx
;
}
private
static
void
assertEquals
(
Object
x
,
Object
y
)
{
if
(
x
==
y
||
x
!=
null
&&
x
.
equals
(
y
))
return
;
throw
new
RuntimeException
(
x
+
" != "
+
y
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录