byebug 6.0.2 → 7.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/CONTRIBUTING.md +23 -5
- data/GUIDE.md +5 -97
- data/README.md +9 -7
- data/ext/byebug/breakpoint.c +3 -3
- data/ext/byebug/byebug.c +96 -49
- data/ext/byebug/byebug.h +1 -1
- data/ext/byebug/context.c +2 -2
- data/lib/byebug.rb +0 -1
- data/lib/byebug/attacher.rb +3 -1
- data/lib/byebug/commands.rb +0 -1
- data/lib/byebug/commands/continue.rb +2 -0
- data/lib/byebug/commands/history.rb +2 -5
- data/lib/byebug/commands/info/breakpoints.rb +1 -1
- data/lib/byebug/context.rb +9 -9
- data/lib/byebug/helpers/eval.rb +17 -2
- data/lib/byebug/helpers/var.rb +0 -14
- data/lib/byebug/interfaces/local_interface.rb +4 -2
- data/lib/byebug/interfaces/test_interface.rb +11 -3
- data/lib/byebug/option_setter.rb +2 -2
- data/lib/byebug/printers/texts/plain.yml +1 -1
- data/lib/byebug/processors/command_processor.rb +20 -10
- data/lib/byebug/processors/control_processor.rb +4 -0
- data/lib/byebug/processors/script_processor.rb +1 -1
- data/lib/byebug/remote.rb +1 -1
- data/lib/byebug/runner.rb +8 -1
- data/lib/byebug/settings/autopry.rb +27 -0
- data/lib/byebug/version.rb +1 -1
- metadata +3 -3
- data/lib/byebug/commands/ps.rb +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 075e48a583d6bdc5ec0cd4ce6cf195412476d722
|
4
|
+
data.tar.gz: 8e755e6afcc87f2fb06109c9fdc0dd8e052a1736
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: def5daed567d526f9cf7ad3af964a997e18aeedaf9349f23c5e9e25534c9c3711a6e1688efbfc317da99b83508035ff9db4a9d64f12ba56fb671422044a8103b
|
7
|
+
data.tar.gz: bac9c0be89f64f58403218158b92686734bcf7a5771f4d6eac6e9c7cd4a91ebcf28d476d3e8c3e447c4bf01ba534a60651ce33dec7e04ad81edc4372ff89110a
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,33 @@
|
|
1
|
+
## 7.0.0 - 2015-11-04
|
2
|
+
### Fixed
|
3
|
+
* [#177](https://github.com/deivid-rodriguez/byebug/issues/177). Some issues
|
4
|
+
with formatting results of evaluations.
|
5
|
+
* [#144](https://github.com/deivid-rodriguez/byebug/issues/144). Ruby process
|
6
|
+
after using byebug does no longer get slow.
|
7
|
+
* [#121](https://github.com/deivid-rodriguez/byebug/issues/121). `byebug`
|
8
|
+
commands inside code evaluated from debugger's prompt are now properly working.
|
9
|
+
* Another evaluation bug in autocommands.
|
10
|
+
* `finish 0` command would sometimes fail to stop right before exiting the
|
11
|
+
current frame.
|
12
|
+
* Runner's `--[no-]stop` option now works (thanks @windwiny).
|
13
|
+
* Change variable name `bool`, avoid conflict clang's predefined macro
|
14
|
+
|
15
|
+
### Removed
|
16
|
+
* `ps` command.
|
17
|
+
|
18
|
+
### Changed
|
19
|
+
* [#166](https://github.com/deivid-rodriguez/byebug/issues/166). Don't load
|
20
|
+
the entire library on require, but only when a `byebug` call is issued. Thanks
|
21
|
+
@bquorning.
|
22
|
+
* The above fix to the `finish 0` command cause `byebug`'s entrypoint to
|
23
|
+
require 3 steps out instead of 2. In general, plugins using
|
24
|
+
`Byebug::Context.step_out` will need to be changed to consider "c return events"
|
25
|
+
as well.
|
26
|
+
|
27
|
+
### Added
|
28
|
+
* `autopry` setting that calls `pry` on every stop.
|
29
|
+
* Return value information to debugger's output when `finish 0` is used.
|
30
|
+
|
1
31
|
## 6.0.2 - 2015-08-20
|
2
32
|
### Fixed
|
3
33
|
* The user should always be given back a prompt unless (s)he explicitly states
|
data/CONTRIBUTING.md
CHANGED
@@ -1,4 +1,18 @@
|
|
1
|
-
##
|
1
|
+
## Contributing to Byebug
|
2
|
+
|
3
|
+
### Bug Reports
|
4
|
+
|
5
|
+
* Try to reproduce the issue against the latest revision. There might be
|
6
|
+
unrealeased work that fixes your problem!
|
7
|
+
|
8
|
+
* Ensure that your issue has not already been reported.
|
9
|
+
|
10
|
+
* Include the steps you carried out to produce the problem. If we can't
|
11
|
+
reproduce it, we can't fix it.
|
12
|
+
|
13
|
+
* Include the behavior you observed along with the behavior you expected,
|
14
|
+
and why you expected it.
|
15
|
+
|
2
16
|
|
3
17
|
### Development dependencies
|
4
18
|
|
@@ -25,16 +39,20 @@ test`.
|
|
25
39
|
* If you want to run specific tests, use the provided test runner, like so:
|
26
40
|
|
27
41
|
- Specific test files. For example,
|
28
|
-
`script/minitest_runner test/commands/break_test.rb`
|
42
|
+
`script/minitest_runner.rb test/commands/break_test.rb`
|
29
43
|
|
30
44
|
- Specific test classes. For example,
|
31
|
-
`script/minitest_runner Byebug::BreakAtLinesTestCase`
|
45
|
+
`script/minitest_runner.rb Byebug::BreakAtLinesTestCase`
|
32
46
|
|
33
47
|
- Specific tests. For example,
|
34
|
-
`script/minitest_runner test_catch_removes_specific_catchpoint`
|
48
|
+
`script/minitest_runner.rb test_catch_removes_specific_catchpoint`
|
49
|
+
|
50
|
+
- Specific fully qualified tests. For example,
|
51
|
+
`script/minitest_runner.rb
|
52
|
+
BreakAtLinesTest#test_setting_breakpoint_sets_correct_fields`
|
35
53
|
|
36
54
|
- You can combine any of them and you will get the union of all filters. For
|
37
|
-
example: `script/minitest_runner Byebug::BreakAtLinesTestCase
|
55
|
+
example: `script/minitest_runner.rb Byebug::BreakAtLinesTestCase
|
38
56
|
test_catch_removes_specific_catchpoint`
|
39
57
|
|
40
58
|
|
data/GUIDE.md
CHANGED
@@ -297,98 +297,7 @@ false
|
|
297
297
|
`private_methods` is not a byebug command but a Ruby feature. By default, when
|
298
298
|
`byebug` doesn't understand a command, it will evaluate it as if it was a Ruby
|
299
299
|
command. You can use any Ruby to inspect your program's state at the place it
|
300
|
-
is stopped.
|
301
|
-
that automatically enhances the evaluated results a bit. For example, it
|
302
|
-
automatically sorts arrays.
|
303
|
-
|
304
|
-
```
|
305
|
-
[:Array,
|
306
|
-
:Complex,
|
307
|
-
:DelegateClass,
|
308
|
-
:Digest,
|
309
|
-
:Float,
|
310
|
-
:Hash,
|
311
|
-
:Integer,
|
312
|
-
:Pathname,
|
313
|
-
:Rational,
|
314
|
-
:String,
|
315
|
-
:URI,
|
316
|
-
:__callee__,
|
317
|
-
:__dir__,
|
318
|
-
:__method__,
|
319
|
-
:`,
|
320
|
-
:abort,
|
321
|
-
:at_exit,
|
322
|
-
:autoload,
|
323
|
-
:autoload?,
|
324
|
-
:binding,
|
325
|
-
:block_given?,
|
326
|
-
:caller,
|
327
|
-
:caller_locations,
|
328
|
-
:catch,
|
329
|
-
:default_src_encoding,
|
330
|
-
:define_method,
|
331
|
-
:eval,
|
332
|
-
:exec,
|
333
|
-
:exit,
|
334
|
-
:exit!,
|
335
|
-
:fail,
|
336
|
-
:fork,
|
337
|
-
:format,
|
338
|
-
:gem_original_require,
|
339
|
-
:gets,
|
340
|
-
:global_variables,
|
341
|
-
:include,
|
342
|
-
:initialize,
|
343
|
-
:initialize_clone,
|
344
|
-
:initialize_copy,
|
345
|
-
:initialize_dup,
|
346
|
-
:iterator?,
|
347
|
-
:lambda,
|
348
|
-
:load,
|
349
|
-
:local_variables,
|
350
|
-
:loop,
|
351
|
-
:method_missing,
|
352
|
-
:open,
|
353
|
-
:p,
|
354
|
-
:pp,
|
355
|
-
:print,
|
356
|
-
:printf,
|
357
|
-
:private,
|
358
|
-
:proc,
|
359
|
-
:public,
|
360
|
-
:putc,
|
361
|
-
:puts,
|
362
|
-
:raise,
|
363
|
-
:rand,
|
364
|
-
:readline,
|
365
|
-
:readlines,
|
366
|
-
:require,
|
367
|
-
:require_relative,
|
368
|
-
:respond_to_missing?,
|
369
|
-
:rubygems_require,
|
370
|
-
:select,
|
371
|
-
:set_trace_func,
|
372
|
-
:singleton_method_added,
|
373
|
-
:singleton_method_removed,
|
374
|
-
:singleton_method_undefined,
|
375
|
-
:sleep,
|
376
|
-
:spawn,
|
377
|
-
:sprintf,
|
378
|
-
:srand,
|
379
|
-
:syscall,
|
380
|
-
:system,
|
381
|
-
:test,
|
382
|
-
:throw,
|
383
|
-
:timeout,
|
384
|
-
:trace_var,
|
385
|
-
:trap,
|
386
|
-
:untrace_var,
|
387
|
-
:using,
|
388
|
-
:warn,
|
389
|
-
:y]
|
390
|
-
|
391
|
-
```
|
300
|
+
is stopped.
|
392
301
|
|
393
302
|
Now let's see what happens after stepping:
|
394
303
|
|
@@ -766,7 +675,7 @@ $ byebug primes.rb
|
|
766
675
|
8:
|
767
676
|
9: def self.next_prime(&block)
|
768
677
|
10: candidate = 2
|
769
|
-
(byebug) set
|
678
|
+
(byebug) set linetrace
|
770
679
|
line tracing is on.
|
771
680
|
(byebug) set basename
|
772
681
|
basename in on.
|
@@ -1553,7 +1462,6 @@ short list of named classes of commands
|
|
1553
1462
|
method -- Shows methods of an object, class or module
|
1554
1463
|
next -- Runs one or more lines of code
|
1555
1464
|
pry -- Starts a Pry session
|
1556
|
-
ps -- Evaluates an expression and prettyprints & sort the result
|
1557
1465
|
quit -- Exits byebug
|
1558
1466
|
restart -- Restarts the debugged program
|
1559
1467
|
save -- Saves current byebug session to a file
|
@@ -1768,10 +1676,10 @@ basically listing `<object>.instance_variables`.
|
|
1768
1676
|
* `var global`. Show global variables.
|
1769
1677
|
* `var all`. Show local, global and instance and class variables of `self`.
|
1770
1678
|
* `method instance <object>`. Show methods of `<object>`. Basically this is the
|
1771
|
-
same as running
|
1679
|
+
same as running `<object>.instance_methods(false)`.
|
1772
1680
|
* `method <class-or-module>`. Show methods of the class or module
|
1773
|
-
`<class-or-module>`. Basically this is the same as running
|
1774
|
-
|
1681
|
+
`<class-or-module>`. Basically this is the same as running
|
1682
|
+
`<class-or-module>.methods`.
|
1775
1683
|
|
1776
1684
|
### Examining Program Source Files: list
|
1777
1685
|
|
data/README.md
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
# Byebug
|
2
2
|
|
3
|
-
[![
|
4
|
-
[![
|
5
|
-
[![
|
6
|
-
[![
|
3
|
+
[![Version][gem]][gem_url]
|
4
|
+
[![Quality][gpa]][gpa_url]
|
5
|
+
[![Coverage][cov]][cov_url]
|
6
|
+
[![Gratipay][tip]][tip_url]
|
7
|
+
[![Gitter][irc]][irc_url]
|
7
8
|
|
8
9
|
[gem]: https://img.shields.io/gem/v/byebug.svg
|
9
10
|
[gpa]: https://img.shields.io/codeclimate/github/deivid-rodriguez/byebug.svg
|
10
11
|
[cov]: https://img.shields.io/codeclimate/coverage/github/deivid-rodriguez/byebug.svg
|
11
12
|
[tip]: https://img.shields.io/gittip/deivid-rodriguez.svg
|
13
|
+
[irc]: https://img.shields.io/badge/IRC%20(gitter)-devs%20%26%20users-brightgreen.svg
|
12
14
|
|
13
15
|
[gem_url]: https://rubygems.org/gems/byebug
|
14
16
|
[gpa_url]: https://codeclimate.com/github/deivid-rodriguez/byebug
|
15
17
|
[cov_url]: https://codeclimate.com/github/deivid-rodriguez/byebug
|
16
18
|
[tip_url]: https://www.gittip.com/deivid-rodriguez
|
19
|
+
[irc_url]: https://gitter.im/deivid-rodriguez/byebug
|
17
20
|
|
18
21
|
_Debugging in Ruby 2_
|
19
22
|
|
@@ -99,12 +102,11 @@ are debugging rails, start the server and once the execution gets to your
|
|
99
102
|
`method` | | `instance`
|
100
103
|
`next` | |
|
101
104
|
`pry` | |
|
102
|
-
`ps` | |
|
103
105
|
`quit` | |
|
104
106
|
`restart` | |
|
105
107
|
`save` | |
|
106
|
-
`set` | | `autoirb` `autolist` `autosave` `basename` `callstyle` `fullpath` `histfile` `histsize` `linetrace` `listsize` `post_mortem` `savefile` `stack_on_error` `width`
|
107
|
-
`show` | | `autoirb` `autolist` `autosave` `basename` `callstyle` `fullpath` `histfile` `histsize` `linetrace` `listsize` `post_mortem` `savefile` `stack_on_error` `width`
|
108
|
+
`set` | | `autoirb` `autolist` `autopry` `autosave` `basename` `callstyle` `fullpath` `histfile` `histsize` `linetrace` `listsize` `post_mortem` `savefile` `stack_on_error` `width`
|
109
|
+
`show` | | `autoirb` `autolist` `autopry` `autosave` `basename` `callstyle` `fullpath` `histfile` `histsize` `linetrace` `listsize` `post_mortem` `savefile` `stack_on_error` `width`
|
108
110
|
`source` | |
|
109
111
|
`step` | |
|
110
112
|
`thread` | | `current` `list` `resume` `stop` `switch`
|
data/ext/byebug/breakpoint.c
CHANGED
@@ -38,17 +38,17 @@ brkpt_enabled(VALUE self)
|
|
38
38
|
|
39
39
|
/*
|
40
40
|
* call-seq:
|
41
|
-
* breakpoint.enabled =
|
41
|
+
* breakpoint.enabled = true | false
|
42
42
|
*
|
43
43
|
* Enables or disables breakpoint.
|
44
44
|
*/
|
45
45
|
static VALUE
|
46
|
-
brkpt_set_enabled(VALUE self, VALUE
|
46
|
+
brkpt_set_enabled(VALUE self, VALUE enabled)
|
47
47
|
{
|
48
48
|
breakpoint_t *breakpoint;
|
49
49
|
|
50
50
|
Data_Get_Struct(self, breakpoint_t, breakpoint);
|
51
|
-
return breakpoint->enabled =
|
51
|
+
return breakpoint->enabled = enabled;
|
52
52
|
}
|
53
53
|
|
54
54
|
/*
|
data/ext/byebug/byebug.c
CHANGED
@@ -13,6 +13,7 @@ static VALUE tracepoints = Qnil;
|
|
13
13
|
static VALUE raised_exception = Qnil;
|
14
14
|
|
15
15
|
static ID idPuts;
|
16
|
+
static ID idEmpty;
|
16
17
|
|
17
18
|
/* Hash table with active threads and their associated contexts */
|
18
19
|
VALUE threads = Qnil;
|
@@ -63,6 +64,7 @@ Raised_exception(VALUE self)
|
|
63
64
|
}
|
64
65
|
|
65
66
|
#define IS_STARTED (catchpoints != Qnil)
|
67
|
+
|
66
68
|
static void
|
67
69
|
check_started()
|
68
70
|
{
|
@@ -157,20 +159,32 @@ cleanup(debug_context_t * dc)
|
|
157
159
|
trace_print(trace_arg, dc, 0, 0); \
|
158
160
|
|
159
161
|
|
162
|
+
#define CALL_EVENT_SETUP \
|
163
|
+
dc->calced_stack_size++; \
|
164
|
+
dc->steps_out = dc->steps_out < 0 ? -1 : dc->steps_out + 1;
|
165
|
+
|
166
|
+
#define RETURN_EVENT_SETUP \
|
167
|
+
dc->calced_stack_size--; \
|
168
|
+
\
|
169
|
+
if (dc->steps_out == 1) \
|
170
|
+
dc->steps = 1;
|
171
|
+
|
172
|
+
#define RETURN_EVENT_TEARDOWN \
|
173
|
+
dc->steps_out = dc->steps_out <= 0 ? -1 : dc->steps_out - 1;
|
174
|
+
|
175
|
+
|
160
176
|
/* Functions that return control to byebug after the different events */
|
161
177
|
|
162
178
|
static VALUE
|
163
|
-
call_at(VALUE
|
164
|
-
VALUE a1)
|
179
|
+
call_at(VALUE ctx, debug_context_t * dc, ID mid, int argc, VALUE arg)
|
165
180
|
{
|
166
181
|
struct call_with_inspection_data cwi;
|
167
|
-
VALUE argv[
|
182
|
+
VALUE argv[1];
|
168
183
|
|
169
|
-
argv[0] =
|
170
|
-
argv[1] = a1;
|
184
|
+
argv[0] = arg;
|
171
185
|
|
172
186
|
cwi.dc = dc;
|
173
|
-
cwi.
|
187
|
+
cwi.ctx = ctx;
|
174
188
|
cwi.id = mid;
|
175
189
|
cwi.argc = argc;
|
176
190
|
cwi.argv = &argv[0];
|
@@ -179,49 +193,52 @@ call_at(VALUE context_obj, debug_context_t * dc, ID mid, int argc, VALUE a0,
|
|
179
193
|
}
|
180
194
|
|
181
195
|
static VALUE
|
182
|
-
call_at_line(VALUE
|
196
|
+
call_at_line(VALUE ctx, debug_context_t * dc)
|
183
197
|
{
|
184
|
-
return call_at(
|
198
|
+
return call_at(ctx, dc, rb_intern("at_line"), 0, Qnil);
|
185
199
|
}
|
186
200
|
|
187
201
|
static VALUE
|
188
|
-
call_at_tracing(VALUE
|
202
|
+
call_at_tracing(VALUE ctx, debug_context_t * dc)
|
189
203
|
{
|
190
|
-
return call_at(
|
204
|
+
return call_at(ctx, dc, rb_intern("at_tracing"), 0, Qnil);
|
191
205
|
}
|
192
206
|
|
193
207
|
static VALUE
|
194
|
-
call_at_breakpoint(VALUE
|
208
|
+
call_at_breakpoint(VALUE ctx, debug_context_t * dc, VALUE breakpoint)
|
195
209
|
{
|
196
210
|
dc->stop_reason = CTX_STOP_BREAKPOINT;
|
197
|
-
|
211
|
+
|
212
|
+
return call_at(ctx, dc, rb_intern("at_breakpoint"), 1, breakpoint);
|
198
213
|
}
|
199
214
|
|
200
215
|
static VALUE
|
201
|
-
call_at_catchpoint(VALUE
|
216
|
+
call_at_catchpoint(VALUE ctx, debug_context_t * dc, VALUE exp)
|
202
217
|
{
|
203
218
|
dc->stop_reason = CTX_STOP_CATCHPOINT;
|
204
|
-
|
219
|
+
|
220
|
+
return call_at(ctx, dc, rb_intern("at_catchpoint"), 1, exp);
|
205
221
|
}
|
206
222
|
|
207
223
|
static VALUE
|
208
|
-
call_at_return(VALUE
|
224
|
+
call_at_return(VALUE ctx, debug_context_t * dc, VALUE return_value)
|
209
225
|
{
|
210
226
|
dc->stop_reason = CTX_STOP_BREAKPOINT;
|
211
|
-
|
227
|
+
|
228
|
+
return call_at(ctx, dc, rb_intern("at_return"), 1, return_value);
|
212
229
|
}
|
213
230
|
|
214
231
|
static void
|
215
|
-
call_at_line_check(VALUE
|
216
|
-
VALUE file, VALUE line)
|
232
|
+
call_at_line_check(VALUE ctx, debug_context_t * dc, VALUE breakpoint)
|
217
233
|
{
|
218
234
|
dc->stop_reason = CTX_STOP_STEP;
|
219
235
|
|
220
236
|
if (breakpoint != Qnil)
|
221
|
-
call_at_breakpoint(
|
237
|
+
call_at_breakpoint(ctx, dc, breakpoint);
|
222
238
|
|
223
239
|
reset_stepping_stop_points(dc);
|
224
|
-
|
240
|
+
|
241
|
+
call_at_line(ctx, dc);
|
225
242
|
}
|
226
243
|
|
227
244
|
|
@@ -239,7 +256,7 @@ line_event(VALUE trace_point, void *data)
|
|
239
256
|
binding = rb_tracearg_binding(trace_arg);
|
240
257
|
|
241
258
|
if (RTEST(tracing))
|
242
|
-
call_at_tracing(context, dc
|
259
|
+
call_at_tracing(context, dc);
|
243
260
|
|
244
261
|
if (!CTX_FL_TEST(dc, CTX_FL_IGNORE_STEPS))
|
245
262
|
dc->steps = dc->steps <= 0 ? -1 : dc->steps - 1;
|
@@ -253,7 +270,7 @@ line_event(VALUE trace_point, void *data)
|
|
253
270
|
}
|
254
271
|
|
255
272
|
if (dc->steps == 0 || dc->lines == 0)
|
256
|
-
call_at_line_check(context, dc, Qnil
|
273
|
+
call_at_line_check(context, dc, Qnil);
|
257
274
|
|
258
275
|
brkpnt = Qnil;
|
259
276
|
|
@@ -261,7 +278,7 @@ line_event(VALUE trace_point, void *data)
|
|
261
278
|
brkpnt = find_breakpoint_by_pos(breakpoints, file, line, binding);
|
262
279
|
|
263
280
|
if (!NIL_P(brkpnt))
|
264
|
-
call_at_line_check(context, dc, brkpnt
|
281
|
+
call_at_line_check(context, dc, brkpnt);
|
265
282
|
|
266
283
|
EVENT_TEARDOWN;
|
267
284
|
}
|
@@ -269,16 +286,14 @@ line_event(VALUE trace_point, void *data)
|
|
269
286
|
static void
|
270
287
|
call_event(VALUE trace_point, void *data)
|
271
288
|
{
|
272
|
-
VALUE brkpnt, klass, msym, mid, binding, self
|
289
|
+
VALUE brkpnt, klass, msym, mid, binding, self;
|
273
290
|
|
274
291
|
EVENT_SETUP;
|
275
292
|
|
276
293
|
if (dc->calced_stack_size <= dc->dest_frame)
|
277
294
|
CTX_FL_UNSET(dc, CTX_FL_IGNORE_STEPS);
|
278
295
|
|
279
|
-
|
280
|
-
|
281
|
-
dc->steps_out = dc->steps_out <= 0 ? -1 : dc->steps_out + 1;
|
296
|
+
CALL_EVENT_SETUP;
|
282
297
|
|
283
298
|
/* nil method_id means we are at top level so there can't be a method
|
284
299
|
* breakpoint here. Just leave then. */
|
@@ -293,8 +308,6 @@ call_event(VALUE trace_point, void *data)
|
|
293
308
|
klass = rb_tracearg_defined_class(trace_arg);
|
294
309
|
binding = rb_tracearg_binding(trace_arg);
|
295
310
|
self = rb_tracearg_self(trace_arg);
|
296
|
-
file = rb_tracearg_path(trace_arg);
|
297
|
-
line = rb_tracearg_lineno(trace_arg);
|
298
311
|
|
299
312
|
brkpnt = Qnil;
|
300
313
|
|
@@ -304,7 +317,7 @@ call_event(VALUE trace_point, void *data)
|
|
304
317
|
if (!NIL_P(brkpnt))
|
305
318
|
{
|
306
319
|
call_at_breakpoint(context, dc, brkpnt);
|
307
|
-
call_at_line(context, dc
|
320
|
+
call_at_line(context, dc);
|
308
321
|
}
|
309
322
|
|
310
323
|
EVENT_TEARDOWN;
|
@@ -313,23 +326,26 @@ call_event(VALUE trace_point, void *data)
|
|
313
326
|
static void
|
314
327
|
return_event(VALUE trace_point, void *data)
|
315
328
|
{
|
329
|
+
VALUE return_value;
|
330
|
+
|
316
331
|
EVENT_SETUP;
|
317
332
|
|
318
|
-
|
333
|
+
RETURN_EVENT_SETUP;
|
319
334
|
|
320
|
-
if (dc->steps_out ==
|
321
|
-
dc->steps = 1;
|
322
|
-
else if ((dc->steps_out == 0) && (CTX_FL_TEST(dc, CTX_FL_STOP_ON_RET)))
|
335
|
+
if ((dc->steps_out == 0) && (CTX_FL_TEST(dc, CTX_FL_STOP_ON_RET)))
|
323
336
|
{
|
324
|
-
VALUE file, line;
|
325
|
-
|
326
337
|
reset_stepping_stop_points(dc);
|
327
|
-
|
328
|
-
|
329
|
-
|
338
|
+
|
339
|
+
if (rb_tracearg_event_flag(trace_arg) &
|
340
|
+
(RUBY_EVENT_RETURN | RUBY_EVENT_B_RETURN))
|
341
|
+
return_value = rb_tracearg_return_value(trace_arg);
|
342
|
+
else
|
343
|
+
return_value = Qnil;
|
344
|
+
|
345
|
+
call_at_return(context, dc, return_value);
|
330
346
|
}
|
331
347
|
|
332
|
-
|
348
|
+
RETURN_EVENT_TEARDOWN;
|
333
349
|
|
334
350
|
EVENT_TEARDOWN;
|
335
351
|
}
|
@@ -339,7 +355,7 @@ raw_call_event(VALUE trace_point, void *data)
|
|
339
355
|
{
|
340
356
|
EVENT_SETUP;
|
341
357
|
|
342
|
-
|
358
|
+
CALL_EVENT_SETUP;
|
343
359
|
|
344
360
|
EVENT_TEARDOWN;
|
345
361
|
}
|
@@ -349,7 +365,9 @@ raw_return_event(VALUE trace_point, void *data)
|
|
349
365
|
{
|
350
366
|
EVENT_SETUP;
|
351
367
|
|
352
|
-
|
368
|
+
RETURN_EVENT_SETUP;
|
369
|
+
|
370
|
+
RETURN_EVENT_TEARDOWN;
|
353
371
|
|
354
372
|
EVENT_TEARDOWN;
|
355
373
|
}
|
@@ -357,14 +375,12 @@ raw_return_event(VALUE trace_point, void *data)
|
|
357
375
|
static void
|
358
376
|
raise_event(VALUE trace_point, void *data)
|
359
377
|
{
|
360
|
-
VALUE expn_class, ancestors,
|
378
|
+
VALUE expn_class, ancestors, pm_context;
|
361
379
|
int i;
|
362
380
|
debug_context_t *new_dc;
|
363
381
|
|
364
382
|
EVENT_SETUP;
|
365
383
|
|
366
|
-
path = rb_tracearg_path(trace_arg);
|
367
|
-
lineno = rb_tracearg_lineno(trace_arg);
|
368
384
|
raised_exception = rb_tracearg_raised_exception(trace_arg);
|
369
385
|
|
370
386
|
if (post_mortem == Qtrue)
|
@@ -397,8 +413,10 @@ raise_event(VALUE trace_point, void *data)
|
|
397
413
|
if (hit_count != Qnil)
|
398
414
|
{
|
399
415
|
rb_hash_aset(catchpoints, module_name, INT2FIX(FIX2INT(hit_count) + 1));
|
416
|
+
|
400
417
|
call_at_catchpoint(context, dc, raised_exception);
|
401
|
-
call_at_line(context, dc
|
418
|
+
call_at_line(context, dc);
|
419
|
+
|
402
420
|
break;
|
403
421
|
}
|
404
422
|
}
|
@@ -540,8 +558,6 @@ Current_context(VALUE self)
|
|
540
558
|
|
541
559
|
UNUSED(self);
|
542
560
|
|
543
|
-
check_started();
|
544
|
-
|
545
561
|
thread_context_lookup(rb_thread_current(), &context);
|
546
562
|
|
547
563
|
return context;
|
@@ -579,7 +595,6 @@ Stop(VALUE self)
|
|
579
595
|
|
580
596
|
breakpoints = Qnil;
|
581
597
|
catchpoints = Qnil;
|
582
|
-
threads = Qnil;
|
583
598
|
|
584
599
|
return Qfalse;
|
585
600
|
}
|
@@ -587,6 +602,36 @@ Stop(VALUE self)
|
|
587
602
|
return Qtrue;
|
588
603
|
}
|
589
604
|
|
605
|
+
static VALUE
|
606
|
+
Stoppable(VALUE self)
|
607
|
+
{
|
608
|
+
VALUE context;
|
609
|
+
debug_context_t *dc;
|
610
|
+
|
611
|
+
if (!IS_STARTED)
|
612
|
+
return Qfalse;
|
613
|
+
|
614
|
+
if (breakpoints != Qnil && rb_funcall(breakpoints, idEmpty, 0) == Qfalse)
|
615
|
+
return Qfalse;
|
616
|
+
|
617
|
+
if (catchpoints != Qnil && rb_funcall(catchpoints, idEmpty, 0) == Qfalse)
|
618
|
+
return Qfalse;
|
619
|
+
|
620
|
+
if (post_mortem == Qtrue)
|
621
|
+
return Qfalse;
|
622
|
+
|
623
|
+
context = Current_context(self);
|
624
|
+
if (context != Qnil)
|
625
|
+
{
|
626
|
+
Data_Get_Struct(context, debug_context_t, dc);
|
627
|
+
|
628
|
+
if (dc->steps > 0)
|
629
|
+
return Qfalse;
|
630
|
+
}
|
631
|
+
|
632
|
+
return Qtrue;
|
633
|
+
}
|
634
|
+
|
590
635
|
/*
|
591
636
|
* call-seq:
|
592
637
|
* Byebug.start -> bool
|
@@ -750,6 +795,7 @@ Init_byebug()
|
|
750
795
|
rb_define_module_function(mByebug, "start", Start, 0);
|
751
796
|
rb_define_module_function(mByebug, "started?", Started, 0);
|
752
797
|
rb_define_module_function(mByebug, "stop", Stop, 0);
|
798
|
+
rb_define_module_function(mByebug, "stoppable?", Stoppable, 0);
|
753
799
|
rb_define_module_function(mByebug, "thread_context", Thread_context, 1);
|
754
800
|
rb_define_module_function(mByebug, "tracing?", Tracing, 0);
|
755
801
|
rb_define_module_function(mByebug, "tracing=", Set_tracing, 1);
|
@@ -765,4 +811,5 @@ Init_byebug()
|
|
765
811
|
rb_global_variable(&threads);
|
766
812
|
|
767
813
|
idPuts = rb_intern("puts");
|
814
|
+
idEmpty = rb_intern("empty?");
|
768
815
|
}
|
data/ext/byebug/byebug.h
CHANGED
data/ext/byebug/context.c
CHANGED
@@ -168,7 +168,7 @@ open_debug_inspector_i(const rb_debug_inspector_t * inspector, void *data)
|
|
168
168
|
|
169
169
|
cwi->dc->backtrace = load_backtrace(inspector);
|
170
170
|
|
171
|
-
return rb_funcall2(cwi->
|
171
|
+
return rb_funcall2(cwi->ctx, cwi->id, cwi->argc, cwi->argv);
|
172
172
|
}
|
173
173
|
|
174
174
|
static VALUE
|
@@ -344,7 +344,7 @@ Context_resume(VALUE self)
|
|
344
344
|
|
345
345
|
/*
|
346
346
|
* call-seq:
|
347
|
-
* context.backtrace->
|
347
|
+
* context.backtrace-> Array
|
348
348
|
*
|
349
349
|
* Returns the frame stack of a context.
|
350
350
|
*/
|
data/lib/byebug.rb
CHANGED
data/lib/byebug/attacher.rb
CHANGED
@@ -7,6 +7,8 @@ module Byebug
|
|
7
7
|
# events occur. Before entering byebug the init script is read.
|
8
8
|
#
|
9
9
|
def self.attach
|
10
|
+
require 'byebug/core'
|
11
|
+
|
10
12
|
unless started?
|
11
13
|
self.mode = :attached
|
12
14
|
|
@@ -14,7 +16,7 @@ module Byebug
|
|
14
16
|
run_init_script
|
15
17
|
end
|
16
18
|
|
17
|
-
current_context.step_out(
|
19
|
+
current_context.step_out(3, true)
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
data/lib/byebug/commands.rb
CHANGED
@@ -20,7 +20,6 @@ require 'byebug/commands/list'
|
|
20
20
|
require 'byebug/commands/method'
|
21
21
|
require 'byebug/commands/next'
|
22
22
|
require 'byebug/commands/pry'
|
23
|
-
require 'byebug/commands/ps'
|
24
23
|
require 'byebug/commands/quit'
|
25
24
|
require 'byebug/commands/restart'
|
26
25
|
require 'byebug/commands/save'
|
@@ -16,7 +16,7 @@ module Byebug
|
|
16
16
|
|
17
17
|
def self.description
|
18
18
|
<<-EOD
|
19
|
-
hist[ory]
|
19
|
+
hist[ory][ num_cmds]
|
20
20
|
|
21
21
|
#{short_description}
|
22
22
|
EOD
|
@@ -29,10 +29,7 @@ module Byebug
|
|
29
29
|
def execute
|
30
30
|
history = processor.interface.history
|
31
31
|
|
32
|
-
if @match[:num_cmds]
|
33
|
-
size, err = get_int(@match[:num_cmds], 'history', 1, history.size)
|
34
|
-
return errmsg(err) unless size
|
35
|
-
end
|
32
|
+
size, = get_int(@match[:num_cmds], 'history', 1) if @match[:num_cmds]
|
36
33
|
|
37
34
|
puts history.to_s(size)
|
38
35
|
end
|
data/lib/byebug/context.rb
CHANGED
@@ -89,35 +89,35 @@ module Byebug
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def at_breakpoint(breakpoint)
|
92
|
-
|
92
|
+
processor.at_breakpoint(breakpoint)
|
93
93
|
end
|
94
94
|
|
95
95
|
def at_catchpoint(exception)
|
96
|
-
|
96
|
+
processor.at_catchpoint(exception)
|
97
97
|
end
|
98
98
|
|
99
|
-
def at_tracing
|
99
|
+
def at_tracing
|
100
100
|
return if ignored_file?(file)
|
101
101
|
|
102
|
-
|
102
|
+
processor.at_tracing
|
103
103
|
end
|
104
104
|
|
105
|
-
def at_line
|
105
|
+
def at_line
|
106
106
|
self.frame = 0
|
107
107
|
return if ignored_file?(file)
|
108
108
|
|
109
|
-
|
109
|
+
processor.at_line
|
110
110
|
end
|
111
111
|
|
112
|
-
def at_return(
|
112
|
+
def at_return(return_value)
|
113
113
|
return if ignored_file?(file)
|
114
114
|
|
115
|
-
|
115
|
+
processor.at_return(return_value)
|
116
116
|
end
|
117
117
|
|
118
118
|
private
|
119
119
|
|
120
|
-
def
|
120
|
+
def processor
|
121
121
|
@processor ||= self.class.processor.new(self)
|
122
122
|
end
|
123
123
|
end
|
data/lib/byebug/helpers/eval.rb
CHANGED
@@ -64,7 +64,7 @@ module Byebug
|
|
64
64
|
at = e.backtrace
|
65
65
|
|
66
66
|
locations = ["#{at.shift}: #{warning_msg(e)}"]
|
67
|
-
locations += at.map { |path| "
|
67
|
+
locations += at.map { |path| " from #{path}" }
|
68
68
|
locations.join("\n")
|
69
69
|
end
|
70
70
|
|
@@ -80,11 +80,26 @@ module Byebug
|
|
80
80
|
# will get blocked by byebug's main thread.
|
81
81
|
#
|
82
82
|
def allowing_other_threads
|
83
|
+
res = nil
|
83
84
|
Byebug.unlock
|
84
|
-
|
85
|
+
|
86
|
+
Thread.new { res = yield }.join
|
87
|
+
|
85
88
|
Byebug.lock
|
86
89
|
res
|
87
90
|
end
|
91
|
+
|
92
|
+
def safe_inspect(var)
|
93
|
+
var.inspect
|
94
|
+
rescue
|
95
|
+
safe_to_s(var)
|
96
|
+
end
|
97
|
+
|
98
|
+
def safe_to_s(var)
|
99
|
+
var.to_s
|
100
|
+
rescue
|
101
|
+
'*Error in evaluation*'
|
102
|
+
end
|
88
103
|
end
|
89
104
|
end
|
90
105
|
end
|
data/lib/byebug/helpers/var.rb
CHANGED
@@ -47,20 +47,6 @@ module Byebug
|
|
47
47
|
locals = all_locals.select { |k, _| arg_values.include?(k) }
|
48
48
|
puts prv(locals.keys.sort.map { |k| [k, locals[k]] }, 'instance')
|
49
49
|
end
|
50
|
-
|
51
|
-
private
|
52
|
-
|
53
|
-
def safe_inspect(var)
|
54
|
-
var.inspect
|
55
|
-
rescue
|
56
|
-
safe_to_s(var)
|
57
|
-
end
|
58
|
-
|
59
|
-
def safe_to_s(var)
|
60
|
-
var.to_s
|
61
|
-
rescue
|
62
|
-
'*Error in evaluation*'
|
63
|
-
end
|
64
50
|
end
|
65
51
|
end
|
66
52
|
end
|
@@ -3,6 +3,8 @@ module Byebug
|
|
3
3
|
# Interface class for standard byebug use.
|
4
4
|
#
|
5
5
|
class LocalInterface < Interface
|
6
|
+
EOF_ALIAS = 'continue'
|
7
|
+
|
6
8
|
def initialize
|
7
9
|
super()
|
8
10
|
@input = STDIN
|
@@ -13,12 +15,12 @@ module Byebug
|
|
13
15
|
#
|
14
16
|
# Reads a single line of input using Readline. If Ctrl-C is pressed in the
|
15
17
|
# middle of input, the line is reset to only the prompt and we ask for input
|
16
|
-
# again.
|
18
|
+
# again. If Ctrl-D is pressed, it returns "continue".
|
17
19
|
#
|
18
20
|
# @param prompt Prompt to be displayed.
|
19
21
|
#
|
20
22
|
def readline(prompt)
|
21
|
-
Readline.readline(prompt, false)
|
23
|
+
Readline.readline(prompt, false) || EOF_ALIAS
|
22
24
|
rescue Interrupt
|
23
25
|
puts('^C')
|
24
26
|
retry
|
@@ -13,15 +13,15 @@ module Byebug
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def errmsg(message)
|
16
|
-
error.concat(message
|
16
|
+
error.concat(prepare(message))
|
17
17
|
end
|
18
18
|
|
19
19
|
def print(message)
|
20
|
-
output.concat(message
|
20
|
+
output.concat(prepare(message))
|
21
21
|
end
|
22
22
|
|
23
23
|
def puts(message)
|
24
|
-
output.concat(message
|
24
|
+
output.concat(prepare(message))
|
25
25
|
end
|
26
26
|
|
27
27
|
def read_command(prompt)
|
@@ -54,5 +54,13 @@ module Byebug
|
|
54
54
|
cmd = input.shift
|
55
55
|
cmd.is_a?(Proc) ? cmd.call : cmd
|
56
56
|
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def prepare(message)
|
61
|
+
return message.map(&:to_s) if message.respond_to?(:map)
|
62
|
+
|
63
|
+
message.to_s.split("\n")
|
64
|
+
end
|
57
65
|
end
|
58
66
|
end
|
data/lib/byebug/option_setter.rb
CHANGED
@@ -31,7 +31,7 @@ module Byebug
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def include_flag
|
34
|
-
@opts.on
|
34
|
+
@opts.on '-I', '--include list', 'Add to paths to $LOAD_PATH' do |list|
|
35
35
|
$LOAD_PATH.push(list.split(':')).flatten!
|
36
36
|
end
|
37
37
|
end
|
@@ -85,7 +85,7 @@ module Byebug
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def help
|
88
|
-
@opts.on
|
88
|
+
@opts.on '-h', '--help', 'Display this message' do
|
89
89
|
@runner.help = @opts.help
|
90
90
|
end
|
91
91
|
end
|
@@ -26,7 +26,7 @@ module Byebug
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def interface
|
29
|
-
@interface ||=
|
29
|
+
@interface ||= Context.interface
|
30
30
|
end
|
31
31
|
|
32
32
|
def printer
|
@@ -68,14 +68,16 @@ module Byebug
|
|
68
68
|
def at_tracing
|
69
69
|
puts "Tracing: #{context.full_location}"
|
70
70
|
|
71
|
-
|
71
|
+
run_auto_cmds(2)
|
72
72
|
end
|
73
73
|
|
74
74
|
def at_line
|
75
75
|
process_commands
|
76
76
|
end
|
77
77
|
|
78
|
-
def at_return
|
78
|
+
def at_return(return_value)
|
79
|
+
puts "Return value is: #{safe_inspect(return_value)}"
|
80
|
+
|
79
81
|
process_commands
|
80
82
|
end
|
81
83
|
|
@@ -108,22 +110,24 @@ module Byebug
|
|
108
110
|
|
109
111
|
private
|
110
112
|
|
111
|
-
def
|
113
|
+
def auto_cmds_for(run_level)
|
112
114
|
command_list.select { |cmd| cmd.always_run >= run_level }
|
113
115
|
end
|
114
116
|
|
115
117
|
#
|
116
118
|
# Run permanent commands.
|
117
119
|
#
|
118
|
-
def
|
119
|
-
|
120
|
+
def run_auto_cmds(run_level)
|
121
|
+
safely do
|
122
|
+
auto_cmds_for(run_level).each { |cmd| cmd.new(self).execute }
|
123
|
+
end
|
120
124
|
end
|
121
125
|
|
122
126
|
def before_repl
|
123
127
|
@proceed = false
|
124
128
|
@prev_line = nil
|
125
129
|
|
126
|
-
|
130
|
+
run_auto_cmds(1)
|
127
131
|
interface.autorestore
|
128
132
|
end
|
129
133
|
|
@@ -152,10 +156,16 @@ module Byebug
|
|
152
156
|
# command is not found, it evaluates the unknown input.
|
153
157
|
#
|
154
158
|
def run_cmd(input)
|
155
|
-
|
156
|
-
|
159
|
+
safely do
|
160
|
+
command = command_list.match(input)
|
161
|
+
return command.new(self, input).execute if command
|
162
|
+
|
163
|
+
puts safe_inspect(thread_safe_eval(input))
|
164
|
+
end
|
165
|
+
end
|
157
166
|
|
158
|
-
|
167
|
+
def safely
|
168
|
+
yield
|
159
169
|
rescue => e
|
160
170
|
errmsg(e.message)
|
161
171
|
end
|
data/lib/byebug/remote.rb
CHANGED
data/lib/byebug/runner.rb
CHANGED
@@ -38,6 +38,11 @@ module Byebug
|
|
38
38
|
#
|
39
39
|
attr_accessor :quit
|
40
40
|
|
41
|
+
#
|
42
|
+
# Signals that we should stop before program starts
|
43
|
+
#
|
44
|
+
attr_accessor :stop
|
45
|
+
|
41
46
|
#
|
42
47
|
# @param stop [Boolean] Whether the runner should stop right before
|
43
48
|
# starting the program.
|
@@ -102,6 +107,8 @@ module Byebug
|
|
102
107
|
end
|
103
108
|
end
|
104
109
|
|
110
|
+
attr_writer :interface
|
111
|
+
|
105
112
|
def interface
|
106
113
|
@interface ||= LocalInterface.new
|
107
114
|
end
|
@@ -139,7 +146,7 @@ module Byebug
|
|
139
146
|
ok = syntax_valid?(File.read($PROGRAM_NAME))
|
140
147
|
fail(InvalidScript, 'The script has incorrect syntax') unless ok
|
141
148
|
|
142
|
-
error = Byebug.debug_load($PROGRAM_NAME,
|
149
|
+
error = Byebug.debug_load($PROGRAM_NAME, stop)
|
143
150
|
puts "#{error}\n#{error.backtrace}" if error
|
144
151
|
end
|
145
152
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'byebug/setting'
|
2
|
+
require 'byebug/commands/pry'
|
3
|
+
|
4
|
+
module Byebug
|
5
|
+
#
|
6
|
+
# Setting for automatically invoking Pry on every stop.
|
7
|
+
#
|
8
|
+
class AutoprySetting < Setting
|
9
|
+
DEFAULT = 0
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
PryCommand.always_run = DEFAULT
|
13
|
+
end
|
14
|
+
|
15
|
+
def banner
|
16
|
+
'Invoke Pry on every stop'
|
17
|
+
end
|
18
|
+
|
19
|
+
def value=(v)
|
20
|
+
PryCommand.always_run = v ? 1 : 0
|
21
|
+
end
|
22
|
+
|
23
|
+
def value
|
24
|
+
PryCommand.always_run == 1
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/byebug/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: byebug
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 7.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Rodriguez
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-11-04 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -94,7 +94,6 @@ files:
|
|
94
94
|
- lib/byebug/commands/method.rb
|
95
95
|
- lib/byebug/commands/next.rb
|
96
96
|
- lib/byebug/commands/pry.rb
|
97
|
-
- lib/byebug/commands/ps.rb
|
98
97
|
- lib/byebug/commands/quit.rb
|
99
98
|
- lib/byebug/commands/restart.rb
|
100
99
|
- lib/byebug/commands/save.rb
|
@@ -154,6 +153,7 @@ files:
|
|
154
153
|
- lib/byebug/setting.rb
|
155
154
|
- lib/byebug/settings/autoirb.rb
|
156
155
|
- lib/byebug/settings/autolist.rb
|
156
|
+
- lib/byebug/settings/autopry.rb
|
157
157
|
- lib/byebug/settings/autosave.rb
|
158
158
|
- lib/byebug/settings/basename.rb
|
159
159
|
- lib/byebug/settings/callstyle.rb
|
data/lib/byebug/commands/ps.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'English'
|
2
|
-
require 'pp'
|
3
|
-
require 'byebug/command'
|
4
|
-
require 'byebug/helpers/eval'
|
5
|
-
|
6
|
-
module Byebug
|
7
|
-
#
|
8
|
-
# Enhanced evaluation of expressions from byebug's prompt. Besides
|
9
|
-
# evaluating, it sorts and pretty prints arrays.
|
10
|
-
#
|
11
|
-
class PsCommand < Command
|
12
|
-
include Helpers::EvalHelper
|
13
|
-
|
14
|
-
self.allow_in_post_mortem = true
|
15
|
-
|
16
|
-
def self.regexp
|
17
|
-
/^\s* ps (\s+ (.+)) \s*$/x
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.description
|
21
|
-
<<-EOD
|
22
|
-
ps <expression>
|
23
|
-
|
24
|
-
#{short_description}
|
25
|
-
EOD
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.short_description
|
29
|
-
'Evaluates an expression and prettyprints & sort the result'
|
30
|
-
end
|
31
|
-
|
32
|
-
def execute
|
33
|
-
return puts(help) unless @match[1]
|
34
|
-
|
35
|
-
res = thread_safe_eval(@match[1])
|
36
|
-
res = res.sort if res.respond_to?(:sort)
|
37
|
-
|
38
|
-
out = PP.pp(res, StringIO.new, Setting[:width])
|
39
|
-
print pr('eval.result', expr: @match[1], result: out.string)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|