From 53eac1b03fb220058d07bb2ff638b12b6fcce6bc Mon Sep 17 00:00:00 2001 From: Keith OHara Date: Fri, 13 Dec 2013 21:46:49 -0800 Subject: [PATCH] grob-property: if callback is independent of layout, call just once --- lily/grob-property.cc | 11 ++++++++++- lily/include/unpure-pure-container.hh | 1 + lily/unpure-pure-container.cc | 11 +++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lily/grob-property.cc b/lily/grob-property.cc index f9773e5ec5..32ff49124d 100644 --- a/lily/grob-property.cc +++ b/lily/grob-property.cc @@ -197,8 +197,17 @@ SCM Grob::internal_get_pure_property (SCM sym, int start, int end) const { SCM val = internal_get_property_data (sym); - if (ly_is_procedure (val) || is_unpure_pure_container (val)) + if (ly_is_procedure (val)) return call_pure_function (val, scm_list_1 (self_scm ()), start, end); + + if (is_unpure_pure_container (val)) { + // Do cache, if the function ignores 'start' and 'end' + if (is_unchanging_unpure_pure_container (val)) + return internal_get_property (sym); + else + return call_pure_function (val, scm_list_1 (self_scm ()), start, end); + } + if (is_simple_closure (val)) return evaluate_with_simple_closure (self_scm (), simple_closure_expression (val), diff --git a/lily/include/unpure-pure-container.hh b/lily/include/unpure-pure-container.hh index ccf0971844..e4347b4d0a 100644 --- a/lily/include/unpure-pure-container.hh +++ b/lily/include/unpure-pure-container.hh @@ -23,6 +23,7 @@ #include "lily-guile.hh" bool is_unpure_pure_container (SCM s); +bool is_unchanging_unpure_pure_container (SCM s); SCM unpure_pure_container_unpure_part (SCM smob); SCM unpure_pure_container_pure_part (SCM smob); SCM ly_make_unpure_pure_container (SCM, SCM); diff --git a/lily/unpure-pure-container.cc b/lily/unpure-pure-container.cc index 9b2f871769..b8d1e2d4a5 100644 --- a/lily/unpure-pure-container.cc +++ b/lily/unpure-pure-container.cc @@ -32,6 +32,17 @@ is_unpure_pure_container (SCM s) return (SCM_NIMP (s) && SCM_CELL_TYPE (s) == unpure_pure_container_tag); } +bool +is_unchanging_unpure_pure_container (SCM s) +// A container that has the same callback for both 'pure' and 'unpure' lookups +// and which ignores the 'start' and 'end' columnns. +// Such a callback will give the same answer for tentative or final layouts. +{ + LY_ASSERT_TYPE (is_unpure_pure_container, s, 1); + SCM pure_part = SCM_SMOB_OBJECT_2 (s); + return (SCM_UNBNDP (pure_part)); +} + SCM unpure_pure_container_unpure_part (SCM smob) { -- 2.39.5