]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lily-lexer.cc
(parse_symbol_list): Bugfix.
[lilypond.git] / lily / lily-lexer.cc
index 455bbfaea06c6ad645ed442496f0d982f136d89f..8a331e263aefe913812490e1a7c1b87af0f4f284 100644 (file)
@@ -93,12 +93,12 @@ Lily_lexer::Lily_lexer (Sources *sources)
   scopes_ = SCM_EOL;
   error_level_ = 0;
   is_main_input_ = false;
-
+  start_module_ = SCM_EOL;
   smobify_self ();
 
   add_scope (ly_make_anonymous_module (false));
   push_note_state (scm_c_make_hash_table (0));
-  chordmodifier_tab_ = scm_make_vector (scm_int2num (1), SCM_EOL);
+  chordmodifier_tab_ = scm_make_vector (scm_from_int (1), SCM_EOL);
 }
 
 Lily_lexer::Lily_lexer (Lily_lexer const &src)
@@ -108,6 +108,7 @@ Lily_lexer::Lily_lexer (Lily_lexer const &src)
   chordmodifier_tab_ = src.chordmodifier_tab_;
   pitchname_tab_stack_ = src.pitchname_tab_stack_;
   sources_ = src.sources_;
+  start_module_ = SCM_EOL;
 
   error_level_ = src.error_level_;
   is_main_input_ = src.is_main_input_;
@@ -139,12 +140,16 @@ void
 Lily_lexer::add_scope (SCM module)
 {
   ly_reexport_module (scm_current_module ());
-  scm_set_current_module (module);
+  if (!scm_is_pair (scopes_))
+    start_module_ = scm_current_module ();
+
   for (SCM s = scopes_; scm_is_pair (s); s = scm_cdr (s))
     {
       ly_use_module (module, scm_car (s));
     }
   scopes_ = scm_cons (module, scopes_);
+
+  set_current_scope ();
 }
 
 SCM
@@ -152,11 +157,23 @@ Lily_lexer::remove_scope ()
 {
   SCM sc = scm_car (scopes_);
   scopes_ = scm_cdr (scopes_);
-  scm_set_current_module (scm_car (scopes_));
-
+  set_current_scope ();
   return sc;
 }
 
+SCM
+Lily_lexer::set_current_scope ()
+{
+  SCM old = scm_current_module ();
+
+  if (scm_is_pair (scopes_))
+    scm_set_current_module (scm_car (scopes_));
+  else
+    scm_set_current_module (start_module_);
+
+  return old;
+}
+
 int
 Lily_lexer::lookup_keyword (String s)
 {
@@ -268,7 +285,7 @@ Lily_lexer::prepare_for_next_token ()
 void
 Lily_lexer::add_lexed_char (int count)
 {
-  char const * start = here_str0 ();
+  char const *start = here_str0 ();
   lexloc->set (get_source_file (),
               start, start + count);
   char_count_stack_.top () += count;
@@ -287,13 +304,17 @@ Lily_lexer::mark_smob (SCM s)
 
   scm_gc_mark (lexer->chordmodifier_tab_);
   scm_gc_mark (lexer->pitchname_tab_stack_);
+  scm_gc_mark (lexer->start_module_);
   return lexer->scopes_;
 }
 
 int
-Lily_lexer::print_smob (SCM, SCM port, scm_print_state*)
+Lily_lexer::print_smob (SCM s, SCM port, scm_print_state*)
 {
+  Lily_lexer *lexer = Lily_lexer::unsmob (s);
+
   scm_puts ("#<Lily_lexer ", port);
+  scm_display (lexer->scopes_, port);
   scm_puts (" >", port);
   return 1;
 }