]> 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)
committerCarl Sorensen <c_sorensen@byu.edu>
Fri, 28 May 2010 21:09:09 +0000 (15:09 -0600)
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..ecead39
--- /dev/null
@@ -0,0 +1,20 @@
+\version "2.12.0"
+
+\header {
+  texidoc="Engravers which do not exist are simply ignored"
+}
+
+\layout { \context {
+  \name ImproVoice
+  \type "Engraver_group"
+  \consists "Rhythmic_column_engraver_foo"  % "typo" here
+}
+\context { \Staff
+  \accepts "ImproVoice"
+}}
+
+\relative c'' {
+  a4 d8 bes8 \new ImproVoice { c4^"ad lib" c
+   c4 c^"undress" c_"while playing :)" c }
+  a1
+}
\ No newline at end of file
index dc2b772428f681e935d6e089f7fbffe16610bb87..7d7847743c59e3886036e4feed9d938196ede2b0 100644 (file)
@@ -153,19 +153,17 @@ 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 = true;
 
       Translator *type = 0;
-      Translator *instance = type;
       if (ly_is_symbol (definition))
        {
          type = get_translator (definition);
-         instance = type->clone ();
+          is_scheme = false;
        }
       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);
        }
       else if (ly_is_procedure (definition))
        {
@@ -174,14 +172,16 @@ Translator_group::create_child_translator (SCM sev)
          // definition.
          SCM def = scm_call_1 (definition, cs);
          type = get_translator (ly_symbol2scm ("Scheme_engraver"));
-         instance = type->clone ();
-         dynamic_cast<Scheme_engraver*> (instance)->init_from_scheme (def);
        }
         
       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 ())