]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/score.cc (Score): unprotect copy of Output_def. Plugs
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 31 May 2005 15:25:26 +0000 (15:25 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 31 May 2005 15:25:26 +0000 (15:25 +0000)
memory leak.

* lily/parser.yy (score_body): don't clone Score, that's done in
Lily_lexer::try_special_identifiers(). This fixes a memory leak.

* lily/score-engraver.cc (derived_mark): new function.
(initialize): unprotect Paper_score. This fixes a memory leak.

* lily/score-performer.cc (derived_mark): new function.

* lily/score-translator.cc (get_output): use SCM for get_output() call.

18 files changed:
ChangeLog
lily/global-context-scheme.cc
lily/global-context.cc
lily/grob.cc
lily/include/global-context.hh
lily/include/score-context.hh
lily/include/score-engraver.hh
lily/include/score-performer.hh
lily/include/score-translator.hh
lily/music-output.cc
lily/paper-score.cc
lily/parser.yy
lily/score-context.cc
lily/score-engraver.cc
lily/score-performer.cc
lily/score-translator.cc
lily/score.cc
scm/lily.scm

index 26bfe8eb43da812748cfa7fa487a7019e5c5e46b..e77c4a37a1877dd775ada04131af07c09d3afed6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
 2005-05-31  Han-Wen Nienhuys  <hanwen@xs4all.nl>
 
+       * lily/score.cc (Score): unprotect copy of Output_def. Plugs
+       memory leak.
+
+       * lily/parser.yy (score_body): don't clone Score, that's done in
+       Lily_lexer::try_special_identifiers(). This fixes a memory leak.
+
+       * lily/score-engraver.cc (derived_mark): new function.
+       (initialize): unprotect Paper_score. This fixes a memory leak.
+
+       * lily/score-performer.cc (derived_mark): new function.
+
+       * lily/score-translator.cc (get_output): use SCM for get_output() call.
+
        * stepmake/aclocal.m4: put FlexLexer.h test in conftest.cc. Fixes
        spurious warning.
 
index c98a6fd8e458aef15b0d304d66c92b8d175b0d5a..8b77fab5c6e1c01758d132f55e39a26a58313faa 100644 (file)
@@ -24,10 +24,10 @@ LY_DEFINE (ly_format_output, "ly:format-output",
   Global_context *g = dynamic_cast<Global_context *> (unsmob_context (context));
   SCM_ASSERT_TYPE (g, context, SCM_ARG1, __FUNCTION__, "Global context");
 
-  Music_output *output = g->get_output ();
+  SCM output = g->get_output ();
   progress_indication ("\n");
-  output->process ();
-  return output->self_scm ();
+  unsmob_music_output (output)->process ();
+  return output;
 }
 
 LY_DEFINE (ly_run_translator, "ly:run-translator",
index df9187d1e5df9363620bc804fd9a16678bc81e92..7f342a182f2bebb4ef1f7edb7a73bb9fbd4cbe10 100644 (file)
@@ -97,7 +97,7 @@ Global_context::get_score_context () const
     : 0;
 }
 
-Music_output *
+SCM
 Global_context::get_output ()
 {
   return get_score_context ()->get_output ();
index fca538fb7eb67bd601cae254bda3c2e8b0729fb1..548c82f2c84d74f7ab0949c5adc15f62839d0274 100644 (file)
@@ -663,8 +663,8 @@ Grob::mark_smob (SCM ses)
   if (s->original_)
     scm_gc_mark (s->original_->self_scm ());
 
-  if (s->pscore_ && s->pscore_->layout ())
-    scm_gc_mark (s->pscore_->layout ()->self_scm ());
+  if (s->pscore_)
+    scm_gc_mark (s->pscore_->self_scm ());
 
   s->do_derived_mark ();
   return s->mutable_property_alist_;
index adc0b07932e6098315b518ea3b1d7e783f262051..720147e03d4e488e97291d5ddc952f37ddb21f82 100644 (file)
@@ -29,7 +29,7 @@ public:
   void apply_finalizations ();
   void add_finalization (SCM);
 
-  virtual Music_output *get_output ();
+  virtual SCM get_output ();
   virtual void prepare (Moment);
   virtual void one_time_step ();
   virtual void finish ();
index f22038a841a26425f8a5849a2882efc91c6b7089..44028900d746063d97f46e0012b0fd4f26c605c7 100644 (file)
@@ -15,7 +15,7 @@ class Score_context : public Context
 public:
   Score_context (Object_key const *);
 
-  virtual Music_output *get_output ();
+  virtual SCM get_output ();
   virtual void prepare (Moment);
   virtual void finish ();
   virtual void one_time_step ();
index a790b5f967e863c93b194ae27c5a43ccf727bb64..6286759fee6404bb9b66f2491674111cb5db10a0 100644 (file)
@@ -32,6 +32,7 @@ protected:
   virtual void prepare (Moment);
   virtual void one_time_step ();
 
+  
   /* Engraver_group_engraver interface */
   virtual void acknowledge_grob (Grob_info);
   virtual bool try_music (Music *);
@@ -40,10 +41,14 @@ protected:
   virtual void announce_grob (Grob_info);
   virtual void stop_translation_timestep ();
 
+  /*
+    Translator interface
+   */
+  virtual void derived_mark () const;
 public:
   TRANSLATOR_DECLARATIONS (Score_engraver);
   void forbid_breaks ();
-  virtual Music_output *get_output ();
+  virtual SCM get_output ();
 };
 
 #endif /* SCORE_ENGRAVER_HH */
index 9c36525db8d2aab79c8f47be8c654fe05ad045bb..cd3ebefa6904a39cebb936cbc9fa9d3cccdd45a3 100644 (file)
@@ -29,7 +29,8 @@ protected:
   virtual void announce_element (Audio_element_info);
   virtual int get_tempo () const;
   virtual void play_element (Audio_element *p);
-  virtual Music_output *get_output ();
+  virtual SCM get_output ();
+  virtual void derived_mark () const;
 private:
   void header (Midi_stream &);
 
index 532ef943483253caa9cadc1219503a6f79a514bd..7c3e5033242198dca23c7a542662ce456b706832 100644 (file)
@@ -15,7 +15,7 @@ class Score_translator : public virtual Translator_group
 {
   friend class Score_context;
 protected:
-  virtual Music_output *get_output ();
+  virtual SCM get_output ();
   virtual void prepare (Moment);
   virtual void finish ();
   virtual void one_time_step ();
index 5330e864eb3bdf93924d07df564bc50f413a6a12..c41d59e3a940d870f8d30c136692c3f2c225c850 100644 (file)
@@ -8,7 +8,9 @@
 */
 
 #include "music-output.hh" 
+
 #include "ly-smobs.icc"
+#include "virtual-methods.hh"
 
 Music_output::Music_output ()
 {
@@ -44,9 +46,12 @@ Music_output::mark_smob (SCM s)
 }
 
 int
-Music_output::print_smob (SCM, SCM p, scm_print_state*)
+Music_output::print_smob (SCM s, SCM p, scm_print_state*)
 {
-  scm_puts ("#<Music_output>", p);
+  Music_output *sc = (Music_output *) SCM_CELL_WORD_1 (s);
+  scm_puts ("#<", p);
+  scm_puts (classname (sc), p);
+  scm_puts (">", p);
 
   return 1;
 }
index b7568416793f3dbc0b3e7c06858aef087d9bb233..98b734a6534da32429d9a409a45d25824c86b0f3 100644 (file)
@@ -39,6 +39,8 @@ Paper_score::Paper_score (Paper_score const &s)
 void
 Paper_score::derived_mark () const
 {
+  if (layout_)
+    scm_gc_mark (layout_->self_scm ());
   scm_gc_mark (systems_);
   scm_gc_mark (paper_systems_);
 }
index 8d1cbb643ba4bf6aeba47cc508c7dbd96a495729..9982ba66903dfeac6401e0dc672607f573163cb5 100644 (file)
@@ -792,7 +792,7 @@ score_body:
                $$->set_spot (@$);
        }
        | SCORE_IDENTIFIER {
-               $$ = new Score ( *unsmob_score ($1));
+               $$ = unsmob_score ($1);
                $$->set_spot (@$);
        }
        | score_body object_id_setting {
index c89469d8f9a6d0370004b59e71fc1935a99b7027..15e2e5e9facc7db7ab8c4e97d9c3fe88136514ba 100644 (file)
@@ -36,7 +36,7 @@ Score_context::one_time_step ()
   s->one_time_step ();
 }
 
-Music_output *
+SCM
 Score_context::get_output ()
 {
   Translator *t = implementation ();
index 08be7890d5b468138655a0f5c3cc7789aca16670..46d2078a424e19c056417917e9581abfb239ff7d 100644 (file)
@@ -34,6 +34,15 @@ Score_engraver::Score_engraver ()
   pscore_ = 0;
 }
 
+void
+Score_engraver::derived_mark () const
+{
+  if (pscore_)
+    scm_gc_mark (pscore_->self_scm ());
+  Score_translator::derived_mark ();
+  Engraver_group_engraver::derived_mark ();
+}
+
 void
 Score_engraver::make_columns ()
 {
@@ -106,6 +115,7 @@ Score_engraver::initialize ()
     }
 
   pscore_ = new Paper_score (dynamic_cast<Output_def *> (get_output_def ()));
+  scm_gc_unprotect_object (pscore_->self_scm ()); 
 
   SCM props = updated_grob_properties (context (), ly_symbol2scm ("System"));
 
@@ -217,12 +227,11 @@ Score_engraver::set_columns (Paper_column *new_command,
   system_->add_column (musical_column_);
 }
 
-Music_output *
+SCM
 Score_engraver::get_output ()
 {
   Music_output *o = pscore_;
-  ///FIXME WTF ? pscore_ = 0;
-  return o;
+  return o->self_scm ();
 }
 
 bool
index 31f9ecdade04ba9b4ff72a8c71110e838e665384..0c341dd98c3635115fb67cc9416cf7a02745f098 100644 (file)
@@ -78,18 +78,29 @@ Score_performer::get_tempo () const
   return ::get_tempo (performance_->midi_, Moment (Rational (1, 4)));
 }
 
-Music_output *
+SCM
 Score_performer::get_output ()
 {
   Music_output *o = performance_;
   performance_ = 0;
-  return o;
+  return o->self_scm ();
+}
+
+void
+Score_performer::derived_mark () const
+{
+  if (performance_)
+    scm_gc_mark (performance_->self_scm ());
+
+  Score_translator::derived_mark ();
+  Performer_group_performer::derived_mark ();
 }
 
 void
 Score_performer::initialize ()
 {
   performance_ = new Performance;
+  scm_gc_unprotect_object (performance_->self_scm ());
   performance_->midi_ = get_output_def ();
 
   Translator_group::initialize ();
index ceb980d3fb0e749dc8f620a676bdc62dc0373b0f..f8fa4d931763186aefaf7b4f476e4bf2a50357a3 100644 (file)
@@ -14,10 +14,10 @@ Score_translator::prepare (Moment)
 {
 }
 
-Music_output *
+SCM
 Score_translator::get_output ()
 {
-  return 0;
+  return SCM_EOL;
 }
 
 void
index ee628b9b25f91863056b6726c67bb7d80ea98145..cec3cef117f79ea3b2b2310fe0b28ea2e2dfa7f2 100644 (file)
@@ -78,8 +78,11 @@ Score::Score (Score const &s)
   scm_gc_unprotect_object (music_);
 
   for (int i = 0, n = s.defs_.size (); i < n; i++)
-    defs_.push (s.defs_[i]->clone ());
-
+    {
+      Output_def * copy = s.defs_[i]->clone ();
+      defs_.push (copy);
+      scm_gc_unprotect_object (copy->self_scm ());
+    }
   header_ = ly_make_anonymous_module (false);
   if (ly_c_module_p (s.header_))
     ly_module_copy (header_, s.header_);
index 9bc8504810e7dd9de4660fb4c5d5be5c591111f5..903df5b2f8e302276c588046f7bb0cbd9616a6b7 100644 (file)
@@ -274,7 +274,7 @@ The syntax is the same as `define*-public'."
                         ".scm"))
         (outfile    (open-file  out-file-name  "w")))
 
-    (display "Dumping gc protected objs to ...\n")
+    (display (format "Dumping gc protected objs to ~a...\n" out-file-name))
     (display
      (filter
       (lambda (x) (not (symbol? x))) 
@@ -326,8 +326,8 @@ The syntax is the same as `define*-public'."
   (catch 'ly-file-failed
         (lambda () (ly:parse-file file-name))
         (lambda (x . args) (handler x file-name)))
-  ;;(lambda (x) (handler x f)))
-  (if #f
+
+  (if #t
       (dump-gc-protects)))
 
 (use-modules (scm editor))