Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
0a93a48f
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,发现更多精彩内容 >>
提交
0a93a48f
编写于
8月 22, 2011
作者:
B
Brian Anderson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Extract trans_ivec::alloc_with_heap from trans_ivec::trans_ivec
Need this for building istrs
上级
309a7534
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
32 addition
and
9 deletion
+32
-9
src/comp/middle/trans_ivec.rs
src/comp/middle/trans_ivec.rs
+32
-9
未找到文件。
src/comp/middle/trans_ivec.rs
浏览文件 @
0a93a48f
import
std
::
vec
;
import
std
::
option
::
none
;
import
syntax
::
ast
;
import
lib
::
llvm
::
llvm
::{
ValueRef
,
TypeRef
};
...
...
@@ -13,9 +14,13 @@
export
trans_ivec
,
get_len_and_data
,
duplicate_heap_part
,
trans_add
,
trans_append
;
fn
trans_ivec
(
bcx
:
@
block_ctxt
,
args
:
&
[
@
ast
::
expr
],
id
:
ast
::
node_id
)
->
result
{
let
typ
=
node_id_type
(
bcx_ccx
(
bcx
),
id
);
fn
alloc_with_heap
(
bcx
:
@
block_ctxt
,
typ
:
&
ty
::
t
,
vecsz
:
uint
)
->
{
bcx
:
@
block_ctxt
,
unit_ty
:
ty
::
t
,
llunitsz
:
ValueRef
,
llptr
:
ValueRef
,
llfirsteltptr
:
ValueRef
}
{
let
unit_ty
;
alt
ty
::
struct
(
bcx_tcx
(
bcx
),
typ
)
{
ty
::
ty_vec
(
mt
)
{
unit_ty
=
mt
.ty
;
}
...
...
@@ -31,12 +36,11 @@ fn trans_ivec(bcx: @block_ctxt, args: &[@ast::expr], id: ast::node_id) ->
add_clean_temp
(
bcx
,
llvecptr
,
typ
);
let
lllen
=
bcx
.build
.Mul
(
C_uint
(
std
::
vec
::
len
(
args
)
),
unit_sz
);
let
lllen
=
bcx
.build
.Mul
(
C_uint
(
vecsz
),
unit_sz
);
// Allocate the vector pieces and store length and allocated length.
let
llfirsteltptr
;
if
std
::
vec
::
len
(
args
)
>
0u
&&
std
::
vec
::
len
(
args
)
<=
abi
::
ivec_default_length
{
if
vecsz
>
0u
&&
vecsz
<=
abi
::
ivec_default_length
{
// Interior case.
bcx
.build
.Store
(
lllen
,
...
...
@@ -61,7 +65,7 @@ fn trans_ivec(bcx: @block_ctxt, args: &[@ast::expr], id: ast::node_id) ->
let
llstubptr
=
bcx
.build
.PointerCast
(
llvecptr
,
T_ptr
(
llstubty
));
bcx
.build
.Store
(
C_int
(
0
),
bcx
.build
.InBoundsGEP
(
llstubptr
,
stub_z
));
let
llheapty
=
T_ivec_heap_part
(
llunitty
);
if
std
::
vec
::
len
(
args
)
==
0u
{
if
vecsz
==
0u
{
// Null heap pointer indicates a zero-length vector.
bcx
.build
.Store
(
llalen
,
bcx
.build
.InBoundsGEP
(
llstubptr
,
stub_a
));
...
...
@@ -86,8 +90,27 @@ fn trans_ivec(bcx: @block_ctxt, args: &[@ast::expr], id: ast::node_id) ->
C_int
(
0
)]);
}
}
// Store the individual elements.
ret
{
bcx
:
bcx
,
unit_ty
:
unit_ty
,
llunitsz
:
unit_sz
,
llptr
:
llvecptr
,
llfirsteltptr
:
llfirsteltptr
};
}
fn
trans_ivec
(
bcx
:
@
block_ctxt
,
args
:
&
[
@
ast
::
expr
],
id
:
ast
::
node_id
)
->
result
{
let
typ
=
node_id_type
(
bcx_ccx
(
bcx
),
id
);
let
alloc_res
=
alloc_with_heap
(
bcx
,
typ
,
vec
::
len
(
args
));
let
bcx
=
alloc_res
.bcx
;
let
unit_ty
=
alloc_res
.unit_ty
;
let
llunitsz
=
alloc_res
.llunitsz
;
let
llvecptr
=
alloc_res
.llptr
;
let
llfirsteltptr
=
alloc_res
.llfirsteltptr
;
// Store the individual elements.
let
i
=
0u
;
for
e
:
@
ast
::
expr
in
args
{
let
lv
=
trans_lval
(
bcx
,
e
);
...
...
@@ -96,7 +119,7 @@ fn trans_ivec(bcx: @block_ctxt, args: &[@ast::expr], id: ast::node_id) ->
if
ty
::
type_has_dynamic_size
(
bcx_tcx
(
bcx
),
unit_ty
)
{
lleltptr
=
bcx
.build
.InBoundsGEP
(
llfirsteltptr
,
[
bcx
.build
.Mul
(
C_uint
(
i
),
unit_
sz
)]);
[
bcx
.build
.Mul
(
C_uint
(
i
),
llunit
sz
)]);
}
else
{
lleltptr
=
bcx
.build
.InBoundsGEP
(
llfirsteltptr
,
[
C_uint
(
i
)]);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录