Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
8c703643
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8c703643
编写于
12月 22, 2013
作者:
P
Patrick Walton
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
librustc: De-`@mut` the reachability worklist
上级
4b4ff2cf
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
29 addition
and
12 deletion
+29
-12
src/librustc/middle/reachable.rs
src/librustc/middle/reachable.rs
+29
-12
未找到文件。
src/librustc/middle/reachable.rs
浏览文件 @
8c703643
...
...
@@ -88,11 +88,11 @@ struct ReachableContext {
reachable_symbols
:
@
RefCell
<
HashSet
<
ast
::
NodeId
>>
,
// A worklist of item IDs. Each item ID in this worklist will be inlined
// and will be scanned for further references.
worklist
:
@
mut
~
[
ast
::
NodeId
]
,
worklist
:
@
RefCell
<~
[
ast
::
NodeId
]
>
,
}
struct
MarkSymbolVisitor
{
worklist
:
@
mut
~
[
ast
::
NodeId
]
,
worklist
:
@
RefCell
<~
[
ast
::
NodeId
]
>
,
method_map
:
typeck
::
method_map
,
tcx
:
ty
::
ctxt
,
reachable_symbols
:
@
RefCell
<
HashSet
<
ast
::
NodeId
>>
,
...
...
@@ -116,7 +116,10 @@ fn visit_expr(&mut self, expr:@ast::Expr, _:()) {
if
is_local
(
def_id
)
{
if
ReachableContext
::
def_id_represents_local_inlined_item
(
self
.tcx
,
def_id
)
{
self
.worklist
.push
(
def_id
.node
)
{
let
mut
worklist
=
self
.worklist
.borrow_mut
();
worklist
.get
()
.push
(
def_id
.node
)
}
}
else
{
match
def
{
// If this path leads to a static, then we may have
...
...
@@ -124,7 +127,8 @@ fn visit_expr(&mut self, expr:@ast::Expr, _:()) {
// is indeed reachable (address_insignificant
// statics are *never* reachable).
ast
::
DefStatic
(
..
)
=>
{
self
.worklist
.push
(
def_id
.node
);
let
mut
worklist
=
self
.worklist
.borrow_mut
();
worklist
.get
()
.push
(
def_id
.node
);
}
// If this wasn't a static, then this destination is
...
...
@@ -150,7 +154,11 @@ fn visit_expr(&mut self, expr:@ast::Expr, _:()) {
def_id_represents_local_inlined_item
(
self
.tcx
,
def_id
)
{
self
.worklist
.push
(
def_id
.node
)
{
let
mut
worklist
=
self
.worklist
.borrow_mut
();
worklist
.get
()
.push
(
def_id
.node
)
}
}
{
let
mut
reachable_symbols
=
...
...
@@ -186,7 +194,7 @@ fn new(tcx: ty::ctxt, method_map: typeck::method_map) -> ReachableContext {
tcx
:
tcx
,
method_map
:
method_map
,
reachable_symbols
:
@
RefCell
::
new
(
HashSet
::
new
()),
worklist
:
@
mut
~
[]
,
worklist
:
@
RefCell
::
new
(
~
[])
,
}
}
...
...
@@ -265,11 +273,19 @@ fn init_visitor(&self) -> MarkSymbolVisitor {
fn
propagate
(
&
self
)
{
let
mut
visitor
=
self
.init_visitor
();
let
mut
scanned
=
HashSet
::
new
();
while
self
.worklist
.len
()
>
0
{
let
search_item
=
self
.worklist
.pop
();
loop
{
let
search_item
=
{
let
mut
worklist
=
self
.worklist
.borrow_mut
();
if
worklist
.get
()
.len
()
==
0
{
break
}
let
search_item
=
worklist
.get
()
.pop
();
if
scanned
.contains
(
&
search_item
)
{
continue
}
search_item
};
scanned
.insert
(
search_item
);
match
self
.tcx.items
.find
(
&
search_item
)
{
Some
(
item
)
=>
self
.propagate_node
(
item
,
search_item
,
...
...
@@ -407,7 +423,8 @@ pub fn find_reachable(tcx: ty::ctxt,
// Step 1: Seed the worklist with all nodes which were found to be public as
// a result of the privacy pass
for
&
id
in
exported_items
.iter
()
{
reachable_context
.worklist
.push
(
id
);
let
mut
worklist
=
reachable_context
.worklist
.borrow_mut
();
worklist
.get
()
.push
(
id
);
}
// Step 2: Mark all symbols that the symbols on the worklist touch.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录