Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
eb9cb4db
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,发现更多精彩内容 >>
提交
eb9cb4db
编写于
6月 09, 2016
作者:
E
Eduard Burtescu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
trans: derefs don't need the pointer in an alloca.
上级
93c32b55
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
29 addition
and
9 deletion
+29
-9
src/librustc_trans/mir/analyze.rs
src/librustc_trans/mir/analyze.rs
+7
-0
src/librustc_trans/mir/lvalue.rs
src/librustc_trans/mir/lvalue.rs
+22
-9
未找到文件。
src/librustc_trans/mir/analyze.rs
浏览文件 @
eb9cb4db
...
...
@@ -151,6 +151,13 @@ fn visit_lvalue(&mut self,
}
}
// A deref projection only reads the pointer, never needs the lvalue.
if
let
mir
::
Lvalue
::
Projection
(
ref
proj
)
=
*
lvalue
{
if
let
mir
::
ProjectionElem
::
Deref
=
proj
.elem
{
return
self
.visit_lvalue
(
&
proj
.base
,
LvalueContext
::
Consume
);
}
}
self
.super_lvalue
(
lvalue
,
context
);
}
}
...
...
src/librustc_trans/mir/lvalue.rs
浏览文件 @
eb9cb4db
...
...
@@ -27,6 +27,7 @@
use
std
::
ptr
;
use
super
::{
MirContext
,
TempRef
};
use
super
::
operand
::
OperandValue
;
#[derive(Copy,
Clone,
Debug)]
pub
struct
LvalueRef
<
'tcx
>
{
...
...
@@ -121,6 +122,26 @@ pub fn trans_lvalue(&mut self,
let
return_ty
=
fn_return_ty
.unwrap
();
LvalueRef
::
new_sized
(
llval
,
LvalueTy
::
from_ty
(
return_ty
))
},
mir
::
Lvalue
::
Projection
(
box
mir
::
Projection
{
ref
base
,
elem
:
mir
::
ProjectionElem
::
Deref
})
=>
{
// Load the pointer from its location.
let
ptr
=
self
.trans_consume
(
bcx
,
base
);
let
projected_ty
=
LvalueTy
::
from_ty
(
ptr
.ty
)
.projection_ty
(
tcx
,
&
mir
::
ProjectionElem
::
Deref
);
let
projected_ty
=
bcx
.monomorphize
(
&
projected_ty
);
let
(
llptr
,
llextra
)
=
match
ptr
.val
{
OperandValue
::
Immediate
(
llptr
)
=>
(
llptr
,
ptr
::
null_mut
()),
OperandValue
::
Pair
(
llptr
,
llextra
)
=>
(
llptr
,
llextra
),
OperandValue
::
Ref
(
_
)
=>
bug!
(
"Deref of by-Ref type {:?}"
,
ptr
.ty
)
};
LvalueRef
{
llval
:
llptr
,
llextra
:
llextra
,
ty
:
projected_ty
,
}
}
mir
::
Lvalue
::
Projection
(
ref
projection
)
=>
{
let
tr_base
=
self
.trans_lvalue
(
bcx
,
&
projection
.base
);
let
projected_ty
=
tr_base
.ty
.projection_ty
(
tcx
,
&
projection
.elem
);
...
...
@@ -138,15 +159,7 @@ pub fn trans_lvalue(&mut self,
};
let
(
llprojected
,
llextra
)
=
match
projection
.elem
{
mir
::
ProjectionElem
::
Deref
=>
{
let
base_ty
=
tr_base
.ty
.to_ty
(
tcx
);
if
common
::
type_is_sized
(
tcx
,
projected_ty
.to_ty
(
tcx
))
{
(
base
::
load_ty_builder
(
bcx
,
tr_base
.llval
,
base_ty
),
ptr
::
null_mut
())
}
else
{
load_fat_ptr
(
bcx
,
tr_base
.llval
)
}
}
mir
::
ProjectionElem
::
Deref
=>
bug!
(),
mir
::
ProjectionElem
::
Field
(
ref
field
,
_
)
=>
{
let
base_ty
=
tr_base
.ty
.to_ty
(
tcx
);
let
base_repr
=
adt
::
represent_type
(
ccx
,
base_ty
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录