diff options
| author | ppedrot | 2013-10-31 00:45:45 +0000 |
|---|---|---|
| committer | ppedrot | 2013-10-31 00:45:45 +0000 |
| commit | b0631cba10fda88eb3518153860807b10441ef34 (patch) | |
| tree | bd1da0cd80896693dff2dd778e3a4c15d9e8723a | |
| parent | 326799c4404c08ebf4ae8f8937925d83ac2246b0 (diff) | |
Efficient filtered functions in Evd. We test that a filter is actually
different from the identity before trying to compute filtered env/hyps.
According to profiling, it seems that the filter operation is NEVER taken,
that is, all filters that reach toplevel are dummy. There is surely something
to do here...
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@16960 85f007b7-540e-0410-9357-904b9bb8a0f7
| -rw-r--r-- | pretyping/evd.ml | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/pretyping/evd.ml b/pretyping/evd.ml index 42b9a69f3b..5537d87d03 100644 --- a/pretyping/evd.ml +++ b/pretyping/evd.ml @@ -151,20 +151,53 @@ let make_evar hyps ccl = { evar_extra = Store.empty } +let instance_mismatch () = + anomaly (Pp.str "Signature and its instance do not match") + let evar_concl evi = evi.evar_concl + let evar_filter evi = evi.evar_filter + let evar_body evi = evi.evar_body + let evar_context evi = named_context_of_val evi.evar_hyps + let evar_filtered_context evi = - Filter.filter_list (evar_filter evi) (evar_context evi) + let filter = evar_filter evi in + if Filter.is_identity filter then evar_context evi + else Filter.filter_list (evar_filter evi) (evar_context evi) + let evar_hyps evi = evi.evar_hyps + let evar_filtered_hyps evi = - List.fold_right push_named_context_val (evar_filtered_context evi) - empty_named_context_val + let filter = evar_filter evi in + if Filter.is_identity filter then evar_hyps evi + else + let rec make_hyps filter ctxt = match filter, ctxt with + | [], [] -> empty_named_context_val + | false :: filter, _ :: ctxt -> make_hyps filter ctxt + | true :: filter, decl :: ctxt -> + let hyps = make_hyps filter ctxt in + push_named_context_val decl hyps + | _ -> instance_mismatch () + in + make_hyps (Filter.repr filter) (evar_context evi) + let evar_env evi = Global.env_of_context evi.evar_hyps + let evar_filtered_env evi = - List.fold_right push_named (evar_filtered_context evi) - (reset_context (Global.env())) + let filter = evar_filter evi in + if Filter.is_identity filter then evar_env evi + else + let rec make_env filter ctxt = match filter, ctxt with + | [], [] -> reset_context (Global.env ()) + | false :: filter, _ :: ctxt -> make_env filter ctxt + | true :: filter, decl :: ctxt -> + let env = make_env filter ctxt in + push_named decl env + | _ -> instance_mismatch () + in + make_env (Filter.repr filter) (evar_context evi) let eq_evar_body b1 b2 = match b1, b2 with | Evar_empty, Evar_empty -> true @@ -188,9 +221,6 @@ let eq_evar_info ei1 ei2 = (* This exception is raised by *.existential_value *) exception NotInstantiatedEvar -let instance_mismatch () = - anomaly (Pp.str "Signature and its instance do not match") - (* Note: let-in contributes to the instance *) let make_evar_instance sign args = let rec instrec sign args = match sign, args with |
