Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
e42afd31
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,发现更多精彩内容 >>
提交
e42afd31
编写于
3月 08, 2013
作者:
J
Jed Davis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Let const_deref "dereference" newtypes.
上级
5ca1d353
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
47 addition
and
10 deletion
+47
-10
src/librustc/middle/trans/consts.rs
src/librustc/middle/trans/consts.rs
+47
-10
未找到文件。
src/librustc/middle/trans/consts.rs
浏览文件 @
e42afd31
...
...
@@ -106,15 +106,46 @@ fn const_addr_of(cx: @CrateContext, cv: ValueRef) -> ValueRef {
}
}
pub
fn
const_deref
(
cx
:
@
CrateContext
,
v
:
ValueRef
)
->
ValueRef
{
fn
const_deref_ptr
(
cx
:
@
CrateContext
,
v
:
ValueRef
)
->
ValueRef
{
let
v
=
match
cx
.const_globals
.find
(
&
(
v
as
int
))
{
Some
(
v
)
=>
v
,
None
=>
v
};
unsafe
{
let
v
=
match
cx
.const_globals
.find
(
&
(
v
as
int
))
{
Some
(
v
)
=>
v
,
None
=>
v
};
fail_unless!
(
llvm
::
LLVMIsGlobalConstant
(
v
)
==
True
);
let
v
=
llvm
::
LLVMGetInitializer
(
v
);
v
llvm
::
LLVMGetInitializer
(
v
)
}
}
fn
const_deref_newtype
(
cx
:
@
CrateContext
,
v
:
ValueRef
,
t
:
ty
::
t
)
->
ValueRef
{
let
repr
=
adt
::
represent_type
(
cx
,
t
);
adt
::
const_get_field
(
cx
,
repr
,
v
,
0
,
0
)
}
fn
const_deref
(
cx
:
@
CrateContext
,
v
:
ValueRef
,
t
:
ty
::
t
,
explicit
:
bool
)
->
(
ValueRef
,
ty
::
t
)
{
match
ty
::
deref
(
cx
.tcx
,
t
,
explicit
)
{
Some
(
ref
mt
)
=>
{
fail_unless!
(
mt
.mutbl
!=
ast
::
m_mutbl
);
let
dv
=
match
ty
::
get
(
t
)
.sty
{
ty
::
ty_ptr
(
*
)
|
ty
::
ty_rptr
(
*
)
=>
{
const_deref_ptr
(
cx
,
v
)
}
ty
::
ty_enum
(
*
)
|
ty
::
ty_struct
(
*
)
=>
{
const_deref_newtype
(
cx
,
v
,
t
)
}
_
=>
{
cx
.sess
.bug
(
fmt!
(
"Unexpected dereferenceable type %s"
,
ty_to_str
(
cx
.tcx
,
t
)))
}
};
(
dv
,
mt
.ty
)
}
None
=>
{
cx
.sess
.bug
(
fmt!
(
"Can't dereference const of type %s"
,
ty_to_str
(
cx
.tcx
,
t
)))
}
}
}
...
...
@@ -150,8 +181,11 @@ pub fn const_expr(cx: @CrateContext, e: @ast::expr) -> ValueRef {
region %? sigil %?"
,
*
r
,
*
s
))
}
Some
(
@
ty
::
AutoDerefRef
(
ref
adj
))
=>
{
let
mut
ty
=
ety
;
for
adj
.autoderefs.times
{
llconst
=
const_deref
(
cx
,
llconst
)
let
(
dv
,
dt
)
=
const_deref
(
cx
,
llconst
,
ty
,
false
);
llconst
=
dv
;
ty
=
dt
;
}
match
adj
.autoref
{
...
...
@@ -263,7 +297,10 @@ fn const_expr_unadjusted(cx: @CrateContext, e: @ast::expr) -> ValueRef {
return
match
u
{
ast
::
box
(
_
)
|
ast
::
uniq
(
_
)
|
ast
::
deref
=>
const_deref
(
cx
,
te
),
ast
::
deref
=>
{
let
(
dv
,
_
dt
)
=
const_deref
(
cx
,
te
,
ty
,
true
);
dv
}
ast
::
not
=>
{
match
ty
::
get
(
ty
)
.sty
{
ty
::
ty_bool
=>
{
...
...
@@ -313,7 +350,7 @@ fn const_expr_unadjusted(cx: @CrateContext, e: @ast::expr) -> ValueRef {
let
llunitty
=
type_of
::
type_of
(
cx
,
unit_ty
);
let
unit_sz
=
machine
::
llsize_of
(
cx
,
llunitty
);
(
const_deref
(
cx
,
const_get_elt
(
cx
,
bv
,
[
0
])),
(
const_deref
_ptr
(
cx
,
const_get_elt
(
cx
,
bv
,
[
0
])),
llvm
::
LLVMConstUDiv
(
const_get_elt
(
cx
,
bv
,
[
1
]),
unit_sz
))
},
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录