Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_langtools
提交
f1809952
D
dragonwell8_langtools
项目概览
openanolis
/
dragonwell8_langtools
通知
0
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_langtools
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
f1809952
编写于
9月 24, 2015
作者:
A
asaha
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
c203e786
a1e6a391
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
160 addition
and
0 deletion
+160
-0
src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
...hare/classes/com/sun/tools/javac/comp/LambdaToMethod.java
+3
-0
test/tools/javac/lambda/lambdaNaming/TestNonSerializableLambdaNameStability.java
.../lambdaNaming/TestNonSerializableLambdaNameStability.java
+157
-0
未找到文件。
src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
浏览文件 @
f1809952
...
@@ -1179,12 +1179,14 @@ public class LambdaToMethod extends TreeTranslator {
...
@@ -1179,12 +1179,14 @@ public class LambdaToMethod extends TreeTranslator {
@Override
@Override
public
void
visitClassDef
(
JCClassDecl
tree
)
{
public
void
visitClassDef
(
JCClassDecl
tree
)
{
List
<
Frame
>
prevStack
=
frameStack
;
List
<
Frame
>
prevStack
=
frameStack
;
int
prevLambdaCount
=
lambdaCount
;
SyntheticMethodNameCounter
prevSyntheticMethodNameCounts
=
SyntheticMethodNameCounter
prevSyntheticMethodNameCounts
=
syntheticMethodNameCounts
;
syntheticMethodNameCounts
;
Map
<
ClassSymbol
,
Symbol
>
prevClinits
=
clinits
;
Map
<
ClassSymbol
,
Symbol
>
prevClinits
=
clinits
;
DiagnosticSource
prevSource
=
log
.
currentSource
();
DiagnosticSource
prevSource
=
log
.
currentSource
();
try
{
try
{
log
.
useSource
(
tree
.
sym
.
sourcefile
);
log
.
useSource
(
tree
.
sym
.
sourcefile
);
lambdaCount
=
0
;
syntheticMethodNameCounts
=
new
SyntheticMethodNameCounter
();
syntheticMethodNameCounts
=
new
SyntheticMethodNameCounter
();
prevClinits
=
new
HashMap
<
ClassSymbol
,
Symbol
>();
prevClinits
=
new
HashMap
<
ClassSymbol
,
Symbol
>();
if
(
tree
.
sym
.
owner
.
kind
==
MTH
)
{
if
(
tree
.
sym
.
owner
.
kind
==
MTH
)
{
...
@@ -1211,6 +1213,7 @@ public class LambdaToMethod extends TreeTranslator {
...
@@ -1211,6 +1213,7 @@ public class LambdaToMethod extends TreeTranslator {
finally
{
finally
{
log
.
useSource
(
prevSource
.
getFile
());
log
.
useSource
(
prevSource
.
getFile
());
frameStack
=
prevStack
;
frameStack
=
prevStack
;
lambdaCount
=
prevLambdaCount
;
syntheticMethodNameCounts
=
prevSyntheticMethodNameCounts
;
syntheticMethodNameCounts
=
prevSyntheticMethodNameCounts
;
clinits
=
prevClinits
;
clinits
=
prevClinits
;
}
}
...
...
test/tools/javac/lambda/lambdaNaming/TestNonSerializableLambdaNameStability.java
0 → 100644
浏览文件 @
f1809952
/*
* Copyright (c) 2014, 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 8067422
* @summary Check that the lambda names are not unnecessarily unstable
* @run main TestNonSerializableLambdaNameStability
*/
import
com.sun.tools.classfile.ClassFile
;
import
com.sun.tools.classfile.Method
;
import
java.io.ByteArrayInputStream
;
import
java.io.ByteArrayOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.net.URI
;
import
java.net.URISyntaxException
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
javax.tools.FileObject
;
import
javax.tools.ForwardingJavaFileManager
;
import
javax.tools.JavaCompiler
;
import
javax.tools.JavaFileManager
;
import
javax.tools.JavaFileObject
;
import
javax.tools.JavaFileObject.Kind
;
import
javax.tools.SimpleJavaFileObject
;
import
javax.tools.ToolProvider
;
public
class
TestNonSerializableLambdaNameStability
{
public
static
void
main
(
String
...
args
)
throws
Exception
{
new
TestNonSerializableLambdaNameStability
().
run
();
}
String
lambdaSource
=
"public class L%d {\n"
+
" public static class A {\n"
+
" private Runnable r = () -> { };\n"
+
" }\n"
+
" public static class B {\n"
+
" private Runnable r = () -> { };\n"
+
" }\n"
+
" private Runnable r = () -> { };\n"
+
"}\n"
;
String
expectedLambdaMethodName
=
"lambda$new$0"
;
void
run
()
throws
Exception
{
List
<
JavaFileObject
>
sources
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
3
;
i
++)
{
sources
.
add
(
new
SourceJavaFileObject
(
"L"
+
i
,
String
.
format
(
lambdaSource
,
i
)));
}
JavaCompiler
compiler
=
ToolProvider
.
getSystemJavaCompiler
();
try
(
MemoryFileManager
fm
=
new
MemoryFileManager
(
compiler
.
getStandardFileManager
(
null
,
null
,
null
)))
{
if
(!
compiler
.
getTask
(
null
,
fm
,
null
,
null
,
null
,
sources
).
call
())
{
throw
new
AssertionError
(
"Compilation failed!"
);
}
for
(
String
file
:
fm
.
name2Content
.
keySet
())
{
byte
[]
fileBytes
=
fm
.
name2Content
.
get
(
file
);
try
(
InputStream
in
=
new
ByteArrayInputStream
(
fileBytes
))
{
boolean
foundLambdaMethod
=
false
;
ClassFile
cf
=
ClassFile
.
read
(
in
);
StringBuilder
seenMethods
=
new
StringBuilder
();
String
sep
=
""
;
for
(
Method
m
:
cf
.
methods
)
{
String
methodName
=
m
.
getName
(
cf
.
constant_pool
);
if
(
expectedLambdaMethodName
.
equals
(
methodName
))
{
foundLambdaMethod
=
true
;
break
;
}
seenMethods
.
append
(
sep
);
seenMethods
.
append
(
methodName
);
sep
=
", "
;
}
if
(!
foundLambdaMethod
)
{
throw
new
AbstractMethodError
(
"Did not find the lambda method, "
+
"found methods: "
+
seenMethods
.
toString
());
}
}
}
}
}
class
MemoryFileManager
extends
ForwardingJavaFileManager
<
JavaFileManager
>
{
final
Map
<
String
,
byte
[]>
name2Content
=
new
HashMap
<>();
public
MemoryFileManager
(
JavaFileManager
fileManager
)
{
super
(
fileManager
);
}
@Override
public
JavaFileObject
getJavaFileForOutput
(
Location
location
,
String
className
,
Kind
kind
,
FileObject
sibling
)
throws
IOException
{
try
{
return
new
SimpleJavaFileObject
(
new
URI
(
"mem://"
+
className
.
replace
(
'.'
,
'/'
)
+
kind
.
extension
),
kind
)
{
@Override
public
OutputStream
openOutputStream
()
throws
IOException
{
return
new
ByteArrayOutputStream
()
{
@Override
public
void
close
()
throws
IOException
{
super
.
close
();
name2Content
.
put
(
className
,
toByteArray
());
}
};
}
};
}
catch
(
URISyntaxException
ex
)
{
throw
new
AssertionError
(
ex
);
}
}
}
class
SourceJavaFileObject
extends
SimpleJavaFileObject
{
private
final
String
code
;
public
SourceJavaFileObject
(
String
name
,
String
code
)
throws
URISyntaxException
{
super
(
new
URI
(
"mem:///"
+
name
+
".java"
),
Kind
.
SOURCE
);
this
.
code
=
code
;
}
@Override
public
CharSequence
getCharContent
(
boolean
ignoreEncodingErrors
)
throws
IOException
{
return
code
;
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录