@@ -637,6 +637,47 @@ Debase_enable_file_filtering(VALUE self, VALUE value)
637637 return value ;
638638}
639639
640+ #if RUBY_API_VERSION_CODE >= 20500 && !(RUBY_RELEASE_YEAR == 2017 && RUBY_RELEASE_MONTH == 10 && RUBY_RELEASE_DAY == 10 )
641+ static const rb_iseq_t *
642+ my_iseqw_check (VALUE iseqw )
643+ {
644+ rb_iseq_t * iseq = DATA_PTR (iseqw );
645+
646+ if (!iseq -> body ) {
647+ ibf_load_iseq_complete (iseq );
648+ }
649+
650+ if (!iseq -> body -> location .label ) {
651+ rb_raise (rb_eTypeError , "uninitialized InstructionSequence" );
652+ }
653+ return iseq ;
654+ }
655+
656+ static void
657+ Debase_set_trace_flag_to_iseq (VALUE self , VALUE rb_iseq ) {
658+ if (!SPECIAL_CONST_P (rb_iseq ) && RBASIC_CLASS (rb_iseq ) == rb_cISeq ) {
659+ rb_iseq_t * iseq = my_iseqw_check (rb_iseq );
660+ rb_iseq_trace_set (iseq , RUBY_EVENT_TRACEPOINT_ALL );
661+ }
662+ }
663+
664+ static void
665+ Debase_unset_trace_flags (VALUE self , VALUE rb_iseq ) {
666+ if (!SPECIAL_CONST_P (rb_iseq ) && RBASIC_CLASS (rb_iseq ) == rb_cISeq ) {
667+ rb_iseq_t * iseq = my_iseqw_check (rb_iseq );
668+ rb_iseq_trace_set (iseq , RUBY_EVENT_NONE );
669+ }
670+ }
671+ #else
672+ static void
673+ Debase_set_trace_flag_to_iseq (VALUE self , VALUE rb_iseq ) {
674+ }
675+
676+ static void
677+ Debase_unset_trace_flags (VALUE self , VALUE rb_iseq ) {
678+ }
679+ #endif
680+
640681static VALUE
641682Debase_init_variables ()
642683{
@@ -680,6 +721,10 @@ Init_debase_internals()
680721 rb_define_module_function (mDebase , "enable_trace_points" , Debase_enable_trace_points , 0 );
681722 rb_define_module_function (mDebase , "prepare_context" , Debase_prepare_context , 0 );
682723 rb_define_module_function (mDebase , "init_variables" , Debase_init_variables , 0 );
724+ rb_define_module_function (mDebase , "set_trace_flag_to_iseq" , Debase_set_trace_flag_to_iseq , 1 );
725+
726+ //use only for tests
727+ rb_define_module_function (mDebase , "unset_iseq_flags" , Debase_unset_trace_flags , 1 );
683728
684729 idAlive = rb_intern ("alive?" );
685730 idAtLine = rb_intern ("at_line" );
0 commit comments