Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
ac94858e
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,发现更多精彩内容 >>
提交
ac94858e
编写于
3月 21, 2019
作者:
V
varkor
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add int variables and float variables to `InferenceFudger`
上级
1f9a2326
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
35 addition
and
9 deletion
+35
-9
src/librustc/infer/fudge.rs
src/librustc/infer/fudge.rs
+35
-8
src/librustc/infer/type_variable.rs
src/librustc/infer/type_variable.rs
+0
-1
未找到文件。
src/librustc/infer/fudge.rs
浏览文件 @
ac94858e
use
crate
::
ty
::{
self
,
Ty
,
TyCtxt
,
TyVid
,
RegionVid
};
use
crate
::
ty
::{
self
,
Ty
,
TyCtxt
,
TyVid
,
IntVid
,
FloatVid
,
RegionVid
};
use
crate
::
ty
::
fold
::{
TypeFoldable
,
TypeFolder
};
use
super
::
InferCtxt
;
...
...
@@ -56,7 +56,7 @@ pub fn fudge_inference_if_ok<T, E, F>(
{
debug!
(
"fudge_inference_if_ok(origin={:?})"
,
origin
);
let
(
type_var
iable
s
,
region_vars
,
value
)
=
self
.probe
(|
snapshot
|
{
let
(
type_var
s
,
int_vars
,
float_var
s
,
region_vars
,
value
)
=
self
.probe
(|
snapshot
|
{
match
f
()
{
Ok
(
value
)
=>
{
let
value
=
self
.resolve_type_vars_if_possible
(
&
value
);
...
...
@@ -67,14 +67,20 @@ pub fn fudge_inference_if_ok<T, E, F>(
// going to be popped, so we will have to
// eliminate any references to them.
let
type_var
iable
s
=
self
.type_variables
.borrow_mut
()
.vars_since_snapshot
(
let
type_vars
=
self
.type_variables
.borrow_mut
()
.vars_since_snapshot
(
&
snapshot
.type_snapshot
,
);
let
int_vars
=
self
.int_unification_table
.borrow_mut
()
.vars_since_snapshot
(
&
snapshot
.int_snapshot
,
);
let
float_vars
=
self
.float_unification_table
.borrow_mut
()
.vars_since_snapshot
(
&
snapshot
.float_snapshot
,
);
let
region_vars
=
self
.borrow_region_constraints
()
.vars_since_snapshot
(
&
snapshot
.region_constraints_snapshot
,
);
Ok
((
type_var
iable
s
,
region_vars
,
value
))
Ok
((
type_var
s
,
int_vars
,
float_var
s
,
region_vars
,
value
))
}
Err
(
e
)
=>
Err
(
e
),
}
...
...
@@ -87,13 +93,18 @@ pub fn fudge_inference_if_ok<T, E, F>(
// Micro-optimization: if no variables have been created, then
// `value` can't refer to any of them. =) So we can just return it.
if
type_variables
.is_empty
()
&&
region_vars
.is_empty
()
{
if
type_vars
.is_empty
()
&&
int_vars
.is_empty
()
&&
float_vars
.is_empty
()
&&
region_vars
.is_empty
()
{
return
Ok
(
value
);
}
let
mut
fudger
=
InferenceFudger
{
infcx
:
self
,
type_variables
:
&
type_variables
,
type_vars
:
&
type_vars
,
int_vars
:
&
int_vars
,
float_vars
:
&
float_vars
,
region_vars
:
&
region_vars
,
origin
,
};
...
...
@@ -104,7 +115,9 @@ pub fn fudge_inference_if_ok<T, E, F>(
pub
struct
InferenceFudger
<
'a
,
'gcx
:
'a
+
'tcx
,
'tcx
:
'a
>
{
infcx
:
&
'a
InferCtxt
<
'a
,
'gcx
,
'tcx
>
,
type_variables
:
&
'a
Range
<
TyVid
>
,
type_vars
:
&
'a
Range
<
TyVid
>
,
int_vars
:
&
'a
Range
<
IntVid
>
,
float_vars
:
&
'a
Range
<
FloatVid
>
,
region_vars
:
&
'a
Range
<
RegionVid
>
,
origin
:
&
'a
RegionVariableOrigin
,
}
...
...
@@ -117,7 +130,7 @@ fn tcx<'b>(&'b self) -> TyCtxt<'b, 'gcx, 'tcx> {
fn
fold_ty
(
&
mut
self
,
ty
:
Ty
<
'tcx
>
)
->
Ty
<
'tcx
>
{
match
ty
.sty
{
ty
::
Infer
(
ty
::
InferTy
::
TyVar
(
vid
))
=>
{
if
self
.type_var
iable
s
.contains
(
&
vid
)
{
if
self
.type_vars
.contains
(
&
vid
)
{
// This variable was created during the fudging.
// Recreate it with a fresh variable here.
let
origin
=
self
.infcx.type_variables
.borrow
()
.var_origin
(
vid
)
.clone
();
...
...
@@ -134,6 +147,20 @@ fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> {
ty
}
}
ty
::
Infer
(
ty
::
InferTy
::
IntVar
(
vid
))
=>
{
if
self
.int_vars
.contains
(
&
vid
)
{
self
.infcx.tcx
.mk_int_var
(
self
.infcx
.next_int_var_id
())
}
else
{
ty
}
}
ty
::
Infer
(
ty
::
InferTy
::
FloatVar
(
vid
))
=>
{
if
self
.float_vars
.contains
(
&
vid
)
{
self
.infcx.tcx
.mk_float_var
(
self
.infcx
.next_float_var_id
())
}
else
{
ty
}
}
_
=>
ty
.super_fold_with
(
self
),
}
}
...
...
src/librustc/infer/type_variable.rs
浏览文件 @
ac94858e
...
...
@@ -6,7 +6,6 @@
use
std
::
marker
::
PhantomData
;
use
std
::
ops
::
Range
;
use
std
::
u32
;
use
rustc_data_structures
::
fx
::
FxHashMap
;
use
rustc_data_structures
::
snapshot_vec
as
sv
;
use
rustc_data_structures
::
unify
as
ut
;
use
ut
::
UnifyKey
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录