From: David Kastrup Date: Tue, 16 Jun 2015 06:07:45 +0000 (+0200) Subject: Issue 4627: Convert Scheme_hash_table to using Smob1 X-Git-Tag: release/2.19.29-1~11 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=cfc908430e67711a28a33097aaea491f7c127a72;p=lilypond.git Issue 4627: Convert Scheme_hash_table to using Smob1 That reduces its memory and access footprint. The unused copy constructor is removed altogether as the use of Smob1 would require different semantics. --- diff --git a/lily/all-font-metrics.cc b/lily/all-font-metrics.cc index 13542022c3..79bb4f128d 100644 --- a/lily/all-font-metrics.cc +++ b/lily/all-font-metrics.cc @@ -45,15 +45,15 @@ All_font_metrics::get_index_to_charcode_map (const string &filename, All_font_metrics::All_font_metrics (const string &path) { #if HAVE_PANGO_FT2 - pango_dict_ = new Scheme_hash_table; + pango_dict_ = 0; #endif - otf_dict_ = new Scheme_hash_table; + otf_dict_ = 0; smobify_self (); - otf_dict_->unprotect (); + otf_dict_ = unsmob (Scheme_hash_table::make_smob ()); #if HAVE_PANGO_FT2 - pango_dict_->unprotect (); + pango_dict_ = unsmob (Scheme_hash_table::make_smob ()); PangoFontMap *pfm = pango_ft2_font_map_new (); pango_ft2_fontmap_ = PANGO_FT2_FONT_MAP (pfm); diff --git a/lily/context.cc b/lily/context.cc index 7892236010..b425aff5d2 100644 --- a/lily/context.cc +++ b/lily/context.cc @@ -93,8 +93,7 @@ Context::Context () smobify_self (); - Scheme_hash_table *tab = new Scheme_hash_table; - properties_scm_ = tab->unprotect (); + properties_scm_ = Scheme_hash_table::make_smob (); event_source_ = new Dispatcher (); event_source_->unprotect (); events_below_ = new Dispatcher (); diff --git a/lily/include/scm-hash.hh b/lily/include/scm-hash.hh index f77ba50635..3453904f71 100644 --- a/lily/include/scm-hash.hh +++ b/lily/include/scm-hash.hh @@ -20,7 +20,7 @@ #ifndef SCM_HASH_HH #define SCM_HASH_HH -#include "smobs.hh" +#include "small-smobs.hh" /* hash table. @@ -43,25 +43,21 @@ scm_gc_unprotect_object (tab->self_scm_); */ -class Scheme_hash_table : public Smob +class Scheme_hash_table : public Smob1 { public: int print_smob (SCM, scm_print_state *) const; - SCM mark_smob () const; - virtual ~Scheme_hash_table (); bool try_retrieve (SCM key, SCM *val); bool contains (SCM key) const; void set (SCM k, SCM v); SCM get (SCM k) const; void remove (SCM k); - Scheme_hash_table (); void operator = (Scheme_hash_table const &); - Scheme_hash_table (Scheme_hash_table const &); SCM to_alist () const; + static SCM make_smob (); private: - SCM hash_tab_; - void copy (Scheme_hash_table const &src); + SCM &hash_tab () const { return scm1 (); } }; #endif /* SCM_HASH_HH */ diff --git a/lily/scm-hash.cc b/lily/scm-hash.cc index b56c400556..dd8f9257b9 100644 --- a/lily/scm-hash.cc +++ b/lily/scm-hash.cc @@ -19,69 +19,19 @@ #include "scm-hash.hh" -#include -#include - - -/* - Return: number of objects. -*/ -SCM -copy_handle (void *closure, SCM handle) -{ - SCM tab = (SCM) closure; - scm_hashq_set_x (tab, scm_car (handle), scm_cdr (handle)); - return tab; -} - -static void -copy_scm_hashes (SCM dest, SCM src) -{ - scm_internal_hash_for_each_handle ((scm_t_hash_handle_fn) ©_handle, - dest, src); -} - -Scheme_hash_table::Scheme_hash_table () -{ - hash_tab_ = SCM_EOL; - smobify_self (); - hash_tab_ = scm_c_make_hash_table (119); -} - -Scheme_hash_table::Scheme_hash_table (Scheme_hash_table const &src) - : Smob () -{ - hash_tab_ = SCM_EOL; - smobify_self (); - copy (src); -} - -void -Scheme_hash_table::copy (Scheme_hash_table const &src) -{ - if (&src == this) - return; - - hash_tab_ = scm_c_make_hash_table (SCM_HASHTABLE_N_ITEMS (src.hash_tab_)); - copy_scm_hashes (hash_tab_, src.hash_tab_); -} - -Scheme_hash_table::~Scheme_hash_table () -{ -} +#include SCM -Scheme_hash_table::mark_smob () const +Scheme_hash_table::make_smob () { - scm_gc_mark (hash_tab_); - return SCM_EOL; + return Smob1::make_smob (scm_c_make_hash_table (119)); } int Scheme_hash_table::print_smob (SCM p, scm_print_state *) const { scm_puts ("# ", p); return 1; } @@ -90,7 +40,7 @@ bool Scheme_hash_table::try_retrieve (SCM k, SCM *v) { - SCM handle = scm_hashq_get_handle (hash_tab_, k); + SCM handle = scm_hashq_get_handle (hash_tab (), k); if (scm_is_pair (handle)) { *v = scm_cdr (handle); @@ -103,14 +53,14 @@ Scheme_hash_table::try_retrieve (SCM k, SCM *v) bool Scheme_hash_table::contains (SCM k) const { - return scm_is_pair (scm_hashq_get_handle (hash_tab_, k)); + return scm_is_pair (scm_hashq_get_handle (hash_tab (), k)); } void Scheme_hash_table::set (SCM k, SCM v) { assert (scm_is_symbol (k)); - SCM handle = scm_hashq_create_handle_x (hash_tab_, k, SCM_UNDEFINED); + SCM handle = scm_hashq_create_handle_x (hash_tab (), k, SCM_UNDEFINED); scm_set_cdr_x (handle, v); } @@ -119,13 +69,13 @@ Scheme_hash_table::get (SCM k) const { /* SCM_UNSPECIFIED will stick out like a sore thumb, hopefully. */ - return scm_hashq_ref (hash_tab_, k, SCM_UNSPECIFIED); + return scm_hashq_ref (hash_tab (), k, SCM_UNSPECIFIED); } void Scheme_hash_table::remove (SCM k) { - scm_hashq_remove_x (hash_tab_, k); + scm_hashq_remove_x (hash_tab (), k); } static SCM @@ -141,5 +91,5 @@ SCM Scheme_hash_table::to_alist () const { return scm_internal_hash_fold ((scm_t_hash_fold_fn) &collect_handles, - NULL, SCM_EOL, hash_tab_); + NULL, SCM_EOL, hash_tab ()); } diff --git a/lily/translator-ctors.cc b/lily/translator-ctors.cc index 15edd7df4a..67fa95a610 100644 --- a/lily/translator-ctors.cc +++ b/lily/translator-ctors.cc @@ -28,14 +28,14 @@ should delete these after exit. */ -Scheme_hash_table *global_translator_dict = 0; -Protected_scm global_translator_dict_scm; +Protected_scm global_translator_dict; LY_DEFINE (get_all_translators, "ly:get-all-translators", 0, 0, 0, (), "Return a list of all translator objects that may be" " instantiated.") { - SCM l = global_translator_dict ? global_translator_dict->to_alist () : SCM_EOL; + Scheme_hash_table *dict = unsmob (global_translator_dict); + SCM l = dict ? dict->to_alist () : SCM_EOL; for (SCM s = l; scm_is_pair (s); s = scm_cdr (s)) scm_set_car_x (s, scm_cdar (s)); @@ -46,22 +46,24 @@ LY_DEFINE (get_all_translators, "ly:get-all-translators", 0, 0, 0, (), void add_translator (Translator *t) { - if (!global_translator_dict) + Scheme_hash_table *dict = unsmob (global_translator_dict); + if (!dict) { - global_translator_dict = new Scheme_hash_table; - global_translator_dict_scm = global_translator_dict->unprotect (); + global_translator_dict = Scheme_hash_table::make_smob (); + dict = unsmob (global_translator_dict); } SCM k = ly_symbol2scm (t->class_name ()); - global_translator_dict->set (k, t->unprotect ()); + dict->set (k, t->unprotect ()); } Translator * get_translator (SCM sym) { SCM v = SCM_BOOL_F; - if (global_translator_dict) - global_translator_dict->try_retrieve (sym, &v); + Scheme_hash_table *dict = unsmob (global_translator_dict); + if (dict) + dict->try_retrieve (sym, &v); if (scm_is_false (v)) { @@ -71,4 +73,3 @@ get_translator (SCM sym) return unsmob (v); } -