]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/score-element.cc
release: 1.3.0
[lilypond.git] / lily / score-element.cc
index 9368f95f866620aedbd07afa7c717b20ecae4f46..a8a82a8a87c6cb0f3e636e28fdce7655a56e4633 100644 (file)
@@ -44,13 +44,18 @@ Score_element::Score_element()
   pscore_l_=0;
   lookup_l_ =0;
   status_i_ = 0;
+  self_scm_ = SCM_EOL;
   original_l_ = 0;
   element_property_alist_ = scm_protect_object (gh_cons (gh_cons (void_scm_sym, SCM_BOOL_T) , SCM_EOL));
+
+  smobify_self ();
 }
 
 Score_element::Score_element (Score_element const&s)
   : Graphical_element (s)
 {
+  
+  self_scm_ = SCM_EOL;
   used_b_ = true;
   original_l_ =(Score_element*) &s;
   element_property_alist_ = scm_protect_object (scm_list_copy (s.element_property_alist_));
@@ -59,11 +64,13 @@ Score_element::Score_element (Score_element const&s)
   status_i_ = s.status_i_;
   lookup_l_ = s.lookup_l_;
   pscore_l_ = s.pscore_l_;
+
+  smobify_self ();
 }
 
 Score_element::~Score_element()
 {
-  delete output_p_; 
+  assert (!output_p_);
   assert (status_i_ >=0);
   status_i_  = -1;
 }
@@ -137,16 +144,16 @@ void
 Score_element::print() const
 {
 #ifndef NPRINT
-  DOUT << classname(this) << "{\n";
-  if (check_debug && !lily_monitor->silent_b ("Score_element"))
+  DEBUG_OUT << classname(this) << "{\n";
+  if (flower_dstream && !flower_dstream->silent_b ("Score_element"))
     ly_display_scm (element_property_alist_);
-  DOUT << "dependencies: " << dependency_size();
+  DEBUG_OUT << "dependencies: " << dependency_size();
   if (original_l_)
-    DOUT << "Copy ";
+    DEBUG_OUT << "Copy ";
   Graphical_element::do_print ();
   do_print();
   
-  DOUT <<  "}\n";
+  DEBUG_OUT <<  "}\n";
 #endif
 }
 
@@ -223,6 +230,9 @@ Score_element::output_processing ()
   pscore_l_->outputter_l_->output_molecule (output_p_,
                                            o,
                                            classname(this));
+
+  delete output_p_;
+  output_p_ =0;
 }
 
 /*
@@ -424,3 +434,33 @@ Score_element::find_broken_piece (Line_of_score*) const
 {
   return 0;
 }
+
+SCM
+Score_element::mark_smob (SCM ses)
+{
+  void * mp = (void*) SCM_CDR(ses);
+  Score_element * s = (Score_element*) mp;
+
+  assert (s->self_scm_ == ses);
+  return s->element_property_alist_;
+}
+
+
+int
+Score_element::print_smob (SCM s, SCM port, scm_print_state *)
+{
+  Score_element *sc = (Score_element *) SCM_CDR (s);
+     
+  scm_puts ("#<Score_element ", port);
+  scm_puts ((char *)sc->name (), port);
+  scm_puts (" >", port);
+  return 1;
+}
+
+void
+Score_element::do_smobify_self ()
+{
+  scm_unprotect_object (element_property_alist_); // ugh
+}
+#include "ly-smobs.icc"
+IMPLEMENT_SMOBS(Score_element);