From f62359acc71dbfab8b198e7419629eb57efb954d Mon Sep 17 00:00:00 2001 From: Leonardo de Moura Date: Mon, 5 Aug 2024 01:21:57 +0200 Subject: [PATCH] perf: use `lean_instantiate_level_mvars` (#4912) implemented in C/C++. Next step: same for `instantiateExprMVars` --- src/Lean/MetavarContext.lean | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/Lean/MetavarContext.lean b/src/Lean/MetavarContext.lean index 9390090903..1e26549e5e 100644 --- a/src/Lean/MetavarContext.lean +++ b/src/Lean/MetavarContext.lean @@ -541,20 +541,10 @@ This operation is performed at `instantiateExprMVars`, `elimMVarDeps`, and `leve @[extern "lean_instantiate_level_mvars"] opaque instantiateLevelMVarsImp (mctx : MetavarContext) (l : Level) : MetavarContext × Level -partial def instantiateLevelMVars [Monad m] [MonadMCtx m] : Level → m Level - | lvl@(Level.succ lvl₁) => return Level.updateSucc! lvl (← instantiateLevelMVars lvl₁) - | lvl@(Level.max lvl₁ lvl₂) => return Level.updateMax! lvl (← instantiateLevelMVars lvl₁) (← instantiateLevelMVars lvl₂) - | lvl@(Level.imax lvl₁ lvl₂) => return Level.updateIMax! lvl (← instantiateLevelMVars lvl₁) (← instantiateLevelMVars lvl₂) - | lvl@(Level.mvar mvarId) => do - match (← getLevelMVarAssignment? mvarId) with - | some newLvl => - if !newLvl.hasMVar then pure newLvl - else do - let newLvl' ← instantiateLevelMVars newLvl - assignLevelMVar mvarId newLvl' - pure newLvl' - | none => pure lvl - | lvl => pure lvl +partial def instantiateLevelMVars [Monad m] [MonadMCtx m] (l : Level) : m Level := do + let (mctx, lNew) := instantiateLevelMVarsImp (← getMCtx) l + setMCtx mctx + return lNew @[extern "lean_instantiate_expr_mvars"] opaque instantiateExprMVarsImp (mctx : MetavarContext) (e : Expr) : MetavarContext × Expr