Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
a4daa63a
R
Rust
项目概览
int
/
Rust
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
a4daa63a
编写于
12月 16, 2020
作者:
T
Tyson Nottingham
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rustc_serialize: specialize opaque encoding of some u8 sequences
上级
417fe470
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
32 addition
and
21 deletion
+32
-21
compiler/rustc_macros/src/serialize.rs
compiler/rustc_macros/src/serialize.rs
+2
-2
compiler/rustc_middle/src/ty/query/on_disk_cache.rs
compiler/rustc_middle/src/ty/query/on_disk_cache.rs
+10
-0
compiler/rustc_serialize/src/collection_impls.rs
compiler/rustc_serialize/src/collection_impls.rs
+6
-18
compiler/rustc_serialize/src/lib.rs
compiler/rustc_serialize/src/lib.rs
+1
-0
compiler/rustc_serialize/src/opaque.rs
compiler/rustc_serialize/src/opaque.rs
+12
-0
compiler/rustc_serialize/src/serialize.rs
compiler/rustc_serialize/src/serialize.rs
+1
-1
未找到文件。
compiler/rustc_macros/src/serialize.rs
浏览文件 @
a4daa63a
...
...
@@ -203,7 +203,7 @@ fn encodable_body(
#
field_name
,
#
field_idx
,
|
__
encoder
|
::
rustc_serialize
::
Encodable
::
encode
(
#
bind_ident
,
__
encoder
),
::
rustc_serialize
::
Encodable
::
<
#
encoder_ty
>
::
encode
(
#
bind_ident
,
__
encoder
),
)
{
::
std
::
result
::
Result
::
Ok
(())
=>
(),
::
std
::
result
::
Result
::
Err
(
__
err
)
...
...
@@ -237,7 +237,7 @@ fn encodable_body(
__
encoder
,
#
field_idx
,
|
__
encoder
|
::
rustc_serialize
::
Encodable
::
encode
(
#
bind_ident
,
__
encoder
),
::
rustc_serialize
::
Encodable
::
<
#
encoder_ty
>
::
encode
(
#
bind_ident
,
__
encoder
),
)
{
::
std
::
result
::
Result
::
Ok
(())
=>
(),
::
std
::
result
::
Result
::
Err
(
__
err
)
...
...
compiler/rustc_middle/src/ty/query/on_disk_cache.rs
浏览文件 @
a4daa63a
...
...
@@ -1149,6 +1149,16 @@ fn emit_unit(&mut self) -> Result<(), Self::Error> {
}
}
// This ensures that the `Encodable<opaque::Encoder>::encode` specialization for byte slices
// is used when a `CacheEncoder` having an `opaque::Encoder` is passed to `Encodable::encode`.
// Unfortunately, we have to manually opt into specializations this way, given how `CacheEncoder`
// and the encoding traits currently work.
impl
<
'a
,
'tcx
>
Encodable
<
CacheEncoder
<
'a
,
'tcx
,
opaque
::
Encoder
>>
for
[
u8
]
{
fn
encode
(
&
self
,
e
:
&
mut
CacheEncoder
<
'a
,
'tcx
,
opaque
::
Encoder
>
)
->
opaque
::
EncodeResult
{
self
.encode
(
e
.encoder
)
}
}
// An integer that will always encode to 8 bytes.
struct
IntEncodedWithFixedSize
(
u64
);
...
...
compiler/rustc_serialize/src/collection_impls.rs
浏览文件 @
a4daa63a
...
...
@@ -11,12 +11,8 @@
impl
<
S
:
Encoder
,
A
:
Array
<
Item
:
Encodable
<
S
>>>
Encodable
<
S
>
for
SmallVec
<
A
>
{
fn
encode
(
&
self
,
s
:
&
mut
S
)
->
Result
<
(),
S
::
Error
>
{
s
.emit_seq
(
self
.len
(),
|
s
|
{
for
(
i
,
e
)
in
self
.iter
()
.enumerate
()
{
s
.emit_seq_elt
(
i
,
|
s
|
e
.encode
(
s
))
?
;
}
Ok
(())
})
let
slice
:
&
[
A
::
Item
]
=
self
;
slice
.encode
(
s
)
}
}
...
...
@@ -292,12 +288,8 @@ fn decode(d: &mut D) -> Result<indexmap::IndexSet<T, S>, D::Error> {
impl
<
E
:
Encoder
,
T
:
Encodable
<
E
>>
Encodable
<
E
>
for
Rc
<
[
T
]
>
{
fn
encode
(
&
self
,
s
:
&
mut
E
)
->
Result
<
(),
E
::
Error
>
{
s
.emit_seq
(
self
.len
(),
|
s
|
{
for
(
index
,
e
)
in
self
.iter
()
.enumerate
()
{
s
.emit_seq_elt
(
index
,
|
s
|
e
.encode
(
s
))
?
;
}
Ok
(())
})
let
slice
:
&
[
T
]
=
self
;
slice
.encode
(
s
)
}
}
...
...
@@ -315,12 +307,8 @@ fn decode(d: &mut D) -> Result<Rc<[T]>, D::Error> {
impl
<
E
:
Encoder
,
T
:
Encodable
<
E
>>
Encodable
<
E
>
for
Arc
<
[
T
]
>
{
fn
encode
(
&
self
,
s
:
&
mut
E
)
->
Result
<
(),
E
::
Error
>
{
s
.emit_seq
(
self
.len
(),
|
s
|
{
for
(
index
,
e
)
in
self
.iter
()
.enumerate
()
{
s
.emit_seq_elt
(
index
,
|
s
|
e
.encode
(
s
))
?
;
}
Ok
(())
})
let
slice
:
&
[
T
]
=
self
;
slice
.encode
(
s
)
}
}
...
...
compiler/rustc_serialize/src/lib.rs
浏览文件 @
a4daa63a
...
...
@@ -14,6 +14,7 @@
#![feature(nll)]
#![feature(associated_type_bounds)]
#![cfg_attr(bootstrap,
feature(min_const_generics))]
#![feature(min_specialization)]
#![cfg_attr(test,
feature(test))]
#![allow(rustc::internal)]
...
...
compiler/rustc_serialize/src/opaque.rs
浏览文件 @
a4daa63a
...
...
@@ -316,3 +316,15 @@ fn error(&mut self, err: &str) -> Self::Error {
err
.to_string
()
}
}
// Specialize encoding byte slices. The default implementation for slices encodes and emits each
// element individually. This isn't necessary for `u8` slices encoded with an `opaque::Encoder`,
// because each `u8` is emitted as-is. Therefore, we can use a more efficient implementation. This
// specialization applies to encoding `Vec<u8>`s, etc., since they call `encode` on their slices.
impl
serialize
::
Encodable
<
Encoder
>
for
[
u8
]
{
fn
encode
(
&
self
,
e
:
&
mut
Encoder
)
->
EncodeResult
{
serialize
::
Encoder
::
emit_usize
(
e
,
self
.len
())
?
;
e
.emit_raw_bytes
(
self
);
Ok
(())
}
}
compiler/rustc_serialize/src/serialize.rs
浏览文件 @
a4daa63a
...
...
@@ -527,7 +527,7 @@ fn decode(d: &mut D) -> Result<Rc<T>, D::Error> {
}
impl
<
S
:
Encoder
,
T
:
Encodable
<
S
>>
Encodable
<
S
>
for
[
T
]
{
fn
encode
(
&
self
,
s
:
&
mut
S
)
->
Result
<
(),
S
::
Error
>
{
default
fn
encode
(
&
self
,
s
:
&
mut
S
)
->
Result
<
(),
S
::
Error
>
{
s
.emit_seq
(
self
.len
(),
|
s
|
{
for
(
i
,
e
)
in
self
.iter
()
.enumerate
()
{
s
.emit_seq_elt
(
i
,
|
s
|
e
.encode
(
s
))
?
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录