Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
ac270fc8
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,发现更多精彩内容 >>
提交
ac270fc8
编写于
12月 22, 2010
作者:
G
Graydon Hoare
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Allocate heap cells to store non-empty object bodies.
上级
04111326
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
45 addition
and
10 deletion
+45
-10
src/comp/middle/trans.rs
src/comp/middle/trans.rs
+45
-10
未找到文件。
src/comp/middle/trans.rs
浏览文件 @
ac270fc8
...
...
@@ -18,6 +18,7 @@
import
middle
.ty.pat_ty
;
import
util
.common
;
import
util
.common.append
;
import
util
.common.istr
;
import
util
.common.new_def_hash
;
import
util
.common.new_str_hash
;
...
...
@@ -566,15 +567,20 @@ fn align_of(TypeRef t) -> ValueRef {
ret
llvm
.LLVMConstIntCast
(
lib
.llvm.llvm
.LLVMAlignOf
(
t
),
T_int
(),
False
);
}
fn
trans_malloc
(
@
block_ctxt
cx
,
@
ty
.t
t
)
->
result
{
auto
scope_cx
=
find_scope_cx
(
cx
);
auto
ptr_ty
=
type_of
(
cx
.fcx.ccx
,
t
);
auto
body_ty
=
lib
.llvm.llvm
.LLVMGetElementType
(
ptr_ty
);
fn
trans_malloc_inner
(
@
block_ctxt
cx
,
TypeRef
llptr_ty
)
->
result
{
auto
llbody_ty
=
lib
.llvm.llvm
.LLVMGetElementType
(
llptr_ty
);
// FIXME: need a table to collect tydesc globals.
auto
tydesc
=
C_int
(
0
);
auto
sz
=
size_of
(
body_ty
);
auto
sz
=
size_of
(
ll
body_ty
);
auto
sub
=
trans_upcall
(
cx
,
"upcall_malloc"
,
vec
(
sz
,
tydesc
));
sub
.val
=
sub
.bcx.build
.IntToPtr
(
sub
.val
,
ptr_ty
);
sub
.val
=
sub
.bcx.build
.IntToPtr
(
sub
.val
,
llptr_ty
);
ret
sub
;
}
fn
trans_malloc
(
@
block_ctxt
cx
,
@
ty
.t
t
)
->
result
{
auto
scope_cx
=
find_scope_cx
(
cx
);
auto
llptr_ty
=
type_of
(
cx
.fcx.ccx
,
t
);
auto
sub
=
trans_malloc_inner
(
cx
,
llptr_ty
);
scope_cx
.cleanups
+=
clean
(
bind
drop_ty
(
_
,
sub
.val
,
t
));
ret
sub
;
}
...
...
@@ -2442,7 +2448,7 @@ fn ret_ty_of_fn(ast.ann ann) -> @ty.t {
auto
llctor_decl
=
cx
.item_ids
.get
(
oid
);
cx
.item_names
.insert
(
cx
.path
,
llctor_decl
);
// Translate obj ctor
field
s to function arguments.
// Translate obj ctor
arg
s to function arguments.
let
vec
[
ast
.arg
]
fn_args
=
vec
();
for
(
ast
.obj_field
f
in
ob
.fields
)
{
fn_args
+=
vec
(
rec
(
mode
=
ast
.alias
,
...
...
@@ -2456,7 +2462,8 @@ fn ret_ty_of_fn(ast.ann ann) -> @ty.t {
auto
bcx
=
new_top_block_ctxt
(
fcx
);
copy_args_to_allocas
(
bcx
,
fn_args
,
arg_tys_of_fn
(
ann
));
let
vec
[
ty
.arg
]
arg_tys
=
arg_tys_of_fn
(
ann
);
copy_args_to_allocas
(
bcx
,
fn_args
,
arg_tys
);
auto
pair
=
bcx
.build
.Alloca
(
type_of
(
cx
,
ret_ty_of_fn
(
ann
)));
auto
vtbl
=
trans_vtbl
(
cx
,
ob
,
ty_params
);
...
...
@@ -2468,9 +2475,37 @@ fn ret_ty_of_fn(ast.ann ann) -> @ty.t {
C_int
(
abi
.obj_field_box
)));
bcx
.build
.Store
(
vtbl
,
pair_vtbl
);
// FIXME: allocate the object body, copy the args in, etc.
bcx
.build
.Store
(
C_null
(
T_ptr
(
T_box
(
T_nil
()))),
pair_box
);
let
TypeRef
llbox_ty
=
T_ptr
(
T_box
(
T_nil
()));
if
(
_
vec
.len
[
ty
.arg
](
arg_tys
)
==
0u
)
{
// Store null into pair, if no args.
bcx
.build
.Store
(
C_null
(
llbox_ty
),
pair_box
);
}
else
{
// Malloc a box for the body and copy args in.
let
vec
[
@
ty
.t
]
obj_fields
=
vec
();
for
(
ty
.arg
a
in
arg_tys
)
{
append
[
@
ty
.t
](
obj_fields
,
a
.ty
);
}
// Synthesize an obj body:
let
@
ty
.t
fields_ty
=
ty
.plain_ty
(
ty
.ty_tup
(
obj_fields
));
let
TypeRef
llfields_ty
=
type_of
(
bcx
.fcx.ccx
,
fields_ty
);
let
TypeRef
llobj_body_ty
=
T_ptr
(
T_box
(
T_struct
(
vec
(
T_tydesc
(),
llfields_ty
))));
auto
r
=
trans_malloc_inner
(
bcx
,
llobj_body_ty
);
auto
box
=
r
.val
;
auto
rc
=
r
.bcx.build
.GEP
(
box
,
vec
(
C_int
(
0
),
C_int
(
abi
.box_rc_field_refcnt
)));
auto
body
=
r
.bcx.build
.GEP
(
box
,
vec
(
C_int
(
0
),
C_int
(
abi
.box_rc_field_body
)));
r
.bcx.build
.Store
(
C_int
(
1
),
rc
);
// FIXME: Copy args into body
auto
p
=
r
.bcx.build
.PointerCast
(
box
,
llbox_ty
);
r
.bcx.build
.Store
(
p
,
pair_box
);
}
bcx
.build
.Ret
(
bcx
.build
.Load
(
pair
));
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录