Reviewers: dak, Message: On 2020/02/10 21:31:46, dak wrote: > https://codereview.appspot.com/547620043/diff/545560043/lily/engraver.cc > File lily/engraver.cc (right): > > https://codereview.appspot.com/547620043/diff/545560043/lily/engraver.cc#newcode126 > lily/engraver.cc:126: grob = new Item (SCM_EOL); > Ugh. How is that going to work? I am not sure we aren't better off with a hard > exit. Admittedly, a failed assertion makes little sense after a > programming_error: this should have been a hard error in the first place. > > What is the use case?
Without this, you get a segfault because we take a cdr of an empty list. Description: engraver: continue when trying to create non-existent Grob Please review this at https://codereview.appspot.com/547620043/ Affected files (+19, -16 lines): M lily/engraver.cc Index: lily/engraver.cc diff --git a/lily/engraver.cc b/lily/engraver.cc index 29e1fb53c3aae1080975e999e0de1661f9824564..347fcb177bca8e680f42d6b59a666e59582ef0a8 100644 --- a/lily/engraver.cc +++ b/lily/engraver.cc @@ -118,23 +118,26 @@ Engraver::internal_make_grob (SCM symbol, #endif SCM props = Grob_property_info (context (), symbol).updated (); - if (!scm_is_pair (props)) { - programming_error (to_string ("No grob definition found for `%s’.", - ly_symbol2string (symbol).c_str ())); - }; - Grob *grob = 0; - - SCM handle = scm_sloppy_assq (ly_symbol2scm ("meta"), props); - SCM klass = scm_cdr (scm_sloppy_assq (ly_symbol2scm ("class"), scm_cdr (handle))); - - if (scm_is_eq (klass, ly_symbol2scm ("Item"))) - grob = new Item (props); - else if (scm_is_eq (klass, ly_symbol2scm ("Spanner"))) - grob = new Spanner (props); - else if (scm_is_eq (klass, ly_symbol2scm ("Paper_column"))) - grob = new Paper_column (props); - + if (!scm_is_pair (props)) + { + programming_error (to_string ("No grob definition found for `%s’.", + ly_symbol2string (symbol).c_str ())); + grob = new Item (SCM_EOL); + } + else + { + SCM handle = scm_sloppy_assq (ly_symbol2scm ("meta"), props); + SCM klass = scm_cdr ( + scm_sloppy_assq (ly_symbol2scm ("class"), scm_cdr (handle))); + + if (scm_is_eq (klass, ly_symbol2scm ("Item"))) + grob = new Item (props); + else if (scm_is_eq (klass, ly_symbol2scm ("Spanner"))) + grob = new Spanner (props); + else if (scm_is_eq (klass, ly_symbol2scm ("Paper_column"))) + grob = new Paper_column (props); + } assert (grob); announce_grob (grob, cause);
