byebug 3.5.1 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -1
- data/.rubocop.yml +18 -1
- data/.travis.yml +21 -1
- data/CHANGELOG.md +356 -308
- data/CONTRIBUTING.md +31 -15
- data/GUIDE.md +859 -475
- data/Gemfile +8 -10
- data/LICENSE +1 -1
- data/README.md +41 -45
- data/Rakefile +30 -28
- data/byebug.gemspec +18 -18
- data/ext/byebug/breakpoint.c +88 -75
- data/ext/byebug/byebug.c +253 -252
- data/ext/byebug/byebug.h +53 -53
- data/ext/byebug/context.c +188 -159
- data/ext/byebug/extconf.rb +9 -6
- data/ext/byebug/locker.c +53 -11
- data/ext/byebug/threads.c +137 -39
- data/lib/byebug/attacher.rb +7 -2
- data/lib/byebug/breakpoint.rb +30 -0
- data/lib/byebug/command.rb +36 -32
- data/lib/byebug/commands/break.rb +49 -48
- data/lib/byebug/commands/catch.rb +64 -0
- data/lib/byebug/commands/condition.rb +13 -9
- data/lib/byebug/commands/continue.rb +8 -4
- data/lib/byebug/commands/delete.rb +10 -4
- data/lib/byebug/commands/display.rb +33 -25
- data/lib/byebug/commands/edit.rb +18 -13
- data/lib/byebug/commands/enable_disable.rb +26 -24
- data/lib/byebug/commands/eval.rb +77 -35
- data/lib/byebug/commands/finish.rb +9 -5
- data/lib/byebug/commands/frame.rb +66 -125
- data/lib/byebug/commands/help.rb +14 -21
- data/lib/byebug/commands/history.rb +5 -1
- data/lib/byebug/commands/info.rb +41 -106
- data/lib/byebug/commands/interrupt.rb +6 -2
- data/lib/byebug/commands/irb.rb +5 -2
- data/lib/byebug/commands/kill.rb +6 -2
- data/lib/byebug/commands/list.rb +21 -14
- data/lib/byebug/commands/method.rb +17 -9
- data/lib/byebug/commands/pry.rb +13 -3
- data/lib/byebug/commands/quit.rb +10 -5
- data/lib/byebug/commands/restart.rb +12 -19
- data/lib/byebug/commands/save.rb +10 -6
- data/lib/byebug/commands/set.rb +15 -14
- data/lib/byebug/commands/show.rb +8 -8
- data/lib/byebug/commands/source.rb +14 -8
- data/lib/byebug/commands/stepping.rb +15 -29
- data/lib/byebug/commands/threads.rb +73 -49
- data/lib/byebug/commands/tracevar.rb +56 -0
- data/lib/byebug/commands/undisplay.rb +8 -4
- data/lib/byebug/commands/untracevar.rb +38 -0
- data/lib/byebug/commands/var.rb +107 -0
- data/lib/byebug/context.rb +78 -42
- data/lib/byebug/core.rb +78 -40
- data/lib/byebug/helper.rb +58 -42
- data/lib/byebug/history.rb +12 -1
- data/lib/byebug/interface.rb +91 -11
- data/lib/byebug/interfaces/local_interface.rb +12 -19
- data/lib/byebug/interfaces/remote_interface.rb +12 -15
- data/lib/byebug/interfaces/script_interface.rb +14 -18
- data/lib/byebug/interfaces/test_interface.rb +54 -0
- data/lib/byebug/printers/base.rb +64 -0
- data/lib/byebug/printers/plain.rb +53 -0
- data/lib/byebug/processor.rb +20 -1
- data/lib/byebug/processors/command_processor.rb +57 -172
- data/lib/byebug/processors/control_command_processor.rb +16 -43
- data/lib/byebug/remote.rb +13 -7
- data/lib/byebug/runner.rb +102 -54
- data/lib/byebug/setting.rb +45 -68
- data/lib/byebug/settings/autoeval.rb +2 -0
- data/lib/byebug/settings/autoirb.rb +3 -0
- data/lib/byebug/settings/autolist.rb +3 -0
- data/lib/byebug/settings/autosave.rb +2 -0
- data/lib/byebug/settings/basename.rb +2 -0
- data/lib/byebug/settings/callstyle.rb +2 -0
- data/lib/byebug/settings/fullpath.rb +2 -0
- data/lib/byebug/settings/histfile.rb +2 -0
- data/lib/byebug/settings/histsize.rb +2 -0
- data/lib/byebug/settings/linetrace.rb +2 -0
- data/lib/byebug/settings/listsize.rb +2 -0
- data/lib/byebug/settings/post_mortem.rb +7 -2
- data/lib/byebug/settings/stack_on_error.rb +2 -0
- data/lib/byebug/settings/verbose.rb +2 -0
- data/lib/byebug/settings/width.rb +2 -0
- data/lib/byebug/state.rb +12 -0
- data/lib/byebug/states/control_state.rb +26 -0
- data/lib/byebug/states/regular_state.rb +178 -0
- data/lib/byebug/version.rb +1 -1
- metadata +24 -109
- data/lib/byebug/commands/catchpoint.rb +0 -53
- data/lib/byebug/commands/reload.rb +0 -29
- data/lib/byebug/commands/trace.rb +0 -50
- data/lib/byebug/commands/variables.rb +0 -206
- data/lib/byebug/options.rb +0 -46
- data/lib/byebug/settings/autoreload.rb +0 -12
- data/lib/byebug/settings/forcestep.rb +0 -14
- data/lib/byebug/settings/testing.rb +0 -12
- data/lib/byebug/settings/tracing_plus.rb +0 -11
- data/test/commands/break_test.rb +0 -364
- data/test/commands/condition_test.rb +0 -85
- data/test/commands/continue_test.rb +0 -47
- data/test/commands/delete_test.rb +0 -26
- data/test/commands/display_test.rb +0 -37
- data/test/commands/edit_test.rb +0 -52
- data/test/commands/eval_test.rb +0 -89
- data/test/commands/finish_test.rb +0 -74
- data/test/commands/frame_test.rb +0 -223
- data/test/commands/help_test.rb +0 -66
- data/test/commands/history_test.rb +0 -61
- data/test/commands/info_test.rb +0 -238
- data/test/commands/interrupt_test.rb +0 -45
- data/test/commands/irb_test.rb +0 -28
- data/test/commands/kill_test.rb +0 -50
- data/test/commands/list_test.rb +0 -174
- data/test/commands/method_test.rb +0 -52
- data/test/commands/post_mortem_test.rb +0 -71
- data/test/commands/pry_test.rb +0 -26
- data/test/commands/quit_test.rb +0 -53
- data/test/commands/reload_test.rb +0 -39
- data/test/commands/restart_test.rb +0 -46
- data/test/commands/save_test.rb +0 -67
- data/test/commands/set_test.rb +0 -140
- data/test/commands/show_test.rb +0 -76
- data/test/commands/source_test.rb +0 -46
- data/test/commands/stepping_test.rb +0 -192
- data/test/commands/thread_test.rb +0 -164
- data/test/commands/trace_test.rb +0 -71
- data/test/commands/undisplay_test.rb +0 -75
- data/test/commands/variables_test.rb +0 -105
- data/test/debugger_alias_test.rb +0 -7
- data/test/runner_test.rb +0 -150
- data/test/support/matchers.rb +0 -65
- data/test/support/test_interface.rb +0 -59
- data/test/support/utils.rb +0 -122
- data/test/test_helper.rb +0 -58
data/ext/byebug/byebug.c
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
#include <byebug.h>
|
2
2
|
|
3
|
-
static VALUE mByebug;
|
3
|
+
static VALUE mByebug; /* Ruby Byebug Module object */
|
4
4
|
|
5
|
-
static VALUE tracing
|
5
|
+
static VALUE tracing = Qfalse;
|
6
6
|
static VALUE post_mortem = Qfalse;
|
7
|
-
static VALUE verbose
|
7
|
+
static VALUE verbose = Qfalse;
|
8
8
|
|
9
9
|
static VALUE catchpoints = Qnil;
|
10
10
|
static VALUE breakpoints = Qnil;
|
@@ -12,8 +12,7 @@ static VALUE tracepoints = Qnil;
|
|
12
12
|
|
13
13
|
static VALUE raised_exception = Qnil;
|
14
14
|
|
15
|
-
|
16
|
-
VALUE locker = Qnil;
|
15
|
+
static ID idPuts;
|
17
16
|
|
18
17
|
/* Hash table with active threads and their associated contexts */
|
19
18
|
VALUE threads = Qnil;
|
@@ -25,8 +24,10 @@ VALUE threads = Qnil;
|
|
25
24
|
* Returns an array of breakpoints.
|
26
25
|
*/
|
27
26
|
static VALUE
|
28
|
-
|
27
|
+
Breakpoints(VALUE self)
|
29
28
|
{
|
29
|
+
UNUSED(self);
|
30
|
+
|
30
31
|
if (NIL_P(breakpoints))
|
31
32
|
breakpoints = rb_ary_new();
|
32
33
|
|
@@ -40,8 +41,10 @@ bb_breakpoints(VALUE self)
|
|
40
41
|
* Returns an array of catchpoints.
|
41
42
|
*/
|
42
43
|
static VALUE
|
43
|
-
|
44
|
+
Catchpoints(VALUE self)
|
44
45
|
{
|
46
|
+
UNUSED(self);
|
47
|
+
|
45
48
|
return catchpoints;
|
46
49
|
}
|
47
50
|
|
@@ -52,8 +55,10 @@ bb_catchpoints(VALUE self)
|
|
52
55
|
* Returns raised exception when in post_mortem mode.
|
53
56
|
*/
|
54
57
|
static VALUE
|
55
|
-
|
58
|
+
Raised_exception(VALUE self)
|
56
59
|
{
|
60
|
+
UNUSED(self);
|
61
|
+
|
57
62
|
return raised_exception;
|
58
63
|
}
|
59
64
|
|
@@ -68,90 +73,95 @@ check_started()
|
|
68
73
|
}
|
69
74
|
|
70
75
|
static void
|
71
|
-
trace_print(rb_trace_arg_t *trace_arg, debug_context_t *dc
|
76
|
+
trace_print(rb_trace_arg_t * trace_arg, debug_context_t * dc,
|
77
|
+
const char *file_filter, const char *debug_msg)
|
72
78
|
{
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
int line = NUM2INT(rb_tracearg_lineno(trace_arg));
|
78
|
-
VALUE v_mid_sym = rb_tracearg_method_id(trace_arg);
|
79
|
-
VALUE v_mid_id = NIL_P(v_mid_sym) ? Qnil : SYM2ID(v_mid_sym);
|
80
|
-
const char *mid = NIL_P(v_mid_id) ? "" : rb_id2name(v_mid_id);
|
81
|
-
printf("%*s (%d)->[#%d] %s@%s:%d %s\n", dc->calced_stack_size, "",
|
82
|
-
dc->calced_stack_size, dc->thnum, event, path, line, mid);
|
83
|
-
}
|
84
|
-
}
|
79
|
+
char *fullpath = NULL;
|
80
|
+
const char *basename;
|
81
|
+
int filtered = 0;
|
82
|
+
const char *event = rb_id2name(SYM2ID(rb_tracearg_event(trace_arg)));
|
85
83
|
|
86
|
-
|
87
|
-
|
88
|
-
{
|
89
|
-
VALUE thread;
|
84
|
+
VALUE rb_path = rb_tracearg_path(trace_arg);
|
85
|
+
const char *path = NIL_P(rb_path) ? "" : RSTRING_PTR(rb_path);
|
90
86
|
|
91
|
-
|
87
|
+
int line = NUM2INT(rb_tracearg_lineno(trace_arg));
|
92
88
|
|
93
|
-
|
94
|
-
|
89
|
+
VALUE rb_mid = rb_tracearg_method_id(trace_arg);
|
90
|
+
const char *mid = NIL_P(rb_mid) ? "(top level)" : rb_id2name(SYM2ID(rb_mid));
|
95
91
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
/* let the next thread to run */
|
100
|
-
thread = remove_from_locked();
|
101
|
-
if (thread != Qnil)
|
102
|
-
rb_thread_run(thread);
|
103
|
-
}
|
92
|
+
VALUE rb_cl = rb_tracearg_defined_class(trace_arg);
|
93
|
+
VALUE rb_cl_name = NIL_P(rb_cl) ? rb_cl : rb_mod_name(rb_cl);
|
94
|
+
const char *defined_class = NIL_P(rb_cl_name) ? "" : RSTRING_PTR(rb_cl_name);
|
104
95
|
|
105
|
-
|
106
|
-
|
107
|
-
debug_context_t *dc; \
|
108
|
-
VALUE context; \
|
109
|
-
thread_context_lookup(rb_thread_current(), &context); \
|
110
|
-
Data_Get_Struct(context, debug_context_t, dc); \
|
111
|
-
|
112
|
-
#define EVENT_COMMON \
|
113
|
-
if (verbose == Qtrue) trace_print(trace_arg, dc); \
|
114
|
-
if (!trace_common(trace_arg, dc)) { return; } \
|
96
|
+
if (!trace_arg)
|
97
|
+
return;
|
115
98
|
|
116
|
-
|
117
|
-
trace_common(rb_trace_arg_t *trace_arg, debug_context_t *dc)
|
118
|
-
{
|
119
|
-
/* return if thread marked as 'ignored', like byebug's control thread */
|
120
|
-
if (CTX_FL_TEST(dc, CTX_FL_IGNORE))
|
99
|
+
if (file_filter)
|
121
100
|
{
|
122
|
-
|
123
|
-
|
124
|
-
|
101
|
+
#ifndef _WIN32
|
102
|
+
fullpath = realpath(path, NULL);
|
103
|
+
#endif
|
104
|
+
basename = fullpath ? strrchr(fullpath, '/') : path;
|
125
105
|
|
126
|
-
|
106
|
+
if (!basename || strncmp(basename + 1, file_filter, strlen(file_filter)))
|
107
|
+
filtered = 1;
|
127
108
|
|
128
|
-
|
129
|
-
|
109
|
+
#ifndef _WIN32
|
110
|
+
free(fullpath);
|
111
|
+
#endif
|
112
|
+
}
|
130
113
|
|
131
|
-
|
132
|
-
if (dc->last_line != rb_tracearg_lineno(trace_arg) ||
|
133
|
-
dc->last_file != rb_tracearg_path(trace_arg))
|
114
|
+
if (!filtered)
|
134
115
|
{
|
135
|
-
|
116
|
+
if (debug_msg)
|
117
|
+
rb_funcall(mByebug, idPuts, 1,
|
118
|
+
rb_sprintf("[#%d] %s\n", dc->thnum, debug_msg));
|
119
|
+
else
|
120
|
+
rb_funcall(mByebug, idPuts, 1,
|
121
|
+
rb_sprintf("%*s [#%d] %s@%s:%d %s#%s\n", dc->calced_stack_size,
|
122
|
+
"", dc->thnum, event, path, line, defined_class,
|
123
|
+
mid));
|
136
124
|
}
|
137
|
-
|
138
|
-
return 1;
|
139
125
|
}
|
140
126
|
|
141
127
|
static void
|
142
|
-
|
128
|
+
cleanup(debug_context_t * dc)
|
143
129
|
{
|
144
|
-
dc->
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
130
|
+
dc->stop_reason = CTX_STOP_NONE;
|
131
|
+
|
132
|
+
release_lock();
|
133
|
+
}
|
134
|
+
|
135
|
+
#define EVENT_TEARDOWN cleanup(dc);
|
136
|
+
|
137
|
+
#define EVENT_SETUP \
|
138
|
+
debug_context_t *dc; \
|
139
|
+
VALUE context; \
|
140
|
+
rb_trace_arg_t *trace_arg; \
|
141
|
+
\
|
142
|
+
UNUSED(data); \
|
143
|
+
\
|
144
|
+
if (!is_living_thread(rb_thread_current())) \
|
145
|
+
return; \
|
146
|
+
\
|
147
|
+
thread_context_lookup(rb_thread_current(), &context); \
|
148
|
+
Data_Get_Struct(context, debug_context_t, dc); \
|
149
|
+
\
|
150
|
+
if (CTX_FL_TEST(dc, CTX_FL_IGNORE)) \
|
151
|
+
return; \
|
152
|
+
\
|
153
|
+
acquire_lock(dc); \
|
154
|
+
\
|
155
|
+
trace_arg = rb_tracearg_from_tracepoint(trace_point); \
|
156
|
+
if (verbose == Qtrue) \
|
157
|
+
trace_print(trace_arg, dc, 0, 0); \
|
158
|
+
|
149
159
|
|
150
160
|
/* Functions that return control to byebug after the different events */
|
151
161
|
|
152
162
|
static VALUE
|
153
|
-
call_at(VALUE context_obj, debug_context_t *dc, ID mid, int argc, VALUE a0,
|
154
|
-
|
163
|
+
call_at(VALUE context_obj, debug_context_t * dc, ID mid, int argc, VALUE a0,
|
164
|
+
VALUE a1)
|
155
165
|
{
|
156
166
|
struct call_with_inspection_data cwi;
|
157
167
|
VALUE argv[2];
|
@@ -159,52 +169,51 @@ call_at(VALUE context_obj, debug_context_t *dc, ID mid, int argc, VALUE a0,
|
|
159
169
|
argv[0] = a0;
|
160
170
|
argv[1] = a1;
|
161
171
|
|
162
|
-
cwi.dc
|
172
|
+
cwi.dc = dc;
|
163
173
|
cwi.context_obj = context_obj;
|
164
|
-
cwi.id
|
165
|
-
cwi.argc
|
166
|
-
cwi.argv
|
174
|
+
cwi.id = mid;
|
175
|
+
cwi.argc = argc;
|
176
|
+
cwi.argv = &argv[0];
|
167
177
|
|
168
178
|
return call_with_debug_inspector(&cwi);
|
169
179
|
}
|
170
180
|
|
171
181
|
static VALUE
|
172
|
-
call_at_line(VALUE context_obj, debug_context_t *dc, VALUE file, VALUE line)
|
182
|
+
call_at_line(VALUE context_obj, debug_context_t * dc, VALUE file, VALUE line)
|
173
183
|
{
|
174
|
-
save_current_position(dc, file, line);
|
175
184
|
return call_at(context_obj, dc, rb_intern("at_line"), 2, file, line);
|
176
185
|
}
|
177
186
|
|
178
187
|
static VALUE
|
179
|
-
call_at_tracing(VALUE context_obj, debug_context_t *dc, VALUE file, VALUE line)
|
188
|
+
call_at_tracing(VALUE context_obj, debug_context_t * dc, VALUE file, VALUE line)
|
180
189
|
{
|
181
190
|
return call_at(context_obj, dc, rb_intern("at_tracing"), 2, file, line);
|
182
191
|
}
|
183
192
|
|
184
193
|
static VALUE
|
185
|
-
call_at_breakpoint(VALUE context_obj, debug_context_t *dc, VALUE breakpoint)
|
194
|
+
call_at_breakpoint(VALUE context_obj, debug_context_t * dc, VALUE breakpoint)
|
186
195
|
{
|
187
196
|
dc->stop_reason = CTX_STOP_BREAKPOINT;
|
188
197
|
return call_at(context_obj, dc, rb_intern("at_breakpoint"), 1, breakpoint, 0);
|
189
198
|
}
|
190
199
|
|
191
200
|
static VALUE
|
192
|
-
call_at_catchpoint(VALUE context_obj, debug_context_t *dc, VALUE exp)
|
201
|
+
call_at_catchpoint(VALUE context_obj, debug_context_t * dc, VALUE exp)
|
193
202
|
{
|
194
203
|
dc->stop_reason = CTX_STOP_CATCHPOINT;
|
195
204
|
return call_at(context_obj, dc, rb_intern("at_catchpoint"), 1, exp, 0);
|
196
205
|
}
|
197
206
|
|
198
207
|
static VALUE
|
199
|
-
call_at_return(VALUE context_obj, debug_context_t *dc, VALUE file, VALUE line)
|
208
|
+
call_at_return(VALUE context_obj, debug_context_t * dc, VALUE file, VALUE line)
|
200
209
|
{
|
201
|
-
|
210
|
+
dc->stop_reason = CTX_STOP_BREAKPOINT;
|
202
211
|
return call_at(context_obj, dc, rb_intern("at_return"), 2, file, line);
|
203
212
|
}
|
204
213
|
|
205
214
|
static void
|
206
|
-
call_at_line_check(VALUE context_obj, debug_context_t *dc,
|
207
|
-
VALUE
|
215
|
+
call_at_line_check(VALUE context_obj, debug_context_t * dc, VALUE breakpoint,
|
216
|
+
VALUE file, VALUE line)
|
208
217
|
{
|
209
218
|
dc->stop_reason = CTX_STOP_STEP;
|
210
219
|
|
@@ -221,102 +230,95 @@ call_at_line_check(VALUE context_obj, debug_context_t *dc,
|
|
221
230
|
static void
|
222
231
|
line_event(VALUE trace_point, void *data)
|
223
232
|
{
|
224
|
-
VALUE
|
225
|
-
int moved = 0;
|
233
|
+
VALUE brkpnt, file, line, binding;
|
226
234
|
|
227
|
-
EVENT_SETUP
|
235
|
+
EVENT_SETUP;
|
228
236
|
|
229
|
-
|
230
|
-
|
231
|
-
line = rb_tracearg_lineno(trace_arg);
|
237
|
+
file = rb_tracearg_path(trace_arg);
|
238
|
+
line = rb_tracearg_lineno(trace_arg);
|
232
239
|
binding = rb_tracearg_binding(trace_arg);
|
233
|
-
self = rb_tracearg_self(trace_arg);
|
234
|
-
|
235
|
-
EVENT_COMMON
|
236
|
-
|
237
|
-
if (dc->calced_stack_size == 0) dc->calced_stack_size++;
|
238
|
-
|
239
|
-
if (dc->last_line != rb_tracearg_lineno(trace_arg) ||
|
240
|
-
dc->last_file != rb_tracearg_path(trace_arg))
|
241
|
-
{
|
242
|
-
moved = 1;
|
243
|
-
}
|
244
240
|
|
245
241
|
if (RTEST(tracing))
|
246
242
|
call_at_tracing(context, dc, file, line);
|
247
243
|
|
248
|
-
if (
|
249
|
-
{
|
244
|
+
if (!CTX_FL_TEST(dc, CTX_FL_IGNORE_STEPS))
|
250
245
|
dc->steps = dc->steps <= 0 ? -1 : dc->steps - 1;
|
251
|
-
if (dc->calced_stack_size <= dc->dest_frame)
|
252
|
-
{
|
253
|
-
dc->lines = dc->lines <= 0 ? -1 : dc->lines - 1;
|
254
|
-
if (dc->calced_stack_size < dc->dest_frame)
|
255
|
-
{
|
256
|
-
dc->dest_frame = dc->calced_stack_size;
|
257
|
-
rb_funcall(mByebug, rb_intern("puts"), 1,
|
258
|
-
rb_str_new2("Next went up a frame because previous frame finished\n"));
|
259
|
-
}
|
260
|
-
}
|
261
|
-
}
|
262
246
|
|
263
|
-
if (dc->
|
264
|
-
(CTX_FL_TEST(dc, CTX_FL_ENABLE_BKPT) &&
|
265
|
-
(!NIL_P(
|
266
|
-
breakpoint = find_breakpoint_by_pos(bb_breakpoints(self), file, line, binding)))))
|
247
|
+
if (dc->calced_stack_size <= dc->dest_frame)
|
267
248
|
{
|
268
|
-
|
249
|
+
dc->dest_frame = dc->calced_stack_size;
|
250
|
+
CTX_FL_UNSET(dc, CTX_FL_IGNORE_STEPS);
|
251
|
+
|
252
|
+
dc->lines = dc->lines <= 0 ? -1 : dc->lines - 1;
|
269
253
|
}
|
270
254
|
|
271
|
-
|
255
|
+
if (dc->steps == 0 || dc->lines == 0)
|
256
|
+
call_at_line_check(context, dc, Qnil, file, line);
|
257
|
+
|
258
|
+
brkpnt = Qnil;
|
259
|
+
|
260
|
+
if (!NIL_P(breakpoints))
|
261
|
+
brkpnt = find_breakpoint_by_pos(breakpoints, file, line, binding);
|
262
|
+
|
263
|
+
if (!NIL_P(brkpnt))
|
264
|
+
call_at_line_check(context, dc, brkpnt, file, line);
|
265
|
+
|
266
|
+
EVENT_TEARDOWN;
|
272
267
|
}
|
273
268
|
|
274
269
|
static void
|
275
270
|
call_event(VALUE trace_point, void *data)
|
276
271
|
{
|
277
|
-
VALUE
|
272
|
+
VALUE brkpnt, klass, msym, mid, binding, self, file, line;
|
278
273
|
|
279
|
-
EVENT_SETUP
|
274
|
+
EVENT_SETUP;
|
275
|
+
|
276
|
+
if (dc->calced_stack_size <= dc->dest_frame)
|
277
|
+
CTX_FL_UNSET(dc, CTX_FL_IGNORE_STEPS);
|
280
278
|
|
281
279
|
dc->calced_stack_size++;
|
282
280
|
|
283
|
-
|
284
|
-
dc->steps_out = dc->steps_out <= 0 ? -1 : dc->steps_out + 1;
|
281
|
+
dc->steps_out = dc->steps_out <= 0 ? -1 : dc->steps_out + 1;
|
285
282
|
|
286
|
-
|
283
|
+
/* nil method_id means we are at top level so there can't be a method
|
284
|
+
* breakpoint here. Just leave then. */
|
285
|
+
msym = rb_tracearg_method_id(trace_arg);
|
286
|
+
if (NIL_P(msym))
|
287
|
+
{
|
288
|
+
EVENT_TEARDOWN;
|
289
|
+
return;
|
290
|
+
}
|
287
291
|
|
288
|
-
|
289
|
-
klass
|
290
|
-
msym = rb_tracearg_method_id(trace_arg);
|
291
|
-
mid = NIL_P(msym) ? Qnil : SYM2ID(msym);
|
292
|
+
mid = SYM2ID(msym);
|
293
|
+
klass = rb_tracearg_defined_class(trace_arg);
|
292
294
|
binding = rb_tracearg_binding(trace_arg);
|
293
|
-
self
|
294
|
-
file
|
295
|
-
line
|
295
|
+
self = rb_tracearg_self(trace_arg);
|
296
|
+
file = rb_tracearg_path(trace_arg);
|
297
|
+
line = rb_tracearg_lineno(trace_arg);
|
296
298
|
|
297
|
-
|
298
|
-
|
299
|
+
brkpnt = Qnil;
|
300
|
+
|
301
|
+
if (!NIL_P(breakpoints))
|
302
|
+
brkpnt = find_breakpoint_by_method(breakpoints, klass, mid, binding, self);
|
303
|
+
|
304
|
+
if (!NIL_P(brkpnt))
|
299
305
|
{
|
300
|
-
call_at_breakpoint(context, dc,
|
306
|
+
call_at_breakpoint(context, dc, brkpnt);
|
301
307
|
call_at_line(context, dc, file, line);
|
302
308
|
}
|
303
309
|
|
304
|
-
|
310
|
+
EVENT_TEARDOWN;
|
305
311
|
}
|
306
312
|
|
307
313
|
static void
|
308
314
|
return_event(VALUE trace_point, void *data)
|
309
315
|
{
|
310
|
-
EVENT_SETUP
|
311
|
-
|
312
|
-
if (dc->calced_stack_size > 0) dc->calced_stack_size--;
|
316
|
+
EVENT_SETUP;
|
313
317
|
|
314
|
-
|
318
|
+
dc->calced_stack_size--;
|
315
319
|
|
316
320
|
if (dc->steps_out == 1)
|
317
|
-
{
|
318
321
|
dc->steps = 1;
|
319
|
-
}
|
320
322
|
else if ((dc->steps_out == 0) && (CTX_FL_TEST(dc, CTX_FL_STOP_ON_RET)))
|
321
323
|
{
|
322
324
|
VALUE file, line;
|
@@ -329,41 +331,27 @@ return_event(VALUE trace_point, void *data)
|
|
329
331
|
|
330
332
|
dc->steps_out = dc->steps_out <= 0 ? -1 : dc->steps_out - 1;
|
331
333
|
|
332
|
-
|
334
|
+
EVENT_TEARDOWN;
|
333
335
|
}
|
334
336
|
|
335
337
|
static void
|
336
|
-
|
338
|
+
raw_call_event(VALUE trace_point, void *data)
|
337
339
|
{
|
338
|
-
EVENT_SETUP
|
340
|
+
EVENT_SETUP;
|
339
341
|
|
340
342
|
dc->calced_stack_size++;
|
341
343
|
|
342
|
-
|
343
|
-
|
344
|
-
cleanup(dc);
|
344
|
+
EVENT_TEARDOWN;
|
345
345
|
}
|
346
346
|
|
347
347
|
static void
|
348
|
-
|
348
|
+
raw_return_event(VALUE trace_point, void *data)
|
349
349
|
{
|
350
|
-
EVENT_SETUP
|
350
|
+
EVENT_SETUP;
|
351
351
|
|
352
|
-
|
352
|
+
dc->calced_stack_size--;
|
353
353
|
|
354
|
-
|
355
|
-
|
356
|
-
cleanup(dc);
|
357
|
-
}
|
358
|
-
|
359
|
-
static void
|
360
|
-
thread_event(VALUE trace_point, void *data)
|
361
|
-
{
|
362
|
-
EVENT_SETUP
|
363
|
-
|
364
|
-
EVENT_COMMON
|
365
|
-
|
366
|
-
cleanup(dc);
|
354
|
+
EVENT_TEARDOWN;
|
367
355
|
}
|
368
356
|
|
369
357
|
static void
|
@@ -374,32 +362,30 @@ raise_event(VALUE trace_point, void *data)
|
|
374
362
|
int i;
|
375
363
|
debug_context_t *new_dc;
|
376
364
|
|
377
|
-
EVENT_SETUP
|
378
|
-
|
379
|
-
EVENT_COMMON
|
365
|
+
EVENT_SETUP;
|
380
366
|
|
381
|
-
path
|
382
|
-
lineno
|
383
|
-
binding
|
367
|
+
path = rb_tracearg_path(trace_arg);
|
368
|
+
lineno = rb_tracearg_lineno(trace_arg);
|
369
|
+
binding = rb_tracearg_binding(trace_arg);
|
384
370
|
raised_exception = rb_tracearg_raised_exception(trace_arg);
|
385
371
|
|
386
372
|
if (post_mortem == Qtrue)
|
387
373
|
{
|
388
374
|
post_mortem_context = context_dup(dc);
|
389
|
-
rb_ivar_set(raised_exception, rb_intern("@__bb_file")
|
390
|
-
rb_ivar_set(raised_exception, rb_intern("@__bb_line")
|
375
|
+
rb_ivar_set(raised_exception, rb_intern("@__bb_file"), path);
|
376
|
+
rb_ivar_set(raised_exception, rb_intern("@__bb_line"), lineno);
|
391
377
|
rb_ivar_set(raised_exception, rb_intern("@__bb_binding"), binding);
|
392
|
-
rb_ivar_set(raised_exception, rb_intern("@__bb_context"),
|
378
|
+
rb_ivar_set(raised_exception, rb_intern("@__bb_context"),
|
379
|
+
post_mortem_context);
|
393
380
|
|
394
381
|
Data_Get_Struct(post_mortem_context, debug_context_t, new_dc);
|
395
382
|
rb_debug_inspector_open(context_backtrace_set, (void *)new_dc);
|
396
383
|
}
|
397
384
|
|
398
|
-
if (catchpoints == Qnil ||
|
399
|
-
|
400
|
-
RHASH_TBL(catchpoints)->num_entries == 0)
|
385
|
+
if (catchpoints == Qnil || dc->calced_stack_size == 0
|
386
|
+
|| RHASH_TBL(catchpoints)->num_entries == 0)
|
401
387
|
{
|
402
|
-
|
388
|
+
EVENT_TEARDOWN;
|
403
389
|
return;
|
404
390
|
}
|
405
391
|
|
@@ -410,8 +396,8 @@ raise_event(VALUE trace_point, void *data)
|
|
410
396
|
VALUE ancestor_class, module_name, hit_count;
|
411
397
|
|
412
398
|
ancestor_class = rb_ary_entry(ancestors, i);
|
413
|
-
module_name
|
414
|
-
hit_count
|
399
|
+
module_name = rb_mod_name(ancestor_class);
|
400
|
+
hit_count = rb_hash_aref(catchpoints, module_name);
|
415
401
|
|
416
402
|
/* increment exception */
|
417
403
|
if (hit_count != Qnil)
|
@@ -423,7 +409,7 @@ raise_event(VALUE trace_point, void *data)
|
|
423
409
|
}
|
424
410
|
}
|
425
411
|
|
426
|
-
|
412
|
+
EVENT_TEARDOWN;
|
427
413
|
}
|
428
414
|
|
429
415
|
|
@@ -435,23 +421,23 @@ register_tracepoints(VALUE self)
|
|
435
421
|
int i;
|
436
422
|
VALUE traces = tracepoints;
|
437
423
|
|
424
|
+
UNUSED(self);
|
425
|
+
|
438
426
|
if (NIL_P(traces))
|
439
427
|
{
|
440
|
-
int line_msk
|
441
|
-
int call_msk
|
442
|
-
int
|
443
|
-
int
|
444
|
-
int
|
445
|
-
int raise_msk
|
446
|
-
|
447
|
-
|
448
|
-
VALUE
|
449
|
-
VALUE
|
450
|
-
VALUE
|
451
|
-
VALUE
|
452
|
-
VALUE
|
453
|
-
VALUE tpRaise = rb_tracepoint_new(Qnil, raise_msk , raise_event , 0);
|
454
|
-
VALUE tpThread = rb_tracepoint_new(Qnil, thread_msk, thread_event , 0);
|
428
|
+
int line_msk = RUBY_EVENT_LINE;
|
429
|
+
int call_msk = RUBY_EVENT_CALL;
|
430
|
+
int ret_msk = RUBY_EVENT_RETURN | RUBY_EVENT_B_RETURN | RUBY_EVENT_END;
|
431
|
+
int raw_call_msk = RUBY_EVENT_C_CALL | RUBY_EVENT_B_CALL | RUBY_EVENT_CLASS;
|
432
|
+
int raw_ret_msk = RUBY_EVENT_C_RETURN;
|
433
|
+
int raise_msk = RUBY_EVENT_RAISE;
|
434
|
+
|
435
|
+
VALUE tpLine = rb_tracepoint_new(Qnil, line_msk, line_event, 0);
|
436
|
+
VALUE tpCall = rb_tracepoint_new(Qnil, call_msk, call_event, 0);
|
437
|
+
VALUE tpReturn = rb_tracepoint_new(Qnil, ret_msk, return_event, 0);
|
438
|
+
VALUE tpCCall = rb_tracepoint_new(Qnil, raw_call_msk, raw_call_event, 0);
|
439
|
+
VALUE tpCReturn = rb_tracepoint_new(Qnil, raw_ret_msk, raw_return_event, 0);
|
440
|
+
VALUE tpRaise = rb_tracepoint_new(Qnil, raise_msk, raise_event, 0);
|
455
441
|
|
456
442
|
traces = rb_ary_new();
|
457
443
|
rb_ary_push(traces, tpLine);
|
@@ -460,7 +446,6 @@ register_tracepoints(VALUE self)
|
|
460
446
|
rb_ary_push(traces, tpCCall);
|
461
447
|
rb_ary_push(traces, tpCReturn);
|
462
448
|
rb_ary_push(traces, tpRaise);
|
463
|
-
rb_ary_push(traces, tpThread);
|
464
449
|
|
465
450
|
tracepoints = traces;
|
466
451
|
}
|
@@ -474,7 +459,9 @@ clear_tracepoints(VALUE self)
|
|
474
459
|
{
|
475
460
|
int i;
|
476
461
|
|
477
|
-
|
462
|
+
UNUSED(self);
|
463
|
+
|
464
|
+
for (i = RARRAY_LENINT(tracepoints) - 1; i >= 0; i--)
|
478
465
|
rb_tracepoint_disable(rb_ary_entry(tracepoints, i));
|
479
466
|
}
|
480
467
|
|
@@ -488,7 +475,7 @@ clear_tracepoints(VALUE self)
|
|
488
475
|
* Returns an array of all contexts.
|
489
476
|
*/
|
490
477
|
static VALUE
|
491
|
-
|
478
|
+
Contexts(VALUE self)
|
492
479
|
{
|
493
480
|
volatile VALUE list;
|
494
481
|
volatile VALUE new_list;
|
@@ -497,6 +484,8 @@ bb_contexts(VALUE self)
|
|
497
484
|
debug_context_t *dc;
|
498
485
|
int i;
|
499
486
|
|
487
|
+
UNUSED(self);
|
488
|
+
|
500
489
|
check_started();
|
501
490
|
|
502
491
|
new_list = rb_ary_new();
|
@@ -505,6 +494,7 @@ bb_contexts(VALUE self)
|
|
505
494
|
for (i = 0; i < RARRAY_LENINT(list); i++)
|
506
495
|
{
|
507
496
|
VALUE thread = rb_ary_entry(list, i);
|
497
|
+
|
508
498
|
thread_context_lookup(thread, &context);
|
509
499
|
rb_ary_push(new_list, context);
|
510
500
|
}
|
@@ -529,10 +519,12 @@ bb_contexts(VALUE self)
|
|
529
519
|
* Returns context of the thread passed as an argument.
|
530
520
|
*/
|
531
521
|
static VALUE
|
532
|
-
|
522
|
+
Thread_context(VALUE self, VALUE thread)
|
533
523
|
{
|
534
524
|
VALUE context;
|
535
525
|
|
526
|
+
UNUSED(self);
|
527
|
+
|
536
528
|
check_started();
|
537
529
|
|
538
530
|
thread_context_lookup(thread, &context);
|
@@ -548,10 +540,12 @@ bb_thread_context(VALUE self, VALUE thread)
|
|
548
540
|
* <i>Note:</i> Byebug.current_context.thread == Thread.current
|
549
541
|
*/
|
550
542
|
static VALUE
|
551
|
-
|
543
|
+
Current_context(VALUE self)
|
552
544
|
{
|
553
545
|
VALUE context;
|
554
546
|
|
547
|
+
UNUSED(self);
|
548
|
+
|
555
549
|
check_started();
|
556
550
|
|
557
551
|
thread_context_lookup(rb_thread_current(), &context);
|
@@ -566,8 +560,10 @@ bb_current_context(VALUE self)
|
|
566
560
|
* Returns +true+ byebug is started.
|
567
561
|
*/
|
568
562
|
static VALUE
|
569
|
-
|
563
|
+
Started(VALUE self)
|
570
564
|
{
|
565
|
+
UNUSED(self);
|
566
|
+
|
571
567
|
return IS_STARTED;
|
572
568
|
}
|
573
569
|
|
@@ -579,55 +575,49 @@ bb_started(VALUE self)
|
|
579
575
|
* disabled, otherwise it returns +false+.
|
580
576
|
*/
|
581
577
|
static VALUE
|
582
|
-
|
578
|
+
Stop(VALUE self)
|
583
579
|
{
|
580
|
+
UNUSED(self);
|
581
|
+
|
584
582
|
if (IS_STARTED)
|
585
583
|
{
|
586
584
|
clear_tracepoints(self);
|
587
585
|
|
588
586
|
breakpoints = Qnil;
|
589
587
|
catchpoints = Qnil;
|
590
|
-
threads
|
588
|
+
threads = Qnil;
|
591
589
|
|
592
590
|
return Qfalse;
|
593
591
|
}
|
592
|
+
|
594
593
|
return Qtrue;
|
595
594
|
}
|
596
595
|
|
597
596
|
/*
|
598
597
|
* call-seq:
|
599
598
|
* Byebug.start -> bool
|
600
|
-
* Byebug.start { ... } -> bool
|
601
|
-
*
|
602
|
-
* If a block is given, it starts byebug and yields block. After the block is
|
603
|
-
* executed it stops byebug with Byebug.stop method. Inside the block you
|
604
|
-
* will probably want to have a call to Byebug.byebug. For example:
|
605
|
-
*
|
606
|
-
* Byebug.start { byebug; foo } # Stop inside of foo
|
607
599
|
*
|
608
600
|
* The return value is the value of !Byebug.started? <i>before</i> issuing the
|
609
601
|
* +start+; That is, +true+ is returned, unless byebug was previously started.
|
610
602
|
*/
|
611
603
|
static VALUE
|
612
|
-
|
604
|
+
Start(VALUE self)
|
613
605
|
{
|
614
606
|
VALUE result;
|
615
607
|
|
608
|
+
UNUSED(self);
|
609
|
+
|
616
610
|
if (IS_STARTED)
|
617
611
|
result = Qfalse;
|
618
612
|
else
|
619
613
|
{
|
620
|
-
locker = Qnil;
|
621
614
|
catchpoints = rb_hash_new();
|
622
|
-
threads
|
615
|
+
threads = create_threads_table();
|
623
616
|
|
624
617
|
register_tracepoints(self);
|
625
618
|
result = Qtrue;
|
626
619
|
}
|
627
620
|
|
628
|
-
if (rb_block_given_p())
|
629
|
-
rb_ensure(rb_yield, self, bb_stop, self);
|
630
|
-
|
631
621
|
return result;
|
632
622
|
}
|
633
623
|
|
@@ -639,29 +629,28 @@ bb_start(VALUE self)
|
|
639
629
|
* +stop+ parameter forces byebug to stop at the first line of code in +file+
|
640
630
|
*/
|
641
631
|
static VALUE
|
642
|
-
|
632
|
+
Debug_load(int argc, VALUE * argv, VALUE self)
|
643
633
|
{
|
644
634
|
VALUE file, stop, context;
|
645
635
|
debug_context_t *dc;
|
646
636
|
VALUE status = Qnil;
|
647
637
|
int state = 0;
|
648
638
|
|
639
|
+
UNUSED(self);
|
640
|
+
|
649
641
|
if (rb_scan_args(argc, argv, "11", &file, &stop) == 1)
|
650
|
-
{
|
651
642
|
stop = Qfalse;
|
652
|
-
}
|
653
643
|
|
654
|
-
|
644
|
+
Start(self);
|
655
645
|
|
656
|
-
context =
|
646
|
+
context = Current_context(self);
|
657
647
|
Data_Get_Struct(context, debug_context_t, dc);
|
658
648
|
|
659
649
|
dc->calced_stack_size = 1;
|
660
650
|
|
661
|
-
if (RTEST(stop))
|
651
|
+
if (RTEST(stop))
|
652
|
+
dc->steps = 1;
|
662
653
|
|
663
|
-
/* Initializing $0 to the script's path */
|
664
|
-
ruby_script(RSTRING_PTR(file));
|
665
654
|
rb_load_protect(file, 0, &state);
|
666
655
|
if (0 != state)
|
667
656
|
{
|
@@ -669,10 +658,6 @@ bb_load(int argc, VALUE *argv, VALUE self)
|
|
669
658
|
reset_stepping_stop_points(dc);
|
670
659
|
}
|
671
660
|
|
672
|
-
/* We should run all at_exit handler's in order to provide, for instance, a
|
673
|
-
* chance to run all defined test cases */
|
674
|
-
rb_exec_end_proc();
|
675
|
-
|
676
661
|
return status;
|
677
662
|
}
|
678
663
|
|
@@ -683,8 +668,10 @@ bb_load(int argc, VALUE *argv, VALUE self)
|
|
683
668
|
* Returns +true+ if verbose output of TracePoint API events is enabled.
|
684
669
|
*/
|
685
670
|
static VALUE
|
686
|
-
|
671
|
+
Verbose(VALUE self)
|
687
672
|
{
|
673
|
+
UNUSED(self);
|
674
|
+
|
688
675
|
return verbose;
|
689
676
|
}
|
690
677
|
|
@@ -696,8 +683,10 @@ bb_verbose(VALUE self)
|
|
696
683
|
* byebug.
|
697
684
|
*/
|
698
685
|
static VALUE
|
699
|
-
|
686
|
+
Set_verbose(VALUE self, VALUE value)
|
700
687
|
{
|
688
|
+
UNUSED(self);
|
689
|
+
|
701
690
|
verbose = RTEST(value) ? Qtrue : Qfalse;
|
702
691
|
return value;
|
703
692
|
}
|
@@ -709,8 +698,10 @@ bb_set_verbose(VALUE self, VALUE value)
|
|
709
698
|
* Returns +true+ if global tracing is enabled.
|
710
699
|
*/
|
711
700
|
static VALUE
|
712
|
-
|
701
|
+
Tracing(VALUE self)
|
713
702
|
{
|
703
|
+
UNUSED(self);
|
704
|
+
|
714
705
|
return tracing;
|
715
706
|
}
|
716
707
|
|
@@ -721,8 +712,10 @@ bb_tracing(VALUE self)
|
|
721
712
|
* Sets the global tracing flag.
|
722
713
|
*/
|
723
714
|
static VALUE
|
724
|
-
|
715
|
+
Set_tracing(VALUE self, VALUE value)
|
725
716
|
{
|
717
|
+
UNUSED(self);
|
718
|
+
|
726
719
|
tracing = RTEST(value) ? Qtrue : Qfalse;
|
727
720
|
return value;
|
728
721
|
}
|
@@ -734,8 +727,10 @@ bb_set_tracing(VALUE self, VALUE value)
|
|
734
727
|
* Returns +true+ if post-mortem debugging is enabled.
|
735
728
|
*/
|
736
729
|
static VALUE
|
737
|
-
|
730
|
+
Post_mortem(VALUE self)
|
738
731
|
{
|
732
|
+
UNUSED(self);
|
733
|
+
|
739
734
|
return post_mortem;
|
740
735
|
}
|
741
736
|
|
@@ -746,8 +741,10 @@ bb_post_mortem(VALUE self)
|
|
746
741
|
* Sets post-moterm flag.
|
747
742
|
*/
|
748
743
|
static VALUE
|
749
|
-
|
744
|
+
Set_post_mortem(VALUE self, VALUE value)
|
750
745
|
{
|
746
|
+
UNUSED(self);
|
747
|
+
|
751
748
|
post_mortem = RTEST(value) ? Qtrue : Qfalse;
|
752
749
|
return value;
|
753
750
|
}
|
@@ -759,8 +756,10 @@ bb_set_post_mortem(VALUE self, VALUE value)
|
|
759
756
|
* Adds a new exception to the catchpoints array.
|
760
757
|
*/
|
761
758
|
static VALUE
|
762
|
-
|
759
|
+
Add_catchpoint(VALUE self, VALUE value)
|
763
760
|
{
|
761
|
+
UNUSED(self);
|
762
|
+
|
764
763
|
if (TYPE(value) != T_STRING)
|
765
764
|
rb_raise(rb_eTypeError, "value of a catchpoint must be String");
|
766
765
|
|
@@ -781,23 +780,23 @@ Init_byebug()
|
|
781
780
|
{
|
782
781
|
mByebug = rb_define_module("Byebug");
|
783
782
|
|
784
|
-
rb_define_module_function(mByebug, "add_catchpoint"
|
785
|
-
rb_define_module_function(mByebug, "breakpoints"
|
786
|
-
rb_define_module_function(mByebug, "catchpoints"
|
787
|
-
rb_define_module_function(mByebug, "contexts"
|
788
|
-
rb_define_module_function(mByebug, "current_context" ,
|
789
|
-
rb_define_module_function(mByebug, "debug_load"
|
790
|
-
rb_define_module_function(mByebug, "post_mortem?"
|
791
|
-
rb_define_module_function(mByebug, "post_mortem="
|
792
|
-
rb_define_module_function(mByebug, "raised_exception",
|
793
|
-
rb_define_module_function(mByebug, "start"
|
794
|
-
rb_define_module_function(mByebug, "started?"
|
795
|
-
rb_define_module_function(mByebug, "stop"
|
796
|
-
rb_define_module_function(mByebug, "thread_context"
|
797
|
-
rb_define_module_function(mByebug, "tracing?"
|
798
|
-
rb_define_module_function(mByebug, "tracing="
|
799
|
-
rb_define_module_function(mByebug, "verbose?"
|
800
|
-
rb_define_module_function(mByebug, "verbose="
|
783
|
+
rb_define_module_function(mByebug, "add_catchpoint", Add_catchpoint, 1);
|
784
|
+
rb_define_module_function(mByebug, "breakpoints", Breakpoints, 0);
|
785
|
+
rb_define_module_function(mByebug, "catchpoints", Catchpoints, 0);
|
786
|
+
rb_define_module_function(mByebug, "contexts", Contexts, 0);
|
787
|
+
rb_define_module_function(mByebug, "current_context", Current_context, 0);
|
788
|
+
rb_define_module_function(mByebug, "debug_load", Debug_load, -1);
|
789
|
+
rb_define_module_function(mByebug, "post_mortem?", Post_mortem, 0);
|
790
|
+
rb_define_module_function(mByebug, "post_mortem=", Set_post_mortem, 1);
|
791
|
+
rb_define_module_function(mByebug, "raised_exception", Raised_exception, 0);
|
792
|
+
rb_define_module_function(mByebug, "start", Start, 0);
|
793
|
+
rb_define_module_function(mByebug, "started?", Started, 0);
|
794
|
+
rb_define_module_function(mByebug, "stop", Stop, 0);
|
795
|
+
rb_define_module_function(mByebug, "thread_context", Thread_context, 1);
|
796
|
+
rb_define_module_function(mByebug, "tracing?", Tracing, 0);
|
797
|
+
rb_define_module_function(mByebug, "tracing=", Set_tracing, 1);
|
798
|
+
rb_define_module_function(mByebug, "verbose?", Verbose, 0);
|
799
|
+
rb_define_module_function(mByebug, "verbose=", Set_verbose, 1);
|
801
800
|
|
802
801
|
Init_threads_table(mByebug);
|
803
802
|
Init_context(mByebug);
|
@@ -808,4 +807,6 @@ Init_byebug()
|
|
808
807
|
rb_global_variable(&tracepoints);
|
809
808
|
rb_global_variable(&raised_exception);
|
810
809
|
rb_global_variable(&threads);
|
810
|
+
|
811
|
+
idPuts = rb_intern("puts");
|
811
812
|
}
|