Unwrap allocated Location at creation
This commit is contained in:
parent
43b55cf893
commit
3e735a52fe
3 changed files with 9 additions and 14 deletions
|
@ -31,11 +31,7 @@ pub(crate) fn const_caller_location(
|
||||||
trace!("const_caller_location: {}:{}:{}", file, line, col);
|
trace!("const_caller_location: {}:{}:{}", file, line, col);
|
||||||
let mut ecx = mk_eval_cx(tcx, DUMMY_SP, ty::ParamEnv::reveal_all(), false);
|
let mut ecx = mk_eval_cx(tcx, DUMMY_SP, ty::ParamEnv::reveal_all(), false);
|
||||||
|
|
||||||
// This can fail if rustc runs out of memory right here. Trying to emit an error would be
|
let loc_place = ecx.alloc_caller_location(file, line, col);
|
||||||
// pointless, since that would require allocating more memory than a Location.
|
|
||||||
let loc_place = ecx
|
|
||||||
.alloc_caller_location(file, line, col)
|
|
||||||
.expect("not enough memory to allocate location?");
|
|
||||||
if intern_const_alloc_recursive(&mut ecx, InternKind::Constant, &loc_place).is_err() {
|
if intern_const_alloc_recursive(&mut ecx, InternKind::Constant, &loc_place).is_err() {
|
||||||
bug!("intern_const_alloc_recursive should not error in this case")
|
bug!("intern_const_alloc_recursive should not error in this case")
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,7 +137,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
match intrinsic_name {
|
match intrinsic_name {
|
||||||
sym::caller_location => {
|
sym::caller_location => {
|
||||||
let span = self.find_closest_untracked_caller_location();
|
let span = self.find_closest_untracked_caller_location();
|
||||||
let location = self.alloc_caller_location_for_span(span)?;
|
let location = self.alloc_caller_location_for_span(span);
|
||||||
self.write_scalar(location.ptr, dest)?;
|
self.write_scalar(location.ptr, dest)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ use rustc_target::abi::LayoutOf;
|
||||||
|
|
||||||
use crate::interpret::{
|
use crate::interpret::{
|
||||||
intrinsics::{InterpCx, Machine},
|
intrinsics::{InterpCx, Machine},
|
||||||
InterpResult, MPlaceTy, MemoryKind, Scalar,
|
MPlaceTy, MemoryKind, Scalar,
|
||||||
};
|
};
|
||||||
|
|
||||||
impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
|
@ -79,7 +79,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
filename: Symbol,
|
filename: Symbol,
|
||||||
line: u32,
|
line: u32,
|
||||||
col: u32,
|
col: u32,
|
||||||
) -> InterpResult<'static, MPlaceTy<'tcx, M::PointerTag>> {
|
) -> MPlaceTy<'tcx, M::PointerTag> {
|
||||||
let file =
|
let file =
|
||||||
self.allocate_str(&filename.as_str(), MemoryKind::CallerLocation, Mutability::Not);
|
self.allocate_str(&filename.as_str(), MemoryKind::CallerLocation, Mutability::Not);
|
||||||
let line = Scalar::from_u32(line);
|
let line = Scalar::from_u32(line);
|
||||||
|
@ -91,7 +91,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
.type_of(self.tcx.require_lang_item(LangItem::PanicLocation, None))
|
.type_of(self.tcx.require_lang_item(LangItem::PanicLocation, None))
|
||||||
.subst(*self.tcx, self.tcx.mk_substs([self.tcx.lifetimes.re_erased.into()].iter()));
|
.subst(*self.tcx, self.tcx.mk_substs([self.tcx.lifetimes.re_erased.into()].iter()));
|
||||||
let loc_layout = self.layout_of(loc_ty).unwrap();
|
let loc_layout = self.layout_of(loc_ty).unwrap();
|
||||||
let location = self.allocate(loc_layout, MemoryKind::CallerLocation)?;
|
// This can fail if rustc runs out of memory right here. Trying to emit an error would be
|
||||||
|
// pointless, since that would require allocating more memory than a Location.
|
||||||
|
let location = self.allocate(loc_layout, MemoryKind::CallerLocation).unwrap();
|
||||||
|
|
||||||
// Initialize fields.
|
// Initialize fields.
|
||||||
self.write_immediate(file.to_ref(), &self.mplace_field(&location, 0).unwrap().into())
|
self.write_immediate(file.to_ref(), &self.mplace_field(&location, 0).unwrap().into())
|
||||||
|
@ -101,7 +103,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
self.write_scalar(col, &self.mplace_field(&location, 2).unwrap().into())
|
self.write_scalar(col, &self.mplace_field(&location, 2).unwrap().into())
|
||||||
.expect("writing to memory we just allocated cannot fail");
|
.expect("writing to memory we just allocated cannot fail");
|
||||||
|
|
||||||
Ok(location)
|
location
|
||||||
}
|
}
|
||||||
|
|
||||||
crate fn location_triple_for_span(&self, span: Span) -> (Symbol, u32, u32) {
|
crate fn location_triple_for_span(&self, span: Span) -> (Symbol, u32, u32) {
|
||||||
|
@ -114,10 +116,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn alloc_caller_location_for_span(
|
pub fn alloc_caller_location_for_span(&mut self, span: Span) -> MPlaceTy<'tcx, M::PointerTag> {
|
||||||
&mut self,
|
|
||||||
span: Span,
|
|
||||||
) -> InterpResult<'static, MPlaceTy<'tcx, M::PointerTag>> {
|
|
||||||
let (file, line, column) = self.location_triple_for_span(span);
|
let (file, line, column) = self.location_triple_for_span(span);
|
||||||
self.alloc_caller_location(file, line, column)
|
self.alloc_caller_location(file, line, column)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue