Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
073f9165
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,发现更多精彩内容 >>
未验证
提交
073f9165
编写于
10月 21, 2016
作者:
O
Oliver Schneider
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
don't force allocate for most Unsize casts
only Arc<T> -> Arc<Trait> unsize casts are left
上级
9af5a0a4
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
11 addition
and
14 deletion
+11
-14
src/interpreter/mod.rs
src/interpreter/mod.rs
+11
-14
未找到文件。
src/interpreter/mod.rs
浏览文件 @
073f9165
...
...
@@ -656,8 +656,6 @@ fn eval_rvalue_into_lvalue(
use
rustc
::
mir
::
repr
::
CastKind
::
*
;
match
kind
{
Unsize
=>
{
// FIXME(solson)
let
dest
=
self
.force_allocation
(
dest
)
?
.to_ptr
();
let
src
=
self
.eval_operand
(
operand
)
?
;
let
src_ty
=
self
.operand_ty
(
operand
);
self
.unsize_into
(
src
,
src_ty
,
dest
,
dest_ty
)
?
;
...
...
@@ -1484,7 +1482,7 @@ fn unsize_into(
&
mut
self
,
src
:
Value
,
src_ty
:
Ty
<
'tcx
>
,
dest
:
Pointer
,
dest
:
Lvalue
<
'tcx
>
,
dest_ty
:
Ty
<
'tcx
>
,
)
->
EvalResult
<
'tcx
,
()
>
{
match
(
&
src_ty
.sty
,
&
dest_ty
.sty
)
{
...
...
@@ -1498,33 +1496,32 @@ fn unsize_into(
match
(
&
src_pointee_ty
.sty
,
&
dest_pointee_ty
.sty
)
{
(
&
ty
::
TyArray
(
_
,
length
),
&
ty
::
TySlice
(
_
))
=>
{
let
ptr
=
src
.read_ptr
(
&
self
.memory
)
?
;
self
.memory
.write_ptr
(
dest
,
ptr
)
?
;
let
ptr_size
=
self
.memory
.pointer_size
()
as
isize
;
let
dest_extra
=
dest
.offset
(
ptr_size
);
self
.memory
.write_usize
(
dest_extra
,
length
as
u64
)
?
;
let
len
=
self
.usize_primval
(
length
as
u64
);
let
ptr
=
PrimVal
::
from_ptr
(
ptr
);
self
.write_value
(
Value
::
ByValPair
(
ptr
,
len
),
dest
,
dest_ty
)
?
;
}
(
&
ty
::
TyTrait
(
_
),
&
ty
::
TyTrait
(
_
))
=>
{
// For now, upcasts are limited to changes in marker
// traits, and hence never actually require an actual
// change to the vtable.
self
.write_value
_to_ptr
(
src
,
dest
,
dest_ty
)
?
;
self
.write_value
(
src
,
dest
,
dest_ty
)
?
;
},
(
_
,
&
ty
::
TyTrait
(
ref
data
))
=>
{
let
trait_ref
=
data
.principal
.with_self_ty
(
self
.tcx
,
src_pointee_ty
);
let
trait_ref
=
self
.tcx
.erase_regions
(
&
trait_ref
);
let
vtable
=
self
.get_vtable
(
trait_ref
)
?
;
let
ptr
=
src
.read_ptr
(
&
self
.memory
)
?
;
self
.memory
.write_ptr
(
dest
,
ptr
)
?
;
let
ptr_size
=
self
.memory
.pointer_size
()
as
isize
;
let
dest_extra
=
dest
.offset
(
ptr_size
);
self
.memory
.write_ptr
(
dest_extra
,
vtable
)
?
;
let
ptr
=
PrimVal
::
from_ptr
(
ptr
);
let
extra
=
PrimVal
::
from_ptr
(
vtable
);
self
.write_value
(
Value
::
ByValPair
(
ptr
,
extra
),
dest
,
dest_ty
)
?
;
},
_
=>
bug!
(
"invalid unsizing {:?} -> {:?}"
,
src_ty
,
dest_ty
),
}
}
(
&
ty
::
TyAdt
(
def_a
,
substs_a
),
&
ty
::
TyAdt
(
def_b
,
substs_b
))
=>
{
// FIXME(solson)
let
dest
=
self
.force_allocation
(
dest
)
?
.to_ptr
();
// unsizing of generic struct with pointer fields
// Example: `Arc<T>` -> `Arc<Trait>`
// here we need to increase the size of every &T thin ptr field to a fat ptr
...
...
@@ -1555,7 +1552,7 @@ fn unsize_into(
if
src_fty
==
dst_fty
{
self
.copy
(
src_f_ptr
,
dst_f_ptr
,
src_fty
)
?
;
}
else
{
self
.unsize_into
(
Value
::
ByRef
(
src_f_ptr
),
src_fty
,
dst_f_ptr
,
dst_fty
)
?
;
self
.unsize_into
(
Value
::
ByRef
(
src_f_ptr
),
src_fty
,
Lvalue
::
from_ptr
(
dst_f_ptr
)
,
dst_fty
)
?
;
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录