From c783b0827c5e5485209879b6cd329a7f095ecf9c Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Tue, 13 Oct 2009 23:58:36 +0200 Subject: [PATCH] procedure property efficiency tweak * libguile/procprop.c (scm_procedure_property) scm_set_procedure_property_x): Fix to not call scm_procedure_properties(), and thus to avoid consing up the arity as well. --- libguile/procprop.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/libguile/procprop.c b/libguile/procprop.c index 4f18dff75..c066eca8a 100644 --- a/libguile/procprop.c +++ b/libguile/procprop.c @@ -194,7 +194,18 @@ SCM_DEFINE (scm_procedure_property, "procedure-property", 2, 0, 0, /* avoid a cons in this case */ return scm_i_procedure_arity (proc); else - return scm_assq_ref (scm_procedure_properties (proc), key); + { + SCM props; + if (SCM_CLOSUREP (proc)) + props = SCM_PROCPROPS (proc); + else + { + scm_i_pthread_mutex_lock (&non_closure_props_lock); + props = scm_hashq_ref (non_closure_props, proc, SCM_EOL); + scm_i_pthread_mutex_unlock (&non_closure_props_lock); + } + return scm_assq_ref (props, key); + } } #undef FUNC_NAME @@ -208,9 +219,20 @@ SCM_DEFINE (scm_set_procedure_property_x, "set-procedure-property!", 3, 0, 0, if (scm_is_eq (key, scm_sym_arity)) SCM_MISC_ERROR ("arity is a read-only property", SCM_EOL); - scm_set_procedure_properties_x - (proc, - scm_assq_set_x (scm_procedure_properties (proc), key, val)); + + if (SCM_CLOSUREP (proc)) + SCM_SETPROCPROPS (proc, + scm_assq_set_x (SCM_PROCPROPS (proc), key, val)); + else + { + scm_i_pthread_mutex_lock (&non_closure_props_lock); + scm_hashq_set_x (non_closure_props, proc, + scm_assq_set_x (scm_hashq_ref (non_closure_props, proc, + SCM_EOL), + key, val)); + scm_i_pthread_mutex_unlock (&non_closure_props_lock); + } + return SCM_UNSPECIFIED; } #undef FUNC_NAME