Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
c930af74
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,发现更多精彩内容 >>
提交
c930af74
编写于
8月 22, 2011
作者:
M
Marijn Haverbeke
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Write call_copy_glue
上级
cd5e4c21
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
40 addition
and
1 deletion
+40
-1
src/comp/middle/trans.rs
src/comp/middle/trans.rs
+40
-1
未找到文件。
src/comp/middle/trans.rs
浏览文件 @
c930af74
...
...
@@ -1186,7 +1186,7 @@ fn make_generic_glue_inner(cx: &@local_ctxt, sp: &span, t: &ty::t,
helper
(
bcx
,
llval0
,
t
);
}
copy_helper
(
helper
)
{
let
llrawptr1
=
llvm
::
LLVMGetParam
(
llfn
,
4
u
);
let
llrawptr1
=
llvm
::
LLVMGetParam
(
llfn
,
5
u
);
let
llval1
=
bcx
.build
.BitCast
(
llrawptr1
,
llty
);
helper
(
bcx
,
llval0
,
llval1
,
t
);
}
...
...
@@ -2178,6 +2178,45 @@ fn call_cmp_glue(cx: &@block_ctxt, lhs: ValueRef, rhs: ValueRef, t: &ty::t,
ret
rslt
(
r
.bcx
,
r
.bcx.build
.Load
(
llcmpresultptr
));
}
fn
call_copy_glue
(
cx
:
&@
block_ctxt
,
dst
:
ValueRef
,
src
:
ValueRef
,
t
:
&
ty
::
t
,
take
:
bool
)
->
@
block_ctxt
{
// You can't call this on immediate types. Those are simply copied with
// Load/Store.
assert
!
type_is_immediate
(
bcx_ccx
(
cx
),
t
);
let
srcptr
=
cx
.build
.BitCast
(
src
,
T_ptr
(
T_i8
()));
let
dstptr
=
cx
.build
.BitCast
(
dst
,
T_ptr
(
T_i8
()));
let
ti
=
none
;
let
{
bcx
,
val
:
lltydesc
}
=
get_tydesc
(
cx
,
t
,
false
,
ti
)
.result
;
lazily_emit_tydesc_glue
(
cx
,
abi
::
tydesc_field_copy_glue
,
ti
);
let
lltydescs
=
bcx
.build
.GEP
(
lltydesc
,
[
C_int
(
0
),
C_int
(
abi
::
tydesc_field_first_param
)]);
lltydescs
=
bcx
.build
.Load
(
lltydescs
);
let
llfn
=
alt
ti
{
none
.
{
bcx
.build
.Load
(
bcx
.build
.GEP
(
lltydesc
,
[
C_int
(
0
),
C_int
(
abi
::
tydesc_field_copy_glue
)]))
}
some
(
sti
)
{
option
::
get
(
sti
.copy_glue
)
}
};
bcx
.build
.Call
(
llfn
,
[
C_null
(
T_ptr
(
T_nil
())),
bcx
.fcx.lltaskptr
,
C_null
(
T_ptr
(
T_nil
())),
lltydescs
,
srcptr
,
dstptr
]);
if
take
{
lazily_emit_tydesc_glue
(
cx
,
abi
::
tydesc_field_take_glue
,
ti
);
llfn
=
alt
ti
{
none
.
{
bcx
.build
.Load
(
bcx
.build
.GEP
(
lltydesc
,
[
C_int
(
0
),
C_int
(
abi
::
tydesc_field_take_glue
)]))
}
some
(
sti
)
{
option
::
get
(
sti
.take_glue
)
}
};
bcx
.build
.Call
(
llfn
,
[
C_null
(
T_ptr
(
T_nil
())),
bcx
.fcx.lltaskptr
,
C_null
(
T_ptr
(
T_nil
())),
lltydescs
,
dstptr
]);
}
ret
bcx
;
}
// Compares two values. Performs the simple scalar comparison if the types are
// scalar and calls to comparison glue otherwise.
fn
compare
(
cx
:
&@
block_ctxt
,
lhs
:
ValueRef
,
rhs
:
ValueRef
,
t
:
&
ty
::
t
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录