diff options
author | Benjamin Peterson <benjamin@python.org> | 2010-05-27 16:43:11 -0500 |
---|---|---|
committer | Neil Puttock <n.puttock@gmail.com> | 2010-05-30 23:59:01 +0100 |
commit | 1b3e857198400b544a72f3772d6c72f3f113bf2f (patch) | |
tree | 25a7fec3b1b023ed548d75a9e69ab78bcca36970 | |
parent | f75fe46f1727ea0d28840781b0db54474c61442d (diff) |
Don't segfault on invalid engraver names.
Generate the definition for procedure scheme engravers properly.
-rw-r--r-- | input/regression/invalid-engraver.ly | 16 | ||||
-rw-r--r-- | lily/translator-group.cc | 19 |
2 files changed, 25 insertions, 10 deletions
diff --git a/input/regression/invalid-engraver.ly b/input/regression/invalid-engraver.ly new file mode 100644 index 0000000000..e3a1fa5731 --- /dev/null +++ b/input/regression/invalid-engraver.ly @@ -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 } diff --git a/lily/translator-group.cc b/lily/translator-group.cc index dc2b772428..84a97bf52e 100644 --- a/lily/translator-group.cc +++ b/lily/translator-group.cc @@ -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 ()) |