Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
e132f767
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,发现更多精彩内容 >>
提交
e132f767
编写于
8月 11, 2015
作者:
A
Alex Crichton
浏览文件
操作
浏览文件
下载
差异文件
rollup merge of #27618: dotdash/drop_fixes
上级
a0d51819
f8048725
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
53 addition
and
8 deletion
+53
-8
src/librustc_trans/trans/glue.rs
src/librustc_trans/trans/glue.rs
+2
-6
src/librustc_trans/trans/type_of.rs
src/librustc_trans/trans/type_of.rs
+5
-2
src/test/auxiliary/fat_drop.rs
src/test/auxiliary/fat_drop.rs
+23
-0
src/test/run-pass/extern_fat_drop.rs
src/test/run-pass/extern_fat_drop.rs
+23
-0
未找到文件。
src/librustc_trans/trans/glue.rs
浏览文件 @
e132f767
...
...
@@ -324,7 +324,6 @@ fn trans_struct_drop_flag<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
pub
fn
get_res_dtor
<
'a
,
'tcx
>
(
ccx
:
&
CrateContext
<
'a
,
'tcx
>
,
did
:
ast
::
DefId
,
t
:
Ty
<
'tcx
>
,
parent_id
:
ast
::
DefId
,
substs
:
&
Substs
<
'tcx
>
)
->
ValueRef
{
...
...
@@ -347,11 +346,8 @@ pub fn get_res_dtor<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
let
name
=
csearch
::
get_symbol
(
&
ccx
.sess
()
.cstore
,
did
);
let
class_ty
=
tcx
.lookup_item_type
(
parent_id
)
.ty
.subst
(
tcx
,
substs
);
let
llty
=
type_of_dtor
(
ccx
,
class_ty
);
let
dtor_ty
=
ccx
.tcx
()
.mk_ctor_fn
(
did
,
&
[
get_drop_glue_type
(
ccx
,
t
)],
ccx
.tcx
()
.mk_nil
());
foreign
::
get_extern_fn
(
ccx
,
&
mut
*
ccx
.externs
()
.borrow_mut
(),
&
name
[
..
],
llvm
::
CCallConv
,
llty
,
dtor_ty
)
llty
,
ccx
.tcx
()
.mk_nil
()
)
}
}
...
...
@@ -366,7 +362,7 @@ fn trans_struct_drop<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
debug!
(
"trans_struct_drop t: {}"
,
t
);
// Find and call the actual destructor
let
dtor_addr
=
get_res_dtor
(
bcx
.ccx
(),
dtor_did
,
t
,
class_did
,
substs
);
let
dtor_addr
=
get_res_dtor
(
bcx
.ccx
(),
dtor_did
,
class_did
,
substs
);
// Class dtors have no explicit args, so the params should
// just consist of the environment (self).
...
...
src/librustc_trans/trans/type_of.rs
浏览文件 @
e132f767
...
...
@@ -472,6 +472,9 @@ fn llvm_type_name<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
}
pub
fn
type_of_dtor
<
'a
,
'tcx
>
(
ccx
:
&
CrateContext
<
'a
,
'tcx
>
,
self_ty
:
Ty
<
'tcx
>
)
->
Type
{
let
self_ty
=
type_of
(
ccx
,
self_ty
)
.ptr_to
();
Type
::
func
(
&
[
self_ty
],
&
Type
::
void
(
ccx
))
if
type_is_sized
(
ccx
.tcx
(),
self_ty
)
{
Type
::
func
(
&
[
type_of
(
ccx
,
self_ty
)
.ptr_to
()],
&
Type
::
void
(
ccx
))
}
else
{
Type
::
func
(
&
type_of
(
ccx
,
self_ty
)
.field_types
(),
&
Type
::
void
(
ccx
))
}
}
src/test/auxiliary/fat_drop.rs
0 → 100644
浏览文件 @
e132f767
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
pub
static
mut
DROPPED
:
bool
=
false
;
pub
struct
S
{
_u
nsized
:
[
u8
]
}
impl
Drop
for
S
{
fn
drop
(
&
mut
self
)
{
unsafe
{
DROPPED
=
true
;
}
}
}
src/test/run-pass/extern_fat_drop.rs
0 → 100644
浏览文件 @
e132f767
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// aux-build:fat_drop.rs
#![feature(core_intrinsics)]
extern
crate
fat_drop
;
fn
main
()
{
unsafe
{
let
s
:
&
mut
fat_drop
::
S
=
std
::
mem
::
uninitialized
();
std
::
intrinsics
::
drop_in_place
(
s
);
assert
!
(
fat_drop
::
DROPPED
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录