From 7e8a81cadfe28796c40c910b2a0afcfb5d75c2a3 Mon Sep 17 00:00:00 2001 From: fred Date: Tue, 26 Oct 1999 17:22:55 +0000 Subject: [PATCH] lilypond-1.3.0 --- lily/include/ly-smobs.icc | 75 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 lily/include/ly-smobs.icc diff --git a/lily/include/ly-smobs.icc b/lily/include/ly-smobs.icc new file mode 100644 index 0000000000..2bb82ae41b --- /dev/null +++ b/lily/include/ly-smobs.icc @@ -0,0 +1,75 @@ +/* + ly-smobs.icc -- implement smob glue. + + source file of the GNU LilyPond music typesetter + + (c) 1999 Han-Wen Nienhuys + + */ + +#ifndef LY_SMOBS_ICC +#define LY_SMOBS_ICC + +#define IMPLEMENT_SMOBS(CL)\ +long CL::smob_tag_;\ +static scm_smobfuns CL ## _funs = { \ + CL::mark_smob, CL::free_smob, \ + CL::print_smob, 0, \ +}; \ +void \ +CL::init_smobs () \ +{ \ + smob_tag_ = scm_newsmob (&CL ## _funs); \ +} \ + \ + \ +void \ +CL::unsmobify_self () \ +{ \ + SCM s = self_scm_; \ + scm_unprotect_object (s); \ + \ + SCM_CAR(self_scm_) = SCM_EOL; \ + SCM_CDR(self_scm_) = SCM_EOL; \ + self_scm_ = SCM_EOL; \ +} \ +\ +SCM \ +CL::smobify_self () \ +{ \ + if (self_scm_ != SCM_EOL) \ + return self_scm_; \ + \ + /* \ + This is local. We don't assign to self_scm_ directly, to assure \ + that S isn't GC-ed from under us. \ + */ \ + SCM s; \ + \ + SCM_NEWCELL(s); \ + self_scm_ = s; \ + \ + SCM_SETCAR(s,smob_tag_); \ + void * me_p = this; \ + SCM_SETCDR(s,me_p); \ + scm_protect_object (s); \ + \ + do_smobify_self(); \ + return s; \ +} \ +scm_sizet \ +CL::free_smob (SCM ses) \ +{ \ + CL * s = (CL*) SCM_CDR(ses); \ + /* someone else did the deed already; this might be an automatic var.*/ \ + if (s->self_scm_ != ses)\ + return 0; \ + SCM_CAR(ses) = SCM_EOL;\ + \ + return sizeof(CL); \ +} \ +ADD_SCM_INIT_FUNC(CL, CL::init_smobs)\ + + +#endif /* LY_SMOBS_ICC */ + -- 2.39.5