Skip to content

Commit

Permalink
Use the official implementation of type_name.
Browse files Browse the repository at this point in the history
This makes the `type_name` intrinsic call the implementation in
`librustc_mir::interpret::type_name` instead of `Ty::to_string()`.
  • Loading branch information
ecstatic-morse committed Jun 3, 2019
1 parent e1a0f66 commit 743c0b5
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/intrinsic.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use rustc::mir;
use rustc::mir::interpret::{EvalResult, PointerArithmetic};
use rustc::mir::interpret::{ConstValue, EvalResult, PointerArithmetic};
use rustc::ty::layout::{self, LayoutOf, Size};
use rustc::ty;

Expand Down Expand Up @@ -400,10 +400,17 @@ pub trait EvalContextExt<'a, 'mir, 'tcx: 'a+'mir>: crate::MiriEvalContextExt<'a,

"type_name" => {
let ty = substs.type_at(0);
let ty_name = ty.to_string();
let ptr = this.memory_mut().allocate_static_bytes(ty_name.as_bytes(), MiriMemoryKind::Static.into());
let value = Immediate::new_slice(Scalar::Ptr(ptr), ty_name.len() as u64, this);
this.write_immediate(value, dest)?;
let ty_name = rustc_mir::interpret::type_name(*tcx, ty);

if let ConstValue::Slice { data, start, end } = ty_name.val {
let ptr = this.memory_mut().allocate_with(data.clone(), MiriMemoryKind::Static.into());
let ptr = ptr.offset(Size::from_bytes(start as u64), this)?;
let len = end - start;
let value = Immediate::new_slice(Scalar::Ptr(ptr), len as u64, this);
this.write_immediate(value, dest)?;
} else {
unreachable!("Result of `type_name` must be a `ConstValue::Slice`");
}
}

"unchecked_div" => {
Expand Down
5 changes: 5 additions & 0 deletions tests/run-pass/intrinsics.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#![feature(core_intrinsics)]

use std::intrinsics::type_name;
use std::mem::{size_of, size_of_val};

fn main() {
Expand All @@ -7,4 +10,6 @@ fn main() {
assert_eq!(size_of_val(&[] as &[i32]), 0);
assert_eq!(size_of_val(&[1, 2, 3] as &[i32]), 12);
assert_eq!(size_of_val("foobar"), 6);

assert_eq!(unsafe { type_name::<Option<i32>>() }, "core::option::Option<i32>");
}

0 comments on commit 743c0b5

Please sign in to comment.