ruby-debug-base 0.9.3 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,8 +3,9 @@
3
3
  #include <node.h>
4
4
  #include <rubysig.h>
5
5
  #include <st.h>
6
+ #include <version.h>
6
7
 
7
- #define DEBUG_VERSION "0.9.3"
8
+ #define DEBUG_VERSION "0.10.0"
8
9
 
9
10
  #ifdef _WIN32
10
11
  struct FRAME {
@@ -67,6 +68,7 @@ RUBY_EXTERN struct RVarmap *ruby_dyna_vars;
67
68
  #define STACK_SIZE_INCREMENT 128
68
69
 
69
70
  typedef struct {
71
+ int argc; /* Number of arguments a frame should have. */
70
72
  VALUE binding;
71
73
  ID id;
72
74
  ID orig_id;
@@ -74,6 +76,7 @@ typedef struct {
74
76
  const char * file;
75
77
  short dead;
76
78
  VALUE self;
79
+ VALUE arg_ary;
77
80
  union {
78
81
  struct {
79
82
  struct FRAME *frame;
@@ -81,7 +84,9 @@ typedef struct {
81
84
  struct RVarmap *dyna_vars;
82
85
  } runtime;
83
86
  struct {
87
+ VALUE args;
84
88
  VALUE locals;
89
+ VALUE arg_ary;
85
90
  } copy;
86
91
  } info;
87
92
  } debug_frame_t;
@@ -118,6 +123,7 @@ typedef struct {
118
123
  ID mid;
119
124
  } pos;
120
125
  VALUE expr;
126
+ VALUE enabled;
121
127
  int hit_count;
122
128
  int hit_value;
123
129
  enum hit_condition hit_condition;
@@ -135,6 +141,7 @@ static VALUE locker = Qnil;
135
141
  static VALUE post_mortem = Qfalse;
136
142
  static VALUE keep_frame_binding = Qfalse;
137
143
  static VALUE debug = Qfalse;
144
+ static VALUE track_frame_args = Qfalse;
138
145
 
139
146
  static VALUE last_context = Qnil;
140
147
  static VALUE last_thread = Qnil;
@@ -165,9 +172,11 @@ static unsigned long hook_count = 0;
165
172
  static VALUE create_binding(VALUE);
166
173
  static VALUE debug_stop(VALUE);
167
174
  static void save_current_position(debug_context_t *);
175
+ static VALUE context_copy_args(debug_frame_t *);
168
176
  static VALUE context_copy_locals(debug_frame_t *);
169
177
  static void context_suspend_0(debug_context_t *);
170
178
  static void context_resume_0(debug_context_t *);
179
+ static void copy_scalar_args(debug_frame_t *);
171
180
 
172
181
  typedef struct locked_thread_t {
173
182
  VALUE thread_id;
@@ -221,7 +230,8 @@ id2ref_unprotected(VALUE id)
221
230
  static VALUE
222
231
  id2ref_error()
223
232
  {
224
- rb_p(ruby_errinfo);
233
+ if(debug == Qtrue)
234
+ rb_p(ruby_errinfo);
225
235
  return Qnil;
226
236
  }
227
237
 
@@ -409,6 +419,7 @@ debug_context_mark(void *data)
409
419
  if(frame->dead)
410
420
  {
411
421
  rb_gc_mark(frame->info.copy.locals);
422
+ rb_gc_mark(frame->info.copy.args);
412
423
  }
413
424
  }
414
425
  rb_gc_mark(debug_context->breakpoint);
@@ -471,6 +482,7 @@ debug_context_dup(debug_context_t *debug_context)
471
482
  new_frame = &(new_debug_context->frames[i]);
472
483
  old_frame = &(debug_context->frames[i]);
473
484
  new_frame->dead = 1;
485
+ new_frame->info.copy.args = context_copy_args(old_frame);
474
486
  new_frame->info.copy.locals = context_copy_locals(old_frame);
475
487
  }
476
488
  return Data_Wrap_Struct(cContext, debug_context_mark, debug_context_free, new_debug_context);
@@ -521,7 +533,7 @@ static VALUE
521
533
  call_at_line(VALUE context, debug_context_t *debug_context, VALUE file, VALUE line)
522
534
  {
523
535
  VALUE args;
524
-
536
+
525
537
  last_debugged_thnum = debug_context->thnum;
526
538
  save_current_position(debug_context);
527
539
 
@@ -545,6 +557,7 @@ save_call_frame(rb_event_t event, VALUE self, char *file, int line, ID mid, debu
545
557
  debug_context->frames = REALLOC_N(debug_context->frames, debug_frame_t, debug_context->stack_len);
546
558
  }
547
559
  debug_frame = &debug_context->frames[frame_n];
560
+ debug_frame->argc = ruby_frame->argc;
548
561
  debug_frame->file = file;
549
562
  debug_frame->line = line;
550
563
  debug_frame->binding = binding;
@@ -555,8 +568,11 @@ save_call_frame(rb_event_t event, VALUE self, char *file, int line, ID mid, debu
555
568
  debug_frame->info.runtime.frame = ruby_frame;
556
569
  debug_frame->info.runtime.scope = ruby_scope;
557
570
  debug_frame->info.runtime.dyna_vars = event == RUBY_EVENT_LINE ? ruby_dyna_vars : NULL;
571
+ if (RTEST(track_frame_args))
572
+ copy_scalar_args(debug_frame);
558
573
  }
559
574
 
575
+
560
576
  #if defined DOSISH
561
577
  #define isdirsep(x) ((x) == '/' || (x) == '\\')
562
578
  #else
@@ -593,7 +609,9 @@ filename_cmp(VALUE source, char *file)
593
609
  inline static int
594
610
  classname_cmp(VALUE name, VALUE klass)
595
611
  {
596
- return (klass != Qnil && rb_str_cmp(name, rb_mod_name(klass)) == 0);
612
+ VALUE class_name = (Qnil == name) ? rb_str_new2("main") : name;
613
+ return (klass != Qnil
614
+ && rb_str_cmp(class_name, rb_mod_name(klass)) == 0);
597
615
  }
598
616
 
599
617
  static int
@@ -606,6 +624,7 @@ check_breakpoint_hit_condition(VALUE breakpoint)
606
624
  Data_Get_Struct(breakpoint, debug_breakpoint_t, debug_breakpoint);
607
625
 
608
626
  debug_breakpoint->hit_count++;
627
+ if (!Qtrue == debug_breakpoint->enabled) return 0;
609
628
  switch(debug_breakpoint->hit_condition)
610
629
  {
611
630
  case HIT_COND_NONE:
@@ -640,6 +659,7 @@ check_breakpoint_by_pos(VALUE breakpoint, char *file, int line)
640
659
  if(breakpoint == Qnil)
641
660
  return 0;
642
661
  Data_Get_Struct(breakpoint, debug_breakpoint_t, debug_breakpoint);
662
+ if (!Qtrue == debug_breakpoint->enabled) return 0;
643
663
  if(debug_breakpoint->type != BP_POS_TYPE)
644
664
  return 0;
645
665
  if(debug_breakpoint->pos.line != line)
@@ -657,6 +677,7 @@ check_breakpoint_by_method(VALUE breakpoint, VALUE klass, ID mid)
657
677
  if(breakpoint == Qnil)
658
678
  return 0;
659
679
  Data_Get_Struct(breakpoint, debug_breakpoint_t, debug_breakpoint);
680
+ if (!Qtrue == debug_breakpoint->enabled) return 0;
660
681
  if(debug_breakpoint->type != BP_METHOD_TYPE)
661
682
  return 0;
662
683
  if(debug_breakpoint->pos.mid != mid)
@@ -713,8 +734,8 @@ check_breakpoints_by_method(debug_context_t *debug_context, VALUE klass, ID mid)
713
734
  }
714
735
 
715
736
  /*
716
- * This is a NASTY HACK. For some reasons rb_f_binding is decalred
717
- * static in eval.c
737
+ * This is a NASTY HACK. For some reasons rb_f_binding is declared
738
+ * static in eval.c. So we create a cons up call to binding in C.
718
739
  */
719
740
  static VALUE
720
741
  create_binding(VALUE self)
@@ -1167,11 +1188,12 @@ debug_start(VALUE self)
1167
1188
  * call-seq:
1168
1189
  * Debugger.stop -> bool
1169
1190
  *
1170
- * This method disacivates the debugger. It returns +true+ if the debugger is disacivated,
1191
+ * This method disables the debugger. It returns +true+ if the debugger is disabled,
1171
1192
  * otherwise it returns +false+.
1172
1193
  *
1173
- * <i>Note that if you want to stop debugger, you must call Debugger.stop as many time as you
1174
- * called Debugger.start method.</i>
1194
+ * <i>Note that if you want to stop debugger, you must call
1195
+ * Debugger.stop as many times as you called Debugger.start
1196
+ * method.</i>
1175
1197
  */
1176
1198
  static VALUE
1177
1199
  debug_stop(VALUE self)
@@ -1224,6 +1246,7 @@ create_breakpoint_from_args(int argc, VALUE *argv, int id)
1224
1246
  breakpoint->pos.line = FIX2INT(pos);
1225
1247
  else
1226
1248
  breakpoint->pos.mid = rb_intern(RSTRING(pos)->ptr);
1249
+ breakpoint->enabled = Qtrue;
1227
1250
  breakpoint->expr = NIL_P(expr) ? expr: StringValue(expr);
1228
1251
  breakpoint->hit_count = 0;
1229
1252
  breakpoint->hit_value = 0;
@@ -1568,6 +1591,31 @@ debug_set_post_mortem(VALUE self, VALUE value)
1568
1591
  return value;
1569
1592
  }
1570
1593
 
1594
+ /*
1595
+ * call-seq:
1596
+ * Debugger.track_fame_args? -> bool
1597
+ *
1598
+ * Returns +true+ if the debugger track frame argument values on calls.
1599
+ */
1600
+ static VALUE
1601
+ debug_track_frame_args(VALUE self)
1602
+ {
1603
+ return track_frame_args;
1604
+ }
1605
+
1606
+ /*
1607
+ * call-seq:
1608
+ * Debugger.track_frame_args = bool
1609
+ *
1610
+ * Setting to +true+ will make the debugger save argument info on calls.
1611
+ */
1612
+ static VALUE
1613
+ debug_set_track_frame_args(VALUE self, VALUE value)
1614
+ {
1615
+ track_frame_args = RTEST(value) ? Qtrue : Qfalse;
1616
+ return value;
1617
+ }
1618
+
1571
1619
  /*
1572
1620
  * call-seq:
1573
1621
  * Debugger.keep_frame_binding? -> bool
@@ -1816,36 +1864,73 @@ check_frame_number(debug_context_t *debug_context, VALUE frame)
1816
1864
  return frame_n;
1817
1865
  }
1818
1866
 
1867
+ static int
1868
+ optional_frame_position(int argc, VALUE *argv) {
1869
+ unsigned int i_scanned;
1870
+ VALUE level;
1871
+
1872
+ if ((argc > 1) || (argc < 0))
1873
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
1874
+ i_scanned = rb_scan_args(argc, argv, "01", &level);
1875
+ if (0 == i_scanned) {
1876
+ level = INT2FIX(0);
1877
+ }
1878
+ return level;
1879
+ }
1880
+
1819
1881
  /*
1820
1882
  * call-seq:
1821
- * context.frame_binding(frame) -> binding
1883
+ * context.frame_args_info(frame_position=0) -> list
1884
+ if track_frame_args or nil otherwise
1885
+ *
1886
+ * Returns info saved about call arguments (if any saved).
1887
+ */
1888
+ static VALUE
1889
+ context_frame_args_info(int argc, VALUE *argv, VALUE self)
1890
+ {
1891
+ VALUE frame;
1892
+ debug_context_t *debug_context;
1893
+
1894
+ debug_check_started();
1895
+ frame = optional_frame_position(argc, argv);
1896
+ Data_Get_Struct(self, debug_context_t, debug_context);
1897
+
1898
+ return RTEST(track_frame_args) ? GET_FRAME->arg_ary : Qnil;
1899
+ }
1900
+
1901
+ /*
1902
+ * call-seq:
1903
+ * context.frame_binding(frame_position=0) -> binding
1822
1904
  *
1823
1905
  * Returns frame's binding.
1824
1906
  */
1825
1907
  static VALUE
1826
- context_frame_binding(VALUE self, VALUE frame)
1908
+ context_frame_binding(int argc, VALUE *argv, VALUE self)
1827
1909
  {
1910
+ VALUE frame;
1828
1911
  debug_context_t *debug_context;
1829
1912
 
1830
1913
  debug_check_started();
1914
+ frame = optional_frame_position(argc, argv);
1831
1915
  Data_Get_Struct(self, debug_context_t, debug_context);
1832
1916
  return GET_FRAME->binding;
1833
1917
  }
1834
1918
 
1835
1919
  /*
1836
1920
  * call-seq:
1837
- * context.frame_method(frame) -> sym
1921
+ * context.frame_method(frame_position=0) -> sym
1838
1922
  *
1839
1923
  * Returns the sym of the called method.
1840
1924
  */
1841
1925
  static VALUE
1842
- context_frame_id(VALUE self, VALUE frame)
1926
+ context_frame_id(int argc, VALUE *argv, VALUE self)
1843
1927
  {
1844
-
1928
+ VALUE frame;
1845
1929
  debug_context_t *debug_context;
1846
1930
  ID id;
1847
1931
 
1848
1932
  debug_check_started();
1933
+ frame = optional_frame_position(argc, argv);
1849
1934
  Data_Get_Struct(self, debug_context_t, debug_context);
1850
1935
 
1851
1936
  id = GET_FRAME->id;
@@ -1854,16 +1939,18 @@ context_frame_id(VALUE self, VALUE frame)
1854
1939
 
1855
1940
  /*
1856
1941
  * call-seq:
1857
- * context.frame_line(frame) -> int
1942
+ * context.frame_line(frame_position) -> int
1858
1943
  *
1859
1944
  * Returns the line number in the file.
1860
1945
  */
1861
1946
  static VALUE
1862
- context_frame_line(VALUE self, VALUE frame)
1947
+ context_frame_line(int argc, VALUE *argv, VALUE self)
1863
1948
  {
1949
+ VALUE frame;
1864
1950
  debug_context_t *debug_context;
1865
1951
 
1866
1952
  debug_check_started();
1953
+ frame = optional_frame_position(argc, argv);
1867
1954
  Data_Get_Struct(self, debug_context_t, debug_context);
1868
1955
 
1869
1956
  return INT2FIX(GET_FRAME->line);
@@ -1871,21 +1958,100 @@ context_frame_line(VALUE self, VALUE frame)
1871
1958
 
1872
1959
  /*
1873
1960
  * call-seq:
1874
- * context.frame_file(frame) -> string
1961
+ * context.frame_file(frame_position) -> string
1875
1962
  *
1876
1963
  * Returns the name of the file.
1877
1964
  */
1878
1965
  static VALUE
1879
- context_frame_file(VALUE self, VALUE frame)
1966
+ context_frame_file(int argc, VALUE *argv, VALUE self)
1880
1967
  {
1968
+ VALUE frame;
1881
1969
  debug_context_t *debug_context;
1882
1970
 
1883
1971
  debug_check_started();
1972
+ frame = optional_frame_position(argc, argv);
1884
1973
  Data_Get_Struct(self, debug_context_t, debug_context);
1885
1974
 
1886
1975
  return rb_str_new2(GET_FRAME->file);
1887
1976
  }
1888
1977
 
1978
+ static int
1979
+ arg_value_is_small(VALUE val)
1980
+ {
1981
+ switch (TYPE(val)) {
1982
+ case T_FIXNUM: case T_FLOAT: case T_CLASS:
1983
+ case T_NIL: case T_MODULE: case T_FILE:
1984
+ case T_TRUE: case T_FALSE: case T_UNDEF:
1985
+ return 1;
1986
+ default:
1987
+ return SYMBOL_P(val);
1988
+ }
1989
+ }
1990
+
1991
+ /*
1992
+ * Save scalar arguments or a class name.
1993
+ */
1994
+ static void
1995
+ copy_scalar_args(debug_frame_t *debug_frame)
1996
+ {
1997
+ unsigned int i;
1998
+ ID *tbl = ruby_scope->local_tbl;;
1999
+ if (tbl && ruby_scope->local_vars)
2000
+ {
2001
+ int n = *tbl++;
2002
+ if (debug_frame->argc+2 < n) n = debug_frame->argc+2;
2003
+ debug_frame->arg_ary = rb_ary_new2(n);
2004
+ for (i=2; i<n; i++)
2005
+ {
2006
+ /* skip flip states */
2007
+ if (rb_is_local_id(tbl[i]))
2008
+ {
2009
+ const char *name = rb_id2name(tbl[i]);
2010
+ VALUE val = rb_eval_string (name);
2011
+ if (arg_value_is_small(val))
2012
+ rb_ary_push(debug_frame->arg_ary, val);
2013
+ else
2014
+ rb_ary_push(debug_frame->arg_ary,
2015
+ rb_str_new2(rb_obj_classname(val)));
2016
+ }
2017
+ }
2018
+ }
2019
+ }
2020
+
2021
+
2022
+ /*
2023
+ * call-seq:
2024
+ * context.copy_args(frame) -> list of args
2025
+ *
2026
+ * Returns a array of argument names.
2027
+ */
2028
+ static VALUE
2029
+ context_copy_args(debug_frame_t *debug_frame)
2030
+ {
2031
+ ID *tbl;
2032
+ int n, i;
2033
+ struct SCOPE *scope;
2034
+ VALUE list = rb_ary_new2(0); /* [] */
2035
+
2036
+ scope = debug_frame->info.runtime.scope;
2037
+ tbl = scope->local_tbl;
2038
+
2039
+ if (tbl && scope->local_vars)
2040
+ {
2041
+ n = *tbl++;
2042
+ if (debug_frame->argc+2 < n) n = debug_frame->argc+2;
2043
+ list = rb_ary_new2(n);
2044
+ /* skip first 2 ($_ and $~) */
2045
+ for (i=2; i<n; i++)
2046
+ {
2047
+ /* skip first 2 ($_ and $~) */
2048
+ if (!rb_is_local_id(tbl[i])) continue; /* skip flip states */
2049
+ rb_ary_push(list, rb_str_new2(rb_id2name(tbl[i])));
2050
+ }
2051
+ }
2052
+
2053
+ return list;
2054
+ }
1889
2055
  static VALUE
1890
2056
  context_copy_locals(debug_frame_t *debug_frame)
1891
2057
  {
@@ -1927,12 +2093,14 @@ context_copy_locals(debug_frame_t *debug_frame)
1927
2093
  * Returns frame's local variables.
1928
2094
  */
1929
2095
  static VALUE
1930
- context_frame_locals(VALUE self, VALUE frame)
2096
+ context_frame_locals(int argc, VALUE *argv, VALUE self)
1931
2097
  {
2098
+ VALUE frame;
1932
2099
  debug_context_t *debug_context;
1933
2100
  debug_frame_t *debug_frame;
1934
2101
 
1935
2102
  debug_check_started();
2103
+ frame = optional_frame_position(argc, argv);
1936
2104
  Data_Get_Struct(self, debug_context_t, debug_context);
1937
2105
 
1938
2106
  debug_frame = GET_FRAME;
@@ -1944,17 +2112,43 @@ context_frame_locals(VALUE self, VALUE frame)
1944
2112
 
1945
2113
  /*
1946
2114
  * call-seq:
1947
- * context.frame_self(frame) -> obj
2115
+ * context.frame_args(frame_position=0) -> list
2116
+ *
2117
+ * Returns frame's argument parameters
2118
+ */
2119
+ static VALUE
2120
+ context_frame_args(int argc, VALUE *argv, VALUE self)
2121
+ {
2122
+ VALUE frame;
2123
+ debug_context_t *debug_context;
2124
+ debug_frame_t *debug_frame;
2125
+
2126
+ debug_check_started();
2127
+ frame = optional_frame_position(argc, argv);
2128
+ Data_Get_Struct(self, debug_context_t, debug_context);
2129
+
2130
+ debug_frame = GET_FRAME;
2131
+ if(debug_frame->dead)
2132
+ return debug_frame->info.copy.args;
2133
+ else
2134
+ return context_copy_args(debug_frame);
2135
+ }
2136
+
2137
+ /*
2138
+ * call-seq:
2139
+ * context.frame_self(frame_postion=0) -> obj
1948
2140
  *
1949
2141
  * Returns self object of the frame.
1950
2142
  */
1951
2143
  static VALUE
1952
- context_frame_self(VALUE self, VALUE frame)
2144
+ context_frame_self(int argc, VALUE *argv, VALUE self)
1953
2145
  {
2146
+ VALUE frame;
1954
2147
  debug_context_t *debug_context;
1955
2148
  debug_frame_t *debug_frame;
1956
2149
 
1957
2150
  debug_check_started();
2151
+ frame = optional_frame_position(argc, argv);
1958
2152
  Data_Get_Struct(self, debug_context_t, debug_context);
1959
2153
 
1960
2154
  debug_frame = GET_FRAME;
@@ -1963,27 +2157,34 @@ context_frame_self(VALUE self, VALUE frame)
1963
2157
 
1964
2158
  /*
1965
2159
  * call-seq:
1966
- * context.frame_class(frame) -> obj
2160
+ * context.frame_class(frame_position) -> obj
1967
2161
  *
1968
2162
  * Returns the real class of the frame.
1969
2163
  * It could be different than context.frame_self(frame).class
1970
2164
  */
1971
2165
  static VALUE
1972
- context_frame_class(VALUE self, VALUE frame)
2166
+ context_frame_class(int argc, VALUE *argv, VALUE self)
1973
2167
  {
2168
+ VALUE frame;
1974
2169
  debug_context_t *debug_context;
1975
2170
  debug_frame_t *debug_frame;
1976
2171
  VALUE klass;
1977
2172
 
1978
2173
  debug_check_started();
2174
+ frame = optional_frame_position(argc, argv);
1979
2175
  Data_Get_Struct(self, debug_context_t, debug_context);
1980
2176
 
1981
2177
  debug_frame = GET_FRAME;
1982
2178
 
1983
2179
  if(CTX_FL_TEST(debug_context, CTX_FL_DEAD))
1984
2180
  return Qnil;
1985
-
2181
+
2182
+ #if RUBY_VERSION_CODE >= 190
2183
+ klass = debug_frame->info.runtime.frame->this_class;
2184
+ #else
1986
2185
  klass = debug_frame->info.runtime.frame->last_class;
2186
+ #endif
2187
+
1987
2188
  klass = real_class(klass);
1988
2189
  if(TYPE(klass) == T_CLASS || TYPE(klass) == T_MODULE)
1989
2190
  return klass;
@@ -2010,7 +2211,7 @@ context_stack_size(VALUE self)
2010
2211
 
2011
2212
  /*
2012
2213
  * call-seq:
2013
- * context.thread -> trhread
2214
+ * context.thread -> thread
2014
2215
  *
2015
2216
  * Returns a thread this context is associated with.
2016
2217
  */
@@ -2277,6 +2478,36 @@ context_stop_reason(VALUE self)
2277
2478
  }
2278
2479
 
2279
2480
 
2481
+ /*
2482
+ * call-seq:
2483
+ * breakpoint.enabled?
2484
+ *
2485
+ * Returns whether breakpoint is enabled or not.
2486
+ */
2487
+ static VALUE
2488
+ breakpoint_enabled(VALUE self)
2489
+ {
2490
+ debug_breakpoint_t *breakpoint;
2491
+
2492
+ Data_Get_Struct(self, debug_breakpoint_t, breakpoint);
2493
+ return breakpoint->enabled;
2494
+ }
2495
+
2496
+ /*
2497
+ * call-seq:
2498
+ * breakpoint.enabled = bool
2499
+ *
2500
+ * Enables or disables breakpoint.
2501
+ */
2502
+ static VALUE
2503
+ breakpoint_set_enabled(VALUE self, VALUE bool)
2504
+ {
2505
+ debug_breakpoint_t *breakpoint;
2506
+
2507
+ Data_Get_Struct(self, debug_breakpoint_t, breakpoint);
2508
+ return breakpoint->enabled = bool;
2509
+ }
2510
+
2280
2511
  /*
2281
2512
  * call-seq:
2282
2513
  * breakpoint.source -> string
@@ -2521,14 +2752,16 @@ Init_context()
2521
2752
  rb_define_method(cContext, "tracing", context_tracing, 0);
2522
2753
  rb_define_method(cContext, "tracing=", context_set_tracing, 1);
2523
2754
  rb_define_method(cContext, "ignored?", context_ignored, 0);
2524
- rb_define_method(cContext, "frame_binding", context_frame_binding, 1);
2525
- rb_define_method(cContext, "frame_id", context_frame_id, 1);
2526
- rb_define_method(cContext, "frame_method", context_frame_id, 1);
2527
- rb_define_method(cContext, "frame_line", context_frame_line, 1);
2528
- rb_define_method(cContext, "frame_file", context_frame_file, 1);
2529
- rb_define_method(cContext, "frame_locals", context_frame_locals, 1);
2530
- rb_define_method(cContext, "frame_self", context_frame_self, 1);
2531
- rb_define_method(cContext, "frame_class", context_frame_class, 1);
2755
+ rb_define_method(cContext, "frame_args", context_frame_args, -1);
2756
+ rb_define_method(cContext, "frame_args_info", context_frame_args_info, -1);
2757
+ rb_define_method(cContext, "frame_binding", context_frame_binding, -1);
2758
+ rb_define_method(cContext, "frame_class", context_frame_class, -1);
2759
+ rb_define_method(cContext, "frame_file", context_frame_file, -1);
2760
+ rb_define_method(cContext, "frame_id", context_frame_id, -1);
2761
+ rb_define_method(cContext, "frame_line", context_frame_line, -1);
2762
+ rb_define_method(cContext, "frame_locals", context_frame_locals, -1);
2763
+ rb_define_method(cContext, "frame_method", context_frame_id, -1);
2764
+ rb_define_method(cContext, "frame_self", context_frame_self, -1);
2532
2765
  rb_define_method(cContext, "stack_size", context_stack_size, 0);
2533
2766
  rb_define_method(cContext, "dead?", context_dead, 0);
2534
2767
  rb_define_method(cContext, "breakpoint", context_breakpoint, 0);
@@ -2550,6 +2783,8 @@ Init_breakpoint()
2550
2783
  rb_define_method(cBreakpoint, "id", breakpoint_id, 0);
2551
2784
  rb_define_method(cBreakpoint, "source", breakpoint_source, 0);
2552
2785
  rb_define_method(cBreakpoint, "source=", breakpoint_set_source, 1);
2786
+ rb_define_method(cBreakpoint, "enabled?", breakpoint_enabled, 0);
2787
+ rb_define_method(cBreakpoint, "enabled=", breakpoint_set_enabled, 1);
2553
2788
  rb_define_method(cBreakpoint, "pos", breakpoint_pos, 0);
2554
2789
  rb_define_method(cBreakpoint, "pos=", breakpoint_set_pos, 1);
2555
2790
  rb_define_method(cBreakpoint, "expr", breakpoint_expr, 0);
@@ -2583,7 +2818,8 @@ Init_ruby_debug()
2583
2818
  rb_define_module_function(mDebugger, "started?", debug_is_started, 0);
2584
2819
  rb_define_module_function(mDebugger, "breakpoints", debug_breakpoints, 0);
2585
2820
  rb_define_module_function(mDebugger, "add_breakpoint", debug_add_breakpoint, -1);
2586
- rb_define_module_function(mDebugger, "remove_breakpoint", debug_remove_breakpoint, 1);
2821
+ rb_define_module_function(mDebugger, "remove_breakpoint",
2822
+ debug_remove_breakpoint, 1);
2587
2823
  rb_define_module_function(mDebugger, "catchpoint", debug_catchpoint, 0);
2588
2824
  rb_define_module_function(mDebugger, "catchpoint=", debug_set_catchpoint, 1);
2589
2825
  rb_define_module_function(mDebugger, "last_context", debug_last_interrupted, 0);
@@ -2601,6 +2837,10 @@ Init_ruby_debug()
2601
2837
  rb_define_module_function(mDebugger, "post_mortem=", debug_set_post_mortem, 1);
2602
2838
  rb_define_module_function(mDebugger, "keep_frame_binding?", debug_keep_frame_binding, 0);
2603
2839
  rb_define_module_function(mDebugger, "keep_frame_binding=", debug_set_keep_frame_binding, 1);
2840
+ rb_define_module_function(mDebugger, "track_frame_args?",
2841
+ debug_track_frame_args, 0);
2842
+ rb_define_module_function(mDebugger, "track_frame_args=",
2843
+ debug_set_track_frame_args, 1);
2604
2844
  rb_define_module_function(mDebugger, "debug", debug_debug, 0);
2605
2845
  rb_define_module_function(mDebugger, "debug=", debug_set_debug, 1);
2606
2846