]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/ly-smobs.icc
release: 1.3.0
[lilypond.git] / lily / include / ly-smobs.icc
1 /*   
2   ly-smobs.icc -- implement smob glue. 
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #ifndef LY_SMOBS_ICC
11 #define LY_SMOBS_ICC
12
13 #define IMPLEMENT_SMOBS(CL)\
14 long CL::smob_tag_;\
15 static scm_smobfuns CL ## _funs = {                                     \
16   CL::mark_smob, CL::free_smob,                                         \
17   CL::print_smob, 0,                                                    \
18 };                                                                      \
19 void                                                                    \
20 CL::init_smobs ()                                                       \
21 {                                                                       \
22   smob_tag_ = scm_newsmob (&CL ## _funs);                                       \
23 }                                                                       \
24                                                                         \
25                                                                          \
26 void                                                                     \
27 CL::unsmobify_self ()                                                    \
28 {                                                                        \
29   SCM s = self_scm_;                                                     \
30   scm_unprotect_object (s);                                              \
31                                                                          \
32   SCM_CAR(self_scm_) = SCM_EOL;  \
33   SCM_CDR(self_scm_) = SCM_EOL;                                          \
34   self_scm_ = SCM_EOL;                                                   \
35 }                                                                        \
36 \
37 SCM                                                                     \
38 CL::smobify_self ()                                                     \
39 {                                                                       \
40   if (self_scm_ != SCM_EOL)                                             \
41     return self_scm_;                                                   \
42                                                                         \
43   /*                                                                    \
44     This is local. We don't assign to self_scm_ directly, to assure     \
45     that S isn't GC-ed from under us.                                   \
46    */                                                                   \
47   SCM s;                                                                \
48                                                                         \
49   SCM_NEWCELL(s);                                                       \
50   self_scm_ = s;                                                        \
51                                                                         \
52   SCM_SETCAR(s,smob_tag_);                                              \
53   void * me_p = this;                                                   \
54   SCM_SETCDR(s,me_p);                                                   \
55   scm_protect_object (s);                                               \
56                                                                         \
57   do_smobify_self();                                                    \
58   return s;                                     \
59 }                                               \
60 scm_sizet                                       \
61 CL::free_smob (SCM ses)                         \
62 {                                               \
63   CL * s = (CL*) SCM_CDR(ses);                  \
64   /* someone else did the deed already; this might be an automatic var.*/ \
65   if (s->self_scm_ != ses)\
66      return 0; \
67   SCM_CAR(ses) = SCM_EOL;\
68                                         \
69   return sizeof(CL);                            \
70 }                                               \
71 ADD_SCM_INIT_FUNC(CL, CL::init_smobs)\
72
73
74 #endif /* LY_SMOBS_ICC */
75