Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
6840b480
R
Rust
项目概览
int
/
Rust
12 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
6840b480
编写于
2月 28, 2013
作者:
J
Jed Davis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
trans_cast_to_int is hard to explain; make it trans_get_discr instead.
上级
8dca7be1
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
10 addition
and
12 deletion
+10
-12
src/librustc/middle/trans/adt.rs
src/librustc/middle/trans/adt.rs
+9
-11
src/librustc/middle/trans/expr.rs
src/librustc/middle/trans/expr.rs
+1
-1
未找到文件。
src/librustc/middle/trans/adt.rs
浏览文件 @
6840b480
...
...
@@ -231,14 +231,16 @@ fn generic_fields_of(cx: @CrateContext, r: &Repr, sizing: bool)
}
/**
* Obtain as much of a "discriminant" as this representation has.
* Obtain a representation of the discriminant sufficient to translate
* destructuring; this may or may not involve the actual discriminant.
*
* This should ideally be less tightly tied to `_match`.
*/
pub
fn
trans_switch
(
bcx
:
block
,
r
:
&
Repr
,
scrutinee
:
ValueRef
)
->
(
_
match
::
branch_kind
,
Option
<
ValueRef
>
)
{
match
*
r
{
CEnum
(
*
)
|
General
(
*
)
=>
{
(
_
match
::
switch
,
Some
(
trans_
cast_to_int
(
bcx
,
r
,
scrutinee
)))
(
_
match
::
switch
,
Some
(
trans_
get_discr
(
bcx
,
r
,
scrutinee
)))
}
Unit
(
*
)
|
Univariant
(
*
)
=>
{
(
_
match
::
single
,
None
)
...
...
@@ -246,24 +248,19 @@ pub fn trans_switch(bcx: block, r: &Repr, scrutinee: ValueRef)
}
}
/**
* If the representation is potentially of a C-like enum, implement
* coercion to numeric types.
*/
pub
fn
trans_cast_to_int
(
bcx
:
block
,
r
:
&
Repr
,
scrutinee
:
ValueRef
)
/// Obtain the actual discriminant of a value.
pub
fn
trans_get_discr
(
bcx
:
block
,
r
:
&
Repr
,
scrutinee
:
ValueRef
)
->
ValueRef
{
match
*
r
{
Unit
(
the_disc
)
=>
C_int
(
bcx
.ccx
(),
the_disc
),
CEnum
(
min
,
max
)
=>
load_discr
(
bcx
,
scrutinee
,
min
,
max
),
Univariant
(
*
)
=>
bcx
.ccx
()
.sess
.bug
(
~
"type has no explicit
\
discriminant"
),
// Note: this case is used internally by trans_switch,
// even though it shouldn't be reached by an external caller.
Univariant
(
*
)
=>
C_int
(
bcx
.ccx
(),
0
),
General
(
ref
cases
)
=>
load_discr
(
bcx
,
scrutinee
,
0
,
(
cases
.len
()
-
1
)
as
int
)
}
}
/// Helper for cases where the discriminant is simply loaded.
fn
load_discr
(
bcx
:
block
,
scrutinee
:
ValueRef
,
min
:
int
,
max
:
int
)
->
ValueRef
{
let
ptr
=
GEPi
(
bcx
,
scrutinee
,
[
0
,
0
]);
...
...
@@ -285,6 +282,7 @@ fn load_discr(bcx: block, scrutinee: ValueRef, min: int, max: int)
/**
* Yield information about how to dispatch a case of the
* discriminant-like value returned by `trans_switch`.
*
* This should ideally be less tightly tied to `_match`.
*/
pub
fn
trans_case
(
bcx
:
block
,
r
:
&
Repr
,
discr
:
int
)
->
_
match
::
opt_result
{
...
...
src/librustc/middle/trans/expr.rs
浏览文件 @
6840b480
...
...
@@ -1645,7 +1645,7 @@ fn trans_imm_cast(bcx: block, expr: @ast::expr,
(
cast_enum
,
cast_float
)
=>
{
let
bcx
=
bcx
;
let
repr
=
adt
::
represent_type
(
ccx
,
t_in
);
let
lldiscrim_a
=
adt
::
trans_
cast_to_int
(
bcx
,
repr
,
llexpr
);
let
lldiscrim_a
=
adt
::
trans_
get_discr
(
bcx
,
repr
,
llexpr
);
match
k_out
{
cast_integral
=>
int_cast
(
bcx
,
ll_t_out
,
val_ty
(
lldiscrim_a
),
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录