Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
a47fa9b3
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,发现更多精彩内容 >>
提交
a47fa9b3
编写于
1月 29, 2013
作者:
P
Patrick Walton
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
librustc: De-export some of trans. rs=deexporting
上级
4b8dfad5
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
218 addition
and
215 deletion
+218
-215
src/librustc/middle/trans/callee.rs
src/librustc/middle/trans/callee.rs
+68
-72
src/librustc/middle/trans/controlflow.rs
src/librustc/middle/trans/controlflow.rs
+44
-32
src/librustc/middle/trans/datum.rs
src/librustc/middle/trans/datum.rs
+21
-18
src/librustc/middle/trans/expr.rs
src/librustc/middle/trans/expr.rs
+13
-27
src/librustc/middle/trans/glue.rs
src/librustc/middle/trans/glue.rs
+57
-45
src/librustc/middle/trans/inline.rs
src/librustc/middle/trans/inline.rs
+2
-2
src/librustc/middle/trans/monomorphize.rs
src/librustc/middle/trans/monomorphize.rs
+13
-12
src/librustc/rustc.rc
src/librustc/rustc.rc
+0
-7
未找到文件。
src/librustc/middle/trans/callee.rs
浏览文件 @
a47fa9b3
...
...
@@ -39,29 +39,29 @@
// Represents a (possibly monomorphized) top-level fn item or method
// item. Note that this is just the fn-ptr and is not a Rust closure
// value (which is a pair).
struct
FnData
{
pub
struct
FnData
{
llfn
:
ValueRef
,
}
struct
MethodData
{
pub
struct
MethodData
{
llfn
:
ValueRef
,
llself
:
ValueRef
,
self_ty
:
ty
::
t
,
self_mode
:
ast
::
rmode
}
enum
CalleeData
{
pub
enum
CalleeData
{
Closure
(
Datum
),
Fn
(
FnData
),
Method
(
MethodData
)
}
struct
Callee
{
pub
struct
Callee
{
bcx
:
block
,
data
:
CalleeData
}
fn
trans
(
bcx
:
block
,
expr
:
@
ast
::
expr
)
->
Callee
{
pub
fn
trans
(
bcx
:
block
,
expr
:
@
ast
::
expr
)
->
Callee
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_callee"
);
// pick out special kinds of expressions that can be called:
...
...
@@ -133,17 +133,16 @@ fn trans_def(bcx: block, def: ast::def, ref_expr: @ast::expr) -> Callee {
}
}
fn
trans_fn_ref_to_callee
(
bcx
:
block
,
def_id
:
ast
::
def_id
,
ref_id
:
ast
::
node_id
)
->
Callee
{
pub
fn
trans_fn_ref_to_callee
(
bcx
:
block
,
def_id
:
ast
::
def_id
,
ref_id
:
ast
::
node_id
)
->
Callee
{
Callee
{
bcx
:
bcx
,
data
:
Fn
(
trans_fn_ref
(
bcx
,
def_id
,
ref_id
))}
}
fn
trans_fn_ref
(
bcx
:
block
,
def_id
:
ast
::
def_id
,
ref_id
:
ast
::
node_id
)
->
FnData
{
pub
fn
trans_fn_ref
(
bcx
:
block
,
def_id
:
ast
::
def_id
,
ref_id
:
ast
::
node_id
)
->
FnData
{
/*!
*
* Translates a reference (with id `ref_id`) to the fn/method
...
...
@@ -158,26 +157,25 @@ fn trans_fn_ref(bcx: block,
trans_fn_ref_with_vtables
(
bcx
,
def_id
,
ref_id
,
type_params
,
vtables
)
}
fn
trans_fn_ref_with_vtables_to_callee
(
bcx
:
block
,
def_id
:
ast
::
def_id
,
ref_id
:
ast
::
node
_id
,
+
type_params
:
~
[
ty
::
t
]
,
vtables
:
Option
<
typeck
::
vtable_res
>
)
->
Callee
{
pub
fn
trans_fn_ref_with_vtables_to_callee
(
bcx
:
block
,
def_id
:
ast
::
def
_id
,
ref_id
:
ast
::
node_id
,
+
type_params
:
~
[
ty
::
t
],
vtables
:
Option
<
typeck
::
vtable_res
>
)
->
Callee
{
Callee
{
bcx
:
bcx
,
data
:
Fn
(
trans_fn_ref_with_vtables
(
bcx
,
def_id
,
ref_id
,
type_params
,
vtables
))}
}
fn
trans_fn_ref_with_vtables
(
bcx
:
block
,
//
def_id
:
ast
::
def_id
,
// def id of fn
ref_id
:
ast
::
node_id
,
// node id of use of fn; may be zero if N/A
+
type_params
:
~
[
ty
::
t
],
// values for fn's ty params
vtables
:
Option
<
typeck
::
vtable_res
>
)
->
FnData
{
pub
fn
trans_fn_ref_with_vtables
(
bcx
:
block
,
//
def_id
:
ast
::
def_id
,
// def id of fn
ref_id
:
ast
::
node_id
,
// node id of use of fn; may be zero if N/A
+
type_params
:
~
[
ty
::
t
],
// values for fn's ty params
vtables
:
Option
<
typeck
::
vtable_res
>
)
->
FnData
{
//!
//
// Translates a reference to a fn/method item, monomorphizing and
...
...
@@ -289,26 +287,25 @@ fn trans_fn_ref_with_vtables(
// ______________________________________________________________________
// Translating calls
fn
trans_call
(
in_cx
:
block
,
call_ex
:
@
ast
::
expr
,
f
:
@
ast
::
expr
,
args
:
CallArgs
,
id
:
ast
::
node_id
,
dest
:
expr
::
Dest
)
->
block
{
pub
fn
trans_call
(
in_cx
:
block
,
call_ex
:
@
ast
::
expr
,
f
:
@
ast
::
expr
,
args
:
CallArgs
,
id
:
ast
::
node_id
,
dest
:
expr
::
Dest
)
->
block
{
let
_
icx
=
in_cx
.insn_ctxt
(
"trans_call"
);
trans_call_inner
(
in_cx
,
call_ex
.info
(),
expr_ty
(
in_cx
,
f
),
node_id_type
(
in_cx
,
id
),
|
cx
|
trans
(
cx
,
f
),
args
,
dest
,
DontAutorefArg
)
}
fn
trans_method_call
(
in_cx
:
block
,
call_ex
:
@
ast
::
expr
,
rcvr
:
@
ast
::
expr
,
args
:
CallArgs
,
dest
:
expr
::
Dest
)
->
block
{
pub
fn
trans_method_call
(
in_cx
:
block
,
call_ex
:
@
ast
::
expr
,
rcvr
:
@
ast
::
expr
,
args
:
CallArgs
,
dest
:
expr
::
Dest
)
->
block
{
let
_
icx
=
in_cx
.insn_ctxt
(
"trans_method_call"
);
trans_call_inner
(
in_cx
,
...
...
@@ -335,8 +332,11 @@ fn trans_method_call(in_cx: block,
DontAutorefArg
)
}
fn
trans_rtcall_or_lang_call
(
bcx
:
block
,
did
:
ast
::
def_id
,
args
:
~
[
ValueRef
],
dest
:
expr
::
Dest
)
->
block
{
pub
fn
trans_rtcall_or_lang_call
(
bcx
:
block
,
did
:
ast
::
def_id
,
args
:
~
[
ValueRef
],
dest
:
expr
::
Dest
)
->
block
{
let
fty
=
if
did
.crate
==
ast
::
local_crate
{
ty
::
node_id_to_type
(
bcx
.ccx
()
.tcx
,
did
.node
)
}
else
{
...
...
@@ -349,11 +349,12 @@ fn trans_rtcall_or_lang_call(bcx: block, did: ast::def_id, args: ~[ValueRef],
ArgVals
(
args
),
dest
,
DontAutorefArg
);
}
fn
trans_rtcall_or_lang_call_with_type_params
(
bcx
:
block
,
did
:
ast
::
def_id
,
args
:
~
[
ValueRef
],
type_params
:
~
[
ty
::
t
],
dest
:
expr
::
Dest
)
->
block
{
pub
fn
trans_rtcall_or_lang_call_with_type_params
(
bcx
:
block
,
did
:
ast
::
def_id
,
args
:
~
[
ValueRef
],
type_params
:
~
[
ty
::
t
],
dest
:
expr
::
Dest
)
->
block
{
let
fty
;
if
did
.crate
==
ast
::
local_crate
{
fty
=
ty
::
node_id_to_type
(
bcx
.tcx
(),
did
.node
);
...
...
@@ -389,7 +390,7 @@ fn trans_rtcall_or_lang_call_with_type_params(bcx: block,
ArgVals
(
args
),
dest
,
DontAutorefArg
);
}
fn
body_contains_ret
(
body
:
ast
::
blk
)
->
bool
{
pub
fn
body_contains_ret
(
body
:
ast
::
blk
)
->
bool
{
let
cx
=
{
mut
found
:
false
};
visit
::
visit_block
(
body
,
cx
,
visit
::
mk_vt
(
@
visit
::
Visitor
{
visit_item
:
|
_
i
,
_
cx
,
_
v
|
{
},
...
...
@@ -407,7 +408,7 @@ fn body_contains_ret(body: ast::blk) -> bool {
}
// See [Note-arg-mode]
fn
trans_call_inner
(
pub
fn
trans_call_inner
(
++
in_cx
:
block
,
call_info
:
Option
<
node_info
>
,
fn_expr_ty
:
ty
::
t
,
...
...
@@ -415,8 +416,7 @@ fn trans_call_inner(
get_callee
:
fn
(
block
)
->
Callee
,
args
:
CallArgs
,
dest
:
expr
::
Dest
,
autoref_arg
:
AutorefArg
)
->
block
{
autoref_arg
:
AutorefArg
)
->
block
{
do
base
::
with_scope
(
in_cx
,
call_info
,
~
"call"
)
|
cx
|
{
let
ret_in_loop
=
match
/*bad*/
copy
args
{
ArgExprs
(
args
)
=>
{
...
...
@@ -520,21 +520,19 @@ fn trans_call_inner(
}
}
enum
CallArgs
{
pub
enum
CallArgs
{
ArgExprs
(
~
[
@
ast
::
expr
]),
ArgVals
(
~
[
ValueRef
])
}
fn
trans_args
(
cx
:
block
,
llenv
:
ValueRef
,
+
args
:
CallArgs
,
fn_ty
:
ty
::
t
,
dest
:
expr
::
Dest
,
ret_flag
:
Option
<
ValueRef
>
,
+
autoref_arg
:
AutorefArg
)
->
{
bcx
:
block
,
args
:
~
[
ValueRef
],
retslot
:
ValueRef
}
{
pub
fn
trans_args
(
cx
:
block
,
llenv
:
ValueRef
,
+
args
:
CallArgs
,
fn_ty
:
ty
::
t
,
dest
:
expr
::
Dest
,
ret_flag
:
Option
<
ValueRef
>
,
+
autoref_arg
:
AutorefArg
)
->
{
bcx
:
block
,
args
:
~
[
ValueRef
],
retslot
:
ValueRef
}
{
let
_
icx
=
cx
.insn_ctxt
(
"trans_args"
);
let
mut
temp_cleanups
=
~
[];
let
arg_tys
=
ty
::
ty_fn_args
(
fn_ty
);
...
...
@@ -594,21 +592,19 @@ fn trans_args(cx: block,
return
{
bcx
:
bcx
,
args
:
llargs
,
retslot
:
llretslot
};
}
enum
AutorefArg
{
pub
enum
AutorefArg
{
DontAutorefArg
,
DoAutorefArg
}
// temp_cleanups: cleanups that should run only if failure occurs before the
// call takes place:
fn
trans_arg_expr
(
bcx
:
block
,
formal_ty
:
ty
::
arg
,
arg_expr
:
@
ast
::
expr
,
temp_cleanups
:
&
mut
~
[
ValueRef
],
ret_flag
:
Option
<
ValueRef
>
,
+
autoref_arg
:
AutorefArg
)
->
Result
{
pub
fn
trans_arg_expr
(
bcx
:
block
,
formal_ty
:
ty
::
arg
,
arg_expr
:
@
ast
::
expr
,
temp_cleanups
:
&
mut
~
[
ValueRef
],
ret_flag
:
Option
<
ValueRef
>
,
+
autoref_arg
:
AutorefArg
)
->
Result
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_arg_expr"
);
let
ccx
=
bcx
.ccx
();
...
...
src/librustc/middle/trans/controlflow.rs
浏览文件 @
a47fa9b3
...
...
@@ -18,9 +18,12 @@
use
core
::
str
;
fn
macros
()
{
include!
(
"macros.rs"
);
}
// FIXME(#3114): Macro import/export.
pub
fn
macros
()
{
// FIXME(#3114): Macro import/export.
include!
(
"macros.rs"
);
}
fn
trans_block
(
bcx
:
block
,
b
:
ast
::
blk
,
dest
:
expr
::
Dest
)
->
block
{
pub
fn
trans_block
(
bcx
:
block
,
b
:
ast
::
blk
,
dest
:
expr
::
Dest
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_block"
);
let
mut
bcx
=
bcx
;
do
block_locals
(
b
)
|
local
|
{
...
...
@@ -42,13 +45,12 @@ fn trans_block(bcx: block, b: ast::blk, dest: expr::Dest) -> block {
return
bcx
;
}
fn
trans_if
(
bcx
:
block
,
pub
fn
trans_if
(
bcx
:
block
,
cond
:
@
ast
::
expr
,
thn
:
ast
::
blk
,
els
:
Option
<@
ast
::
expr
>
,
dest
:
expr
::
Dest
)
->
block
{
->
block
{
debug!
(
"trans_if(bcx=%s, cond=%s, thn=%?, dest=%s)"
,
bcx
.to_str
(),
bcx
.expr_to_str
(
cond
),
thn
.node.id
,
dest
.to_str
(
bcx
.ccx
()));
...
...
@@ -95,7 +97,7 @@ fn trans_if(bcx: block,
}
fn
join_blocks
(
parent_bcx
:
block
,
in_cxs
:
~
[
block
])
->
block
{
pub
fn
join_blocks
(
parent_bcx
:
block
,
in_cxs
:
~
[
block
])
->
block
{
let
out
=
sub_block
(
parent_bcx
,
~
"join"
);
let
mut
reachable
=
false
;
for
vec
::
each
(
in_cxs
)
|
bcx
|
{
...
...
@@ -110,8 +112,7 @@ fn join_blocks(parent_bcx: block, in_cxs: ~[block]) -> block {
return
out
;
}
fn
trans_while
(
bcx
:
block
,
cond
:
@
ast
::
expr
,
body
:
ast
::
blk
)
->
block
{
pub
fn
trans_while
(
bcx
:
block
,
cond
:
@
ast
::
expr
,
body
:
ast
::
blk
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_while"
);
let
next_bcx
=
sub_block
(
bcx
,
~
"while next"
);
...
...
@@ -149,7 +150,10 @@ fn trans_while(bcx: block, cond: @ast::expr, body: ast::blk)
return
next_bcx
;
}
fn
trans_loop
(
bcx
:
block
,
body
:
ast
::
blk
,
opt_label
:
Option
<
ident
>
)
->
block
{
pub
fn
trans_loop
(
bcx
:
block
,
body
:
ast
::
blk
,
opt_label
:
Option
<
ident
>
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_loop"
);
let
next_bcx
=
sub_block
(
bcx
,
~
"next"
);
let
body_bcx_in
=
loop_scope_block
(
bcx
,
next_bcx
,
opt_label
,
~
"`loop`"
,
...
...
@@ -160,11 +164,10 @@ fn trans_loop(bcx:block, body: ast::blk, opt_label: Option<ident>) -> block {
return
next_bcx
;
}
fn
trans_log
(
log_ex
:
@
ast
::
expr
,
lvl
:
@
ast
::
expr
,
bcx
:
block
,
e
:
@
ast
::
expr
)
->
block
{
pub
fn
trans_log
(
log_ex
:
@
ast
::
expr
,
lvl
:
@
ast
::
expr
,
bcx
:
block
,
e
:
@
ast
::
expr
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_log"
);
let
ccx
=
bcx
.ccx
();
let
mut
bcx
=
bcx
;
...
...
@@ -223,8 +226,10 @@ fn trans_log(log_ex: @ast::expr,
}
}
fn
trans_break_cont
(
bcx
:
block
,
opt_label
:
Option
<
ident
>
,
to_end
:
bool
)
->
block
{
pub
fn
trans_break_cont
(
bcx
:
block
,
opt_label
:
Option
<
ident
>
,
to_end
:
bool
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_break_cont"
);
// Locate closest loop block, outputting cleanup as we go.
let
mut
unwind
=
bcx
;
...
...
@@ -270,15 +275,15 @@ fn trans_break_cont(bcx: block, opt_label: Option<ident>, to_end: bool)
return
bcx
;
}
fn
trans_break
(
bcx
:
block
,
label_opt
:
Option
<
ident
>
)
->
block
{
pub
fn
trans_break
(
bcx
:
block
,
label_opt
:
Option
<
ident
>
)
->
block
{
return
trans_break_cont
(
bcx
,
label_opt
,
true
);
}
fn
trans_cont
(
bcx
:
block
,
label_opt
:
Option
<
ident
>
)
->
block
{
pub
fn
trans_cont
(
bcx
:
block
,
label_opt
:
Option
<
ident
>
)
->
block
{
return
trans_break_cont
(
bcx
,
label_opt
,
false
);
}
fn
trans_ret
(
bcx
:
block
,
e
:
Option
<@
ast
::
expr
>
)
->
block
{
pub
fn
trans_ret
(
bcx
:
block
,
e
:
Option
<@
ast
::
expr
>
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_ret"
);
let
mut
bcx
=
bcx
;
let
retptr
=
match
copy
bcx
.fcx.loop_ret
{
...
...
@@ -306,8 +311,12 @@ fn trans_ret(bcx: block, e: Option<@ast::expr>) -> block {
Unreachable
(
bcx
);
return
bcx
;
}
fn
trans_check_expr
(
bcx
:
block
,
chk_expr
:
@
ast
::
expr
,
pred_expr
:
@
ast
::
expr
,
s
:
~
str
)
->
block
{
pub
fn
trans_check_expr
(
bcx
:
block
,
chk_expr
:
@
ast
::
expr
,
pred_expr
:
@
ast
::
expr
,
s
:
~
str
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_check_expr"
);
let
expr_str
=
s
+
~
" "
+
expr_to_str
(
pred_expr
,
bcx
.ccx
()
.sess
.intr
())
+
~
" failed"
;
...
...
@@ -321,9 +330,10 @@ fn trans_check_expr(bcx: block, chk_expr: @ast::expr,
}
}
fn
trans_fail_expr
(
bcx
:
block
,
sp_opt
:
Option
<
span
>
,
fail_expr
:
Option
<@
ast
::
expr
>
)
->
block
{
pub
fn
trans_fail_expr
(
bcx
:
block
,
sp_opt
:
Option
<
span
>
,
fail_expr
:
Option
<@
ast
::
expr
>
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_fail_expr"
);
let
mut
bcx
=
bcx
;
match
fail_expr
{
...
...
@@ -347,17 +357,19 @@ fn trans_fail_expr(bcx: block,
}
}
fn
trans_fail
(
bcx
:
block
,
sp_opt
:
Option
<
span
>
,
+
fail_str
:
~
str
)
->
block
{
pub
fn
trans_fail
(
bcx
:
block
,
sp_opt
:
Option
<
span
>
,
+
fail_str
:
~
str
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_fail"
);
let
V_fail_str
=
C_cstr
(
bcx
.ccx
(),
fail_str
);
return
trans_fail_value
(
bcx
,
sp_opt
,
V_fail_str
);
}
fn
trans_fail_value
(
bcx
:
block
,
sp_opt
:
Option
<
span
>
,
V_fail_str
:
ValueRef
)
->
block
{
fn
trans_fail_value
(
bcx
:
block
,
sp_opt
:
Option
<
span
>
,
V_fail_str
:
ValueRef
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_fail_value"
);
let
ccx
=
bcx
.ccx
();
let
{
V_filename
,
V_line
}
=
match
sp_opt
{
...
...
@@ -381,8 +393,8 @@ fn trans_fail_value(bcx: block, sp_opt: Option<span>, V_fail_str: ValueRef)
return
bcx
;
}
fn
trans_fail_bounds_check
(
bcx
:
block
,
sp
:
span
,
index
:
ValueRef
,
len
:
ValueRef
)
->
block
{
pub
fn
trans_fail_bounds_check
(
bcx
:
block
,
sp
:
span
,
index
:
ValueRef
,
len
:
ValueRef
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_fail_bounds_check"
);
let
ccx
=
bcx
.ccx
();
...
...
src/librustc/middle/trans/datum.rs
浏览文件 @
a47fa9b3
...
...
@@ -114,12 +114,12 @@
use
core
::
vec
;
use
syntax
::
parse
::
token
::
special_idents
;
enum
CopyAction
{
pub
enum
CopyAction
{
INIT
,
DROP_EXISTING
}
struct
Datum
{
pub
struct
Datum
{
/// The llvm value. This is either a pointer to the Rust value or
/// the value itself, depending on `mode` below.
val
:
ValueRef
,
...
...
@@ -137,12 +137,12 @@ struct Datum {
source
:
DatumSource
}
struct
DatumBlock
{
pub
struct
DatumBlock
{
bcx
:
block
,
datum
:
Datum
,
}
enum
DatumMode
{
pub
enum
DatumMode
{
/// `val` is a pointer to the actual value (and thus has type *T)
ByRef
,
...
...
@@ -150,7 +150,7 @@ enum DatumMode {
ByValue
,
}
impl
DatumMode
{
pub
impl
DatumMode
{
fn
is_by_ref
()
->
bool
{
match
self
{
ByRef
=>
true
,
ByValue
=>
false
}
}
...
...
@@ -160,27 +160,27 @@ fn is_by_value() -> bool {
}
}
impl
DatumMode
:
cmp
::
Eq
{
pub
impl
DatumMode
:
cmp
::
Eq
{
pure
fn
eq
(
&
self
,
other
:
&
DatumMode
)
->
bool
{
(
*
self
)
as
uint
==
(
*
other
as
uint
)
}
pure
fn
ne
(
&
self
,
other
:
&
DatumMode
)
->
bool
{
!
(
*
self
)
.eq
(
other
)
}
}
impl
DatumMode
:
to_bytes
::
IterBytes
{
pub
impl
DatumMode
:
to_bytes
::
IterBytes
{
pure
fn
iter_bytes
(
&
self
,
+
lsb0
:
bool
,
f
:
to_bytes
::
Cb
)
{
(
*
self
as
uint
)
.iter_bytes
(
lsb0
,
f
)
}
}
/// See `Datum Sources` section at the head of this module.
enum
DatumSource
{
pub
enum
DatumSource
{
FromRvalue
,
FromLvalue
,
FromLastUseLvalue
,
}
impl
DatumSource
{
pub
impl
DatumSource
{
fn
is_rvalue
()
->
bool
{
match
self
{
FromRvalue
=>
true
,
...
...
@@ -196,16 +196,19 @@ fn is_any_lvalue() -> bool {
}
}
fn
immediate_rvalue
(
val
:
ValueRef
,
ty
:
ty
::
t
)
->
Datum
{
pub
fn
immediate_rvalue
(
val
:
ValueRef
,
ty
:
ty
::
t
)
->
Datum
{
return
Datum
{
val
:
val
,
ty
:
ty
,
mode
:
ByValue
,
source
:
FromRvalue
};
}
fn
immediate_rvalue_bcx
(
bcx
:
block
,
val
:
ValueRef
,
ty
:
ty
::
t
)
->
DatumBlock
{
pub
fn
immediate_rvalue_bcx
(
bcx
:
block
,
val
:
ValueRef
,
ty
:
ty
::
t
)
->
DatumBlock
{
return
DatumBlock
{
bcx
:
bcx
,
datum
:
immediate_rvalue
(
val
,
ty
)};
}
fn
scratch_datum
(
bcx
:
block
,
ty
:
ty
::
t
,
zero
:
bool
)
->
Datum
{
pub
fn
scratch_datum
(
bcx
:
block
,
ty
:
ty
::
t
,
zero
:
bool
)
->
Datum
{
/*!
*
* Allocates temporary space on the stack using alloca() and
...
...
@@ -221,7 +224,7 @@ fn scratch_datum(bcx: block, ty: ty::t, zero: bool) -> Datum {
Datum
{
val
:
scratch
,
ty
:
ty
,
mode
:
ByRef
,
source
:
FromRvalue
}
}
fn
appropriate_mode
(
ty
:
ty
::
t
)
->
DatumMode
{
pub
fn
appropriate_mode
(
ty
:
ty
::
t
)
->
DatumMode
{
/*!
*
* Indicates the "appropriate" mode for this value,
...
...
@@ -237,7 +240,7 @@ fn appropriate_mode(ty: ty::t) -> DatumMode {
}
}
impl
Datum
{
pub
impl
Datum
{
fn
store_will_move
()
->
bool
{
match
self
.source
{
FromRvalue
|
FromLastUseLvalue
=>
true
,
...
...
@@ -348,7 +351,7 @@ fn copy_to_no_check(bcx: block, action: CopyAction,
Store
(
bcx
,
self
.val
,
dst
);
}
ByRef
=>
{
memcpy_ty
(
bcx
,
dst
,
self
.val
,
self
.ty
);
base
::
memcpy_ty
(
bcx
,
dst
,
self
.val
,
self
.ty
);
}
}
...
...
@@ -375,7 +378,7 @@ fn move_to(bcx: block, action: CopyAction, dst: ValueRef) -> block {
match
self
.mode
{
ByRef
=>
{
glu
e
::
memcpy_ty
(
bcx
,
dst
,
self
.val
,
self
.ty
);
bas
e
::
memcpy_ty
(
bcx
,
dst
,
self
.val
,
self
.ty
);
}
ByValue
=>
{
Store
(
bcx
,
self
.val
,
dst
);
...
...
@@ -823,7 +826,7 @@ fn to_result(bcx: block) -> common::Result {
}
}
impl
DatumBlock
{
pub
impl
DatumBlock
{
fn
unpack
(
bcx
:
&
mut
block
)
->
Datum
{
*
bcx
=
self
.bcx
;
return
self
.datum
;
...
...
@@ -871,7 +874,7 @@ fn to_str() -> ~str {
}
}
impl
CopyAction
:
cmp
::
Eq
{
pub
impl
CopyAction
:
cmp
::
Eq
{
pure
fn
eq
(
&
self
,
other
:
&
CopyAction
)
->
bool
{
match
((
*
self
),
(
*
other
))
{
(
INIT
,
INIT
)
=>
true
,
...
...
src/librustc/middle/trans/expr.rs
浏览文件 @
a47fa9b3
...
...
@@ -137,20 +137,6 @@
use
syntax
::
ast
;
use
syntax
::
ast
::
spanned
;
// The primary two functions for translating expressions:
export
trans_to_datum
,
trans_into
;
// More specific variants than trans_to_datum/trans_into that are useful
// in some scenarios:
export
trans_local_var
;
// Other helpers, types, and so forth:
export
with_field_tys
;
export
Dest
,
SaveIn
,
Ignore
;
export
cast_type_kind
;
export
cast_kind
,
cast_pointer
,
cast_integral
,
cast_float
;
export
cast_enum
,
cast_other
;
// Destinations
// These are passed around by the code generating functions to track the
...
...
@@ -158,7 +144,7 @@
fn
macros
()
{
include!
(
"macros.rs"
);
}
// FIXME(#3114): Macro import/export.
enum
Dest
{
pub
enum
Dest
{
SaveIn
(
ValueRef
),
Ignore
,
}
...
...
@@ -190,7 +176,7 @@ fn drop_and_cancel_clean(bcx: block, dat: Datum) -> block {
return
bcx
;
}
fn
trans_to_datum
(
bcx
:
block
,
expr
:
@
ast
::
expr
)
->
DatumBlock
{
pub
fn
trans_to_datum
(
bcx
:
block
,
expr
:
@
ast
::
expr
)
->
DatumBlock
{
debug!
(
"trans_to_datum(expr=%s)"
,
bcx
.expr_to_str
(
expr
));
return
match
bcx
.tcx
()
.adjustments
.find
(
expr
.id
)
{
None
=>
{
...
...
@@ -271,7 +257,7 @@ fn auto_slice_and_ref(bcx: block, datum: Datum) -> DatumBlock {
}
}
fn
trans_into
(
bcx
:
block
,
expr
:
@
ast
::
expr
,
dest
:
Dest
)
->
block
{
pub
fn
trans_into
(
bcx
:
block
,
expr
:
@
ast
::
expr
,
dest
:
Dest
)
->
block
{
return
match
bcx
.tcx
()
.adjustments
.find
(
expr
.id
)
{
None
=>
trans_into_unadjusted
(
bcx
,
expr
,
dest
),
Some
(
_
)
=>
{
...
...
@@ -830,10 +816,10 @@ fn trans_def_lvalue(bcx: block,
}
}
fn
trans_local_var
(
bcx
:
block
,
def
:
ast
::
def
,
expr_id_opt
:
Option
<
ast
::
node_id
>
)
->
Datum
{
pub
fn
trans_local_var
(
bcx
:
block
,
def
:
ast
::
def
,
expr_id_opt
:
Option
<
ast
::
node_id
>
)
->
Datum
{
let
_
icx
=
bcx
.insn_ctxt
(
"trans_local_var"
);
return
match
def
{
...
...
@@ -949,10 +935,10 @@ fn fn_data_to_datum(bcx: block,
// The optional node ID here is the node ID of the path identifying the enum
// variant in use. If none, this cannot possibly an enum variant (so, if it
// is and `node_id_opt` is none, this function fails).
fn
with_field_tys
<
R
>
(
tcx
:
ty
::
ctxt
,
ty
:
ty
::
t
,
node_id_opt
:
Option
<
ast
::
node_id
>
,
op
:
fn
(
bool
,
(
&
[
ty
::
field
]))
->
R
)
->
R
{
pub
fn
with_field_tys
<
R
>
(
tcx
:
ty
::
ctxt
,
ty
:
ty
::
t
,
node_id_opt
:
Option
<
ast
::
node_id
>
,
op
:
fn
(
bool
,
(
&
[
ty
::
field
]))
->
R
)
->
R
{
match
ty
::
get
(
ty
)
.sty
{
ty
::
ty_rec
(
ref
fields
)
=>
{
op
(
false
,
*
fields
)
...
...
@@ -1521,7 +1507,7 @@ fn float_cast(bcx: block, lldsttype: TypeRef, llsrctype: TypeRef,
}
else
{
llsrc
};
}
enum
cast_kind
{
pub
enum
cast_kind
{
cast_pointer
,
cast_integral
,
cast_float
,
...
...
@@ -1547,7 +1533,7 @@ impl cast_kind : cmp::Eq {
pure
fn
ne
(
&
self
,
other
:
&
cast_kind
)
->
bool
{
!
(
*
self
)
.eq
(
other
)
}
}
fn
cast_type_kind
(
t
:
ty
::
t
)
->
cast_kind
{
pub
fn
cast_type_kind
(
t
:
ty
::
t
)
->
cast_kind
{
match
ty
::
get
(
t
)
.sty
{
ty
::
ty_float
(
*
)
=>
cast_float
,
ty
::
ty_ptr
(
*
)
=>
cast_pointer
,
...
...
src/librustc/middle/trans/glue.rs
浏览文件 @
a47fa9b3
...
...
@@ -28,7 +28,7 @@
use
core
::
io
;
use
core
::
str
;
fn
trans_free
(
cx
:
block
,
v
:
ValueRef
)
->
block
{
pub
fn
trans_free
(
cx
:
block
,
v
:
ValueRef
)
->
block
{
let
_
icx
=
cx
.insn_ctxt
(
"trans_free"
);
callee
::
trans_rtcall_or_lang_call
(
cx
,
...
...
@@ -37,7 +37,7 @@ fn trans_free(cx: block, v: ValueRef) -> block {
expr
::
Ignore
)
}
fn
trans_unique_free
(
cx
:
block
,
v
:
ValueRef
)
->
block
{
pub
fn
trans_unique_free
(
cx
:
block
,
v
:
ValueRef
)
->
block
{
let
_
icx
=
cx
.insn_ctxt
(
"trans_unique_free"
);
callee
::
trans_rtcall_or_lang_call
(
cx
,
...
...
@@ -46,7 +46,7 @@ fn trans_unique_free(cx: block, v: ValueRef) -> block {
expr
::
Ignore
)
}
fn
take_ty
(
cx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
pub
fn
take_ty
(
cx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
// NB: v is an *alias* of type t here, not a direct value.
let
_
icx
=
cx
.insn_ctxt
(
"take_ty"
);
if
ty
::
type_needs_drop
(
cx
.tcx
(),
t
)
{
...
...
@@ -55,7 +55,7 @@ fn take_ty(cx: block, v: ValueRef, t: ty::t) -> block {
return
cx
;
}
fn
drop_ty
(
cx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
pub
fn
drop_ty
(
cx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
// NB: v is an *alias* of type t here, not a direct value.
let
_
icx
=
cx
.insn_ctxt
(
"drop_ty"
);
if
ty
::
type_needs_drop
(
cx
.tcx
(),
t
)
{
...
...
@@ -64,7 +64,11 @@ fn drop_ty(cx: block, v: ValueRef, t: ty::t) -> block {
return
cx
;
}
fn
drop_ty_root
(
bcx
:
block
,
v
:
ValueRef
,
rooted
:
bool
,
t
:
ty
::
t
)
->
block
{
pub
fn
drop_ty_root
(
bcx
:
block
,
v
:
ValueRef
,
rooted
:
bool
,
t
:
ty
::
t
)
->
block
{
if
rooted
{
// NB: v is a raw ptr to an addrspace'd ptr to the value.
let
v
=
PointerCast
(
bcx
,
Load
(
bcx
,
v
),
T_ptr
(
type_of
(
bcx
.ccx
(),
t
)));
...
...
@@ -74,7 +78,7 @@ fn drop_ty_root(bcx: block, v: ValueRef, rooted: bool, t: ty::t) -> block {
}
}
fn
drop_ty_immediate
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
pub
fn
drop_ty_immediate
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"drop_ty_immediate"
);
match
ty
::
get
(
t
)
.sty
{
ty
::
ty_uniq
(
_
)
|
...
...
@@ -91,7 +95,7 @@ fn drop_ty_immediate(bcx: block, v: ValueRef, t: ty::t) -> block {
}
}
fn
take_ty_immediate
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
Result
{
pub
fn
take_ty_immediate
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
Result
{
let
_
icx
=
bcx
.insn_ctxt
(
"take_ty_immediate"
);
match
ty
::
get
(
t
)
.sty
{
ty
::
ty_box
(
_
)
|
ty
::
ty_opaque_box
|
...
...
@@ -111,7 +115,7 @@ fn take_ty_immediate(bcx: block, v: ValueRef, t: ty::t) -> Result {
}
}
fn
free_ty
(
cx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
pub
fn
free_ty
(
cx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
// NB: v is an *alias* of type t here, not a direct value.
let
_
icx
=
cx
.insn_ctxt
(
"free_ty"
);
if
ty
::
type_needs_drop
(
cx
.tcx
(),
t
)
{
...
...
@@ -120,7 +124,7 @@ fn free_ty(cx: block, v: ValueRef, t: ty::t) -> block {
return
cx
;
}
fn
free_ty_immediate
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
pub
fn
free_ty_immediate
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"free_ty_immediate"
);
match
ty
::
get
(
t
)
.sty
{
ty
::
ty_uniq
(
_
)
|
...
...
@@ -138,16 +142,15 @@ fn free_ty_immediate(bcx: block, v: ValueRef, t: ty::t) -> block {
}
}
fn
lazily_emit_all_tydesc_glue
(
ccx
:
@
crate_ctxt
,
static_ti
:
@
tydesc_info
)
{
pub
fn
lazily_emit_all_tydesc_glue
(
ccx
:
@
crate_ctxt
,
static_ti
:
@
tydesc_info
)
{
lazily_emit_tydesc_glue
(
ccx
,
abi
::
tydesc_field_take_glue
,
static_ti
);
lazily_emit_tydesc_glue
(
ccx
,
abi
::
tydesc_field_drop_glue
,
static_ti
);
lazily_emit_tydesc_glue
(
ccx
,
abi
::
tydesc_field_free_glue
,
static_ti
);
lazily_emit_tydesc_glue
(
ccx
,
abi
::
tydesc_field_visit_glue
,
static_ti
);
}
fn
simplified_glue_type
(
tcx
:
ty
::
ctxt
,
field
:
uint
,
t
:
ty
::
t
)
->
ty
::
t
{
pub
fn
simplified_glue_type
(
tcx
:
ty
::
ctxt
,
field
:
uint
,
t
:
ty
::
t
)
->
ty
::
t
{
if
(
field
==
abi
::
tydesc_field_take_glue
||
field
==
abi
::
tydesc_field_drop_glue
||
field
==
abi
::
tydesc_field_free_glue
)
&&
...
...
@@ -200,16 +203,17 @@ fn simplified_glue_type(tcx: ty::ctxt, field: uint, t: ty::t) -> ty::t {
return
t
;
}
pure
fn
cast_glue
(
ccx
:
@
crate_ctxt
,
ti
:
@
tydesc_info
,
v
:
ValueRef
)
->
ValueRef
{
pu
b
pu
re
fn
cast_glue
(
ccx
:
@
crate_ctxt
,
ti
:
@
tydesc_info
,
v
:
ValueRef
)
->
ValueRef
{
unsafe
{
let
llfnty
=
type_of_glue_fn
(
ccx
,
ti
.ty
);
llvm
::
LLVMConstPointerCast
(
v
,
T_ptr
(
llfnty
))
}
}
fn
lazily_emit_simplified_tydesc_glue
(
ccx
:
@
crate_ctxt
,
field
:
uint
,
ti
:
@
tydesc_info
)
->
bool
{
pub
fn
lazily_emit_simplified_tydesc_glue
(
ccx
:
@
crate_ctxt
,
field
:
uint
,
ti
:
@
tydesc_info
)
->
bool
{
let
_
icx
=
ccx
.insn_ctxt
(
"lazily_emit_simplified_tydesc_glue"
);
let
simpl
=
simplified_glue_type
(
ccx
.tcx
,
field
,
ti
.ty
);
if
simpl
!=
ti
.ty
{
...
...
@@ -234,8 +238,9 @@ fn lazily_emit_simplified_tydesc_glue(ccx: @crate_ctxt, field: uint,
}
fn
lazily_emit_tydesc_glue
(
ccx
:
@
crate_ctxt
,
field
:
uint
,
ti
:
@
tydesc_info
)
{
pub
fn
lazily_emit_tydesc_glue
(
ccx
:
@
crate_ctxt
,
field
:
uint
,
ti
:
@
tydesc_info
)
{
let
_
icx
=
ccx
.insn_ctxt
(
"lazily_emit_tydesc_glue"
);
let
llfnty
=
type_of_glue_fn
(
ccx
,
ti
.ty
);
...
...
@@ -299,8 +304,8 @@ fn lazily_emit_tydesc_glue(ccx: @crate_ctxt, field: uint,
}
// See [Note-arg-mode]
fn
call_tydesc_glue_full
(
++
bcx
:
block
,
v
:
ValueRef
,
tydesc
:
ValueRef
,
field
:
uint
,
static_ti
:
Option
<@
tydesc_info
>
)
{
pub
fn
call_tydesc_glue_full
(
++
bcx
:
block
,
v
:
ValueRef
,
tydesc
:
ValueRef
,
field
:
uint
,
static_ti
:
Option
<@
tydesc_info
>
)
{
let
_
icx
=
bcx
.insn_ctxt
(
"call_tydesc_glue_full"
);
let
ccx
=
bcx
.ccx
();
// NB: Don't short-circuit even if this block is unreachable because
...
...
@@ -363,7 +368,7 @@ fn call_tydesc_glue_full(++bcx: block, v: ValueRef, tydesc: ValueRef,
}
// See [Note-arg-mode]
fn
call_tydesc_glue
(
++
cx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
,
field
:
uint
)
pub
fn
call_tydesc_glue
(
++
cx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
,
field
:
uint
)
->
block
{
let
_
icx
=
cx
.insn_ctxt
(
"call_tydesc_glue"
);
let
ti
=
get_tydesc
(
cx
.ccx
(),
t
);
...
...
@@ -371,7 +376,7 @@ fn call_tydesc_glue(++cx: block, v: ValueRef, t: ty::t, field: uint)
return
cx
;
}
fn
make_visit_glue
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
{
pub
fn
make_visit_glue
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
{
let
_
icx
=
bcx
.insn_ctxt
(
"make_visit_glue"
);
let
mut
bcx
=
bcx
;
let
ty_visitor_name
=
special_idents
::
ty_visitor
;
...
...
@@ -382,7 +387,7 @@ fn make_visit_glue(bcx: block, v: ValueRef, t: ty::t) {
build_return
(
bcx
);
}
fn
make_free_glue
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
{
pub
fn
make_free_glue
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
{
// NB: v0 is an *alias* of type t here, not a direct value.
let
_
icx
=
bcx
.insn_ctxt
(
"make_free_glue"
);
let
ccx
=
bcx
.ccx
();
...
...
@@ -437,12 +442,13 @@ fn make_free_glue(bcx: block, v: ValueRef, t: ty::t) {
build_return
(
bcx
);
}
fn
trans_struct_drop
(
bcx
:
block
,
v0
:
ValueRef
,
dtor_did
:
ast
::
def_id
,
class_did
:
ast
::
def_id
,
substs
:
&
ty
::
substs
,
take_ref
:
bool
)
->
block
{
pub
fn
trans_struct_drop
(
bcx
:
block
,
v0
:
ValueRef
,
dtor_did
:
ast
::
def_id
,
class_did
:
ast
::
def_id
,
substs
:
&
ty
::
substs
,
take_ref
:
bool
)
->
block
{
let
drop_flag
=
GEPi
(
bcx
,
v0
,
struct_dtor
());
do
with_cond
(
bcx
,
IsNotNull
(
bcx
,
Load
(
bcx
,
drop_flag
)))
|
cx
|
{
let
mut
bcx
=
cx
;
...
...
@@ -491,7 +497,7 @@ fn trans_struct_drop(bcx: block,
}
fn
make_drop_glue
(
bcx
:
block
,
v0
:
ValueRef
,
t
:
ty
::
t
)
{
pub
fn
make_drop_glue
(
bcx
:
block
,
v0
:
ValueRef
,
t
:
ty
::
t
)
{
// NB: v0 is an *alias* of type t here, not a direct value.
let
_
icx
=
bcx
.insn_ctxt
(
"make_drop_glue"
);
let
ccx
=
bcx
.ccx
();
...
...
@@ -549,7 +555,10 @@ fn make_drop_glue(bcx: block, v0: ValueRef, t: ty::t) {
build_return
(
bcx
);
}
fn
decr_refcnt_maybe_free
(
bcx
:
block
,
box_ptr
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
pub
fn
decr_refcnt_maybe_free
(
bcx
:
block
,
box_ptr
:
ValueRef
,
t
:
ty
::
t
)
->
block
{
let
_
icx
=
bcx
.insn_ctxt
(
"decr_refcnt_maybe_free"
);
let
ccx
=
bcx
.ccx
();
...
...
@@ -563,7 +572,7 @@ fn decr_refcnt_maybe_free(bcx: block, box_ptr: ValueRef, t: ty::t) -> block {
}
fn
make_take_glue
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
{
pub
fn
make_take_glue
(
bcx
:
block
,
v
:
ValueRef
,
t
:
ty
::
t
)
{
let
_
icx
=
bcx
.insn_ctxt
(
"make_take_glue"
);
// NB: v is a *pointer* to type t here, not a direct value.
let
bcx
=
match
ty
::
get
(
t
)
.sty
{
...
...
@@ -612,7 +621,7 @@ fn make_take_glue(bcx: block, v: ValueRef, t: ty::t) {
build_return
(
bcx
);
}
fn
incr_refcnt_of_boxed
(
cx
:
block
,
box_ptr
:
ValueRef
)
{
pub
fn
incr_refcnt_of_boxed
(
cx
:
block
,
box_ptr
:
ValueRef
)
{
let
_
icx
=
cx
.insn_ctxt
(
"incr_refcnt_of_boxed"
);
let
ccx
=
cx
.ccx
();
let
rc_ptr
=
GEPi
(
cx
,
box_ptr
,
[
0u
,
abi
::
box_field_refcnt
]);
...
...
@@ -623,7 +632,7 @@ fn incr_refcnt_of_boxed(cx: block, box_ptr: ValueRef) {
// Chooses the addrspace for newly declared types.
fn
declare_tydesc_addrspace
(
ccx
:
@
crate_ctxt
,
t
:
ty
::
t
)
->
addrspace
{
pub
fn
declare_tydesc_addrspace
(
ccx
:
@
crate_ctxt
,
t
:
ty
::
t
)
->
addrspace
{
if
!
ty
::
type_needs_drop
(
ccx
.tcx
,
t
)
{
return
default_addrspace
;
}
else
if
ty
::
type_is_immediate
(
t
)
{
...
...
@@ -637,7 +646,7 @@ fn declare_tydesc_addrspace(ccx: @crate_ctxt, t: ty::t) -> addrspace {
}
// Generates the declaration for (but doesn't emit) a type descriptor.
fn
declare_tydesc
(
ccx
:
@
crate_ctxt
,
t
:
ty
::
t
)
->
@
tydesc_info
{
pub
fn
declare_tydesc
(
ccx
:
@
crate_ctxt
,
t
:
ty
::
t
)
->
@
tydesc_info
{
let
_
icx
=
ccx
.insn_ctxt
(
"declare_tydesc"
);
// If emit_tydescs already ran, then we shouldn't be creating any new
// tydescs.
...
...
@@ -682,10 +691,10 @@ fn declare_tydesc(ccx: @crate_ctxt, t: ty::t) -> @tydesc_info {
return
inf
;
}
type
glue_helper
=
fn
@
(
block
,
ValueRef
,
ty
::
t
);
pub
type
glue_helper
=
fn
@
(
block
,
ValueRef
,
ty
::
t
);
fn
declare_generic_glue
(
ccx
:
@
crate_ctxt
,
t
:
ty
::
t
,
llfnty
:
TypeRef
,
+
name
:
~
str
)
->
ValueRef
{
pub
fn
declare_generic_glue
(
ccx
:
@
crate_ctxt
,
t
:
ty
::
t
,
llfnty
:
TypeRef
,
+
name
:
~
str
)
->
ValueRef
{
let
_
icx
=
ccx
.insn_ctxt
(
"declare_generic_glue"
);
let
name
=
name
;
let
mut
fn_nm
;
...
...
@@ -703,8 +712,11 @@ fn declare_generic_glue(ccx: @crate_ctxt, t: ty::t, llfnty: TypeRef,
return
llfn
;
}
fn
make_generic_glue_inner
(
ccx
:
@
crate_ctxt
,
t
:
ty
::
t
,
llfn
:
ValueRef
,
helper
:
glue_helper
)
->
ValueRef
{
pub
fn
make_generic_glue_inner
(
ccx
:
@
crate_ctxt
,
t
:
ty
::
t
,
llfn
:
ValueRef
,
helper
:
glue_helper
)
->
ValueRef
{
let
_
icx
=
ccx
.insn_ctxt
(
"make_generic_glue_inner"
);
let
fcx
=
new_fn_ctxt
(
ccx
,
~
[],
llfn
,
None
);
lib
::
llvm
::
SetLinkage
(
llfn
,
lib
::
llvm
::
InternalLinkage
);
...
...
@@ -725,9 +737,9 @@ fn make_generic_glue_inner(ccx: @crate_ctxt, t: ty::t,
return
llfn
;
}
fn
make_generic_glue
(
ccx
:
@
crate_ctxt
,
t
:
ty
::
t
,
llfn
:
ValueRef
,
helper
:
glue_helper
,
name
:
~
str
)
->
ValueRef
{
pub
fn
make_generic_glue
(
ccx
:
@
crate_ctxt
,
t
:
ty
::
t
,
llfn
:
ValueRef
,
helper
:
glue_helper
,
name
:
~
str
)
->
ValueRef
{
let
_
icx
=
ccx
.insn_ctxt
(
"make_generic_glue"
);
if
!
ccx
.sess
.trans_stats
()
{
return
make_generic_glue_inner
(
ccx
,
t
,
llfn
,
helper
);
...
...
@@ -741,7 +753,7 @@ fn make_generic_glue(ccx: @crate_ctxt, t: ty::t, llfn: ValueRef,
return
llval
;
}
fn
emit_tydescs
(
ccx
:
@
crate_ctxt
)
{
pub
fn
emit_tydescs
(
ccx
:
@
crate_ctxt
)
{
let
_
icx
=
ccx
.insn_ctxt
(
"emit_tydescs"
);
// As of this point, allow no more tydescs to be created.
ccx
.finished_tydescs
=
true
;
...
...
src/librustc/middle/trans/inline.rs
浏览文件 @
a47fa9b3
...
...
@@ -27,8 +27,8 @@
// `translate` will be true if this function is allowed to translate the
// item and false otherwise. Currently, this parameter is set to false when
// translating default methods.
fn
maybe_instantiate_inline
(
ccx
:
@
crate_ctxt
,
fn_id
:
ast
::
def_id
,
translate
:
bool
)
pub
fn
maybe_instantiate_inline
(
ccx
:
@
crate_ctxt
,
fn_id
:
ast
::
def_id
,
translate
:
bool
)
->
ast
::
def_id
{
let
_
icx
=
ccx
.insn_ctxt
(
"maybe_instantiate_inline"
);
match
ccx
.external
.find
(
fn_id
)
{
...
...
src/librustc/middle/trans/monomorphize.rs
浏览文件 @
a47fa9b3
...
...
@@ -36,13 +36,13 @@
use
syntax
::
ast_util
::
local_def
;
use
syntax
::
parse
::
token
::
special_idents
;
fn
monomorphic_fn
(
ccx
:
@
crate_ctxt
,
fn_id
:
ast
::
def_id
,
real_substs
:
~
[
ty
::
t
],
vtables
:
Option
<
typeck
::
vtable_res
>
,
impl_did_opt
:
Option
<
ast
::
def_id
>
,
ref_id
:
Option
<
ast
::
node_id
>
)
->
{
val
:
ValueRef
,
must_cast
:
bool
}
{
pub
fn
monomorphic_fn
(
ccx
:
@
crate_ctxt
,
fn_id
:
ast
::
def_id
,
real_substs
:
~
[
ty
::
t
],
vtables
:
Option
<
typeck
::
vtable_res
>
,
impl_did_opt
:
Option
<
ast
::
def_id
>
,
ref_id
:
Option
<
ast
::
node_id
>
)
->
{
val
:
ValueRef
,
must_cast
:
bool
}
{
let
_
icx
=
ccx
.insn_ctxt
(
"monomorphic_fn"
);
let
mut
must_cast
=
false
;
let
substs
=
vec
::
map
(
real_substs
,
|
t
|
{
...
...
@@ -268,7 +268,8 @@ fn monomorphic_fn(ccx: @crate_ctxt,
{
val
:
lldecl
,
must_cast
:
must_cast
}
}
fn
normalize_for_monomorphization
(
tcx
:
ty
::
ctxt
,
ty
:
ty
::
t
)
->
Option
<
ty
::
t
>
{
pub
fn
normalize_for_monomorphization
(
tcx
:
ty
::
ctxt
,
ty
:
ty
::
t
)
->
Option
<
ty
::
t
>
{
// FIXME[mono] could do this recursively. is that worthwhile? (#2529)
match
ty
::
get
(
ty
)
.sty
{
ty
::
ty_box
(
*
)
=>
{
...
...
@@ -305,10 +306,10 @@ fn normalize_for_monomorphization(tcx: ty::ctxt, ty: ty::t) -> Option<ty::t> {
}
}
fn
make_mono_id
(
ccx
:
@
crate_ctxt
,
item
:
ast
::
def_id
,
substs
:
~
[
ty
::
t
],
vtables
:
Option
<
typeck
::
vtable_res
>
,
impl_did_opt
:
Option
<
ast
::
def_id
>
,
param_uses
:
Option
<~
[
type_use
::
type_uses
]
>
)
->
mono_id
{
pub
fn
make_mono_id
(
ccx
:
@
crate_ctxt
,
item
:
ast
::
def_id
,
substs
:
~
[
ty
::
t
],
vtables
:
Option
<
typeck
::
vtable_res
>
,
impl_did_opt
:
Option
<
ast
::
def_id
>
,
param_uses
:
Option
<~
[
type_use
::
type_uses
]
>
)
->
mono_id
{
let
precise_param_ids
=
match
vtables
{
Some
(
vts
)
=>
{
let
bounds
=
ty
::
lookup_item_type
(
ccx
.tcx
,
item
)
.bounds
;
...
...
src/librustc/rustc.rc
浏览文件 @
a47fa9b3
...
...
@@ -50,19 +50,12 @@ use back_ = back;
pub mod middle {
pub mod trans {
#[legacy_exports]
pub mod inline;
#[legacy_exports]
pub mod monomorphize;
#[legacy_exports]
pub mod controlflow;
#[legacy_exports]
pub mod glue;
#[legacy_exports]
pub mod datum;
#[legacy_exports]
pub mod callee;
#[legacy_exports]
pub mod expr;
#[legacy_exports]
pub mod common;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录