Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
7e30ba8f
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,发现更多精彩内容 >>
提交
7e30ba8f
编写于
8月 14, 2014
作者:
L
Luqman Aden
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
librustc: Don't create scratch for the base expr in function record update.
上级
f8e0ede9
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
35 addition
and
30 deletion
+35
-30
src/librustc/middle/trans/expr.rs
src/librustc/middle/trans/expr.rs
+35
-30
未找到文件。
src/librustc/middle/trans/expr.rs
浏览文件 @
7e30ba8f
...
...
@@ -746,12 +746,12 @@ fn trans_rvalue_dps_unadjusted<'a>(bcx: &'a Block<'a>,
controlflow
::
trans_block
(
bcx
,
&**
blk
,
dest
)
}
ast
::
ExprStruct
(
_
,
ref
fields
,
base
)
=>
{
trans_
rec_or_
struct
(
bcx
,
fields
.as_slice
(),
base
,
expr
.span
,
expr
.id
,
dest
)
trans_struct
(
bcx
,
fields
.as_slice
(),
base
,
expr
.span
,
expr
.id
,
dest
)
}
ast
::
ExprTup
(
ref
args
)
=>
{
let
repr
=
adt
::
represent_type
(
bcx
.ccx
(),
expr_ty
(
bcx
,
expr
));
...
...
@@ -1042,16 +1042,13 @@ pub fn with_field_tys<R>(tcx: &ty::ctxt,
}
}
fn
trans_rec_or_struct
<
'a
>
(
bcx
:
&
'a
Block
<
'a
>
,
fields
:
&
[
ast
::
Field
],
base
:
Option
<
Gc
<
ast
::
Expr
>>
,
expr_span
:
codemap
::
Span
,
id
:
ast
::
NodeId
,
dest
:
Dest
)
->
&
'a
Block
<
'a
>
{
fn
trans_struct
<
'a
>
(
bcx
:
&
'a
Block
<
'a
>
,
fields
:
&
[
ast
::
Field
],
base
:
Option
<
Gc
<
ast
::
Expr
>>
,
expr_span
:
codemap
::
Span
,
id
:
ast
::
NodeId
,
dest
:
Dest
)
->
&
'a
Block
<
'a
>
{
let
_
icx
=
push_ctxt
(
"trans_rec"
);
let
bcx
=
bcx
;
let
ty
=
node_id_type
(
bcx
,
id
);
let
tcx
=
bcx
.tcx
();
...
...
@@ -1121,7 +1118,7 @@ pub struct StructBaseInfo {
* - `optbase` contains information on the base struct (if any) from
* which remaining fields are copied; see comments on `StructBaseInfo`.
*/
pub
fn
trans_adt
<
'a
>
(
bcx
:
&
'a
Block
<
'a
>
,
pub
fn
trans_adt
<
'a
>
(
mut
bcx
:
&
'a
Block
<
'a
>
,
repr
:
&
adt
::
Repr
,
discr
:
ty
::
Disr
,
fields
:
&
[(
uint
,
Gc
<
ast
::
Expr
>
)],
...
...
@@ -1129,7 +1126,6 @@ pub fn trans_adt<'a>(bcx: &'a Block<'a>,
dest
:
Dest
)
->
&
'a
Block
<
'a
>
{
let
_
icx
=
push_ctxt
(
"trans_adt"
);
let
fcx
=
bcx
.fcx
;
let
mut
bcx
=
bcx
;
let
addr
=
match
dest
{
Ignore
=>
{
for
&
(
_
i
,
ref
e
)
in
fields
.iter
()
{
...
...
@@ -1148,6 +1144,28 @@ pub fn trans_adt<'a>(bcx: &'a Block<'a>,
// failure occur before the ADT as a whole is ready.
let
custom_cleanup_scope
=
fcx
.push_custom_cleanup_scope
();
// First we trans the base, if we have one, to the dest
for
base
in
optbase
.iter
()
{
assert_eq!
(
discr
,
0
);
match
ty
::
expr_kind
(
bcx
.tcx
(),
&*
base
.expr
)
{
ty
::
LvalueExpr
=>
{
let
base_datum
=
unpack_datum!
(
bcx
,
trans_to_lvalue
(
bcx
,
&*
base
.expr
,
"base"
));
for
&
(
i
,
t
)
in
base
.fields
.iter
()
{
let
datum
=
base_datum
.get_element
(
t
,
|
srcval
|
adt
::
trans_field_ptr
(
bcx
,
repr
,
srcval
,
discr
,
i
));
let
dest
=
adt
::
trans_field_ptr
(
bcx
,
repr
,
addr
,
discr
,
i
);
bcx
=
datum
.store_to
(
bcx
,
dest
);
}
},
ty
::
RvalueDpsExpr
|
ty
::
RvalueDatumExpr
=>
{
bcx
=
trans_into
(
bcx
,
&*
base
.expr
,
SaveIn
(
addr
));
},
ty
::
RvalueStmtExpr
=>
bcx
.tcx
()
.sess
.bug
(
"unexpected expr kind for struct base expr"
)
}
}
// Now, we just overwrite the fields we've explicity specified
for
&
(
i
,
ref
e
)
in
fields
.iter
()
{
let
dest
=
adt
::
trans_field_ptr
(
bcx
,
repr
,
addr
,
discr
,
i
);
let
e_ty
=
expr_ty_adjusted
(
bcx
,
&**
e
);
...
...
@@ -1157,19 +1175,6 @@ pub fn trans_adt<'a>(bcx: &'a Block<'a>,
fcx
.schedule_drop_mem
(
scope
,
dest
,
e_ty
);
}
for
base
in
optbase
.iter
()
{
// FIXME #6573: is it sound to use the destination's repr on the base?
// And, would it ever be reasonable to be here with discr != 0?
let
base_datum
=
unpack_datum!
(
bcx
,
trans_to_lvalue
(
bcx
,
&*
base
.expr
,
"base"
));
for
&
(
i
,
t
)
in
base
.fields
.iter
()
{
let
datum
=
base_datum
.get_element
(
t
,
|
srcval
|
adt
::
trans_field_ptr
(
bcx
,
repr
,
srcval
,
discr
,
i
));
let
dest
=
adt
::
trans_field_ptr
(
bcx
,
repr
,
addr
,
discr
,
i
);
bcx
=
datum
.store_to
(
bcx
,
dest
);
}
}
adt
::
trans_set_discr
(
bcx
,
repr
,
addr
,
discr
);
fcx
.pop_custom_cleanup_scope
(
custom_cleanup_scope
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录