Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
0f41f5a8
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,发现更多精彩内容 >>
提交
0f41f5a8
编写于
12月 02, 2010
作者:
G
Graydon Hoare
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Improve translations of unary box operator and drop_ty on boxes.
上级
e2339788
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
46 addition
and
22 deletion
+46
-22
src/comp/middle/trans.rs
src/comp/middle/trans.rs
+46
-22
未找到文件。
src/comp/middle/trans.rs
浏览文件 @
0f41f5a8
...
...
@@ -374,16 +374,16 @@ fn C_struct(vec[ValueRef] elts) -> ValueRef {
}
fn
C_tydesc
(
TypeRef
t
)
->
ValueRef
{
ret
C_struct
(
vec
(
C_null
(
T_
opaque
(
)),
// first_param
llvm
.LLVMSizeOf
(
t
),
// size
llvm
.LLVMAlignOf
(
t
),
// align
C_null
(
T_
opaque
(
)),
// copy_glue_off
C_null
(
T_
opaque
(
)),
// drop_glue_off
C_null
(
T_
opaque
(
)),
// free_glue_off
C_null
(
T_
opaque
(
)),
// sever_glue_off
C_null
(
T_
opaque
(
)),
// mark_glue_off
C_null
(
T_
opaque
(
)),
// obj_drop_glue_off
C_null
(
T_
opaque
(
))));
// is_stateful
ret
C_struct
(
vec
(
C_null
(
T_
ptr
(
T_opaque
()
)),
// first_param
llvm
.LLVMSizeOf
(
t
),
// size
llvm
.LLVMAlignOf
(
t
),
// align
C_null
(
T_
ptr
(
T_opaque
()
)),
// copy_glue_off
C_null
(
T_
ptr
(
T_opaque
()
)),
// drop_glue_off
C_null
(
T_
ptr
(
T_opaque
()
)),
// free_glue_off
C_null
(
T_
ptr
(
T_opaque
()
)),
// sever_glue_off
C_null
(
T_
ptr
(
T_opaque
()
)),
// mark_glue_off
C_null
(
T_
ptr
(
T_opaque
()
)),
// obj_drop_glue_off
C_null
(
T_
ptr
(
T_opaque
()
))));
// is_stateful
}
fn
decl_fn
(
ModuleRef
llmod
,
str
name
,
uint
cc
,
TypeRef
llty
)
->
ValueRef
{
...
...
@@ -450,6 +450,19 @@ fn trans_non_gc_free(@block_ctxt cx, ValueRef v) -> result {
C_int
(
0
)));
}
fn
trans_malloc
(
@
block_ctxt
cx
,
@
typeck
.ty
t
)
->
result
{
auto
ptr_ty
=
type_of
(
cx
.fcx.ccx
,
t
);
auto
body_ty
=
lib
.llvm.llvm
.LLVMGetElementType
(
ptr_ty
);
// FIXME: need a table to collect tydesc globals.
auto
tydesc
=
C_int
(
0
);
auto
sz
=
cx
.build
.IntCast
(
lib
.llvm.llvm
.LLVMSizeOf
(
body_ty
),
T_int
());
auto
sub
=
trans_upcall
(
cx
,
"upcall_malloc"
,
vec
(
sz
,
tydesc
));
sub
.val
=
sub
.bcx.build
.IntToPtr
(
sub
.val
,
ptr_ty
);
sub
.bcx.cleanups
+=
clean
(
bind
drop_ty
(
_
,
sub
.val
,
t
));
ret
sub
;
}
fn
incr_refcnt
(
@
block_ctxt
cx
,
ValueRef
box_ptr
)
->
result
{
auto
rc_ptr
=
cx
.build
.GEP
(
box_ptr
,
vec
(
C_int
(
0
),
C_int
(
abi
.box_rc_field_refcnt
)));
...
...
@@ -636,16 +649,21 @@ fn hit_zero(@block_ctxt cx, ValueRef v,
T_int
(),
C_int
(
0
));
}
case
(
typeck
.ty_box
(
_
))
{
case
(
typeck
.ty_box
(
?
body_ty
))
{
fn
hit_zero
(
@
block_ctxt
cx
,
ValueRef
v
,
@
typeck
.ty
elt_ty
)
->
result
{
auto
res
=
drop_ty
(
cx
,
cx
.build
.GEP
(
v
,
vec
(
C_int
(
0
))),
elt_ty
);
@
typeck
.ty
body_ty
)
->
result
{
auto
body
=
cx
.build
.GEP
(
v
,
vec
(
C_int
(
0
),
C_int
(
abi
.box_rc_field_body
)));
auto
res
=
drop_ty
(
cx
,
body
,
body_ty
);
// FIXME: switch gc/non-gc on stratum of the type.
ret
trans_non_gc_free
(
res
.bcx
,
v
);
}
ret
incr_refcnt
(
cx
,
v
);
ret
decr_refcnt_and_if_zero
(
cx
,
v
,
bind
hit_zero
(
_
,
v
,
body_ty
),
"free box"
,
T_int
(),
C_int
(
0
));
}
case
(
_
)
{
...
...
@@ -778,7 +796,7 @@ fn trans_drop_str(@block_ctxt cx, ValueRef v) -> result {
C_int
(
len
)));
sub
.val
=
sub
.bcx.build
.IntToPtr
(
sub
.val
,
T_ptr
(
T_str
()));
cx
.cleanups
+=
vec
(
clean
(
bind
trans_drop_str
(
_
,
sub
.val
)
));
cx
.cleanups
+=
clean
(
bind
trans_drop_str
(
_
,
sub
.val
));
ret
sub
;
}
}
...
...
@@ -835,13 +853,19 @@ fn node_type(@crate_ctxt cx, &ast.ann a) -> TypeRef {
ret
sub
;
}
case
(
ast
.box
)
{
auto
e_ty
=
node_type
(
cx
.fcx.ccx
,
a
);
auto
box_ty
=
T_box
(
e_ty
);
sub
.val
=
cx
.build
.Malloc
(
box_ty
);
auto
rc
=
sub
.bcx.build
.GEP
(
sub
.val
,
auto
e_ty
=
typeck
.expr_ty
(
e
);
auto
e_val
=
sub
.val
;
sub
=
trans_malloc
(
sub
.bcx
,
node_ann_type
(
sub
.bcx.fcx.ccx
,
a
));
auto
box
=
sub
.val
;
auto
rc
=
sub
.bcx.build
.GEP
(
box
,
vec
(
C_int
(
0
),
C_int
(
abi
.box_rc_field_refcnt
)));
ret
res
(
sub
.bcx
,
cx
.build
.Store
(
C_int
(
1
),
rc
));
auto
body
=
sub
.bcx.build
.GEP
(
box
,
vec
(
C_int
(
0
),
C_int
(
abi
.box_rc_field_body
)));
sub
.bcx.build
.Store
(
C_int
(
1
),
rc
);
sub
=
copy_ty
(
sub
.bcx
,
true
,
body
,
e_val
,
e_ty
);
ret
res
(
sub
.bcx
,
box
);
}
case
(
_
)
{
cx
.fcx.ccx.sess
.unimpl
(
"expr variant in trans_unary"
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录