@@ -132,9 +132,7 @@ impl Evaluator<'_> {
132
132
return Ok ( true ) ;
133
133
}
134
134
if let Some ( it) = self . detect_lang_function ( def) {
135
- let arg_bytes =
136
- args. iter ( ) . map ( |it| Ok ( it. get ( self ) ?. to_owned ( ) ) ) . collect :: < Result < Vec < _ > > > ( ) ?;
137
- let result = self . exec_lang_item ( it, generic_args, & arg_bytes, locals, span) ?;
135
+ let result = self . exec_lang_item ( it, generic_args, args, locals, span) ?;
138
136
destination. write_from_bytes ( self , & result) ?;
139
137
return Ok ( true ) ;
140
138
}
@@ -333,18 +331,52 @@ impl Evaluator<'_> {
333
331
& mut self ,
334
332
it : LangItem ,
335
333
generic_args : & Substitution ,
336
- args : & [ Vec < u8 > ] ,
334
+ args : & [ IntervalAndTy ] ,
337
335
locals : & Locals ,
338
336
span : MirSpan ,
339
337
) -> Result < Vec < u8 > > {
340
338
use LangItem :: * ;
341
339
let mut args = args. iter ( ) ;
342
340
match it {
343
- BeginPanic => Err ( MirEvalError :: Panic ( "<unknown-panic-payload>" . to_owned ( ) ) ) ,
341
+ BeginPanic => {
342
+ let mut arg = args
343
+ . next ( )
344
+ . ok_or ( MirEvalError :: InternalError (
345
+ "argument of BeginPanic is not provided" . into ( ) ,
346
+ ) ) ?
347
+ . clone ( ) ;
348
+ while let TyKind :: Ref ( _, _, ty) = arg. ty . kind ( Interner ) {
349
+ if ty. is_str ( ) {
350
+ let ( pointee, metadata) = arg. interval . get ( self ) ?. split_at ( self . ptr_size ( ) ) ;
351
+ let len = from_bytes ! ( usize , metadata) ;
352
+
353
+ return {
354
+ Err ( MirEvalError :: Panic (
355
+ std:: str:: from_utf8 (
356
+ self . read_memory ( Address :: from_bytes ( pointee) ?, len) ?,
357
+ )
358
+ . unwrap ( )
359
+ . to_owned ( ) ,
360
+ ) )
361
+ } ;
362
+ }
363
+ let size = self . size_of_sized ( & ty, locals, "begin panic arg" ) ?;
364
+ let pointee = arg. interval . get ( self ) ?;
365
+ arg = IntervalAndTy {
366
+ interval : Interval :: new ( Address :: from_bytes ( pointee) ?, size) ,
367
+ ty : ty. clone ( ) ,
368
+ } ;
369
+ }
370
+ Err ( MirEvalError :: Panic ( format ! (
371
+ "unknown-panic-payload: {:?}" ,
372
+ arg. ty. kind( Interner )
373
+ ) ) )
374
+ }
344
375
SliceLen => {
345
376
let arg = args. next ( ) . ok_or ( MirEvalError :: InternalError (
346
377
"argument of <[T]>::len() is not provided" . into ( ) ,
347
378
) ) ?;
379
+ let arg = arg. get ( self ) ?;
348
380
let ptr_size = arg. len ( ) / 2 ;
349
381
Ok ( arg[ ptr_size..] . into ( ) )
350
382
}
@@ -358,6 +390,7 @@ impl Evaluator<'_> {
358
390
let arg = args. next ( ) . ok_or ( MirEvalError :: InternalError (
359
391
"argument of drop_in_place is not provided" . into ( ) ,
360
392
) ) ?;
393
+ let arg = arg. interval . get ( self ) ?. to_owned ( ) ;
361
394
self . run_drop_glue_deep (
362
395
ty. clone ( ) ,
363
396
locals,
0 commit comments