]> git.donarmstrong.com Git - lilypond.git/commitdiff
Don't segfault on invalid engraver names.
authorBenjamin Peterson <benjamin@python.org>
Thu, 27 May 2010 21:43:11 +0000 (16:43 -0500)
committerNeil Puttock <n.puttock@gmail.com>
Sun, 30 May 2010 22:59:01 +0000 (23:59 +0100)
Generate the definition for procedure scheme engravers properly.

input/regression/invalid-engraver.ly [new file with mode: 0644]
lily/translator-group.cc

diff --git a/input/regression/invalid-engraver.ly b/input/regression/invalid-engraver.ly
new file mode 100644 (file)
index 0000000..e3a1fa5
--- /dev/null
@@ -0,0 +1,16 @@
+\version "2.13.23"
+
+#(ly:set-option 'warning-as-error #f)
+
+\header {
+  texidoc = "Engravers which do not exist produce a warning."
+}
+
+\layout {
+  \context {
+    \Voice
+    \consists "Rhythmic_column_engraver_foo"
+  }
+}
+
+{ a4 }
index dc2b772428f681e935d6e089f7fbffe16610bb87..84a97bf52e206bdf980ab6bae228fabac470cbab 100644 (file)
@@ -153,35 +153,34 @@ Translator_group::create_child_translator (SCM sev)
   for (SCM s = trans_names; scm_is_pair (s); s = scm_cdr (s))
     {
       SCM definition = scm_car (s);
+      bool is_scheme = false;
 
       Translator *type = 0;
-      Translator *instance = type;
       if (ly_is_symbol (definition))
-       {
-         type = get_translator (definition);
-         instance = type->clone ();
-       }
+       type = get_translator (definition);
       else if (ly_is_pair (definition))
        {
          type = get_translator (ly_symbol2scm ("Scheme_engraver"));
-         instance = type->clone ();
-         dynamic_cast<Scheme_engraver*> (instance)->init_from_scheme (definition);
+         is_scheme = true;
        }
       else if (ly_is_procedure (definition))
        {
          // `definition' is a procedure, which takes the context as
          // an argument and evaluates to an a-list scheme engraver
          // definition.
-         SCM def = scm_call_1 (definition, cs);
+         definition = scm_call_1 (definition, cs);
          type = get_translator (ly_symbol2scm ("Scheme_engraver"));
-         instance = type->clone ();
-         dynamic_cast<Scheme_engraver*> (instance)->init_from_scheme (def);
+         is_scheme = true;
        }
         
       if (!type)
        warning (_f ("cannot find: `%s'", ly_symbol2string (scm_car (s)).c_str ()));
       else
        {
+         Translator *instance = type->clone ();
+         if (is_scheme)
+           dynamic_cast<Scheme_engraver *> (instance)->init_from_scheme (definition);
+
          SCM str = instance->self_scm ();
 
          if (instance->must_be_last ())