Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
1f2585f4
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,发现更多精彩内容 >>
提交
1f2585f4
编写于
12月 30, 2010
作者:
G
Graydon Hoare
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Teach trans to access object fields.
上级
9676fb2d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
100 addition
and
14 deletion
+100
-14
src/comp/middle/trans.rs
src/comp/middle/trans.rs
+100
-14
未找到文件。
src/comp/middle/trans.rs
浏览文件 @
1f2585f4
...
...
@@ -68,6 +68,7 @@ fn next(str prefix) -> str {
hashmap
[
ast
.def_id
,
@
ast
.item
]
items
,
hashmap
[
ast
.def_id
,
@
tag_info
]
tags
,
hashmap
[
@
ty
.t
,
ValueRef
]
tydescs
,
vec
[
ast
.obj_field
]
obj_fields
,
@
glue_fns
glues
,
namegen
names
,
str
path
);
...
...
@@ -77,6 +78,7 @@ fn next(str prefix) -> str {
mutable
option
.t
[
ValueRef
]
llself
,
mutable
option
.t
[
ValueRef
]
llretptr
,
hashmap
[
ast
.def_id
,
ValueRef
]
llargs
,
hashmap
[
ast
.def_id
,
ValueRef
]
llobjfields
,
hashmap
[
ast
.def_id
,
ValueRef
]
lllocals
,
hashmap
[
ast
.def_id
,
ValueRef
]
lltydescs
,
@
crate_ctxt
ccx
);
...
...
@@ -1667,6 +1669,10 @@ fn trans_name(@block_ctxt cx, &ast.name n, &option.t[ast.def] dopt)
check
(
cx
.fcx.lllocals
.contains_key
(
did
));
ret
lval_mem
(
cx
,
cx
.fcx.lllocals
.get
(
did
));
}
case
(
ast
.def_obj_field
(
?
did
))
{
check
(
cx
.fcx.llobjfields
.contains_key
(
did
));
ret
lval_mem
(
cx
,
cx
.fcx.llobjfields
.get
(
did
));
}
case
(
ast
.def_fn
(
?
did
))
{
check
(
cx
.fcx.ccx.item_ids
.contains_key
(
did
));
ret
lval_val
(
cx
,
cx
.fcx.ccx.item_ids
.get
(
did
));
...
...
@@ -2382,8 +2388,9 @@ fn new_fn_ctxt(@crate_ctxt cx,
let
ValueRef
lltaskptr
=
llvm
.LLVMGetParam
(
llfndecl
,
0u
);
let
hashmap
[
ast
.def_id
,
ValueRef
]
lllocals
=
new_def_hash
[
ValueRef
]();
let
hashmap
[
ast
.def_id
,
ValueRef
]
llargs
=
new_def_hash
[
ValueRef
]();
let
hashmap
[
ast
.def_id
,
ValueRef
]
llobjfields
=
new_def_hash
[
ValueRef
]();
let
hashmap
[
ast
.def_id
,
ValueRef
]
lllocals
=
new_def_hash
[
ValueRef
]();
let
hashmap
[
ast
.def_id
,
ValueRef
]
lltydescs
=
new_def_hash
[
ValueRef
]();
ret
@
rec
(
llfn
=
llfndecl
,
...
...
@@ -2391,6 +2398,7 @@ fn new_fn_ctxt(@crate_ctxt cx,
mutable
llself
=
none
[
ValueRef
],
mutable
llretptr
=
none
[
ValueRef
],
llargs
=
llargs
,
llobjfields
=
llobjfields
,
lllocals
=
lllocals
,
lltydescs
=
lltydescs
,
ccx
=
cx
);
...
...
@@ -2434,16 +2442,31 @@ fn create_llargs_for_fn_args(&@fn_ctxt cx,
}
}
// Recommended LLVM style, strange though this is, is to copy from args to
// allocas immediately upon entry; this permits us to GEP into structures we
// were passed and whatnot. Apparently mem2reg will mop up.
fn
copy_args_to_allocas
(
@
block_ctxt
cx
,
vec
[
ast
.arg
]
args
,
vec
[
ty
.arg
]
arg_tys
)
{
impure
fn
copy_args_to_allocas
(
@
block_ctxt
cx
,
option
.t
[
TypeRef
]
ty_self
,
vec
[
ast
.arg
]
args
,
vec
[
ty
.arg
]
arg_tys
)
{
let
uint
arg_n
=
0u
;
alt
(
cx
.fcx.llself
)
{
case
(
some
[
ValueRef
](
?
self_v
))
{
alt
(
ty_self
)
{
case
(
some
[
TypeRef
](
?
self_t
))
{
auto
alloca
=
cx
.build
.Alloca
(
self_t
);
cx
.build
.Store
(
self_v
,
alloca
);
cx
.fcx.llself
=
some
[
ValueRef
](
alloca
);
}
}
}
case
(
_
)
{
}
}
for
(
ast
.arg
aarg
in
args
)
{
if
(
aarg
.mode
!=
ast
.alias
)
{
auto
arg_t
=
type_of_arg
(
cx
.fcx.ccx
,
arg_tys
.
(
arg_n
));
...
...
@@ -2481,19 +2504,66 @@ fn ret_ty_of_fn(ast.ann ann) -> @ty.t {
fail
;
}
fn
create_llobjfields_for_fields
(
@
block_ctxt
cx
,
ValueRef
llself
)
{
let
vec
[
TypeRef
]
llfield_tys
=
vec
();
for
(
ast
.obj_field
f
in
cx
.fcx.ccx.obj_fields
)
{
llfield_tys
+=
node_type
(
cx
.fcx.ccx
,
f
.ann
);
}
let
TypeRef
llfields_ty
=
T_struct
(
llfield_tys
);
let
TypeRef
lltydesc_ty
=
T_ptr
(
T_tydesc
());
let
TypeRef
llobj_body_ty
=
T_struct
(
vec
(
lltydesc_ty
,
llfields_ty
));
let
TypeRef
llobj_box_ty
=
T_ptr
(
T_box
(
llobj_body_ty
));
auto
box_cell
=
cx
.build
.GEP
(
llself
,
vec
(
C_int
(
0
),
C_int
(
abi
.obj_field_box
)));
auto
box_ptr
=
cx
.build
.Load
(
box_cell
);
box_ptr
=
cx
.build
.PointerCast
(
box_ptr
,
llobj_box_ty
);
auto
obj_fields
=
cx
.build
.GEP
(
box_ptr
,
vec
(
C_int
(
0
),
C_int
(
abi
.box_rc_field_body
),
C_int
(
abi
.obj_body_elt_fields
)));
let
int
i
=
0
;
for
(
ast
.obj_field
f
in
cx
.fcx.ccx.obj_fields
)
{
let
ValueRef
llfield
=
cx
.build
.GEP
(
obj_fields
,
vec
(
C_int
(
0
),
C_int
(
i
)));
cx
.fcx.llobjfields
.insert
(
f
.id
,
llfield
);
i
+=
1
;
}
}
impure
fn
trans_fn
(
@
crate_ctxt
cx
,
&
ast
._fn
f
,
ast
.def_id
fid
,
option
.t
[
TypeRef
]
ty_self
,
&
vec
[
ast
.ty_param
]
ty_params
,
&
ast
.ann
ann
)
{
auto
llfndecl
=
cx
.item_ids
.get
(
fid
);
cx
.item_names
.insert
(
cx
.path
,
llfndecl
);
auto
fcx
=
new_fn_ctxt
(
cx
,
cx
.path
,
llfndecl
);
create_llargs_for_fn_args
(
fcx
,
none
[
TypeRef
]
,
ret_ty_of_fn
(
ann
),
create_llargs_for_fn_args
(
fcx
,
ty_self
,
ret_ty_of_fn
(
ann
),
f
.inputs
,
ty_params
);
auto
bcx
=
new_top_block_ctxt
(
fcx
);
copy_args_to_allocas
(
bcx
,
f
.inputs
,
arg_tys_of_fn
(
ann
));
copy_args_to_allocas
(
bcx
,
ty_self
,
f
.inputs
,
arg_tys_of_fn
(
ann
));
alt
(
fcx
.llself
)
{
case
(
some
[
ValueRef
](
?
llself
))
{
create_llobjfields_for_fields
(
bcx
,
llself
);
}
case
(
_
)
{
}
}
auto
res
=
trans_block
(
bcx
,
f
.body
);
if
(
!
is_terminated
(
res
.bcx
))
{
...
...
@@ -2507,7 +2577,15 @@ fn ret_ty_of_fn(ast.ann ann) -> @ty.t {
&
ast
._obj
ob
,
&
vec
[
ast
.ty_param
]
ty_params
)
->
ValueRef
{
let
vec
[
ValueRef
]
methods
=
vec
();
for
(
@
ast
.method
m
in
ob
.methods
)
{
fn
meth_lteq
(
&@
ast
.method
a
,
&@
ast
.method
b
)
->
bool
{
ret
_
str
.lteq
(
a
.node.ident
,
b
.node.ident
);
}
auto
meths
=
std
.sort.merge_sort
[
@
ast
.method
](
bind
meth_lteq
(
_
,
_
),
ob
.methods
);
for
(
@
ast
.method
m
in
meths
)
{
auto
llfnty
=
T_nil
();
alt
(
node_ann_type
(
cx
,
m
.node.ann
)
.struct
)
{
...
...
@@ -2518,11 +2596,15 @@ fn ret_ty_of_fn(ast.ann ann) -> @ty.t {
}
}
let
str
s
=
cx
.names
.next
(
"_rust_method"
)
+
"."
+
cx
.path
;
let
@
crate_ctxt
mcx
=
@
rec
(
path
=
cx
.path
+
"."
+
m
.node.ident
with
*
cx
);
let
str
s
=
cx
.names
.next
(
"_rust_method"
)
+
"."
+
mcx
.path
;
let
ValueRef
llfn
=
decl_fastcall_fn
(
cx
.llmod
,
s
,
llfnty
);
cx
.item_ids
.insert
(
m
.node.id
,
llfn
);
trans_fn
(
cx
,
m
.node.meth
,
m
.node.id
,
ty_params
,
m
.node.ann
);
trans_fn
(
mcx
,
m
.node.meth
,
m
.node.id
,
some
[
TypeRef
](
self_ty
),
ty_params
,
m
.node.ann
);
methods
+=
llfn
;
}
auto
vtbl
=
C_struct
(
methods
);
...
...
@@ -2556,7 +2638,7 @@ fn ret_ty_of_fn(ast.ann ann) -> @ty.t {
auto
bcx
=
new_top_block_ctxt
(
fcx
);
let
vec
[
ty
.arg
]
arg_tys
=
arg_tys_of_fn
(
ann
);
copy_args_to_allocas
(
bcx
,
fn_args
,
arg_tys
);
copy_args_to_allocas
(
bcx
,
none
[
TypeRef
],
fn_args
,
arg_tys
);
auto
llself_ty
=
type_of
(
cx
,
ret_ty_of_fn
(
ann
));
auto
pair
=
bcx
.build
.Alloca
(
llself_ty
);
...
...
@@ -2664,7 +2746,7 @@ fn trans_tag_variant(@crate_ctxt cx, ast.def_id tag_id,
auto
bcx
=
new_top_block_ctxt
(
fcx
);
auto
arg_tys
=
arg_tys_of_fn
(
variant
.ann
);
copy_args_to_allocas
(
bcx
,
fn_args
,
arg_tys
);
copy_args_to_allocas
(
bcx
,
none
[
TypeRef
],
fn_args
,
arg_tys
);
auto
info
=
cx
.tags
.get
(
tag_id
);
...
...
@@ -2707,10 +2789,11 @@ fn trans_tag_variant(@crate_ctxt cx, ast.def_id tag_id,
alt
(
item
.node
)
{
case
(
ast
.item_fn
(
?
name
,
?
f
,
?
tps
,
?
fid
,
?
ann
))
{
auto
sub_cx
=
@
rec
(
path
=
cx
.path
+
"."
+
name
with
*
cx
);
trans_fn
(
sub_cx
,
f
,
fid
,
tps
,
ann
);
trans_fn
(
sub_cx
,
f
,
fid
,
none
[
TypeRef
],
tps
,
ann
);
}
case
(
ast
.item_obj
(
?
name
,
?
ob
,
?
tps
,
?
oid
,
?
ann
))
{
auto
sub_cx
=
@
rec
(
path
=
cx
.path
+
"."
+
name
with
*
cx
);
auto
sub_cx
=
@
rec
(
path
=
cx
.path
+
"."
+
name
,
obj_fields
=
ob
.fields
with
*
cx
);
trans_obj
(
sub_cx
,
ob
,
oid
,
tps
,
ann
);
}
case
(
ast
.item_mod
(
?
name
,
?
m
,
_
))
{
...
...
@@ -2927,6 +3010,7 @@ fn trans_exit_task_glue(@crate_ctxt cx) {
mutable
llself
=
none
[
ValueRef
],
mutable
llretptr
=
none
[
ValueRef
],
llargs
=
new_def_hash
[
ValueRef
](),
llobjfields
=
new_def_hash
[
ValueRef
](),
lllocals
=
new_def_hash
[
ValueRef
](),
lltydescs
=
new_def_hash
[
ValueRef
](),
ccx
=
cx
);
...
...
@@ -3097,6 +3181,7 @@ fn trans_crate(session.session sess, @ast.crate crate, str output,
auto
hasher
=
ty
.hash_ty
;
auto
eqer
=
ty
.eq_ty
;
auto
tydescs
=
map
.mk_hashmap
[
@
ty
.t
,
ValueRef
](
hasher
,
eqer
);
let
vec
[
ast
.obj_field
]
obj_fields
=
vec
();
auto
cx
=
@
rec
(
sess
=
sess
,
llmod
=
llmod
,
...
...
@@ -3108,6 +3193,7 @@ fn trans_crate(session.session sess, @ast.crate crate, str output,
items
=
new_def_hash
[
@
ast
.item
](),
tags
=
new_def_hash
[
@
tag_info
](),
tydescs
=
tydescs
,
obj_fields
=
obj_fields
,
glues
=
glues
,
names
=
namegen
(
0
),
path
=
"_rust"
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录