Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
3f59899d
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看板
提交
3f59899d
编写于
8月 12, 2013
作者:
T
twisti
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8022066: Evaluation of method reference to signature polymorphic method crashes VM
Reviewed-by: jrose
上级
976a400d
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
192 addition
and
0 deletion
+192
-0
src/share/classes/java/lang/invoke/MethodHandles.java
src/share/classes/java/lang/invoke/MethodHandles.java
+4
-0
test/java/lang/invoke/MethodHandleConstants.java
test/java/lang/invoke/MethodHandleConstants.java
+188
-0
未找到文件。
src/share/classes/java/lang/invoke/MethodHandles.java
浏览文件 @
3f59899d
...
...
@@ -1289,6 +1289,10 @@ return mh1;
:
resolveOrFail
(
refKind
,
defc
,
name
,
(
Class
<?>)
type
);
return
getDirectField
(
refKind
,
defc
,
field
);
}
else
if
(
MethodHandleNatives
.
refKindIsMethod
(
refKind
))
{
if
(
defc
==
MethodHandle
.
class
&&
refKind
==
REF_invokeVirtual
)
{
MethodHandle
mh
=
findVirtualForMH
(
name
,
(
MethodType
)
type
);
if
(
mh
!=
null
)
return
mh
;
}
MemberName
method
=
(
resolved
!=
null
)
?
resolved
:
resolveOrFail
(
refKind
,
defc
,
name
,
(
MethodType
)
type
);
return
getDirectMethod
(
refKind
,
defc
,
method
,
lookupClass
);
...
...
test/java/lang/invoke/MethodHandleConstants.java
0 → 100644
浏览文件 @
3f59899d
/*
* Copyright (c) 2010, 2013, 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.
*/
/* @test
* @bug 8022066
* @summary smoke test for method handle constants
* @build indify.Indify
* @compile MethodHandleConstants.java
* @run main/othervm
* indify.Indify
* --verify-specifier-count=0
* --expand-properties --classpath ${test.classes}
* --java test.java.lang.invoke.MethodHandleConstants --check-output
* @run main/othervm
* indify.Indify
* --expand-properties --classpath ${test.classes}
* --java test.java.lang.invoke.MethodHandleConstants --security-manager
*/
package
test.java.lang.invoke
;
import
java.util.*
;
import
java.io.*
;
import
java.lang.invoke.*
;
import
java.security.*
;
import
static
java
.
lang
.
invoke
.
MethodHandles
.*;
import
static
java
.
lang
.
invoke
.
MethodType
.*;
public
class
MethodHandleConstants
{
public
static
void
main
(
String
...
av
)
throws
Throwable
{
if
(
av
.
length
>
0
&&
av
[
0
].
equals
(
"--check-output"
))
openBuf
();
if
(
av
.
length
>
0
&&
av
[
0
].
equals
(
"--security-manager"
))
setSM
();
System
.
out
.
println
(
"Obtaining method handle constants:"
);
testCase
(
MH_String_replace_C2
(),
String
.
class
,
"replace"
,
String
.
class
,
String
.
class
,
char
.
class
,
char
.
class
);
testCase
(
MH_MethodHandle_invokeExact_SC2
(),
MethodHandle
.
class
,
"invokeExact"
,
String
.
class
,
MethodHandle
.
class
,
String
.
class
,
char
.
class
,
char
.
class
);
testCase
(
MH_MethodHandle_invoke_SC2
(),
MethodHandle
.
class
,
"invoke"
,
String
.
class
,
MethodHandle
.
class
,
String
.
class
,
char
.
class
,
char
.
class
);
testCase
(
MH_Class_forName_S
(),
Class
.
class
,
"forName"
,
Class
.
class
,
String
.
class
);
testCase
(
MH_Class_forName_SbCL
(),
Class
.
class
,
"forName"
,
Class
.
class
,
String
.
class
,
boolean
.
class
,
ClassLoader
.
class
);
System
.
out
.
println
(
"Done."
);
closeBuf
();
}
private
static
void
testCase
(
MethodHandle
mh
,
Class
<?>
defc
,
String
name
,
Class
<?>
rtype
,
Class
<?>...
ptypes
)
throws
Throwable
{
System
.
out
.
println
(
mh
);
// we include defc, because we assume it is a non-static MH:
MethodType
mt
=
methodType
(
rtype
,
ptypes
);
assertEquals
(
mh
.
type
(),
mt
);
// FIXME: Use revealDirect to find out more
}
private
static
void
assertEquals
(
Object
exp
,
Object
act
)
{
if
(
exp
==
act
||
(
exp
!=
null
&&
exp
.
equals
(
act
)))
return
;
throw
new
AssertionError
(
"not equal: "
+
exp
+
", "
+
act
);
}
private
static
void
setSM
()
{
Policy
.
setPolicy
(
new
TestPolicy
());
System
.
setSecurityManager
(
new
SecurityManager
());
}
private
static
PrintStream
oldOut
;
private
static
ByteArrayOutputStream
buf
;
private
static
void
openBuf
()
{
oldOut
=
System
.
out
;
buf
=
new
ByteArrayOutputStream
();
System
.
setOut
(
new
PrintStream
(
buf
));
}
private
static
void
closeBuf
()
{
if
(
buf
==
null
)
return
;
System
.
out
.
flush
();
System
.
setOut
(
oldOut
);
String
[]
haveLines
=
new
String
(
buf
.
toByteArray
()).
split
(
"[\n\r]+"
);
for
(
String
line
:
haveLines
)
System
.
out
.
println
(
line
);
Iterator
<
String
>
iter
=
Arrays
.
asList
(
haveLines
).
iterator
();
for
(
String
want
:
EXPECT_OUTPUT
)
{
String
have
=
iter
.
hasNext
()
?
iter
.
next
()
:
"[EOF]"
;
if
(
want
.
equals
(
have
))
continue
;
System
.
err
.
println
(
"want line: "
+
want
);
System
.
err
.
println
(
"have line: "
+
have
);
throw
new
AssertionError
(
"unexpected output: "
+
have
);
}
if
(
iter
.
hasNext
())
throw
new
AssertionError
(
"unexpected output: "
+
iter
.
next
());
}
private
static
final
String
[]
EXPECT_OUTPUT
=
{
"Obtaining method handle constants:"
,
"MethodHandle(String,char,char)String"
,
"MethodHandle(MethodHandle,String,char,char)String"
,
"MethodHandle(MethodHandle,String,char,char)String"
,
"MethodHandle(String)Class"
,
"MethodHandle(String,boolean,ClassLoader)Class"
,
"Done."
};
// String.replace(String, char, char)
private
static
MethodType
MT_String_replace_C2
()
{
shouldNotCallThis
();
return
methodType
(
String
.
class
,
char
.
class
,
char
.
class
);
}
private
static
MethodHandle
MH_String_replace_C2
()
throws
ReflectiveOperationException
{
shouldNotCallThis
();
return
lookup
().
findVirtual
(
String
.
class
,
"replace"
,
MT_String_replace_C2
());
}
// MethodHandle.invokeExact(...)
private
static
MethodType
MT_MethodHandle_invokeExact_SC2
()
{
shouldNotCallThis
();
return
methodType
(
String
.
class
,
String
.
class
,
char
.
class
,
char
.
class
);
}
private
static
MethodHandle
MH_MethodHandle_invokeExact_SC2
()
throws
ReflectiveOperationException
{
shouldNotCallThis
();
return
lookup
().
findVirtual
(
MethodHandle
.
class
,
"invokeExact"
,
MT_MethodHandle_invokeExact_SC2
());
}
// MethodHandle.invoke(...)
private
static
MethodType
MT_MethodHandle_invoke_SC2
()
{
shouldNotCallThis
();
return
methodType
(
String
.
class
,
String
.
class
,
char
.
class
,
char
.
class
);
}
private
static
MethodHandle
MH_MethodHandle_invoke_SC2
()
throws
ReflectiveOperationException
{
shouldNotCallThis
();
return
lookup
().
findVirtual
(
MethodHandle
.
class
,
"invoke"
,
MT_MethodHandle_invoke_SC2
());
}
// Class.forName(String)
private
static
MethodType
MT_Class_forName_S
()
{
shouldNotCallThis
();
return
methodType
(
Class
.
class
,
String
.
class
);
}
private
static
MethodHandle
MH_Class_forName_S
()
throws
ReflectiveOperationException
{
shouldNotCallThis
();
return
lookup
().
findStatic
(
Class
.
class
,
"forName"
,
MT_Class_forName_S
());
}
// Class.forName(String, boolean, ClassLoader)
private
static
MethodType
MT_Class_forName_SbCL
()
{
shouldNotCallThis
();
return
methodType
(
Class
.
class
,
String
.
class
,
boolean
.
class
,
ClassLoader
.
class
);
}
private
static
MethodHandle
MH_Class_forName_SbCL
()
throws
ReflectiveOperationException
{
shouldNotCallThis
();
return
lookup
().
findStatic
(
Class
.
class
,
"forName"
,
MT_Class_forName_SbCL
());
}
private
static
void
shouldNotCallThis
()
{
// if this gets called, the transformation has not taken place
if
(
System
.
getProperty
(
"MethodHandleConstants.allow-untransformed"
)
!=
null
)
return
;
throw
new
AssertionError
(
"this code should be statically transformed away by Indify"
);
}
static
class
TestPolicy
extends
Policy
{
final
PermissionCollection
permissions
=
new
Permissions
();
TestPolicy
()
{
permissions
.
add
(
new
java
.
io
.
FilePermission
(
"<<ALL FILES>>"
,
"read"
));
}
public
PermissionCollection
getPermissions
(
ProtectionDomain
domain
)
{
return
permissions
;
}
public
PermissionCollection
getPermissions
(
CodeSource
codesource
)
{
return
permissions
;
}
public
boolean
implies
(
ProtectionDomain
domain
,
Permission
perm
)
{
return
permissions
.
implies
(
perm
);
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录