]> git.lizzy.rs Git - rust.git/commitdiff
Don't actually create a full MIR stack frame when not needed
authorOliver Scherer <github35764891676564198441@oli-obk.de>
Sat, 5 Jan 2019 11:55:30 +0000 (12:55 +0100)
committerOliver Scherer <github35764891676564198441@oli-obk.de>
Sat, 5 Jan 2019 11:55:30 +0000 (12:55 +0100)
src/librustc_mir/const_eval.rs

index b9432997b7e1982135fd2891cf8d9c4180f33477..947b94b61da8fd87d549b63c1f07f6116b2eae7d 100644 (file)
@@ -68,12 +68,36 @@ pub fn mk_eval_cx<'a, 'tcx>(
     debug!("mk_eval_cx: {:?}, {:?}", instance, param_env);
     let span = tcx.def_span(instance.def_id());
     let mut ecx = EvalContext::new(tcx.at(span), param_env, CompileTimeInterpreter::new());
-    let mir = ecx.load_mir(instance.def)?;
+    let mir = mir::Mir::new(
+        ::std::iter::once(
+            mir::BasicBlockData {
+                statements: Vec::new(),
+                is_cleanup: false,
+                terminator: Some(mir::Terminator {
+                    source_info: mir::SourceInfo {
+                        scope: mir::OUTERMOST_SOURCE_SCOPE,
+                        span: DUMMY_SP,
+                    },
+                    kind: mir::TerminatorKind::Return,
+                }),
+            }
+        ).collect(), // basic blocks
+        IndexVec::new(), // source_scopes
+        mir::ClearCrossCrate::Clear, // source_scope_local_data
+        IndexVec::new(), // promoted
+        None, // yield ty
+        ::std::iter::once(mir::LocalDecl::new_return_place(tcx.types.unit, DUMMY_SP)).collect(),
+        IndexVec::new(), //user_type_annotations
+        0, // arg_count
+        Vec::new(), // upvar_decls
+        DUMMY_SP, // span
+        Vec::new(), // control_flow_destroyed
+    );
     // insert a stack frame so any queries have the correct substs
     ecx.push_stack_frame(
         instance,
-        mir.span,
-        mir,
+        span,
+        tcx.alloc_mir(mir),
         None,
         StackPopCleanup::Goto(None), // never pop
     )?;