diff options
| author | ppedrot | 2013-10-29 18:26:55 +0000 |
|---|---|---|
| committer | ppedrot | 2013-10-29 18:26:55 +0000 |
| commit | b8098068f29a58a478efa719c51271d09f66a9d8 (patch) | |
| tree | e7f1ffd6a9769d3287b1f11d6d9931a34ca72ac6 | |
| parent | 60edf5e68beb4f13bdef9c5f548ed7974376c8d6 (diff) | |
Prevent [Evarutil.whd_head_evar] from uselessly reallocating arrays.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@16953 85f007b7-540e-0410-9357-904b9bb8a0f7
| -rw-r--r-- | pretyping/evarutil.ml | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/pretyping/evarutil.ml b/pretyping/evarutil.ml index 6381c29a16..8bf1ecf976 100644 --- a/pretyping/evarutil.ml +++ b/pretyping/evarutil.ml @@ -144,15 +144,27 @@ let head_evar = let whd_head_evar_stack sigma c = let rec whrec (c, l as s) = match kind_of_term c with - | Evar (evk,args as ev) when Evd.is_defined sigma evk - -> whrec (existential_value sigma ev, l) + | Evar (evk,args as ev) -> + let v = + try Some (existential_value sigma ev) + with NotInstantiatedEvar | Not_found -> None in + begin match v with + | None -> s + | Some c -> whrec (c, l) + end | Cast (c,_,_) -> whrec (c, l) - | App (f,args) -> whrec (f, Array.fold_right (fun a l -> a::l) args l) + | App (f,args) -> whrec (f, args :: l) | _ -> s in whrec (c, []) -let whd_head_evar sigma c = applist (whd_head_evar_stack sigma c) +let whd_head_evar sigma c = + let (f, args) = whd_head_evar_stack sigma c in + (** optim: don't reallocate if empty/singleton *) + match args with + | [] -> f + | [arg] -> mkApp (f, arg) + | _ -> mkApp (f, Array.concat args) (**********************) (* Creating new metas *) |
