]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/include/ly-smobs.icc
Docs: clean up Texi2html init file CSS classes generation
[lilypond.git] / lily / include / ly-smobs.icc
index 45ba7ebf2d1e58d4fbf441706c3f37052c63559d..7c730cdd09904e002a8379948e01604fba0d9649 100644 (file)
@@ -1,9 +1,20 @@
 /*
-  ly-smobs.icc -- implement smob glue.
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
-  (c) 1999--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #ifndef LY_SMOBS_ICC
   ADD_SCM_INIT_FUNC (init_type_ ## CL, init_type_ ## CL)
 
 #define IMPLEMENT_BASE_SMOBS(CL)                                       \
+  void \
+  CL ## _type_adder ()                 \
+  {\
+    ly_add_type_predicate ((void*) &CL::unsmob, #CL);  \
+  }\
+  ADD_SCM_INIT_FUNC(CL ## _type_adder_ctor, \
+                   CL ## _type_adder);\
+  const char *CL::smob_name_ = #CL;                                    \
   scm_t_bits CL::smob_tag_;                                            \
   SCM                                                                  \
   CL::smob_p (SCM s)                                                   \
@@ -51,7 +70,7 @@
   {                                                                    \
     CL *s = (CL *) SCM_CELL_WORD_1 (ses);                              \
     delete s;                                                          \
-    scm_gc_unregister_collectable_memory (s, sizeof (CL), #CL " smob");        \
+    /*    scm_gc_unregister_collectable_memory (s, sizeof (CL), #CL " smob"); */ \
     return SMOB_FREE_RETURN_VAL (CL);                                  \
   }                                                                    \
                                                                        \
     void                                                               \
   CL::smobify_self ()                                                  \
   {                                                                    \
-    SCM s = unprotected_smobify_self ();                               \
-    scm_gc_protect_object (s);                                         \
+    protection_cons_ = SCM_EOL;                                                \
+    self_scm_ = unprotected_smobify_self ();                           \
+    protect ();                                                                \
+  }                                                                    \
+  void                                                                 \
+  CL::protect ()                                                       \
+  {                                                                    \
+    protect_smob (self_scm_, &protection_cons_);                       \
+  }                                                                    \
+  SCM                                                                  \
+  CL::unprotect ()                                                     \
+  {                                                                    \
+    unprotect_smob (self_scm_, &protection_cons_);                     \
+    return self_scm_;                                                  \
   }                                                                    \
-                                                                       \
   SCM                                                                  \
   CL::unprotected_smobify_self ()                                      \
   {                                                                    \
       This is local. We don't assign to self_scm_ directly, to assure  \
       that S isn't GC-ed from under us.                                        \
                                                                        \
-                                                                       We don't use smobbed_self () to ensure that mark_smob () doesn't have to \
-                                                                       deal half-initialized objects: scm_done_malloc ( ) might trigger GC. \
-                                                                       the warning in smobs.hh is just to be doubleplus goodly sure \
+      We don't use smobbed_self () to ensure that mark_smob () doesn't  \
+      have to deal half-initialized objects: scm_done_malloc ( ) might  \
+      trigger GC.the warning in smobs.hh is just to be doubleplus       \
+      goodly sure                                                       \
     */                                                                 \
     SCM s;                                                             \
     SCM_NEWSMOB (s, CL::smob_tag_, this);                              \