From 05f46adfbc7a90ad2d439ffdaac5db26c8296458 Mon Sep 17 00:00:00 2001 From: fred Date: Wed, 27 Mar 2002 01:20:21 +0000 Subject: [PATCH] lilypond-1.5.1 --- CHANGES | 29 +++++++++++++++++++++ lily/audio-staff.cc | 4 +-- lily/auto-beam-engraver.cc | 10 -------- lily/beam-engraver.cc | 10 +------- lily/grace-iterator.cc | 42 +++++++++++++++---------------- lily/grace-music.cc | 16 +++++++++--- lily/include/grace-iterator.hh | 4 +-- lily/include/grace-music.hh | 16 +++--------- lily/include/midi-item.hh | 4 +++ lily/include/midi-walker.hh | 3 ++- lily/include/performance.hh | 1 - lily/local-key-engraver.cc | 28 +++------------------ lily/lyric-phrasing-engraver.cc | 6 ----- lily/midi-item.cc | 7 +++++- lily/midi-walker.cc | 18 +++++++++---- lily/parser.yy | 4 +-- lily/performance.cc | 2 +- lily/phrasing-slur-engraver.cc | 4 +-- lily/rhythmic-column-engraver.cc | 24 ------------------ lily/script-engraver.cc | 6 ----- lily/sequential-music-iterator.cc | 5 +--- lily/slur-engraver.cc | 6 ++--- lily/spacing-engraver.cc | 3 --- lily/tuplet-engraver.cc | 22 ++++++---------- ly/performer-init.ly | 14 +++-------- scm/grob-description.scm | 7 ------ 26 files changed, 117 insertions(+), 178 deletions(-) diff --git a/CHANGES b/CHANGES index 6fe737d185..9d68061afb 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,32 @@ +1.5.0.jcn1 +========== + +* Added feature to ly2dvi to find feta pfa font files used in a +postscript file to make printing of direct postscript a bit easier: + + lilypond -fps input/trip.ly + cat $(ly2dvi -f trip.ps) trip.ps | lpr + +* Reincluded 1.4.3.jcn2. + +* Website fixes. + +* Ly2dvi now leaves .tex and .latex output if latex fails, and cleans +the temp dir if anything fails. + +* Fixes for windows scripts. + +1.5.0.uu1 +========= + +* Hara kiri and span-bar. + +* Junk old grace stuff. + +* Don't crash on grace notes in MIDI output. + + + 1.5.0 ===== diff --git a/lily/audio-staff.cc b/lily/audio-staff.cc index 791287ab25..f89ebd62d4 100644 --- a/lily/audio-staff.cc +++ b/lily/audio-staff.cc @@ -23,8 +23,8 @@ void Audio_staff::output (Midi_stream& midi_stream_r, int track_i) { Midi_track midi_track; - midi_track.number_i_ = track_i; - midi_track.channel_i_ = channel_i_; + midi_track.number_i_ = track_i; + midi_track.channel_i_ = channel_i_; for (Midi_walker i (this, &midi_track); i.ok (); i++) i.process (); midi_stream_r << midi_track; diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc index b4191f36bc..31e26d349c 100644 --- a/lily/auto-beam-engraver.cc +++ b/lily/auto-beam-engraver.cc @@ -337,20 +337,10 @@ Auto_beam_engraver::finalize () junk_beam (); } -bool -Auto_beam_engraver::same_grace_state_b (Grob* e) -{ - bool gr = e->get_grob_property ("grace") == SCM_BOOL_T; - SCM wg =get_property ("weAreGraceContext"); - return (to_boolean (wg)) == gr; -} void Auto_beam_engraver::acknowledge_grob (Grob_info info) { - if (!same_grace_state_b (info.elem_l_)) - return; - if (stem_l_arr_p_) { if (Beam::has_interface (info.elem_l_)) diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc index e6f08096d6..4445b79643 100644 --- a/lily/beam-engraver.cc +++ b/lily/beam-engraver.cc @@ -131,7 +131,7 @@ Beam_engraver::process_music () } - if (beam_p_ && !to_boolean (get_property ("weAreGraceContext"))) + if (beam_p_) { Score_engraver * e = 0; Translator * t = daddy_grav_l (); @@ -244,14 +244,6 @@ Beam_engraver::acknowledge_grob (Grob_info info) if (Stem::beam_l (stem_l)) return; - bool stem_grace = stem_l->get_grob_property ("grace") == SCM_BOOL_T; - - SCM wg =get_property ("weAreGraceContext"); - bool wgb= to_boolean (wg); - - if (wgb!= stem_grace) - return; - Rhythmic_req *rhythmic_req = dynamic_cast (info.req_l_); if (!rhythmic_req) { diff --git a/lily/grace-iterator.cc b/lily/grace-iterator.cc index f73e610bad..9248e071f8 100644 --- a/lily/grace-iterator.cc +++ b/lily/grace-iterator.cc @@ -1,5 +1,5 @@ /* - grace-iterator.cc -- implement Grace_iterator + grace-music.cc -- implement Grace_music source file of the GNU LilyPond music typesetter @@ -7,47 +7,45 @@ */ +#include "grace-music.hh" #include "grace-iterator.hh" + + #include "global-translator.hh" #include "warn.hh" + Grace_iterator::~Grace_iterator () { // child_iter_p_ = 0; } + void -Grace_iterator::construct_children () +Grace_iterator::process (Moment m ) { - Translator_group * t = report_to_l ()->find_create_translator_l ("Grace", ""); // umgh. - - if (t) - set_translator (t); - Music_wrapper_iterator::construct_children (); + Moment main ; + main.main_part_ = m.grace_mom_; + Music_wrapper_iterator::process (main); } void -Grace_iterator::process (Moment) +Grace_iterator::construct_children () { - Global_translator * t = dynamic_cast (report_to_l ()); - if (t) - { - t->start (); - t->run_iterator_on_me (child_iter_p_); - delete child_iter_p_; - child_iter_p_ = 0; - t->finish (); - } - else - { - warning (_ ("no Grace context available")); - } + Music_wrapper_iterator::construct_children (); } + + Moment Grace_iterator::pending_moment () const { - return 0; + Moment cp =Music_wrapper_iterator::pending_moment(); + + Moment pending; + pending.grace_mom_ = - music_length_.main_part_ + cp.main_part_; + + return pending; } diff --git a/lily/grace-music.cc b/lily/grace-music.cc index 9121df5ff9..9e88f7b835 100644 --- a/lily/grace-music.cc +++ b/lily/grace-music.cc @@ -11,15 +11,25 @@ #include "grace-iterator.hh" void -Grace_music::compress (Moment) +Grace_music::compress (Moment m) { - + Music_wrapper::compress (m); } Moment Grace_music::length_mom () const { - return 0; + Moment l = Music_wrapper::length_mom (); + Moment gl; + gl.grace_mom_ = l.main_part_ + l.grace_mom_ ; + return gl; +} + + +Moment +Grace_music::start_mom () const +{ + return Music::start_mom (); } Grace_music::Grace_music () diff --git a/lily/include/grace-iterator.hh b/lily/include/grace-iterator.hh index f51cbcbc23..2ed8a81452 100644 --- a/lily/include/grace-iterator.hh +++ b/lily/include/grace-iterator.hh @@ -7,8 +7,8 @@ */ -#ifndef GRACE_ITERATOR_HH -#define GRACE_ITERATOR_HH +#ifndef NEWGRACE_ITERATOR_HH +#define NEWGRACE_ITERATOR_HH #include "music-wrapper-iterator.hh" diff --git a/lily/include/grace-music.hh b/lily/include/grace-music.hh index 897146133d..20c6e873a9 100644 --- a/lily/include/grace-music.hh +++ b/lily/include/grace-music.hh @@ -7,8 +7,8 @@ */ -#ifndef GRACE_MUSIC_HH -#define GRACE_MUSIC_HH +#ifndef NGRACE_MUSIC_HH +#define NGRACE_MUSIC_HH #include "music-wrapper.hh" @@ -21,17 +21,7 @@ public: protected: virtual void compress (Moment); virtual Moment length_mom () const; -}; - -class New_grace_music : public Music_wrapper -{ -public: - VIRTUAL_COPY_CONS (Music); - New_grace_music (SCM); - New_grace_music (); -protected: - virtual void compress (Moment); - virtual Moment length_mom () const; + virtual Moment start_mom () const; }; #endif /* GRACE_MUSIC_HH */ diff --git a/lily/include/midi-item.hh b/lily/include/midi-item.hh index ef344797cb..f723164f8e 100644 --- a/lily/include/midi-item.hh +++ b/lily/include/midi-item.hh @@ -194,6 +194,10 @@ class Midi_track : public Midi_chunk { public: int number_i_; + + /* + Compensate for starting grace notes. + */ Cons_list event_p_list_; Midi_track (); diff --git a/lily/include/midi-walker.hh b/lily/include/midi-walker.hh index 342983f5f1..83024f5dca 100644 --- a/lily/include/midi-walker.hh +++ b/lily/include/midi-walker.hh @@ -32,11 +32,12 @@ public: void process (); void operator ++ (int); bool ok () const; + private: void do_start_note (Midi_note* note_p); void do_stop_notes (Moment now_mom); void output_event (Moment now_mom, Midi_item* l); - + Midi_track* track_l_; Audio_staff* staff_l_; int index_; diff --git a/lily/include/performance.hh b/lily/include/performance.hh index af26a91ede..376e10ec54 100644 --- a/lily/include/performance.hh +++ b/lily/include/performance.hh @@ -29,7 +29,6 @@ public: void print () const; void process (); - Link_array audio_staff_l_arr_; Cons *audio_elem_p_list_; Midi_def * midi_l_; diff --git a/lily/local-key-engraver.cc b/lily/local-key-engraver.cc index 94e7980d04..fb491fdf4c 100644 --- a/lily/local-key-engraver.cc +++ b/lily/local-key-engraver.cc @@ -12,7 +12,7 @@ #include "rhythmic-head.hh" #include "timing-translator.hh" #include "engraver-group-engraver.hh" -#include "grace-align-item.hh" + #include "staff-symbol-referencer.hh" #include "side-position-interface.hh" #include "engraver.hh" @@ -56,14 +56,12 @@ public: Link_array forced_l_arr_; Link_array tie_l_arr_; Local_key_engraver (); - - Item * grace_align_l_; }; Local_key_engraver::Local_key_engraver () { key_item_p_ =0; - grace_align_l_ =0; + last_keysig_ = SCM_EOL; } @@ -196,11 +194,6 @@ Local_key_engraver::create_grobs () daddy_trans_l_->set_property ("localKeySignature", localsig); } - if (key_item_p_ && grace_align_l_) - { - Side_position_interface::add_support (grace_align_l_,key_item_p_); - grace_align_l_ =0; - } if (key_item_p_) { @@ -221,7 +214,7 @@ Local_key_engraver::create_grobs () void Local_key_engraver::finalize () { - // TODO: if grace ? signal accidentals to Local_key_engraver the + } void @@ -236,7 +229,7 @@ Local_key_engraver::stop_translation_timestep () key_item_p_ =0; } - grace_align_l_ = 0; + mel_l_arr_.clear (); arpeggios_.clear (); tie_l_arr_.clear (); @@ -247,19 +240,6 @@ Local_key_engraver::stop_translation_timestep () void Local_key_engraver::acknowledge_grob (Grob_info info) { - SCM wg= get_property ("weAreGraceContext"); - - bool selfgr = gh_boolean_p (wg) &&gh_scm2bool (wg); - bool he_gr = to_boolean (info.elem_l_->get_grob_property ("grace")); - - Item * item = dynamic_cast (info.elem_l_); - if (he_gr && !selfgr && item && Grace_align_item::has_interface (item)) - { - grace_align_l_ = item; - } - if (he_gr != selfgr) - return; - Note_req * note_l = dynamic_cast (info.req_l_); if (note_l && Rhythmic_head::has_interface (info.elem_l_)) diff --git a/lily/lyric-phrasing-engraver.cc b/lily/lyric-phrasing-engraver.cc index b23e2d786e..90a092ebdd 100644 --- a/lily/lyric-phrasing-engraver.cc +++ b/lily/lyric-phrasing-engraver.cc @@ -182,12 +182,6 @@ Lyric_phrasing_engraver::acknowledge_grob (Grob_info i) if (Note_head::has_interface (h)) { /* caught a note head ... do something with it */ - /* ... but not if it's a grace note ... */ - bool grace= to_boolean (i.elem_l_->get_grob_property ("grace")); - SCM wg = get_property ("weAreGraceContext"); - bool wgb = to_boolean (wg); - if (grace != wgb) - return; /* what's its Voice context name? */ String voice_context_id = get_context_id (i.origin_trans_l_->daddy_trans_l_, "Voice"); diff --git a/lily/midi-item.cc b/lily/midi-item.cc index bf046d4644..e095fbc125 100644 --- a/lily/midi-item.cc +++ b/lily/midi-item.cc @@ -91,10 +91,15 @@ Midi_event::Midi_event (Moment delta_mom, Midi_item* midi_p) midi_p_ = midi_p; } +/* + ugh. midi output badly broken since grace note hackage. + */ String Midi_event::str () const { - int delta_i = delta_mom_ * Moment (384 * 4); // ugh. + Rational rat_dt = (delta_mom_.main_part_ * Rational (384) + + delta_mom_.grace_mom_ * Rational (100))*Rational (4); + int delta_i = int (rat_dt); String delta_str = Midi_item::i2varint_str (delta_i); String midi_str = midi_p_->str (); diff --git a/lily/midi-walker.cc b/lily/midi-walker.cc index d9637672fb..078dada743 100644 --- a/lily/midi-walker.cc +++ b/lily/midi-walker.cc @@ -31,6 +31,7 @@ Midi_walker::Midi_walker (Audio_staff* audio_staff_l, Midi_track* track_l) track_l_ = track_l; index_= 0; item_l_arr_l_ = &audio_staff_l->audio_item_l_arr_; + last_mom_ = 0; } @@ -116,7 +117,18 @@ void Midi_walker::output_event (Moment now_mom, Midi_item* l) { Moment delta_t = now_mom - last_mom_ ; - last_mom_ += delta_t; + last_mom_ = now_mom; + + /* + this is not correct, but at least it doesn't crash when you + start with graces + */ + if (delta_t < Moment(0)) + { + delta_t = Moment (0); + } + + track_l_->add (delta_t, l); } @@ -126,10 +138,6 @@ Midi_walker::process () Audio_item* audio_p = (*item_l_arr_l_)[index_]; do_stop_notes (audio_p->audio_column_l_->at_mom ()); - /* - THIS IS A MEMORY LEAK. FIXME. - where's the leak? Everything goet to Midi_track, in a killing_cons. - */ if (Midi_item* midi_p = Midi_item::midi_p (audio_p)) { midi_p->channel_i_ = track_l_->channel_i_; diff --git a/lily/parser.yy b/lily/parser.yy index 95caa860e0..46db204f92 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -834,11 +834,11 @@ Composite_music: Music* seq = new Sequential_music (SCM_EOL); seq->set_mus_property ("elements", ms); - $$ = new New_grace_music (SCM_EOL); + $$ = new Grace_music (SCM_EOL); $$->set_mus_property ("element", seq->self_scm ()); scm_unprotect_object (seq->self_scm ()); #else - $$ = new New_grace_music (SCM_EOL); + $$ = new Grace_music (SCM_EOL); $$->set_mus_property ("element", $2->self_scm ()); scm_unprotect_object ($2->self_scm ()); #endif diff --git a/lily/performance.cc b/lily/performance.cc index 5aa7abaa53..55122e302a 100644 --- a/lily/performance.cc +++ b/lily/performance.cc @@ -57,7 +57,6 @@ Performance::output (Midi_stream& midi_stream) progress_indication ("[" + to_str (i)) ; /* - Aargh, let's hear it for the MIDI standard. MIDI players tend to ignore instrument settings on channel 10, the percussion channel by default. */ @@ -71,6 +70,7 @@ Performance::output (Midi_stream& midi_stream) } } + void Performance::output_header_track (Midi_stream& midi_stream) { diff --git a/lily/phrasing-slur-engraver.cc b/lily/phrasing-slur-engraver.cc index 319c266883..ed78313be5 100644 --- a/lily/phrasing-slur-engraver.cc +++ b/lily/phrasing-slur-engraver.cc @@ -111,9 +111,7 @@ Phrasing_slur_engraver::finalize () #endif } phrasing_slur_l_stack_.clear (); - SCM wg = get_property ("weAreGraceContext"); - bool wgb = to_boolean (wg); - if (!wgb) + for (int i=0; i < requests_arr_.size (); i++) { requests_arr_[i]->origin ()->warning (_ ("unterminated phrasing slur")); diff --git a/lily/rhythmic-column-engraver.cc b/lily/rhythmic-column-engraver.cc index f5287f998c..1ebea18a43 100644 --- a/lily/rhythmic-column-engraver.cc +++ b/lily/rhythmic-column-engraver.cc @@ -19,7 +19,6 @@ class Rhythmic_column_engraver :public Engraver { Link_array rhead_l_arr_; - Link_array grace_slur_endings_; Grob * stem_l_; Grob *ncol_p_; Grob *dotcol_l_; @@ -81,25 +80,12 @@ Rhythmic_column_engraver::create_grobs () stem_l_ = 0; } - SCM wg = get_property ("weAreGraceContext"); - bool wegrace = to_boolean (wg); - - if (!wegrace) - for (int i=0; i < grace_slur_endings_.size (); i++) - Slur::add_column (grace_slur_endings_[i], ncol_p_); - grace_slur_endings_.clear (); } } void Rhythmic_column_engraver::acknowledge_grob (Grob_info i) { - SCM wg = get_property ("weAreGraceContext"); - bool wegrace = to_boolean (wg); - if (wegrace != to_boolean (i.elem_l_->get_grob_property ("grace")) - && !Slur::has_interface (i.elem_l_)) - return ; - Item * item = dynamic_cast (i.elem_l_); if (item && Stem::has_interface (item)) { @@ -113,15 +99,6 @@ Rhythmic_column_engraver::acknowledge_grob (Grob_info i) { dotcol_l_ = item; } - else if (Slur::has_interface (i.elem_l_)) - { - /* - end slurs starting on grace notes - */ - - if (to_boolean (i.elem_l_->get_grob_property ("grace"))) - grace_slur_endings_.push (i.elem_l_); - } } void @@ -137,7 +114,6 @@ Rhythmic_column_engraver::stop_translation_timestep () void Rhythmic_column_engraver::start_translation_timestep () { - grace_slur_endings_.clear (); dotcol_l_ =0; stem_l_ =0; } diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc index 256acd3dc4..70844dc5b6 100644 --- a/lily/script-engraver.cc +++ b/lily/script-engraver.cc @@ -116,12 +116,6 @@ Script_engraver::process_music () void Script_engraver::acknowledge_grob (Grob_info inf) { - bool them_grace = to_boolean (inf.elem_l_->get_grob_property ("grace")); - bool us_grace = to_boolean (get_property ("weAreGraceContext")); - - if (us_grace != them_grace) - return; - if (Stem::has_interface (inf.elem_l_)) { for (int i=0; i < script_p_arr_.size (); i++) diff --git a/lily/sequential-music-iterator.cc b/lily/sequential-music-iterator.cc index 0f0f82d898..e02847f991 100644 --- a/lily/sequential-music-iterator.cc +++ b/lily/sequential-music-iterator.cc @@ -5,7 +5,7 @@ (c) 1997--2001 Han-Wen Nienhuys */ -#include "grace-iterator.hh" + #include "translator-group.hh" #include "debug.hh" #include "sequential-music-iterator.hh" @@ -164,9 +164,6 @@ Sequential_music_iterator::descend_to_child () Translator_group * child_report = child_report = iter_p_->report_to_l (); Translator_group * me_report = report_to_l (); - if (dynamic_cast (iter_p_)) - child_report = child_report->daddy_trans_l_; - Translator_group * c = child_report; while (c && c != me_report) { diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index 6f57a925c3..6eb8973f77 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -119,10 +119,8 @@ Slur_engraver::finalize () #endif } slur_l_stack_.clear (); - SCM wg = get_property ("weAreGraceContext"); - bool wgb = to_boolean (wg); - if (!wgb) - for (int i=0; i < requests_arr_.size (); i++) + + for (int i=0; i < requests_arr_.size (); i++) { requests_arr_[i]->origin ()->warning (_ ("unterminated slur")); } diff --git a/lily/spacing-engraver.cc b/lily/spacing-engraver.cc index b02847bf66..edeb8ebb9e 100644 --- a/lily/spacing-engraver.cc +++ b/lily/spacing-engraver.cc @@ -93,9 +93,6 @@ Spacing_engraver::finalize () void Spacing_engraver::acknowledge_grob (Grob_info i) { - if (to_boolean (i.elem_l_->get_grob_property ("grace"))) - return; - if (to_boolean (i.elem_l_->get_grob_property ("non-rhythmic"))) return; diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index 992ce31672..65b38e8a48 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -25,9 +25,9 @@ public: protected: Link_array time_scaled_music_arr_; /// when does the scaled music stop? Array order is synced with time_scaled_music_arr_ - Array stop_moments_; + Array stop_moments_; /// when does the current spanner stop? Array order is synced with time_scaled_music_arr_ - Array span_stop_moments_; + Array span_stop_moments_; /// The spanners. Array order is synced with time_scaled_music_arr_ Link_array started_span_p_arr_; @@ -48,12 +48,12 @@ Tuplet_engraver::try_music (Music *r) if (!dynamic_cast (el)) { time_scaled_music_arr_.push (c); - Moment m = now_mom () + c->length_mom (); + Rational m = now_mom ().main_part_ + c->length_mom ().main_part_; stop_moments_.push (m); SCM s = get_property ("tupletSpannerDuration"); if (unsmob_moment (s)) - m = m get_grob_property ("grace")); - SCM wg = get_property ("weAreGraceContext"); - bool wgb = to_boolean (wg); - if (grace != wgb) - return; - if (Note_column::has_interface (i.elem_l_)) { for (int j =0; j main_part_; for (int i= started_span_p_arr_.size (); i--;) { - if (now >= span_stop_moments_[i]) + if (now.main_part_ >= span_stop_moments_[i]) { if (started_span_p_arr_[i]) { @@ -131,10 +125,10 @@ Tuplet_engraver::start_translation_timestep () } if (tsd) - span_stop_moments_[i] += tsd; + span_stop_moments_[i] += tsd.main_part_; } - if (now >= stop_moments_[i]) + if (now.main_part_ >= stop_moments_[i]) { started_span_p_arr_.del (i); stop_moments_.del (i); diff --git a/ly/performer-init.ly b/ly/performer-init.ly index 8cfa8204bd..6ab401df96 100644 --- a/ly/performer-init.ly +++ b/ly/performer-init.ly @@ -25,28 +25,20 @@ VoiceContext = \translator { \consists "Dynamic_performer" \consists "Span_dynamic_performer" \consists "Piano_pedal_performer" - \consists "Grace_position_performer" - \accepts Thread - \accepts Grace + \consists "Note_performer" + \consists "Tie_performer" } \translator { \VoiceContext } ThreadContext = \translator { \type "Performer_group_performer" \name Thread - \consists "Note_performer" - \consists "Tie_performer" } \translator { \ThreadContext } \translator { - \type "Grace_performer_group" + \type "Performer_group_performer" \name Grace - \consists "Note_performer" - \consists "Tie_performer" - \consists "Swallow_performer" - - weAreGraceContext = #t } \translator diff --git a/scm/grob-description.scm b/scm/grob-description.scm index 4ee94ca851..916afa7884 100644 --- a/scm/grob-description.scm +++ b/scm/grob-description.scm @@ -221,13 +221,6 @@ (meta . ,(grob-description "Fingering" finger-interface font-interface text-script-interface text-interface side-position-interface)) )) - (GraceAlignment . ( - (axes . (0)) - (horizontal-space . 1.2) - (padding . 1.0) - (before-line-breaking-callback . ,Grace_align_item::before_line_breaking) - (meta . ,(grob-description "GraceAlignment" axis-group-interface align-interface grace-alignment-interface)) - )) (HaraKiriVerticalGroup . ( (Y-offset-callbacks . (,Hara_kiri_group_spanner::force_hara_kiri_callback)) -- 2.39.5