Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
09b15e98
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,发现更多精彩内容 >>
提交
09b15e98
编写于
8月 15, 2018
作者:
R
Ralf Jung
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix dropping with vtables
上级
e860ab2d
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
14 addition
and
6 deletion
+14
-6
src/librustc_mir/interpret/terminator/drop.rs
src/librustc_mir/interpret/terminator/drop.rs
+11
-6
src/librustc_mir/interpret/terminator/mod.rs
src/librustc_mir/interpret/terminator/mod.rs
+3
-0
未找到文件。
src/librustc_mir/interpret/terminator/drop.rs
浏览文件 @
09b15e98
...
...
@@ -30,24 +30,29 @@ fn drop(
)
->
EvalResult
<
'tcx
>
{
trace!
(
"drop: {:?},
\n
{:?}, {:?}"
,
arg
,
ty
.sty
,
instance
.def
);
let
instance
=
match
ty
.sty
{
let
(
instance
,
arg
)
=
match
ty
.sty
{
ty
::
TyDynamic
(
..
)
=>
{
if
let
Value
::
ScalarPair
(
_
,
vtable
)
=
arg
{
self
.read_drop_type_from_vtable
(
vtable
.to_ptr
()
?
)
?
if
let
Value
::
ScalarPair
(
ptr
,
vtable
)
=
arg
{
// Figure out the specific drop function to call, and just pass along
// the thin part of the pointer.
let
instance
=
self
.read_drop_type_from_vtable
(
vtable
.to_ptr
()
?
)
?
;
trace!
(
"Dropping via vtable: {:?}"
,
instance
.def
);
(
instance
,
Value
::
Scalar
(
ptr
))
}
else
{
bug!
(
"expected fat ptr, got {:?}"
,
arg
);
}
}
_
=>
instance
,
_
=>
(
instance
,
arg
)
,
};
// the drop function expects a reference to the value
let
fn_sig
=
self
.tcx
.fn_sig
(
instance
.def_id
())
.skip_binder
()
.clone
();
let
arg
=
OpTy
{
op
:
Operand
::
Immediate
(
arg
),
layout
:
self
.layout_of
(
self
.tcx
.mk_mut_ptr
(
ty
))
?
,
layout
:
self
.layout_of
(
fn_sig
.output
(
))
?
,
};
trace!
(
"Dropped type: {:?}"
,
fn_sig
.output
());
let
fn_sig
=
self
.tcx
.fn_sig
(
instance
.def_id
())
.skip_binder
()
.clone
();
// This should always be (), but getting it from the sig seems
// easier than creating a layout of ().
let
dest
=
PlaceTy
::
null
(
&
self
,
self
.layout_of
(
fn_sig
.output
())
?
);
...
...
src/librustc_mir/interpret/terminator/mod.rs
浏览文件 @
09b15e98
...
...
@@ -257,6 +257,9 @@ fn eval_fn_call(
sig
:
ty
::
FnSig
<
'tcx
>
,
)
->
EvalResult
<
'tcx
>
{
trace!
(
"eval_fn_call: {:#?}"
,
instance
);
if
let
Some
((
place
,
_
))
=
destination
{
assert_eq!
(
place
.layout.ty
,
sig
.output
());
}
match
instance
.def
{
ty
::
InstanceDef
::
Intrinsic
(
..
)
=>
{
let
(
ret
,
target
)
=
match
destination
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录