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.
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.
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",
: 0;
}
-Music_output *
+SCM
Global_context::get_output ()
{
return get_score_context ()->get_output ();
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_;
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 ();
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 ();
virtual void prepare (Moment);
virtual void one_time_step ();
+
/* Engraver_group_engraver interface */
virtual void acknowledge_grob (Grob_info);
virtual bool try_music (Music *);
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 */
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 &);
{
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 ();
*/
#include "music-output.hh"
+
#include "ly-smobs.icc"
+#include "virtual-methods.hh"
Music_output::Music_output ()
{
}
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;
}
void
Paper_score::derived_mark () const
{
+ if (layout_)
+ scm_gc_mark (layout_->self_scm ());
scm_gc_mark (systems_);
scm_gc_mark (paper_systems_);
}
$$->set_spot (@$);
}
| SCORE_IDENTIFIER {
- $$ = new Score ( *unsmob_score ($1));
+ $$ = unsmob_score ($1);
$$->set_spot (@$);
}
| score_body object_id_setting {
s->one_time_step ();
}
-Music_output *
+SCM
Score_context::get_output ()
{
Translator *t = implementation ();
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 ()
{
}
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"));
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
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 ();
{
}
-Music_output *
+SCM
Score_translator::get_output ()
{
- return 0;
+ return SCM_EOL;
}
void
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_);
".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)))
(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))