Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_langtools
提交
6469f437
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看板
提交
6469f437
编写于
7月 23, 2008
作者:
J
jjg
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6726015: JavaCompiler: replace desugarLater by compileStates
Reviewed-by: mcimadamore
上级
9dd871cd
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
51 addition
and
47 deletion
+51
-47
src/share/classes/com/sun/tools/javac/main/JavaCompiler.java
src/share/classes/com/sun/tools/javac/main/JavaCompiler.java
+50
-46
test/tools/javac/6199662/Tree.java
test/tools/javac/6199662/Tree.java
+1
-1
未找到文件。
src/share/classes/com/sun/tools/javac/main/JavaCompiler.java
浏览文件 @
6469f437
...
...
@@ -63,6 +63,7 @@ import static com.sun.tools.javac.util.ListBuffer.lb;
// TEMP, until we have a more efficient way to save doc comment info
import
com.sun.tools.javac.parser.DocCommentScanner
;
import
java.util.HashMap
;
import
java.util.Queue
;
import
javax.lang.model.SourceVersion
;
...
...
@@ -444,7 +445,25 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
*/
public
Todo
todo
;
private
Set
<
Env
<
AttrContext
>>
deferredSugar
=
new
HashSet
<
Env
<
AttrContext
>>();
protected
enum
CompileState
{
TODO
(
0
),
ATTR
(
1
),
FLOW
(
2
);
CompileState
(
int
value
)
{
this
.
value
=
value
;
}
boolean
isDone
(
CompileState
other
)
{
return
value
>=
other
.
value
;
}
private
int
value
;
};
protected
class
CompileStates
extends
HashMap
<
Env
<
AttrContext
>,
CompileState
>
{
boolean
isDone
(
Env
<
AttrContext
>
env
,
CompileState
cs
)
{
CompileState
ecs
=
get
(
env
);
return
ecs
!=
null
&&
ecs
.
isDone
(
cs
);
}
}
private
CompileStates
compileStates
=
new
CompileStates
();
/** The set of currently compiled inputfiles, needed to ensure
* we don't accidentally overwrite an input file when -s is set.
...
...
@@ -1039,6 +1058,9 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
* @returns the attributed parse tree
*/
public
Env
<
AttrContext
>
attribute
(
Env
<
AttrContext
>
env
)
{
if
(
compileStates
.
isDone
(
env
,
CompileState
.
ATTR
))
return
env
;
if
(
verboseCompilePolicy
)
log
.
printLines
(
log
.
noticeWriter
,
"[attribute "
+
env
.
enclClass
.
sym
+
"]"
);
if
(
verbose
)
...
...
@@ -1055,6 +1077,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
env
.
toplevel
.
sourcefile
);
try
{
attr
.
attribClass
(
env
.
tree
.
pos
(),
env
.
enclClass
.
sym
);
compileStates
.
put
(
env
,
CompileState
.
ATTR
);
}
finally
{
log
.
useSource
(
prev
);
...
...
@@ -1094,7 +1117,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
if
(
errorCount
()
>
0
)
return
;
if
(
relax
||
deferredSugar
.
contains
(
env
))
{
if
(
relax
||
compileStates
.
isDone
(
env
,
CompileState
.
FLOW
))
{
results
.
append
(
env
);
return
;
}
...
...
@@ -1109,6 +1132,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
make
.
at
(
Position
.
FIRSTPOS
);
TreeMaker
localMake
=
make
.
forToplevel
(
env
.
toplevel
);
flow
.
analyzeTree
(
env
.
tree
,
localMake
);
compileStates
.
put
(
env
,
CompileState
.
FLOW
);
if
(
errorCount
()
>
0
)
return
;
...
...
@@ -1146,7 +1170,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
* the current implicitSourcePolicy is taken into account.
* The preparation stops as soon as an error is found.
*/
protected
void
desugar
(
Env
<
AttrContext
>
env
,
Queue
<
Pair
<
Env
<
AttrContext
>,
JCClassDecl
>>
results
)
{
protected
void
desugar
(
final
Env
<
AttrContext
>
env
,
Queue
<
Pair
<
Env
<
AttrContext
>,
JCClassDecl
>>
results
)
{
if
(
errorCount
()
>
0
)
return
;
...
...
@@ -1155,13 +1179,30 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
return
;
}
if
(
desugarLater
(
env
))
{
if
(
verboseCompilePolicy
)
log
.
printLines
(
log
.
noticeWriter
,
"[defer "
+
env
.
enclClass
.
sym
+
"]"
);
todo
.
append
(
env
);
return
;
/**
* As erasure (TransTypes) destroys information needed in flow analysis,
* including information in supertypes, we need to ensure that supertypes
* are processed through attribute and flow before subtypes are translated.
*/
class
ScanNested
extends
TreeScanner
{
Set
<
Env
<
AttrContext
>>
dependencies
=
new
HashSet
<
Env
<
AttrContext
>>();
public
void
visitClassDef
(
JCClassDecl
node
)
{
Type
st
=
types
.
supertype
(
node
.
sym
.
type
);
if
(
st
.
tag
==
TypeTags
.
CLASS
)
{
ClassSymbol
c
=
st
.
tsym
.
outermostClass
();
Env
<
AttrContext
>
stEnv
=
enter
.
getEnv
(
c
);
if
(
stEnv
!=
null
&&
env
!=
stEnv
)
dependencies
.
add
(
stEnv
);
}
super
.
visitClassDef
(
node
);
}
}
ScanNested
scanner
=
new
ScanNested
();
scanner
.
scan
(
env
.
tree
);
for
(
Env
<
AttrContext
>
dep:
scanner
.
dependencies
)
{
if
(!
compileStates
.
isDone
(
dep
,
CompileState
.
FLOW
))
flow
(
attribute
(
dep
));
}
deferredSugar
.
remove
(
env
);
if
(
verboseCompilePolicy
)
log
.
printLines
(
log
.
noticeWriter
,
"[desugar "
+
env
.
enclClass
.
sym
+
"]"
);
...
...
@@ -1234,43 +1275,6 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
}
/**
* Determine if a class needs to be desugared later. As erasure
* (TransTypes) destroys information needed in flow analysis, we
* need to ensure that supertypes are translated before derived
* types are translated.
*/
public
boolean
desugarLater
(
final
Env
<
AttrContext
>
env
)
{
if
(
compilePolicy
==
CompilePolicy
.
BY_FILE
)
return
false
;
if
(!
devVerbose
&&
deferredSugar
.
contains
(
env
))
// guarantee that compiler terminates
return
false
;
class
ScanNested
extends
TreeScanner
{
Set
<
Symbol
>
externalSupers
=
new
HashSet
<
Symbol
>();
public
void
visitClassDef
(
JCClassDecl
node
)
{
Type
st
=
types
.
supertype
(
node
.
sym
.
type
);
if
(
st
.
tag
==
TypeTags
.
CLASS
)
{
ClassSymbol
c
=
st
.
tsym
.
outermostClass
();
Env
<
AttrContext
>
stEnv
=
enter
.
getEnv
(
c
);
if
(
stEnv
!=
null
&&
env
!=
stEnv
)
externalSupers
.
add
(
st
.
tsym
);
}
super
.
visitClassDef
(
node
);
}
}
ScanNested
scanner
=
new
ScanNested
();
scanner
.
scan
(
env
.
tree
);
if
(
scanner
.
externalSupers
.
isEmpty
())
return
false
;
if
(!
deferredSugar
.
add
(
env
)
&&
devVerbose
)
{
throw
new
AssertionError
(
env
.
enclClass
.
sym
+
" was deferred, "
+
"second time has these external super types "
+
scanner
.
externalSupers
);
}
return
true
;
}
/** Generates the source or class file for a list of classes.
* The decision to generate a source file or a class file is
* based upon the compiler's options.
...
...
test/tools/javac/6199662/Tree.java
浏览文件 @
6469f437
...
...
@@ -23,7 +23,7 @@
/*
* @test
* @bug 6199662 6325201
* @bug 6199662 6325201
6726015
* @summary javac: compilation success depends on compilation order
*
* @compile Tree.java TreeScanner.java TreeInfo.java
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录