Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
080f5d6a
K
kotlin
项目概览
硅谷海盗
/
kotlin
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kotlin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
080f5d6a
编写于
11月 01, 2011
作者:
S
svtk
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Added control flow data for entering each vertex (instruction) as well as for exit
上级
eab7fdf4
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
14 addition
and
14 deletion
+14
-14
compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java
.../jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java
+14
-14
未找到文件。
compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java
浏览文件 @
080f5d6a
...
...
@@ -3,10 +3,8 @@ package org.jetbrains.jet.lang.cfg;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.google.common.collect.Sets
;
import
org.jetbrains.jet.lang.cfg.pseudocode.Instruction
;
import
org.jetbrains.jet.lang.cfg.pseudocode.LocalDeclarationInstruction
;
import
org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode
;
import
org.jetbrains.jet.lang.cfg.pseudocode.SubroutineEnterInstruction
;
import
com.intellij.openapi.util.Pair
;
import
org.jetbrains.jet.lang.cfg.pseudocode.*
;
import
java.util.Collection
;
import
java.util.Collections
;
...
...
@@ -17,15 +15,15 @@ import java.util.Map;
* @author svtk
*/
public
class
JetControlFlowGraphTraverser
{
public
static
<
D
>
Map
<
Instruction
,
D
>
traverseInstructionGraphUntilFactsStabilization
(
public
static
<
D
>
Map
<
Instruction
,
Pair
<
D
,
D
>
>
traverseInstructionGraphUntilFactsStabilization
(
Pseudocode
pseudocode
,
InstructionsMergeStrategy
<
D
>
instructionsMergeStrategy
,
D
initialDataValue
,
D
initialDataValueForEnterInstruction
,
boolean
straightDirection
)
{
Map
<
Instruction
,
D
>
dataMap
=
Maps
.
new
HashMap
();
Map
<
Instruction
,
Pair
<
D
,
D
>>
dataMap
=
Maps
.
newLinked
HashMap
();
initializeDataMap
(
dataMap
,
pseudocode
,
initialDataValue
);
dataMap
.
put
(
pseudocode
.
getEnterInstruction
(),
initialDataValueForEnterInstruction
);
dataMap
.
put
(
pseudocode
.
getEnterInstruction
(),
Pair
.
create
(
initialDataValueForEnterInstruction
,
initialDataValueForEnterInstruction
)
);
boolean
[]
changed
=
new
boolean
[
1
];
changed
[
0
]
=
true
;
...
...
@@ -37,12 +35,13 @@ public class JetControlFlowGraphTraverser {
}
private
static
<
D
>
void
initializeDataMap
(
Map
<
Instruction
,
D
>
dataMap
,
Map
<
Instruction
,
Pair
<
D
,
D
>
>
dataMap
,
Pseudocode
pseudocode
,
D
initialDataValue
)
{
List
<
Instruction
>
instructions
=
pseudocode
.
getInstructions
();
Pair
<
D
,
D
>
initialPair
=
Pair
.
create
(
initialDataValue
,
initialDataValue
);
for
(
Instruction
instruction
:
instructions
)
{
dataMap
.
put
(
instruction
,
initial
DataValue
);
dataMap
.
put
(
instruction
,
initial
Pair
);
if
(
instruction
instanceof
LocalDeclarationInstruction
)
{
initializeDataMap
(
dataMap
,
((
LocalDeclarationInstruction
)
instruction
).
getBody
(),
initialDataValue
);
}
...
...
@@ -54,7 +53,7 @@ public class JetControlFlowGraphTraverser {
InstructionsMergeStrategy
<
D
>
instructionsMergeStrategy
,
Collection
<
Instruction
>
previousSubGraphInstructions
,
boolean
straightDirection
,
Map
<
Instruction
,
D
>
dataMap
,
Map
<
Instruction
,
Pair
<
D
,
D
>
>
dataMap
,
boolean
[]
changed
,
boolean
isLocal
)
{
List
<
Instruction
>
instructions
=
pseudocode
.
getInstructions
();
...
...
@@ -79,14 +78,14 @@ public class JetControlFlowGraphTraverser {
Pseudocode
subroutinePseudocode
=
((
LocalDeclarationInstruction
)
instruction
).
getBody
();
traverseSubGraph
(
subroutinePseudocode
,
instructionsMergeStrategy
,
previousInstructions
,
straightDirection
,
dataMap
,
changed
,
true
);
}
D
previousDataValue
=
dataMap
.
get
(
instruction
);
Pair
<
D
,
D
>
previousDataValue
=
dataMap
.
get
(
instruction
);
Collection
<
D
>
incomingEdgesData
=
Sets
.
newHashSet
();
for
(
Instruction
previousInstruction
:
allPreviousInstructions
)
{
incomingEdgesData
.
add
(
dataMap
.
get
(
previousInstruction
));
incomingEdgesData
.
add
(
dataMap
.
get
(
previousInstruction
)
.
getSecond
()
);
}
D
mergedData
=
instructionsMergeStrategy
.
execute
(
instruction
,
incomingEdgesData
);
Pair
<
D
,
D
>
mergedData
=
instructionsMergeStrategy
.
execute
(
instruction
,
incomingEdgesData
);
if
(!
mergedData
.
equals
(
previousDataValue
))
{
changed
[
0
]
=
true
;
dataMap
.
put
(
instruction
,
mergedData
);
...
...
@@ -99,6 +98,7 @@ public class JetControlFlowGraphTraverser {
InstructionDataAnalyzeStrategy
instructionDataAnalyzeStrategy
)
{
List
<
Instruction
>
instructions
=
pseudocode
.
getInstructions
();
for
(
Instruction
instruction
:
instructions
)
{
if
(((
InstructionImpl
)
instruction
).
isDead
())
continue
;
if
(
instruction
instanceof
LocalDeclarationInstruction
)
{
traverseAndAnalyzeInstructionGraph
(((
LocalDeclarationInstruction
)
instruction
).
getBody
(),
instructionDataAnalyzeStrategy
);
}
...
...
@@ -107,7 +107,7 @@ public class JetControlFlowGraphTraverser {
}
interface
InstructionsMergeStrategy
<
D
>
{
D
execute
(
Instruction
instruction
,
Collection
<
D
>
incomingEdgesData
);
Pair
<
D
,
D
>
execute
(
Instruction
instruction
,
Collection
<
D
>
incomingEdgesData
);
}
interface
InstructionDataAnalyzeStrategy
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录