+pl 12.jcn2
+ - smobs
+
+
pl 12.jcn1
- auto-knees, input/test/auto-knee.ly
MAJOR_VERSION=1
MINOR_VERSION=2
PATCH_LEVEL=12
-MY_PATCH_LEVEL=jcn1
+MY_PATCH_LEVEL=jcn2
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
#include "engraver-group-engraver.hh"
#include "debug.hh"
#include "paper-def.hh"
+#include "score-element.hh"
void
Engraver::fill_staff_info (Staff_info&)
Engraver::announce_element (Score_element_info i)
{
i.origin_trans_l_arr_.push (this);
+ Score_element *s = i.elem_l_;
+ if (s->self_scm_ == SCM_EOL)
+ {
+ scm_protect_object (s->smobify_self ());
+ }
+
daddy_grav_l()->announce_element (i);
}
virtual Link_array<Score_element> get_extra_dependencies () const;
static Interval dim_cache_callback (Dimension_cache*);
+public:
+ SCM smobify_self ();
+ static SCM mark_smob (SCM);
+ static scm_sizet free_smob (SCM s);
+ static int print_smob (SCM s, SCM p, scm_print_state*);
+ static long smob_tag;
+ static void init_smobs();
+ SCM self_scm_;
};
}
extern void init_symbols ();
+extern void init_smobs (); // guh -> .hh
+
void
init_lily_guile ()
{
init_symbols();
init_functions ();
+ init_smobs ();
}
elem_p->pscore_l_ = this;
// take over protection.
- SCM_CDR(protected_scms_) = gh_cons (elem_p->element_property_alist_,
+ assert (elem_p->self_scm_ != SCM_EOL);
+ SCM_CDR(protected_scms_) = gh_cons (elem_p->self_scm_,
SCM_CDR (protected_scms_));
- scm_unprotect_object (elem_p->element_property_alist_);
+ scm_unprotect_object (elem_p->self_scm_);
SCM p = elem_p->remove_elt_property (break_helper_only_scm_sym);
if (p != SCM_BOOL_F)
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));
}
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_));
{
return 0;
}
+
+static scm_smobfuns score_elt_funs = {
+ Score_element::mark_smob, Score_element::free_smob,
+ Score_element::print_smob, 0,
+};
+
+
+SCM
+Score_element::smobify_self ()
+{
+ if (self_scm_ != SCM_EOL)
+ return self_scm_;
+
+ SCM s;
+ SCM_NEWCELL(s);
+ SCM_SETCAR(s,smob_tag);
+ SCM_SETCDR(s,this);
+ self_scm_ = s;
+ scm_unprotect_object (element_property_alist_); // ugh
+ return s;
+}
+
+SCM
+Score_element::mark_smob (SCM ses)
+{
+ Score_element * s = (Score_element*) SCM_CDR(ses);
+ scm_gc_mark (s->self_scm_);
+ return s->element_property_alist_;
+}
+
+scm_sizet
+Score_element::free_smob (SCM ses)
+{
+ Score_element * s = (Score_element*) SCM_CDR(ses);
+ delete s;
+ return 0;
+}
+
+int
+Score_element::print_smob (SCM s, SCM p, scm_print_state *)
+{
+ return 0;
+}
+
+long Score_element::smob_tag;
+
+void
+Score_element::init_smobs ()
+{
+ smob_tag = scm_newsmob (&score_elt_funs);
+}
+
+void
+init_smobs()
+{
+ Score_element::init_smobs ();
+}