Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
a29ba6a2
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,发现更多精彩内容 >>
提交
a29ba6a2
编写于
7月 14, 2017
作者:
O
Oliver Schneider
提交者:
GitHub
7月 14, 2017
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #249 from RalfJung/lvalue
lvalue: refactoring to permit applying a mir projection to a miri lvalue
上级
56d4de30
2312ac8d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
13 addition
and
15 deletion
+13
-15
src/lvalue.rs
src/lvalue.rs
+13
-15
未找到文件。
src/lvalue.rs
浏览文件 @
a29ba6a2
...
...
@@ -189,7 +189,10 @@ pub(super) fn eval_and_read_lvalue(&mut self, lvalue: &mir::Lvalue<'tcx>) -> Eva
return
Ok
(
val
);
}
let
lvalue
=
self
.eval_lvalue
(
lvalue
)
?
;
self
.read_lvalue
(
lvalue
,
ty
)
}
fn
read_lvalue
(
&
self
,
lvalue
:
Lvalue
<
'tcx
>
,
ty
:
Ty
<
'tcx
>
)
->
EvalResult
<
'tcx
,
Value
>
{
if
ty
.is_never
()
{
return
Err
(
EvalError
::
Unreachable
);
}
...
...
@@ -219,7 +222,11 @@ pub(super) fn eval_lvalue(&mut self, mir_lvalue: &mir::Lvalue<'tcx>) -> EvalResu
Lvalue
::
Global
(
GlobalId
{
instance
,
promoted
:
None
})
}
Projection
(
ref
proj
)
=>
return
self
.eval_lvalue_projection
(
proj
),
Projection
(
ref
proj
)
=>
{
let
ty
=
self
.lvalue_ty
(
&
proj
.base
);
let
lvalue
=
self
.eval_lvalue
(
&
proj
.base
)
?
;
return
self
.eval_lvalue_projection
(
lvalue
,
ty
,
&
proj
.elem
);
}
};
if
log_enabled!
(::
log
::
LogLevel
::
Trace
)
{
...
...
@@ -348,19 +355,17 @@ pub fn lvalue_field(
fn
eval_lvalue_projection
(
&
mut
self
,
proj
:
&
mir
::
LvalueProjection
<
'tcx
>
,
base
:
Lvalue
<
'tcx
>
,
base_ty
:
Ty
<
'tcx
>
,
proj_elem
:
&
mir
::
ProjectionElem
<
'tcx
,
mir
::
Operand
<
'tcx
>>
,
)
->
EvalResult
<
'tcx
,
Lvalue
<
'tcx
>>
{
use
rustc
::
mir
::
ProjectionElem
::
*
;
let
(
ptr
,
extra
,
aligned
)
=
match
proj
.
elem
{
let
(
ptr
,
extra
,
aligned
)
=
match
*
proj_
elem
{
Field
(
field
,
field_ty
)
=>
{
let
base
=
self
.eval_lvalue
(
&
proj
.base
)
?
;
let
base_ty
=
self
.lvalue_ty
(
&
proj
.base
);
return
self
.lvalue_field
(
base
,
field
.index
(),
base_ty
,
field_ty
);
}
Downcast
(
_
,
variant
)
=>
{
let
base
=
self
.eval_lvalue
(
&
proj
.base
)
?
;
let
base_ty
=
self
.lvalue_ty
(
&
proj
.base
);
let
base_layout
=
self
.type_layout
(
base_ty
)
?
;
// FIXME(solson)
let
base
=
self
.force_allocation
(
base
)
?
;
...
...
@@ -376,8 +381,7 @@ fn eval_lvalue_projection(
}
Deref
=>
{
let
base_ty
=
self
.lvalue_ty
(
&
proj
.base
);
let
val
=
self
.eval_and_read_lvalue
(
&
proj
.base
)
?
;
let
val
=
self
.read_lvalue
(
base
,
base_ty
)
?
;
let
pointee_type
=
match
base_ty
.sty
{
ty
::
TyRawPtr
(
ref
tam
)
|
...
...
@@ -402,8 +406,6 @@ fn eval_lvalue_projection(
}
Index
(
ref
operand
)
=>
{
let
base
=
self
.eval_lvalue
(
&
proj
.base
)
?
;
let
base_ty
=
self
.lvalue_ty
(
&
proj
.base
);
// FIXME(solson)
let
base
=
self
.force_allocation
(
base
)
?
;
let
(
base_ptr
,
_
,
aligned
)
=
base
.to_ptr_extra_aligned
();
...
...
@@ -419,8 +421,6 @@ fn eval_lvalue_projection(
}
ConstantIndex
{
offset
,
min_length
,
from_end
}
=>
{
let
base
=
self
.eval_lvalue
(
&
proj
.base
)
?
;
let
base_ty
=
self
.lvalue_ty
(
&
proj
.base
);
// FIXME(solson)
let
base
=
self
.force_allocation
(
base
)
?
;
let
(
base_ptr
,
_
,
aligned
)
=
base
.to_ptr_extra_aligned
();
...
...
@@ -440,8 +440,6 @@ fn eval_lvalue_projection(
}
Subslice
{
from
,
to
}
=>
{
let
base
=
self
.eval_lvalue
(
&
proj
.base
)
?
;
let
base_ty
=
self
.lvalue_ty
(
&
proj
.base
);
// FIXME(solson)
let
base
=
self
.force_allocation
(
base
)
?
;
let
(
base_ptr
,
_
,
aligned
)
=
base
.to_ptr_extra_aligned
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录