#include "interval.hh"
#include "offset.hh"
-struct Box
+class Box
{
Interval interval_a_[NO_AXES];
-
+public:
Interval &x () {return interval_a_[X_AXIS]; }
Interval &y (){ return interval_a_[Y_AXIS]; }
Interval x () const{ return interval_a_[X_AXIS]; }
CL *ptr = new CL (*this); \
SCM s; \
s = scm_cons (SCM_PACK (CL::smob_tag_), SCM_PACK (ptr)); \
- /* scm_gc_register_collectable_memory ((CL *)this, sizeof (CL), #CL " smob");*/ \
+ scm_gc_register_collectable_memory ((CL *)this, sizeof (CL), #CL " smob"); \
\
return s; \
}
SCM s; \
SCM_NEWSMOB (s, CL::smob_tag_, this); \
self_scm_ = s; \
- /* scm_gc_register_collectable_memory (this, sizeof (CL), #CL " smob");*/ \
+ scm_gc_register_collectable_memory (this, sizeof (CL), #CL " smob"); \
return s; \
}
--- /dev/null
+/*
+ smobs.cc -- implement Smob protection
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#include "smobs.hh"
+
+static SCM smob_protection_list;
+
+void
+init_smob_protection()
+{
+ smob_protection_list = scm_cons (SCM_UNDEFINED, SCM_EOL);
+ scm_permanent_object (smob_protection_list);
+}
+ADD_SCM_INIT_FUNC(init_smob_protection, init_smob_protection);
+
+void
+protect_smob (SCM smob, SCM *prot_cons)
+{
+ SCM s = scm_cdr (smob_protection_list);
+ while (scm_is_pair (s) && scm_car (s) == SCM_UNDEFINED)
+ {
+ s = scm_cdr (s);
+ }
+
+ SCM prot = scm_cons (smob, s);
+ scm_set_cdr_x (smob_protection_list,
+ prot);
+ *prot_cons = prot;
+}
+
+void
+unprotect_smob (SCM *prot_cons)
+{
+ SCM next = scm_cdr (*prot_cons);
+
+ if (next == SCM_EOL)
+ {
+ scm_set_car_x (*prot_cons, SCM_UNDEFINED);
+ }
+ else
+ {
+ scm_set_car_x (*prot_cons, SCM_UNDEFINED);
+ while (scm_is_pair (next)
+ && scm_car (next) == SCM_UNDEFINED)
+
+ {
+ next = scm_cdr (next);
+ }
+
+ scm_set_cdr_x (*prot_cons, next);
+ }
+
+ *prot_cons = SCM_EOL;
+}