Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
1eb6d0b4
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,发现更多精彩内容 >>
提交
1eb6d0b4
编写于
7月 11, 2016
作者:
J
Jeffrey Seyfried
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Remove `Interner<T>` and rename `StrInterner` to `Interner`.
上级
f8a934e9
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
21 addition
and
144 deletion
+21
-144
src/librustc_metadata/decoder.rs
src/librustc_metadata/decoder.rs
+2
-2
src/librustc_trans/debuginfo/metadata.rs
src/librustc_trans/debuginfo/metadata.rs
+3
-3
src/libsyntax/parse/token.rs
src/libsyntax/parse/token.rs
+3
-3
src/libsyntax/util/interner.rs
src/libsyntax/util/interner.rs
+13
-136
未找到文件。
src/librustc_metadata/decoder.rs
浏览文件 @
1eb6d0b4
...
...
@@ -450,7 +450,7 @@ fn get_variant_fields<'tcx>(intr: &IdentInterner,
struct_field_family_to_visibility
(
ff
))
})
.chain
(
reader
::
tagged_docs
(
doc
,
tag_item_unnamed_field
)
.map
(|
f
|
{
let
ff
=
item_family
(
f
);
let
name
=
intr
.intern
(
&
index
.to_string
());
let
name
=
intr
.intern
(
index
.to_string
());
index
+=
1
;
ty
::
FieldDefData
::
new
(
item_def_id
(
f
,
cdata
),
name
,
struct_field_family_to_visibility
(
ff
))
...
...
@@ -1187,7 +1187,7 @@ pub fn get_struct_field_names(intr: &IdentInterner, cdata: Cmd, id: DefIndex)
reader
::
tagged_docs
(
item
,
tag_item_field
)
.map
(|
an_item
|
{
item_name
(
intr
,
an_item
)
})
.chain
(
reader
::
tagged_docs
(
item
,
tag_item_unnamed_field
)
.map
(|
_
|
{
let
name
=
intr
.intern
(
&
index
.to_string
());
let
name
=
intr
.intern
(
index
.to_string
());
index
+=
1
;
name
}))
.collect
()
...
...
src/librustc_trans/debuginfo/metadata.rs
浏览文件 @
1eb6d0b4
...
...
@@ -81,7 +81,7 @@
// UniqueTypeIds.
pub
struct
TypeMap
<
'tcx
>
{
// The UniqueTypeIds created so far
unique_id_interner
:
Interner
<
Rc
<
String
>>
,
unique_id_interner
:
Interner
,
// A map from UniqueTypeId to debuginfo metadata for that type. This is a 1:1 mapping.
unique_id_to_metadata
:
FnvHashMap
<
UniqueTypeId
,
DIType
>
,
// A map from types to debuginfo metadata. This is a N:1 mapping.
...
...
@@ -313,7 +313,7 @@ fn get_unique_type_id_of_type<'a>(&mut self, cx: &CrateContext<'a, 'tcx>,
// Trim to size before storing permanently
unique_type_id
.shrink_to_fit
();
let
key
=
self
.unique_id_interner
.intern
(
Rc
::
new
(
unique_type_id
)
);
let
key
=
self
.unique_id_interner
.intern
(
unique_type_id
);
self
.type_to_unique_id
.insert
(
type_
,
UniqueTypeId
(
key
));
return
UniqueTypeId
(
key
);
...
...
@@ -383,7 +383,7 @@ fn get_unique_type_id_of_enum_variant<'a>(&mut self,
let
enum_variant_type_id
=
format!
(
"{}::{}"
,
&
self
.get_unique_type_id_as_string
(
enum_type_id
),
variant_name
);
let
interner_key
=
self
.unique_id_interner
.intern
(
Rc
::
new
(
enum_variant_type_id
)
);
let
interner_key
=
self
.unique_id_interner
.intern
(
enum_variant_type_id
);
UniqueTypeId
(
interner_key
)
}
}
...
...
src/libsyntax/parse/token.rs
浏览文件 @
1eb6d0b4
...
...
@@ -17,7 +17,7 @@
use
ast
::{
self
,
BinOpKind
};
use
ext
::
mtwt
;
use
ptr
::
P
;
use
util
::
interner
::
Str
Interner
;
use
util
::
interner
::
Interner
;
use
tokenstream
;
use
serialize
::{
Decodable
,
Decoder
,
Encodable
,
Encoder
};
...
...
@@ -396,7 +396,7 @@ impl Keyword {
}
fn
mk_fresh_ident_interner
()
->
IdentInterner
{
Str
Interner
::
prefill
(
&
[
$
(
$string
,)
*
])
Interner
::
prefill
(
&
[
$
(
$string
,)
*
])
}
}}
...
...
@@ -472,7 +472,7 @@ fn mk_fresh_ident_interner() -> IdentInterner {
}
// looks like we can get rid of this completely...
pub
type
IdentInterner
=
Str
Interner
;
pub
type
IdentInterner
=
Interner
;
// if an interner exists in TLS, return it. Otherwise, prepare a
// fresh one.
...
...
src/libsyntax/util/interner.rs
浏览文件 @
1eb6d0b4
...
...
@@ -17,122 +17,45 @@
use
std
::
borrow
::
Borrow
;
use
std
::
cell
::
RefCell
;
use
std
::
collections
::
HashMap
;
use
std
::
hash
::
Hash
;
use
std
::
rc
::
Rc
;
pub
struct
Interner
<
T
>
{
map
:
RefCell
<
HashMap
<
T
,
Name
>>
,
vect
:
RefCell
<
Vec
<
T
>
>
,
}
// when traits can extend traits, we should extend index<Name,T> to get []
impl
<
T
:
Eq
+
Hash
+
Clone
+
'static
>
Interner
<
T
>
{
pub
fn
new
()
->
Interner
<
T
>
{
Interner
{
map
:
RefCell
::
new
(
HashMap
::
new
()),
vect
:
RefCell
::
new
(
Vec
::
new
()),
}
}
pub
fn
prefill
(
init
:
&
[
T
])
->
Interner
<
T
>
{
let
rv
=
Interner
::
new
();
for
v
in
init
{
rv
.intern
((
*
v
)
.clone
());
}
rv
}
pub
fn
intern
(
&
self
,
val
:
T
)
->
Name
{
let
mut
map
=
self
.map
.borrow_mut
();
if
let
Some
(
&
idx
)
=
(
*
map
)
.get
(
&
val
)
{
return
idx
;
}
let
mut
vect
=
self
.vect
.borrow_mut
();
let
new_idx
=
Name
((
*
vect
)
.len
()
as
u32
);
(
*
map
)
.insert
(
val
.clone
(),
new_idx
);
(
*
vect
)
.push
(
val
);
new_idx
}
pub
fn
gensym
(
&
self
,
val
:
T
)
->
Name
{
let
mut
vect
=
self
.vect
.borrow_mut
();
let
new_idx
=
Name
((
*
vect
)
.len
()
as
u32
);
// leave out of .map to avoid colliding
(
*
vect
)
.push
(
val
);
new_idx
}
pub
fn
get
(
&
self
,
idx
:
Name
)
->
T
{
let
vect
=
self
.vect
.borrow
();
(
*
vect
)[
idx
.0
as
usize
]
.clone
()
}
pub
fn
len
(
&
self
)
->
usize
{
let
vect
=
self
.vect
.borrow
();
(
*
vect
)
.len
()
}
pub
fn
find
<
Q
:
?
Sized
>
(
&
self
,
val
:
&
Q
)
->
Option
<
Name
>
where
T
:
Borrow
<
Q
>
,
Q
:
Eq
+
Hash
{
let
map
=
self
.map
.borrow
();
match
(
*
map
)
.get
(
val
)
{
Some
(
v
)
=>
Some
(
*
v
),
None
=>
None
,
}
}
pub
fn
clear
(
&
self
)
{
*
self
.map
.borrow_mut
()
=
HashMap
::
new
();
*
self
.vect
.borrow_mut
()
=
Vec
::
new
();
}
}
#[derive(Clone,
PartialEq,
Eq,
Hash,
Debug)]
#[derive(PartialEq,
Eq,
Hash)]
struct
RcStr
(
Rc
<
String
>
);
impl
RcStr
{
fn
new
(
string
:
&
str
)
->
Self
{
RcStr
(
Rc
::
new
(
string
.to_owned
()))
}
}
impl
Borrow
<
str
>
for
RcStr
{
fn
borrow
(
&
self
)
->
&
str
{
&
self
.0
}
}
/// A StrInterner differs from Interner<String> in that it accepts
/// &str rather than RcStr, resulting in less allocation.
pub
struct
StrInterner
{
pub
struct
Interner
{
map
:
RefCell
<
HashMap
<
RcStr
,
Name
>>
,
vect
:
RefCell
<
Vec
<
Rc
<
String
>>
>
,
}
/// When traits can extend traits, we should extend index<Name,T> to get []
impl
Str
Interner
{
pub
fn
new
()
->
S
trInterner
{
Str
Interner
{
impl
Interner
{
pub
fn
new
()
->
S
elf
{
Interner
{
map
:
RefCell
::
new
(
HashMap
::
new
()),
vect
:
RefCell
::
new
(
Vec
::
new
()),
}
}
pub
fn
prefill
(
init
:
&
[
&
str
])
->
S
trInterner
{
let
rv
=
Str
Interner
::
new
();
pub
fn
prefill
(
init
:
&
[
&
str
])
->
S
elf
{
let
rv
=
Interner
::
new
();
for
&
v
in
init
{
rv
.intern
(
v
);
}
rv
}
pub
fn
intern
(
&
self
,
val
:
&
str
)
->
Name
{
pub
fn
intern
<
T
:
Borrow
<
str
>
+
Into
<
String
>>
(
&
self
,
val
:
T
)
->
Name
{
let
mut
map
=
self
.map
.borrow_mut
();
if
let
Some
(
&
idx
)
=
map
.get
(
val
)
{
if
let
Some
(
&
idx
)
=
map
.get
(
val
.borrow
()
)
{
return
idx
;
}
let
new_idx
=
Name
(
self
.len
()
as
u32
);
let
val
=
Rc
::
new
(
val
.
to_owned
());
let
val
=
Rc
::
new
(
val
.
into
());
map
.insert
(
RcStr
(
val
.clone
()),
new_idx
);
self
.vect
.borrow_mut
()
.push
(
val
);
new_idx
...
...
@@ -181,7 +104,7 @@ pub fn clear(&self) {
*
self
.vect
.borrow_mut
()
=
Vec
::
new
();
}
pub
fn
reset
(
&
self
,
other
:
Str
Interner
)
{
pub
fn
reset
(
&
self
,
other
:
Interner
)
{
*
self
.map
.borrow_mut
()
=
other
.map
.into_inner
();
*
self
.vect
.borrow_mut
()
=
other
.vect
.into_inner
();
}
...
...
@@ -190,57 +113,11 @@ pub fn reset(&self, other: StrInterner) {
#[cfg(test)]
mod
tests
{
use
super
::
*
;
use
super
::
RcStr
;
use
ast
::
Name
;
#[test]
#[should_panic]
fn
i1
()
{
let
i
:
Interner
<
RcStr
>
=
Interner
::
new
();
i
.get
(
Name
(
13
));
}
#[test]
fn
interner_tests
()
{
let
i
:
Interner
<
RcStr
>
=
Interner
::
new
();
// first one is zero:
assert_eq!
(
i
.intern
(
RcStr
::
new
(
"dog"
)),
Name
(
0
));
// re-use gets the same entry:
assert_eq!
(
i
.intern
(
RcStr
::
new
(
"dog"
)),
Name
(
0
));
// different string gets a different #:
assert_eq!
(
i
.intern
(
RcStr
::
new
(
"cat"
)),
Name
(
1
));
assert_eq!
(
i
.intern
(
RcStr
::
new
(
"cat"
)),
Name
(
1
));
// dog is still at zero
assert_eq!
(
i
.intern
(
RcStr
::
new
(
"dog"
)),
Name
(
0
));
// gensym gets 3
assert_eq!
(
i
.gensym
(
RcStr
::
new
(
"zebra"
)
),
Name
(
2
));
// gensym of same string gets new number :
assert_eq!
(
i
.gensym
(
RcStr
::
new
(
"zebra"
)
),
Name
(
3
));
// gensym of *existing* string gets new number:
assert_eq!
(
i
.gensym
(
RcStr
::
new
(
"dog"
)),
Name
(
4
));
assert_eq!
(
i
.get
(
Name
(
0
)),
RcStr
::
new
(
"dog"
));
assert_eq!
(
i
.get
(
Name
(
1
)),
RcStr
::
new
(
"cat"
));
assert_eq!
(
i
.get
(
Name
(
2
)),
RcStr
::
new
(
"zebra"
));
assert_eq!
(
i
.get
(
Name
(
3
)),
RcStr
::
new
(
"zebra"
));
assert_eq!
(
i
.get
(
Name
(
4
)),
RcStr
::
new
(
"dog"
));
}
#[test]
fn
i3
()
{
let
i
:
Interner
<
RcStr
>
=
Interner
::
prefill
(
&
[
RcStr
::
new
(
"Alan"
),
RcStr
::
new
(
"Bob"
),
RcStr
::
new
(
"Carol"
)
]);
assert_eq!
(
i
.get
(
Name
(
0
)),
RcStr
::
new
(
"Alan"
));
assert_eq!
(
i
.get
(
Name
(
1
)),
RcStr
::
new
(
"Bob"
));
assert_eq!
(
i
.get
(
Name
(
2
)),
RcStr
::
new
(
"Carol"
));
assert_eq!
(
i
.intern
(
RcStr
::
new
(
"Bob"
)),
Name
(
1
));
}
#[test]
fn
string_interner_tests
()
{
let
i
:
StrInterner
=
StrInterner
::
new
();
fn
interner_tests
()
{
let
i
:
Interner
=
Interner
::
new
();
// first one is zero:
assert_eq!
(
i
.intern
(
"dog"
),
Name
(
0
));
// re-use gets the same entry:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录