]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4627: Convert Scheme_hash_table to using Smob1
authorDavid Kastrup <dak@gnu.org>
Tue, 16 Jun 2015 06:07:45 +0000 (08:07 +0200)
committerDavid Kastrup <dak@gnu.org>
Sun, 11 Oct 2015 08:37:01 +0000 (10:37 +0200)
That reduces its memory and access footprint.  The unused copy
constructor is removed altogether as the use of Smob1 would require
different semantics.

lily/all-font-metrics.cc
lily/context.cc
lily/include/scm-hash.hh
lily/scm-hash.cc
lily/translator-ctors.cc

index 13542022c33fc6a5f2f9ab7970fad638e11e876f..79bb4f128d949d3677f1000038ebb1d1c195bd20 100644 (file)
@@ -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> (Scheme_hash_table::make_smob ());
 
 #if HAVE_PANGO_FT2
-  pango_dict_->unprotect ();
+  pango_dict_ = unsmob<Scheme_hash_table> (Scheme_hash_table::make_smob ());
   PangoFontMap *pfm = pango_ft2_font_map_new ();
 
   pango_ft2_fontmap_ = PANGO_FT2_FONT_MAP (pfm);
index 7892236010bac918da656db7cdaad2daab7a7b85..b425aff5d26332eda45710310e3a8c3f143ae7b2 100644 (file)
@@ -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 ();
index f77ba50635a4227d40847e56da2f743cf71eb0f5..3453904f7152cf3c8cfe60b652fca9892803637a 100644 (file)
@@ -20,7 +20,7 @@
 #ifndef SCM_HASH_HH
 #define SCM_HASH_HH
 
-#include "smobs.hh"
+#include "small-smobs.hh"
 
 /*
   hash table.
   scm_gc_unprotect_object (tab->self_scm_);
 */
 
-class Scheme_hash_table : public Smob<Scheme_hash_table>
+class Scheme_hash_table : public Smob1<Scheme_hash_table>
 {
 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 */
index b56c400556167339b5052ded5e41021a41fa9242..dd8f9257b933a93d9bfb92b7593180aa3cb16f7d 100644 (file)
 
 #include "scm-hash.hh"
 
-#include <cstdio>
-#include <algorithm>
-
-
-/*
-  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) &copy_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<Scheme_hash_table> ()
-{
-  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 <cassert>
 
 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 ("#<Scheme_hash_table  ", p);
-  scm_display (hash_tab_, p);
+  scm_display (hash_tab (), p);
   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 ());
 }
index 15edd7df4ab67a39ed9b7ddaff1d8bf6d0f9139a..67fa95a610b139608d94482ae54d6afb202221b3 100644 (file)
   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<Scheme_hash_table> (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<Scheme_hash_table> (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<Scheme_hash_table> (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<Scheme_hash_table> (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<Translator> (v);
 }
-