byebug 6.0.2 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|