From: KITAITI Makoto Date: Mon, 5 Jan 2026 08:41:22 +0000 (+0900) Subject: ruby : fix segmentation fault (#3591) X-Git-Tag: upstream/1.8.3~58 X-Git-Url: https://git.djapps.eu/?a=commitdiff_plain;h=679bdb53dbcbfb3e42685f50c7ff367949fd4d48;p=pkg%2Fggml%2Fsources%2Fwhisper.cpp ruby : fix segmentation fault (#3591) * Mark long live variable * Fix test for Whisper::Token#deconstruct_keys(nil) * Don't use long live variable * Fix indentation --- diff --git a/bindings/ruby/ext/ruby_whisper_segment.c b/bindings/ruby/ext/ruby_whisper_segment.c index 74221790..5229cb53 100644 --- a/bindings/ruby/ext/ruby_whisper_segment.c +++ b/bindings/ruby/ext/ruby_whisper_segment.c @@ -11,7 +11,6 @@ static VALUE sym_text; static VALUE sym_no_speech_prob; static VALUE sym_speaker_turn_next; static VALUE sym_n_tokens; -static VALUE key_names; extern const rb_data_type_t ruby_whisper_type; @@ -221,7 +220,14 @@ ruby_whisper_segment_deconstruct_keys(VALUE self, VALUE keys) VALUE hash = rb_hash_new(); long n_keys; if (NIL_P(keys)) { - keys = key_names; + keys = rb_ary_new3( + N_KEY_NAMES, + sym_start_time, + sym_end_time, + sym_text, + sym_no_speech_prob, + sym_speaker_turn_next + ); n_keys = N_KEY_NAMES; } else { n_keys = RARRAY_LEN(keys); @@ -265,14 +271,6 @@ init_ruby_whisper_segment(VALUE *mWhisper) sym_no_speech_prob = ID2SYM(rb_intern("no_speech_prob")); sym_speaker_turn_next = ID2SYM(rb_intern("speaker_turn_next")); sym_n_tokens = ID2SYM(rb_intern("n_tokens")); - key_names = rb_ary_new3( - N_KEY_NAMES, - sym_start_time, - sym_end_time, - sym_text, - sym_no_speech_prob, - sym_speaker_turn_next - ); rb_define_alloc_func(cSegment, ruby_whisper_segment_allocate); rb_define_method(cSegment, "start_time", ruby_whisper_segment_get_start_time, 0); diff --git a/bindings/ruby/ext/ruby_whisper_token.c b/bindings/ruby/ext/ruby_whisper_token.c index e0dbb79e..ea4f4e63 100644 --- a/bindings/ruby/ext/ruby_whisper_token.c +++ b/bindings/ruby/ext/ruby_whisper_token.c @@ -6,7 +6,6 @@ extern VALUE cToken; extern const rb_data_type_t ruby_whisper_type; -static VALUE key_names; static VALUE sym_id; static VALUE sym_tid; static VALUE sym_probability; @@ -241,7 +240,20 @@ static VALUE ruby_whisper_token_deconstruct_keys(VALUE self, VALUE keys) long n_keys = 0; if (NIL_P(keys)) { - keys = key_names; + keys = rb_ary_new3( + N_KEY_NAMES, + sym_id, + sym_tid, + sym_probability, + sym_log_probability, + sym_pt, + sym_ptsum, + sym_t_dtw, + sym_voice_length, + sym_start_time, + sym_end_time, + sym_text + ); n_keys = N_KEY_NAMES; } else { n_keys = RARRAY_LEN(keys); @@ -320,20 +332,6 @@ init_ruby_whisper_token(VALUE *mWhisper) sym_start_time = ID2SYM(rb_intern("start_time")); sym_end_time = ID2SYM(rb_intern("end_time")); sym_text = ID2SYM(rb_intern("text")); - key_names = rb_ary_new3( - N_KEY_NAMES, - sym_id, - sym_tid, - sym_probability, - sym_log_probability, - sym_pt, - sym_ptsum, - sym_t_dtw, - sym_voice_length, - sym_start_time, - sym_end_time, - sym_text - ); rb_define_method(cToken, "id", ruby_whisper_token_get_id, 0); rb_define_method(cToken, "tid", ruby_whisper_token_get_tid, 0); diff --git a/bindings/ruby/ext/ruby_whisper_vad_segment.c b/bindings/ruby/ext/ruby_whisper_vad_segment.c index f444b419..49ff0aad 100644 --- a/bindings/ruby/ext/ruby_whisper_vad_segment.c +++ b/bindings/ruby/ext/ruby_whisper_vad_segment.c @@ -9,7 +9,6 @@ extern const rb_data_type_t ruby_whisper_vad_segments_type; static VALUE sym_start_time; static VALUE sym_end_time; -static VALUE key_names; static void rb_whisper_vad_segment_mark(void *p) @@ -100,7 +99,11 @@ ruby_whisper_vad_segment_deconstruct_keys(VALUE self, VALUE keys) hash = rb_hash_new(); if (NIL_P(keys)) { - keys = key_names; + keys = rb_ary_new3( + N_KEY_NAMES, + sym_start_time, + sym_end_time + ); n_keys = N_KEY_NAMES; } else { n_keys = RARRAY_LEN(keys); @@ -128,11 +131,6 @@ init_ruby_whisper_vad_segment(VALUE *mVAD) sym_start_time = ID2SYM(rb_intern("start_time")); sym_end_time = ID2SYM(rb_intern("end_time")); - key_names = rb_ary_new3( - N_KEY_NAMES, - sym_start_time, - sym_end_time - ); rb_define_alloc_func(cVADSegment, ruby_whisper_vad_segment_s_allocate); rb_define_method(cVADSegment, "start_time", ruby_whisper_vad_segment_get_start_time, 0); diff --git a/bindings/ruby/test/test_token.rb b/bindings/ruby/test/test_token.rb index 214b355b..e5834b1b 100644 --- a/bindings/ruby/test/test_token.rb +++ b/bindings/ruby/test/test_token.rb @@ -57,7 +57,9 @@ class TestToken < TestBase end def test_deconstruct_keys_with_nil - assert_equal({}, @token.deconstruct_keys(nil)) + keys = %i[id tid probability log_probability pt ptsum t_dtw voice_length start_time end_time text] + expected = keys.collect {|key| [key, @token.send(key)] }.to_h + assert_equal(expected, @token.deconstruct_keys(nil)) end def test_deconstruct_keys_with_keys