]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lily-modules.cc
Release: bump Welcome versions.
[lilypond.git] / lily / lily-modules.cc
index be736615d6e25e1d3f24e64ed4761edbebf86a20..ef3a11cc2c84648fa25be8f63cca186c9882cbc7 100644 (file)
@@ -18,7 +18,9 @@
 */
 
 #include "lily-modules.hh"
+#include "international.hh"
 #include "lily-imports.hh"
+#include "warn.hh"
 
 struct Scm_module::Variable_record
 {
@@ -46,22 +48,41 @@ Scm_module::boot_init (void *arg)
 {
   Scm_module *self = static_cast<Scm_module *> (arg);
 
-  // Establish variables first
-  for (Variable_record *p = self->variables_; p;)
-    {
-      Variable_record *next = p->next_;
-      p->var_->boot (p->name_);
-      delete p;
-      p = next;
-    }
-  self->variables_ = 0;
+  // Establish variables
+  for (Variable_record *p = self->variables_; p; p = p->next_)
+    p->var_->boot (p->name_);
+}
+
+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 <void (**)()> (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 <void *> (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 <void *> (&init));
+  // Verify that every Variable has a definition, either because of
+  // getting initialized with a value at definition or because of the
+  // init call providing one.
+  for (Variable_record *p = variables_; p; )
+    {
+      Variable_record *next = p->next_;
+      if (SCM_UNBNDP (SCM (*p->var_)))
+        error (_f ("Uninitialized variable `%s' in module (%s)", p->name_, name_));
+      delete p;
+      p = next;
+    }
+  variables_ = 0;
 }
 
 void