Skip to content

Commit 186e42d

Browse files
committed
move resolve_path to helpers module
1 parent 8d754e6 commit 186e42d

File tree

4 files changed

+54
-45
lines changed

4 files changed

+54
-45
lines changed

src/fn_call.rs

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
use rustc::ty;
22
use rustc::ty::layout::{Align, LayoutOf, Size};
3-
use rustc::hir::def_id::{DefId, CRATE_DEF_INDEX};
3+
use rustc::hir::def_id::DefId;
44
use rustc::mir;
55
use syntax::attr;
66

7-
use std::mem;
8-
97
use super::*;
108

119
pub trait EvalContextExt<'tcx, 'mir> {
@@ -19,8 +17,6 @@ pub trait EvalContextExt<'tcx, 'mir> {
1917
ret: mir::BasicBlock,
2018
) -> EvalResult<'tcx>;
2119

22-
fn resolve_path(&self, path: &[&str]) -> EvalResult<'tcx, ty::Instance<'tcx>>;
23-
2420
/// Emulate a function that should have MIR but does not.
2521
/// This is solely to support execution without full MIR.
2622
/// Fail if emulating this function is not supported.
@@ -638,40 +634,6 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for EvalContext<'a, '
638634
Ok(())
639635
}
640636

641-
/// Get an instance for a path.
642-
fn resolve_path(&self, path: &[&str]) -> EvalResult<'tcx, ty::Instance<'tcx>> {
643-
self.tcx
644-
.crates()
645-
.iter()
646-
.find(|&&krate| self.tcx.original_crate_name(krate) == path[0])
647-
.and_then(|krate| {
648-
let krate = DefId {
649-
krate: *krate,
650-
index: CRATE_DEF_INDEX,
651-
};
652-
let mut items = self.tcx.item_children(krate);
653-
let mut path_it = path.iter().skip(1).peekable();
654-
655-
while let Some(segment) = path_it.next() {
656-
for item in mem::replace(&mut items, Default::default()).iter() {
657-
if item.ident.name == *segment {
658-
if path_it.peek().is_none() {
659-
return Some(ty::Instance::mono(self.tcx.tcx, item.def.def_id()));
660-
}
661-
662-
items = self.tcx.item_children(item.def.def_id());
663-
break;
664-
}
665-
}
666-
}
667-
None
668-
})
669-
.ok_or_else(|| {
670-
let path = path.iter().map(|&s| s.to_owned()).collect();
671-
EvalErrorKind::PathNotFound(path).into()
672-
})
673-
}
674-
675637
fn emulate_missing_fn(
676638
&mut self,
677639
path: String,

src/helpers.rs

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
use super::{Scalar, ScalarMaybeUndef, EvalResult};
1+
use std::mem;
22

3-
pub trait FalibleScalarExt {
3+
use rustc::ty;
4+
use rustc::hir::def_id::{DefId, CRATE_DEF_INDEX};
5+
6+
use super::*;
7+
8+
pub trait ScalarExt {
49
/// HACK: this function just extracts all bits if `defined != 0`
510
/// Mainly used for args of C-functions and we should totally correctly fetch the size
611
/// of their arguments
712
fn to_bytes(self) -> EvalResult<'static, u128>;
813
}
914

10-
impl FalibleScalarExt for Scalar {
15+
impl ScalarExt for Scalar {
1116
fn to_bytes(self) -> EvalResult<'static, u128> {
1217
match self {
1318
Scalar::Bits { bits, size } => {
@@ -19,8 +24,49 @@ impl FalibleScalarExt for Scalar {
1924
}
2025
}
2126

22-
impl FalibleScalarExt for ScalarMaybeUndef {
27+
impl ScalarExt for ScalarMaybeUndef {
2328
fn to_bytes(self) -> EvalResult<'static, u128> {
2429
self.not_undef()?.to_bytes()
2530
}
2631
}
32+
33+
pub trait EvalContextExt<'tcx> {
34+
fn resolve_path(&self, path: &[&str]) -> EvalResult<'tcx, ty::Instance<'tcx>>;
35+
}
36+
37+
38+
impl<'a, 'mir, 'tcx> EvalContextExt<'tcx> for EvalContext<'a, 'mir, 'tcx, super::Evaluator<'tcx>> {
39+
/// Get an instance for a path.
40+
fn resolve_path(&self, path: &[&str]) -> EvalResult<'tcx, ty::Instance<'tcx>> {
41+
self.tcx
42+
.crates()
43+
.iter()
44+
.find(|&&krate| self.tcx.original_crate_name(krate) == path[0])
45+
.and_then(|krate| {
46+
let krate = DefId {
47+
krate: *krate,
48+
index: CRATE_DEF_INDEX,
49+
};
50+
let mut items = self.tcx.item_children(krate);
51+
let mut path_it = path.iter().skip(1).peekable();
52+
53+
while let Some(segment) = path_it.next() {
54+
for item in mem::replace(&mut items, Default::default()).iter() {
55+
if item.ident.name == *segment {
56+
if path_it.peek().is_none() {
57+
return Some(ty::Instance::mono(self.tcx.tcx, item.def.def_id()));
58+
}
59+
60+
items = self.tcx.item_children(item.def.def_id());
61+
break;
62+
}
63+
}
64+
}
65+
None
66+
})
67+
.ok_or_else(|| {
68+
let path = path.iter().map(|&s| s.to_owned()).collect();
69+
EvalErrorKind::PathNotFound(path).into()
70+
})
71+
}
72+
}

src/intrinsic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use rustc_mir::interpret::{EvalContext, PlaceTy, OpTy};
77

88
use super::{
99
Value, Scalar, ScalarMaybeUndef,
10-
FalibleScalarExt, OperatorEvalContextExt
10+
ScalarExt, OperatorEvalContextExt
1111
};
1212

1313
pub trait EvalContextExt<'tcx> {

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ use operator::EvalContextExt as OperatorEvalContextExt;
4343
use intrinsic::EvalContextExt as IntrinsicEvalContextExt;
4444
use tls::{EvalContextExt as TlsEvalContextExt, TlsData};
4545
use range_map::RangeMap;
46-
use helpers::FalibleScalarExt;
46+
#[allow(unused_imports)] // FIXME rustc bug https://github.com/rust-lang/rust/issues/53682
47+
use helpers::{ScalarExt, EvalContextExt as HelpersEvalContextExt};
4748
use mono_hash_map::MonoHashMap;
4849

4950
pub fn create_ecx<'a, 'mir: 'a, 'tcx: 'mir>(

0 commit comments

Comments
 (0)