ruby-debug-base19 0.11.22 → 0.11.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -392,6 +392,7 @@ debug_context_create(VALUE thread)
392
392
  debug_context->jump_pc = NULL;
393
393
  debug_context->jump_cfp = NULL;
394
394
  debug_context->old_iseq_catch = NULL;
395
+ debug_context->thread_pause = 0;
395
396
  if(rb_obj_class(thread) == cDebugThread)
396
397
  CTX_FL_SET(debug_context, CTX_FL_IGNORE);
397
398
  return Data_Wrap_Struct(cContext, debug_context_mark, debug_context_free, debug_context);
@@ -800,16 +801,27 @@ debug_event_hook(rb_event_flag_t event, VALUE data, VALUE self, ID mid, VALUE kl
800
801
  debug_context->stack_size--;
801
802
  }
802
803
 
803
- /* ignore a skipped section of code */
804
- if(CTX_FL_TEST(debug_context, CTX_FL_SKIPPED)) goto cleanup;
805
-
806
- if ((event == RUBY_EVENT_LINE) && (debug_context->stack_size > 0) &&
807
- (get_top_frame(debug_context)->line == line) && (get_top_frame(debug_context)->info.runtime.cfp->iseq == iseq) &&
808
- !CTX_FL_TEST(debug_context, CTX_FL_CATCHING))
804
+ if (debug_context->thread_pause)
809
805
  {
810
- /* Sometimes duplicate RUBY_EVENT_LINE messages get generated by the compiler.
811
- * Ignore them. */
812
- goto cleanup;
806
+ debug_context->thread_pause = 0;
807
+ debug_context->stop_next = 1;
808
+ debug_context->dest_frame = -1;
809
+ moved = 1;
810
+ }
811
+ else
812
+ {
813
+ /* ignore a skipped section of code */
814
+ if (CTX_FL_TEST(debug_context, CTX_FL_SKIPPED))
815
+ goto cleanup;
816
+
817
+ if ((event == RUBY_EVENT_LINE) && (debug_context->stack_size > 0) &&
818
+ (get_top_frame(debug_context)->line == line) && (get_top_frame(debug_context)->info.runtime.cfp->iseq == iseq) &&
819
+ !CTX_FL_TEST(debug_context, CTX_FL_CATCHING))
820
+ {
821
+ /* Sometimes duplicate RUBY_EVENT_LINE messages get generated by the compiler.
822
+ * Ignore them. */
823
+ goto cleanup;
824
+ }
813
825
  }
814
826
 
815
827
  if(debug == Qtrue)
@@ -892,7 +904,7 @@ debug_event_hook(rb_event_flag_t event, VALUE data, VALUE self, ID mid, VALUE kl
892
904
  (breakpoint = check_breakpoints_by_pos(debug_context, file, line)) != Qnil)
893
905
  {
894
906
  call_at_line_check(self, debug_context, breakpoint, context, file, line);
895
- }
907
+ }
896
908
  break;
897
909
  }
898
910
  case RUBY_EVENT_CALL:
@@ -1794,7 +1806,7 @@ context_frame_line(int argc, VALUE *argv, VALUE self)
1794
1806
 
1795
1807
  pc = GET_FRAME->info.runtime.last_pc;
1796
1808
  cfp = GET_FRAME->info.runtime.cfp;
1797
- while (cfp > th->cfp)
1809
+ while (cfp >= th->cfp)
1798
1810
  {
1799
1811
  if ((cfp->iseq != NULL) && (pc >= cfp->iseq->iseq_encoded) && (pc < cfp->iseq->iseq_encoded + cfp->iseq->iseq_size))
1800
1812
  return(INT2FIX(rb_vm_get_sourceline(cfp)));
@@ -2307,7 +2319,7 @@ FUNC_FASTCALL(do_jump)(rb_thread_t *th, rb_control_frame_t *cfp)
2307
2319
  cfp->pc[-1] = debug_context->saved_jump_ins[1];
2308
2320
 
2309
2321
  if ((debug_context->jump_pc < debug_context->jump_cfp->iseq->iseq_encoded) ||
2310
- (debug_context->jump_pc >= debug_context->jump_cfp->iseq->iseq_encoded + cfp->iseq->iseq_size))
2322
+ (debug_context->jump_pc >= debug_context->jump_cfp->iseq->iseq_encoded + debug_context->jump_cfp->iseq->iseq_size))
2311
2323
  rb_raise(rb_eRuntimeError, "Invalid jump PC target");
2312
2324
 
2313
2325
  jump_cfp = debug_context->jump_cfp;
@@ -2431,6 +2443,31 @@ context_jump(VALUE self, VALUE line, VALUE file)
2431
2443
  return(INT2FIX(3)); /* couldn't find a line and file frame match */
2432
2444
  }
2433
2445
 
2446
+ /*
2447
+ * call-seq:
2448
+ * context.break -> bool
2449
+ *
2450
+ * Returns +true+ if context is currently running and set flag to break it at next line
2451
+ */
2452
+ static VALUE
2453
+ context_pause(VALUE self)
2454
+ {
2455
+ debug_context_t *debug_context;
2456
+ rb_thread_t *th;
2457
+
2458
+ debug_check_started();
2459
+
2460
+ Data_Get_Struct(self, debug_context_t, debug_context);
2461
+ if (CTX_FL_TEST(debug_context, CTX_FL_DEAD))
2462
+ return(Qfalse);
2463
+
2464
+ GetThreadPtr(context_thread_0(debug_context), th);
2465
+ if (th == GET_THREAD())
2466
+ return(Qfalse);
2467
+
2468
+ debug_context->thread_pause = 1;
2469
+ return(Qtrue);
2470
+ }
2434
2471
 
2435
2472
  /*
2436
2473
  * Document-class: Context
@@ -2473,6 +2510,7 @@ Init_context()
2473
2510
  rb_define_method(cContext, "set_breakpoint",
2474
2511
  context_set_breakpoint, -1); /* in breakpoint.c */
2475
2512
  rb_define_method(cContext, "jump", context_jump, 2);
2513
+ rb_define_method(cContext, "pause", context_pause, 0);
2476
2514
  }
2477
2515
 
2478
2516
  /*
@@ -78,6 +78,7 @@ typedef struct {
78
78
  rb_control_frame_t *jump_cfp;
79
79
  VALUE *jump_pc;
80
80
  iseq_catch_t *old_iseq_catch;
81
+ volatile int thread_pause;
81
82
  } debug_context_t;
82
83
 
83
84
  /* variables in ruby_debug.c */
@@ -47,7 +47,8 @@ module Debugger
47
47
  end
48
48
 
49
49
  def at_tracing(file, line)
50
- handler.at_tracing(self, file, line)
50
+ @tracing_started = true if File.identical?(file, File.join(Debugger::INITIAL_DIR, Debugger::PROG_SCRIPT))
51
+ handler.at_tracing(self, file, line) if @tracing_started
51
52
  end
52
53
 
53
54
  def at_line(file, line)
@@ -60,6 +61,7 @@ module Debugger
60
61
  end
61
62
 
62
63
  @reload_source_on_change = false
64
+ @tracing_started = false
63
65
 
64
66
  class << self
65
67
  # interface modules provide +handler+ object
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-debug-base19
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.22
4
+ version: 0.11.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kent Sibilev