2
ly-module.cc -- implement guile module stuff.
2
ly-module.cc -- implement guile module stuff.
4
4
source file of the GNU LilyPond music typesetter
6
(c) 2002--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
6
(c) 2002--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
11
9
#include "lily-guile.hh"
12
#include "ly-module.hh"
12
#include "std-string.hh"
13
13
#include "protected-scm.hh"
15
#define FUNC_NAME __FUNCTION__
17
static int module_count;
15
#ifdef MODULE_GC_KLUDGE
16
Protected_scm anonymous_modules = SCM_EOL;
17
bool perform_gc_kludge;
20
ly_init_anonymous_module (void * data)
21
clear_anonymous_modules ()
23
scm_c_use_module ("lily");
23
#ifdef MODULE_GC_KLUDGE
24
for (SCM s = anonymous_modules;
28
SCM module = scm_car (s);
29
SCM closure = SCM_MODULE_EVAL_CLOSURE (module);
30
SCM prop = scm_procedure_property (closure, ly_symbol2scm ("module"));
32
if (ly_is_module (prop))
34
scm_set_procedure_property_x (closure, ly_symbol2scm ("module"),
39
anonymous_modules = SCM_EOL;
26
Protected_scm anon_modules;
29
ly_make_anonymous_module ()
44
ly_make_anonymous_module (bool safe)
31
String s = "*anonymous-ly-" + to_string (module_count++) + "*";
32
SCM mod = scm_c_define_module (s.to_str0(), ly_init_anonymous_module, 0);
33
anon_modules = scm_cons (mod, anon_modules);
49
SCM maker = ly_lily_module_constant ("make-module");
51
SCM scm_module = ly_lily_module_constant ("the-scm-module");
53
mod = scm_call_0 (maker);
54
scm_module_define (mod, ly_symbol2scm ("%module-public-interface"),
57
ly_use_module (mod, scm_module);
58
ly_use_module (mod, global_lily_module);
62
SCM proc = ly_lily_module_constant ("make-safe-lilypond-module");
63
mod = scm_call_0 (proc);
66
#ifdef MODULE_GC_KLUDGE
67
if (perform_gc_kludge)
68
anonymous_modules = scm_cons (mod, anonymous_modules);
38
ly_clear_anonymous_modules ()
75
ly_use_module (SCM mod, SCM used)
41
anon_modules = SCM_EOL;
43
for (; gh_pair_p (s) ; s = gh_cdr (s))
45
SCM tab= scm_c_make_hash_table (2);
47
SCM_STRUCT_DATA (gh_car (s))[scm_module_index_obarray]
48
= (long unsigned int) tab;
78
= scm_list_3 (ly_symbol2scm ("module-use!"),
80
scm_list_2 (ly_symbol2scm ("module-public-interface"),
83
return scm_eval (expr, global_lily_module);
52
86
#define FUNC_NAME __FUNCTION__
55
ly_module_define (void *closure, SCM key, SCM val, SCM result)
58
SCM module = (SCM) closure;
59
scm_module_define (module, key, scm_variable_ref (val));
63
/* Ugh signature of scm_internal_hash_fold () is inaccurate. */
64
typedef SCM (*Hash_cl_func)();
67
ly_import_module (SCM dest, SCM src)
69
SCM_VALIDATE_MODULE (1, src);
70
scm_internal_hash_fold ((Hash_cl_func) &ly_module_define, (void*) dest,
71
SCM_EOL, SCM_MODULE_OBARRAY (src));
75
89
accumulate_symbol (void *closure, SCM key, SCM val, SCM result)
83
97
ly_module_symbols (SCM mod)
85
99
SCM_VALIDATE_MODULE (1, mod);
87
SCM obarr= SCM_MODULE_OBARRAY (mod);
88
return scm_internal_hash_fold ((Hash_cl_func) &accumulate_symbol,
89
NULL, SCM_EOL, obarr);
101
SCM obarr = SCM_MODULE_OBARRAY (mod);
102
return scm_internal_hash_fold ((Hash_closure_function) & accumulate_symbol,
103
NULL, SCM_EOL, obarr);
93
107
entry_to_alist (void *closure, SCM key, SCM val, SCM result)
96
return scm_cons (scm_cons (key, scm_variable_ref (val)), result);
110
if (scm_variable_bound_p (val) == SCM_BOOL_T)
111
return scm_cons (scm_cons (key, scm_variable_ref (val)), result);
112
programming_error ("unbound variable in module");
100
ly_module_to_alist (SCM mod)
116
LY_DEFINE (ly_module2alist, "ly:module->alist",
118
"Dump the contents of module @var{mod} as an alist.")
102
120
SCM_VALIDATE_MODULE (1, mod);
105
SCM obarr= SCM_MODULE_OBARRAY (mod);
107
return scm_internal_hash_fold ((Hash_cl_func) &entry_to_alist, NULL, SCM_EOL, obarr);
110
/* Lookup SYM, but don't give error when it is not defined. */
112
ly_module_lookup (SCM module, SCM sym)
114
#define FUNC_NAME __FUNCTION__
115
SCM_VALIDATE_MODULE (1, module);
117
return scm_sym2var (sym, scm_module_lookup_closure (module), SCM_BOOL_F);
122
ly_modules_lookup (SCM modules, SCM sym)
124
for (SCM s = gh_car (modules); SCM_MODULEP (s); s = ly_cdr (s))
126
SCM v = scm_sym2var (sym, scm_module_lookup_closure (s), SCM_UNDEFINED);
127
if (v != SCM_UNDEFINED)
130
return SCM_UNDEFINED;
121
SCM obarr = SCM_MODULE_OBARRAY (mod);
123
return scm_internal_hash_fold ((Hash_closure_function) & entry_to_alist, NULL, SCM_EOL, obarr);
137
127
ly_export (SCM module, SCM namelist)
129
static SCM export_function;
139
130
if (!export_function)
140
131
export_function = scm_permanent_object (scm_c_lookup ("module-export!"));
142
133
scm_call_2 (SCM_VARIABLE_REF (export_function), module, namelist);
148
139
ly_export (mod, ly_module_symbols (mod));
142
#ifdef MODULE_GC_KLUDGE
144
redefine_keyval (void *closure, SCM key, SCM val, SCM result)
147
SCM new_tab = result;
148
scm_hashq_set_x (new_tab, key, val);
154
Kludge for older GUILE 1.6 versions.
157
make_stand_in_procs_weak ()
160
Ugh, ABI breakage for 1.6.5: scm_stand_in_procs is a hashtab from
163
if (scm_is_pair (scm_stand_in_procs))
168
if (scm_weak_key_hash_table_p (scm_stand_in_procs) == SCM_BOOL_T)
170
#if (SCM_MINOR_VERSION == 7)
171
perform_gc_kludge = false;
177
perform_gc_kludge = true;
180
SCM old_tab = scm_stand_in_procs;
181
SCM new_tab = scm_make_weak_key_hash_table (scm_from_int (257));
183
new_tab = scm_internal_hash_fold ((Hash_closure_function) & redefine_keyval,
188
scm_stand_in_procs = new_tab;
191
ADD_SCM_INIT_FUNC (make_stand_in_procs_weak, make_stand_in_procs_weak);