From 91f7915b2a66ab9381c2a8d650f14707c60036d1 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Tue, 21 Jul 2015 13:19:24 +0200 Subject: [PATCH] Issue 4514/1: Pass setup function call into Scm_module::boot --- lily/guile-init.cc | 8 +++----- lily/include/lily-modules.hh | 2 +- lily/lily-modules.cc | 15 ++++++++++++++- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/lily/guile-init.cc b/lily/guile-init.cc index b812402e0e..4270aa01d6 100644 --- a/lily/guile-init.cc +++ b/lily/guile-init.cc @@ -48,8 +48,8 @@ void add_scm_init_func (void (*f) ()) scm_init_funcs_->push_back (f); } -SCM -ly_init_ly_module (void *) +void +ly_init_ly_module () { // Start up type system first. Scm_init::init (); @@ -65,15 +65,13 @@ ly_init_ly_module (void *) } scm_primitive_load_path (scm_from_ascii_string ("lily.scm")); - return SCM_UNDEFINED; } void ly_c_init_guile () { Guile_user::module.import (); - Lily::module.boot (); - scm_c_call_with_current_module (Lily::module, ly_init_ly_module, 0); + Lily::module.boot (ly_init_ly_module); Syntax::module.import (); Display::module.import (); scm_c_use_module ("lily"); diff --git a/lily/include/lily-modules.hh b/lily/include/lily-modules.hh index 1eb7cf7354..3393fc2ae8 100644 --- a/lily/include/lily-modules.hh +++ b/lily/include/lily-modules.hh @@ -32,7 +32,7 @@ class Scm_module Variable_record *variables_; static void boot_init (void *); public: - void boot (); + void boot (void (*init)() = 0); void import (); void register_variable (const char *name, Scm_variable *var); diff --git a/lily/lily-modules.cc b/lily/lily-modules.cc index be736615d6..b75e0afc05 100644 --- a/lily/lily-modules.cc +++ b/lily/lily-modules.cc @@ -57,11 +57,24 @@ Scm_module::boot_init (void *arg) self->variables_ = 0; } +static SCM +call_trampoline (void *self) +{ + // One more indirection since void * can only be safely cast to + // pointers to data rather than pointers to function. + (*static_cast (self)) (); + return SCM_UNDEFINED; +} + void -Scm_module::boot () +Scm_module::boot (void (*init) ()) { assert (SCM_UNBNDP (module_)); module_ = scm_c_define_module (name_, boot_init, static_cast (this)); + // Can't wrap the following in the scm_c_define_module call since + // the init code may need module_ operative. + if (init) + scm_c_call_with_current_module (module_, call_trampoline, static_cast (&init)); } void -- 2.39.5