source file of the GNU LilyPond music typesetter
- (c) 2002--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 2002--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
#include "lily-guile.hh"
#include "string.hh"
#include "protected-scm.hh"
-#define MODULE_GC_KLUDGE
-
#ifdef MODULE_GC_KLUDGE
Protected_scm anonymous_modules = SCM_EOL;
+bool perform_gc_kludge;
#endif
-
void
clear_anonymous_modules ()
{
+#ifdef MODULE_GC_KLUDGE
for (SCM s = anonymous_modules;
scm_is_pair (s);
s = scm_cdr (s))
{
SCM module = scm_car (s);
- SCM closure = SCM_MODULE_EVAL_CLOSURE(module);
- SCM prop = scm_procedure_property (closure, ly_symbol2scm ("module"));
+ SCM closure = SCM_MODULE_EVAL_CLOSURE (module);
+ SCM prop = scm_procedure_property (closure, ly_symbol2scm ("module"));
if (ly_is_module (prop))
{
}
anonymous_modules = SCM_EOL;
+#endif
}
SCM
SCM maker = ly_lily_module_constant ("make-module");
SCM scm_module = ly_lily_module_constant ("the-scm-module");
-
+
mod = scm_call_0 (maker);
scm_module_define (mod, ly_symbol2scm ("%module-public-interface"),
mod);
-
+
ly_use_module (mod, scm_module);
ly_use_module (mod, global_lily_module);
}
}
#ifdef MODULE_GC_KLUDGE
- anonymous_modules = scm_cons (mod, anonymous_modules);
+ if (perform_gc_kludge)
+ anonymous_modules = scm_cons (mod, anonymous_modules);
#endif
-
+
return mod;
}
#define FUNC_NAME __FUNCTION__
-
-
static SCM
accumulate_symbol (void *closure, SCM key, SCM val, SCM result)
{
ly_export (mod, ly_module_symbols (mod));
}
-
-
#ifdef MODULE_GC_KLUDGE
static SCM
redefine_keyval (void *closure, SCM key, SCM val, SCM result)
/*
UGH UGH.
Kludge for older GUILE 1.6 versions.
- */
+*/
void
make_stand_in_procs_weak ()
{
+ /*
+ Ugh, ABI breakage for 1.6.5: scm_stand_in_procs is a hashtab from
+ 1.6.5 on.
+ */
+ if (scm_is_pair (scm_stand_in_procs))
+ {
+ return;
+ }
+
+ if (scm_weak_key_hash_table_p (scm_stand_in_procs) == SCM_BOOL_T)
+ {
+#if (SCM_MINOR_VERSION == 7)
+ perform_gc_kludge = false;
+#endif
+ return;
+ }
+
+
+ perform_gc_kludge = true;
+
+
SCM old_tab = scm_stand_in_procs;
SCM new_tab = scm_make_weak_key_hash_table (scm_from_int (257));
-
- new_tab = scm_internal_hash_fold ((Hash_closure_function) &redefine_keyval,
+
+ new_tab = scm_internal_hash_fold ((Hash_closure_function) & redefine_keyval,
NULL,
new_tab,
old_tab);
scm_stand_in_procs = new_tab;
}
-ADD_SCM_INIT_FUNC(make_stand_in_procs_weak, make_stand_in_procs_weak);
+ADD_SCM_INIT_FUNC (make_stand_in_procs_weak, make_stand_in_procs_weak);
#endif