Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
030f00a8
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,发现更多精彩内容 >>
提交
030f00a8
编写于
3月 22, 2017
作者:
O
Oliver Schneider
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix drop terminator
上级
26c3335d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
24 addition
and
14 deletion
+24
-14
src/terminator/mod.rs
src/terminator/mod.rs
+24
-14
未找到文件。
src/terminator/mod.rs
浏览文件 @
030f00a8
...
...
@@ -60,22 +60,24 @@ pub(super) fn eval_terminator(
};
let
func_ty
=
self
.operand_ty
(
func
);
let
(
fn_def
,
abi
)
=
match
func_ty
.sty
{
let
(
fn_def
,
sig
)
=
match
func_ty
.sty
{
ty
::
TyFnPtr
(
sig
)
=>
{
let
fn_ptr
=
self
.eval_operand_to_primval
(
func
)
?
.to_ptr
()
?
;
(
self
.memory
.get_fn
(
fn_ptr
.alloc_id
)
?
,
sig
.abi
()
)
(
self
.memory
.get_fn
(
fn_ptr
.alloc_id
)
?
,
sig
)
},
ty
::
TyFnDef
(
def_id
,
substs
,
sig
)
=>
(::
eval_context
::
resolve
(
self
.tcx
,
def_id
,
substs
),
sig
.abi
()
),
ty
::
TyFnDef
(
def_id
,
substs
,
sig
)
=>
(::
eval_context
::
resolve
(
self
.tcx
,
def_id
,
substs
),
sig
),
_
=>
{
let
msg
=
format!
(
"can't handle callee of type {:?}"
,
func_ty
);
return
Err
(
EvalError
::
Unimplemented
(
msg
));
}
};
self
.eval_fn_call
(
fn_def
,
destination
,
args
,
terminator
.source_info.span
,
abi
)
?
;
let
sig
=
self
.erase_lifetimes
(
&
sig
);
self
.eval_fn_call
(
fn_def
,
destination
,
args
,
terminator
.source_info.span
,
sig
)
?
;
}
Drop
{
ref
location
,
target
,
..
}
=>
{
let
lval
=
self
.eval_lvalue
(
location
)
?
;
let
src_ptr
=
self
.force_allocation
(
lval
)
?
.to_ptr
();
let
ty
=
self
.lvalue_ty
(
location
);
...
...
@@ -97,6 +99,13 @@ pub(super) fn eval_terminator(
Lvalue
::
from_ptr
(
Pointer
::
zst_ptr
()),
StackPopCleanup
::
None
,
)
?
;
let
mut
arg_locals
=
self
.frame
()
.mir
.args_iter
();
assert_eq!
(
self
.frame
()
.mir.arg_count
,
1
);
let
arg_local
=
arg_locals
.next
()
.unwrap
();
let
dest
=
self
.eval_lvalue
(
&
mir
::
Lvalue
::
Local
(
arg_local
))
?
;
let
arg_ty
=
self
.tcx
.mk_mut_ptr
(
ty
);
self
.write_value
(
Value
::
ByVal
(
PrimVal
::
Ptr
(
src_ptr
)),
dest
,
arg_ty
)
?
;
}
Assert
{
ref
cond
,
expected
,
ref
msg
,
target
,
..
}
=>
{
...
...
@@ -135,22 +144,23 @@ fn eval_fn_call(
destination
:
Option
<
(
Lvalue
<
'tcx
>
,
mir
::
BasicBlock
)
>
,
arg_operands
:
&
[
mir
::
Operand
<
'tcx
>
],
span
:
Span
,
abi
:
Abi
,
sig
:
ty
::
FnSig
<
'tcx
>
,
)
->
EvalResult
<
'tcx
>
{
trace!
(
"eval_fn_call: {:#?}"
,
instance
);
match
instance
.def
{
ty
::
InstanceDef
::
Intrinsic
(
..
)
=>
{
unimplemented!
();
/*let sig = self.erase_lifetimes(&sig);
let ty = sig.output();
let layout = self.type_layout(ty)?;
let
(
ret
,
target
)
=
match
destination
{
Some(dest)
if is_inhabited(self.tcx, ty)
=> dest,
Some
(
dest
)
=>
dest
,
_
=>
return
Err
(
EvalError
::
Unreachable
),
};
let
ty
=
sig
.output
();
if
!
is_inhabited
(
self
.tcx
,
ty
)
{
return
Err
(
EvalError
::
Unreachable
);
}
let
layout
=
self
.type_layout
(
ty
)
?
;
self
.call_intrinsic
(
instance
,
arg_operands
,
ret
,
ty
,
layout
,
target
)
?
;
self
.dump_local
(
ret
);
Ok(())
*/
Ok
(())
},
/*Abi::C => {
let sig = self.erase_lifetimes(&sig);
...
...
@@ -172,7 +182,7 @@ fn eval_fn_call(
let
arg_ty
=
self
.operand_ty
(
arg
);
args
.push
((
arg_val
,
arg_ty
));
}
assert_eq!
(
abi
,
Abi
::
RustCall
);
assert_eq!
(
sig
.
abi
,
Abi
::
RustCall
);
self
.eval_fn_call_inner
(
instance
,
destination
,
...
...
@@ -187,7 +197,7 @@ fn eval_fn_call(
let
arg_ty
=
self
.operand_ty
(
arg
);
args
.push
((
arg_val
,
arg_ty
));
}
match
abi
{
match
sig
.
abi
{
Abi
::
C
=>
unimplemented!
(),
Abi
::
Rust
=>
{},
Abi
::
RustCall
=>
self
.unpack_fn_args
(
&
mut
args
)
?
,
...
...
@@ -200,7 +210,7 @@ fn eval_fn_call(
span
,
)
},
_
=>
Err
(
EvalError
::
Unimplemented
(
format!
(
"can't handle function with {:?} ABI"
,
abi
))),
_
=>
Err
(
EvalError
::
Unimplemented
(
format!
(
"can't handle function with {:?} ABI"
,
sig
.
abi
))),
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录