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/Gemfile
CHANGED
@@ -2,16 +2,14 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
gem 'rake', '~> 10.
|
5
|
+
gem 'rake', '~> 10.4'
|
6
6
|
|
7
|
-
group :development do
|
8
|
-
gem 'rake-compiler', '
|
9
|
-
gem 'rubocop', '
|
10
|
-
end
|
11
|
-
|
12
|
-
group :test do
|
7
|
+
group :development, :test do
|
8
|
+
gem 'rake-compiler', '0.9.5'
|
9
|
+
gem 'rubocop', '0.29.1'
|
13
10
|
gem 'mocha', '~> 1.1'
|
14
|
-
gem 'minitest', '~> 5.
|
15
|
-
gem 'simplecov', '
|
16
|
-
gem 'codeclimate-test-reporter', '
|
11
|
+
gem 'minitest', '~> 5.5'
|
12
|
+
gem 'simplecov', '0.9.2', require: false
|
13
|
+
gem 'codeclimate-test-reporter', '0.4.7', require: false
|
14
|
+
gem 'pry', '0.10.1', require: false
|
17
15
|
end
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,22 @@
|
|
1
1
|
# Byebug
|
2
|
-
|
3
|
-
[![
|
4
|
-
[![
|
5
|
-
[![
|
6
|
-
[![
|
7
|
-
[![
|
2
|
+
|
3
|
+
[![Ver][gem]][gem_url]
|
4
|
+
[![Gpa][gpa]][gpa_url]
|
5
|
+
[![Dep][dep]][dep_url]
|
6
|
+
[![Cov][cov]][cov_url]
|
7
|
+
[![Git][tip]][tip_url]
|
8
|
+
|
9
|
+
[gem]: https://img.shields.io/gem/v/byebug.svg
|
10
|
+
[gpa]: https://img.shields.io/codeclimate/github/deivid-rodriguez/byebug.svg
|
11
|
+
[dep]: https://img.shields.io/gemnasium/deivid-rodriguez/byebug.svg
|
12
|
+
[cov]: https://img.shields.io/codeclimate/coverage/github/deivid-rodriguez/byebug.svg
|
13
|
+
[tip]: https://img.shields.io/gittip/deivid-rodriguez.svg
|
14
|
+
|
15
|
+
[gem_url]: https://rubygems.org/gems/byebug
|
16
|
+
[gpa_url]: https://codeclimate.com/github/deivid-rodriguez/byebug
|
17
|
+
[dep_url]: https://gemnasium.com/deivid-rodriguez/byebug
|
18
|
+
[cov_url]: https://codeclimate.com/github/deivid-rodriguez/byebug
|
19
|
+
[tip_url]: https://www.gittip.com/deivid-rodriguez
|
8
20
|
|
9
21
|
_Debugging in Ruby 2_
|
10
22
|
|
@@ -25,19 +37,28 @@ that.
|
|
25
37
|
different lines executed by your program.
|
26
38
|
|
27
39
|
|
28
|
-
##
|
40
|
+
## Build Status
|
41
|
+
|
42
|
+
Linux & OSX [![Tra][tra]][tra_url]
|
43
|
+
|
44
|
+
Windows [![Vey][vey]][vey_url]
|
45
|
+
|
46
|
+
[tra]: https://img.shields.io/travis/deivid-rodriguez/byebug.svg?branch=master
|
47
|
+
[vey]: https://ci.appveyor.com/api/projects/status/github/deivid-rodriguez/byebug?svg=true
|
29
48
|
|
30
|
-
|
31
|
-
|
49
|
+
[tra_url]: https://travis-ci.org/deivid-rodriguez/byebug
|
50
|
+
[vey_url]: https://ci.appveyor.com/project/deivid-rodriguez/byebug
|
32
51
|
|
33
|
-
Furthermore, Byebug uses the TracePoint API which was just first developed for
|
34
|
-
Ruby 2.0.0. Since it was released, a lot of bugs directly impacting Byebug have
|
35
|
-
been corrected, so for the best debugging experience, the following Ruby
|
36
|
-
versions are recommended:
|
37
52
|
|
38
|
-
|
39
|
-
|
40
|
-
*
|
53
|
+
## Requirements
|
54
|
+
|
55
|
+
* Required: MRI 2.0.0 or higher. For debugging ruby 1.9.3 or older, use
|
56
|
+
[debugger][].
|
57
|
+
|
58
|
+
* Recommended:
|
59
|
+
- MRI 2.0.0-p576 or higher.
|
60
|
+
- MRI 2.1.3 or higher.
|
61
|
+
- MRI 2.2.1 or higher.
|
41
62
|
|
42
63
|
|
43
64
|
## Install
|
@@ -55,15 +76,6 @@ wherever you want to start debugging and the execution will stop there. If you
|
|
55
76
|
are debugging rails, start the server and once the execution gets to your
|
56
77
|
`byebug` command you will get a debugging prompt.
|
57
78
|
|
58
|
-
Former [debugger][] or [ruby-debug][] users, notice:
|
59
|
-
|
60
|
-
* Some gems (rails, rspec) implement debugging flags (-d, --debugger) that early
|
61
|
-
require and start the debugger. These flags are a performance penalty and byebug
|
62
|
-
doesn't need them anymore so my recommendation is not to use them. In any case,
|
63
|
-
both rails and rspec have deprecated these flags in their latest versions.
|
64
|
-
* The startup configuration file is now called `.byebugrc` instead of
|
65
|
-
`.rdebugrc`.
|
66
|
-
|
67
79
|
|
68
80
|
## Byebug's commands
|
69
81
|
|
@@ -80,6 +92,7 @@ both rails and rspec have deprecated these flags in their latest versions.
|
|
80
92
|
`down` | |
|
81
93
|
`edit` | |
|
82
94
|
`enable` | | `breakpoints` `display`
|
95
|
+
`eval` | |
|
83
96
|
`finish` | |
|
84
97
|
`frame` | |
|
85
98
|
`help` | |
|
@@ -90,25 +103,22 @@ both rails and rspec have deprecated these flags in their latest versions.
|
|
90
103
|
`list` | |
|
91
104
|
`method` | | `instance`
|
92
105
|
`next` | |
|
93
|
-
`p` | `eval` |
|
94
106
|
`pp` | |
|
95
107
|
`pry` | |
|
96
108
|
`ps` | |
|
97
109
|
`putl` | |
|
98
110
|
`quit` | `exit` |
|
99
|
-
`reload` | |
|
100
111
|
`restart` | |
|
101
112
|
`save` | |
|
102
|
-
`set` | | `autoeval` `autoirb` `autolist` `
|
103
|
-
`show` | | `autoeval` `autoirb` `autolist` `
|
104
|
-
`skip` | |
|
113
|
+
`set` | | `autoeval` `autoirb` `autolist` `autosave` `basename` `callstyle` `fullpath` `histfile` `histsize` `linetrace` `listsize` `post_mortem` `stack_on_error` `verbose` `width`
|
114
|
+
`show` | | `autoeval` `autoirb` `autolist` `autosave` `basename` `callstyle` `fullpath` `histfile` `histsize` `linetrace` `listsize` `post_mortem` `stack_on_error` `verbose` `width`
|
105
115
|
`source` | |
|
106
116
|
`step` | |
|
107
117
|
`thread` | | `current` `list` `resume` `stop` `switch`
|
108
118
|
`tracevar` | |
|
109
119
|
`undisplay` | |
|
110
120
|
`up` | |
|
111
|
-
`var` | | `all` `
|
121
|
+
`var` | | `all` `constant` `global` `instance` `local`
|
112
122
|
|
113
123
|
|
114
124
|
## Semantic Versioning
|
@@ -152,22 +162,8 @@ software, specially:
|
|
152
162
|
* @kevjames3 for testing, bug reports and the interest in the project.
|
153
163
|
* @FooBarWidget for working and helping with remote debugging.
|
154
164
|
|
155
|
-
[VersionBadge]: https://badge.fury.io/rb/byebug.svg
|
156
|
-
[VersionURL]: http://badge.fury.io/rb/byebug
|
157
|
-
[TravisBadge]: https://travis-ci.org/deivid-rodriguez/byebug.svg
|
158
|
-
[TravisURL]: http://travis-ci.org/deivid-rodriguez/byebug
|
159
|
-
[CodeClimateBadge]: https://img.shields.io/codeclimate/github/deivid-rodriguez/byebug.svg
|
160
|
-
[CodeClimateURL]: https://codeclimate.com/github/deivid-rodriguez/byebug
|
161
|
-
[GemnasiumBadge]: https://gemnasium.com/deivid-rodriguez/byebug.svg
|
162
|
-
[GemnasiumURL]: https://gemnasium.com/deivid-rodriguez/byebug
|
163
|
-
[CoverageBadge]: https://codeclimate.com/github/deivid-rodriguez/byebug/badges/coverage.svg
|
164
|
-
[CoverageURL]: https://codeclimate.com/github/deivid-rodriguez/byebug
|
165
|
-
[GittipBadge]: http://img.shields.io/gittip/deivid-rodriguez.svg
|
166
|
-
[GittipURL]: https://www.gittip.com/deivid-rodriguez
|
167
|
-
|
168
165
|
[debugger]: https://github.com/cldwalker/debugger
|
169
166
|
[pry]: https://github.com/pry/pry
|
170
|
-
[ruby-debug]: https://github.com/mark-moseley/ruby-debug
|
171
167
|
[debase]: https://github.com/denofevil/debase
|
172
168
|
[pry-byebug]: https://github.com/deivid-rodriguez/pry-byebug
|
173
169
|
[ruby-debug-passenger]: https://github.com/davejamesmiller/ruby-debug-passenger
|
data/Rakefile
CHANGED
@@ -1,41 +1,43 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
#
|
2
|
+
# For the `rake release` task
|
3
|
+
#
|
3
4
|
require 'bundler/gem_tasks'
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
#
|
7
|
+
# Prepend DevKit into compilation phase
|
8
|
+
#
|
9
|
+
task compile: :devkit if RUBY_PLATFORM =~ /mingw/
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
def rake_loader
|
15
|
-
'test/test_helper.rb'
|
16
|
-
end
|
17
|
-
end
|
11
|
+
require 'rake/extensiontask'
|
12
|
+
|
13
|
+
spec = Gem::Specification.load('byebug.gemspec')
|
14
|
+
Rake::ExtensionTask.new('byebug', spec) do |ext|
|
15
|
+
ext.lib_dir = 'lib/byebug'
|
18
16
|
end
|
19
17
|
|
20
18
|
desc 'Run the test suite'
|
21
19
|
task :test do
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
files = Dir.glob('test/**/*_test.rb').join(' ')
|
21
|
+
system("ruby -w -Ilib test/test_helper.rb #{files}") || exit(false)
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'Activates DevKit'
|
25
|
+
task :devkit do
|
26
|
+
begin
|
27
|
+
require 'devkit'
|
28
|
+
rescue LoadError
|
29
|
+
abort "Failed to activate RubyInstaller's DevKit required for compilation."
|
26
30
|
end
|
27
31
|
end
|
28
32
|
|
29
|
-
|
33
|
+
require 'rubocop/rake_task'
|
30
34
|
|
31
|
-
desc 'Run
|
32
|
-
task
|
33
|
-
|
34
|
-
cmd = %(ruby -Itest -e "#{ code }")
|
35
|
-
system cmd
|
35
|
+
desc 'Run RuboCop'
|
36
|
+
task :rubocop do
|
37
|
+
RuboCop::RakeTask.new
|
36
38
|
end
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
require_relative 'tasks/ccop.rb'
|
41
|
+
require_relative 'tasks/dev_utils.rb'
|
42
|
+
|
43
|
+
task default: [:compile, :test, :rubocop, :ccop]
|
data/byebug.gemspec
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/lib/byebug/version'
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
|
-
s.name
|
5
|
-
s.version
|
6
|
-
s.authors
|
7
|
-
s.email
|
8
|
-
s.license
|
9
|
-
s.homepage
|
10
|
-
s.summary
|
4
|
+
s.name = 'byebug'
|
5
|
+
s.version = Byebug::VERSION
|
6
|
+
s.authors = ['David Rodriguez', 'Kent Sibilev', 'Mark Moseley']
|
7
|
+
s.email = 'deivid.rodriguez@mail.com'
|
8
|
+
s.license = 'BSD'
|
9
|
+
s.homepage = 'http://github.com/deivid-rodriguez/byebug'
|
10
|
+
s.summary = 'Ruby 2.0 fast debugger - base + CLI'
|
11
11
|
s.description = "Byebug is a Ruby 2 debugger. It's implemented using the
|
12
12
|
Ruby 2 TracePoint C API for execution control and the Debug Inspector C API
|
13
13
|
for call stack navigation. The core component provides support that
|
@@ -15,17 +15,17 @@ Gem::Specification.new do |s|
|
|
15
15
|
stack frames among other things and it comes with an easy to use command
|
16
16
|
line interface."
|
17
17
|
|
18
|
-
s.required_ruby_version
|
18
|
+
s.required_ruby_version = '>= 2.0.0'
|
19
19
|
|
20
|
-
s.files
|
21
|
-
s.
|
22
|
-
s.bindir
|
23
|
-
s.executables
|
24
|
-
s.extra_rdoc_files = %w(README.md GUIDE.md)
|
25
|
-
s.extensions
|
26
|
-
s.require_path
|
20
|
+
s.files = Dir['lib/**/*.rb', 'ext/**/*.[ch]', '.gitignore', 'LICENSE']
|
21
|
+
s.files += %w(.rubocop.yml .travis.yml byebug.gemspec Gemfile Rakefile)
|
22
|
+
s.bindir = 'bin'
|
23
|
+
s.executables = ['byebug']
|
24
|
+
s.extra_rdoc_files = %w(CHANGELOG.md CONTRIBUTING.md README.md GUIDE.md)
|
25
|
+
s.extensions = ['ext/byebug/extconf.rb']
|
26
|
+
s.require_path = 'lib'
|
27
27
|
|
28
|
-
s.add_dependency 'columnize', '
|
29
|
-
|
30
|
-
s.
|
28
|
+
s.add_dependency 'columnize', '0.9.0'
|
29
|
+
|
30
|
+
s.add_development_dependency 'bundler', '~> 1.7'
|
31
31
|
end
|
data/ext/byebug/breakpoint.c
CHANGED
@@ -45,10 +45,10 @@ brkpt_enabled(VALUE self)
|
|
45
45
|
static VALUE
|
46
46
|
brkpt_set_enabled(VALUE self, VALUE bool)
|
47
47
|
{
|
48
|
-
|
48
|
+
breakpoint_t *breakpoint;
|
49
49
|
|
50
|
-
|
51
|
-
|
50
|
+
Data_Get_Struct(self, breakpoint_t, breakpoint);
|
51
|
+
return breakpoint->enabled = bool;
|
52
52
|
}
|
53
53
|
|
54
54
|
/*
|
@@ -80,7 +80,7 @@ brkpt_set_expr(VALUE self, VALUE expr)
|
|
80
80
|
breakpoint_t *breakpoint;
|
81
81
|
|
82
82
|
Data_Get_Struct(self, breakpoint_t, breakpoint);
|
83
|
-
breakpoint->expr = NIL_P(expr) ? expr: StringValue(expr);
|
83
|
+
breakpoint->expr = NIL_P(expr) ? expr : StringValue(expr);
|
84
84
|
return expr;
|
85
85
|
}
|
86
86
|
|
@@ -97,7 +97,7 @@ brkpt_hit_condition(VALUE self)
|
|
97
97
|
breakpoint_t *breakpoint;
|
98
98
|
|
99
99
|
Data_Get_Struct(self, breakpoint_t, breakpoint);
|
100
|
-
switch(breakpoint->hit_condition)
|
100
|
+
switch (breakpoint->hit_condition)
|
101
101
|
{
|
102
102
|
case HIT_COND_GE:
|
103
103
|
return ID2SYM(rb_intern("greater_or_equal"));
|
@@ -130,11 +130,11 @@ brkpt_set_hit_condition(VALUE self, VALUE value)
|
|
130
130
|
Data_Get_Struct(self, breakpoint_t, breakpoint);
|
131
131
|
id_value = rb_to_id(value);
|
132
132
|
|
133
|
-
if(rb_intern("greater_or_equal") == id_value || rb_intern("ge") == id_value)
|
133
|
+
if (rb_intern("greater_or_equal") == id_value || rb_intern("ge") == id_value)
|
134
134
|
breakpoint->hit_condition = HIT_COND_GE;
|
135
|
-
else if(rb_intern("equal") == id_value || rb_intern("eq") == id_value)
|
135
|
+
else if (rb_intern("equal") == id_value || rb_intern("eq") == id_value)
|
136
136
|
breakpoint->hit_condition = HIT_COND_EQ;
|
137
|
-
else if(rb_intern("modulo") == id_value || rb_intern("mod") == id_value)
|
137
|
+
else if (rb_intern("modulo") == id_value || rb_intern("mod") == id_value)
|
138
138
|
breakpoint->hit_condition = HIT_COND_MOD;
|
139
139
|
else
|
140
140
|
rb_raise(rb_eArgError, "Invalid condition parameter");
|
@@ -166,10 +166,10 @@ brkpt_hit_count(VALUE self)
|
|
166
166
|
static VALUE
|
167
167
|
brkpt_hit_value(VALUE self)
|
168
168
|
{
|
169
|
-
|
169
|
+
breakpoint_t *breakpoint;
|
170
170
|
|
171
|
-
|
172
|
-
|
171
|
+
Data_Get_Struct(self, breakpoint_t, breakpoint);
|
172
|
+
return INT2FIX(breakpoint->hit_value);
|
173
173
|
}
|
174
174
|
|
175
175
|
/*
|
@@ -182,11 +182,11 @@ brkpt_hit_value(VALUE self)
|
|
182
182
|
static VALUE
|
183
183
|
brkpt_set_hit_value(VALUE self, VALUE value)
|
184
184
|
{
|
185
|
-
|
185
|
+
breakpoint_t *breakpoint;
|
186
186
|
|
187
|
-
|
188
|
-
|
189
|
-
|
187
|
+
Data_Get_Struct(self, breakpoint_t, breakpoint);
|
188
|
+
breakpoint->hit_value = FIX2INT(value);
|
189
|
+
return value;
|
190
190
|
}
|
191
191
|
|
192
192
|
/*
|
@@ -239,7 +239,7 @@ brkpt_source(VALUE self)
|
|
239
239
|
}
|
240
240
|
|
241
241
|
static void
|
242
|
-
mark_breakpoint(breakpoint_t *breakpoint)
|
242
|
+
mark_breakpoint(breakpoint_t * breakpoint)
|
243
243
|
{
|
244
244
|
rb_gc_mark(breakpoint->source);
|
245
245
|
rb_gc_mark(breakpoint->expr);
|
@@ -261,10 +261,10 @@ brkpt_initialize(VALUE self, VALUE source, VALUE pos, VALUE expr)
|
|
261
261
|
Data_Get_Struct(self, breakpoint_t, breakpoint);
|
262
262
|
|
263
263
|
breakpoint->type = FIXNUM_P(pos) ? BP_POS_TYPE : BP_METHOD_TYPE;
|
264
|
-
if(breakpoint->type == BP_POS_TYPE)
|
265
|
-
|
264
|
+
if (breakpoint->type == BP_POS_TYPE)
|
265
|
+
breakpoint->pos.line = FIX2INT(pos);
|
266
266
|
else
|
267
|
-
|
267
|
+
breakpoint->pos.mid = SYM2ID(pos);
|
268
268
|
|
269
269
|
breakpoint->id = ++breakpoint_max;
|
270
270
|
breakpoint->source = StringValue(source);
|
@@ -282,7 +282,7 @@ filename_cmp_impl(VALUE source, char *file)
|
|
282
282
|
{
|
283
283
|
char *source_ptr, *file_ptr;
|
284
284
|
long s_len, f_len, min_len;
|
285
|
-
long s,f;
|
285
|
+
long s, f;
|
286
286
|
int dirsep_flag = 0;
|
287
287
|
|
288
288
|
s_len = RSTRING_LEN(source);
|
@@ -290,19 +290,20 @@ filename_cmp_impl(VALUE source, char *file)
|
|
290
290
|
min_len = s_len < f_len ? s_len : f_len;
|
291
291
|
|
292
292
|
source_ptr = RSTRING_PTR(source);
|
293
|
-
file_ptr
|
293
|
+
file_ptr = file;
|
294
294
|
|
295
|
-
for(
|
295
|
+
for (s = s_len - 1, f = f_len - 1;
|
296
|
+
s >= s_len - min_len && f >= f_len - min_len; s--, f--)
|
296
297
|
{
|
297
|
-
if((source_ptr[s] == '.' || file_ptr[f] == '.') && dirsep_flag)
|
298
|
+
if ((source_ptr[s] == '.' || file_ptr[f] == '.') && dirsep_flag)
|
298
299
|
return 1;
|
299
|
-
if(isdirsep(source_ptr[s]) && isdirsep(file_ptr[f]))
|
300
|
+
if (isdirsep(source_ptr[s]) && isdirsep(file_ptr[f]))
|
300
301
|
dirsep_flag = 1;
|
301
302
|
#ifdef DOSISH_DRIVE_LETTER
|
302
303
|
else if (s == 0)
|
303
|
-
return(toupper(source_ptr[s]) == toupper(file_ptr[f]));
|
304
|
+
return (toupper(source_ptr[s]) == toupper(file_ptr[f]));
|
304
305
|
#endif
|
305
|
-
else if(source_ptr[s] != file_ptr[f])
|
306
|
+
else if (source_ptr[s] != file_ptr[f])
|
306
307
|
return 0;
|
307
308
|
}
|
308
309
|
return 1;
|
@@ -316,11 +317,13 @@ filename_cmp(VALUE source, char *file)
|
|
316
317
|
#else
|
317
318
|
#ifdef PATH_MAX
|
318
319
|
char path[PATH_MAX + 1];
|
320
|
+
|
319
321
|
path[PATH_MAX] = 0;
|
320
322
|
return filename_cmp_impl(source, realpath(file, path) != NULL ? path : file);
|
321
323
|
#else
|
322
324
|
char *path;
|
323
325
|
int result;
|
326
|
+
|
324
327
|
path = realpath(file, NULL);
|
325
328
|
result = filename_cmp_impl(source, path == NULL ? file : path);
|
326
329
|
free(path);
|
@@ -329,15 +332,28 @@ filename_cmp(VALUE source, char *file)
|
|
329
332
|
#endif
|
330
333
|
}
|
331
334
|
|
335
|
+
int
|
336
|
+
classname_cmp(VALUE name, VALUE klass)
|
337
|
+
{
|
338
|
+
VALUE mod_name;
|
339
|
+
VALUE class_name = NIL_P(name) ? rb_str_new2("main") : name;
|
340
|
+
|
341
|
+
if (NIL_P(klass))
|
342
|
+
return 0;
|
343
|
+
|
344
|
+
mod_name = rb_mod_name(klass);
|
345
|
+
return (mod_name != Qnil && rb_str_cmp(class_name, mod_name) == 0);
|
346
|
+
}
|
347
|
+
|
332
348
|
static int
|
333
|
-
check_breakpoint_by_hit_condition(VALUE
|
349
|
+
check_breakpoint_by_hit_condition(VALUE rb_breakpoint)
|
334
350
|
{
|
335
351
|
breakpoint_t *breakpoint;
|
336
352
|
|
337
|
-
if (
|
353
|
+
if (NIL_P(rb_breakpoint))
|
338
354
|
return 0;
|
339
355
|
|
340
|
-
Data_Get_Struct(
|
356
|
+
Data_Get_Struct(rb_breakpoint, breakpoint_t, breakpoint);
|
341
357
|
breakpoint->hit_count++;
|
342
358
|
|
343
359
|
if (Qtrue != breakpoint->enabled)
|
@@ -370,74 +386,71 @@ check_breakpoint_by_hit_condition(VALUE breakpoint_object)
|
|
370
386
|
}
|
371
387
|
|
372
388
|
static int
|
373
|
-
check_breakpoint_by_pos(VALUE
|
389
|
+
check_breakpoint_by_pos(VALUE rb_breakpoint, char *file, int line)
|
374
390
|
{
|
375
391
|
breakpoint_t *breakpoint;
|
376
392
|
|
377
|
-
if (
|
393
|
+
if (NIL_P(rb_breakpoint))
|
378
394
|
return 0;
|
379
395
|
|
380
|
-
Data_Get_Struct(
|
396
|
+
Data_Get_Struct(rb_breakpoint, breakpoint_t, breakpoint);
|
381
397
|
|
382
|
-
if (
|
383
|
-
|
384
|
-
(breakpoint->pos.line != line) )
|
398
|
+
if (Qfalse == breakpoint->enabled || breakpoint->type != BP_POS_TYPE
|
399
|
+
|| breakpoint->pos.line != line)
|
385
400
|
return 0;
|
386
401
|
|
387
402
|
return filename_cmp(breakpoint->source, file);
|
388
403
|
}
|
389
404
|
|
390
405
|
static int
|
391
|
-
check_breakpoint_by_method(VALUE
|
392
|
-
VALUE self)
|
406
|
+
check_breakpoint_by_method(VALUE rb_breakpoint, VALUE klass, ID mid, VALUE self)
|
393
407
|
{
|
394
408
|
breakpoint_t *breakpoint;
|
395
409
|
|
396
|
-
if (
|
410
|
+
if (NIL_P(rb_breakpoint))
|
397
411
|
return 0;
|
398
412
|
|
399
|
-
Data_Get_Struct(
|
413
|
+
Data_Get_Struct(rb_breakpoint, breakpoint_t, breakpoint);
|
400
414
|
|
401
|
-
if (
|
402
|
-
|
403
|
-
(breakpoint->pos.mid != mid) )
|
415
|
+
if (Qfalse == breakpoint->enabled || breakpoint->type != BP_METHOD_TYPE
|
416
|
+
|| breakpoint->pos.mid != mid)
|
404
417
|
return 0;
|
405
418
|
|
406
|
-
if (
|
407
|
-
|
419
|
+
if (classname_cmp(breakpoint->source, klass)
|
420
|
+
|| ((rb_type(self) == T_CLASS || rb_type(self) == T_MODULE)
|
421
|
+
&& classname_cmp(breakpoint->source, self)))
|
408
422
|
return 1;
|
409
423
|
|
410
424
|
return 0;
|
411
425
|
}
|
412
426
|
|
413
427
|
static int
|
414
|
-
check_breakpoint_by_expr(VALUE
|
428
|
+
check_breakpoint_by_expr(VALUE rb_breakpoint, VALUE bind)
|
415
429
|
{
|
416
430
|
breakpoint_t *breakpoint;
|
417
431
|
VALUE args, expr_result;
|
418
432
|
|
419
|
-
if (NIL_P(
|
433
|
+
if (NIL_P(rb_breakpoint))
|
420
434
|
return 0;
|
421
435
|
|
422
|
-
Data_Get_Struct(
|
436
|
+
Data_Get_Struct(rb_breakpoint, breakpoint_t, breakpoint);
|
423
437
|
|
424
|
-
if (
|
438
|
+
if (Qfalse == breakpoint->enabled)
|
425
439
|
return 0;
|
426
440
|
|
427
441
|
if (NIL_P(breakpoint->expr))
|
428
442
|
return 1;
|
429
443
|
|
430
|
-
args = rb_ary_new3(2, breakpoint->expr,
|
444
|
+
args = rb_ary_new3(2, breakpoint->expr, bind);
|
431
445
|
expr_result = rb_protect(eval_expression, args, 0);
|
432
446
|
|
433
447
|
return RTEST(expr_result);
|
434
448
|
}
|
435
449
|
|
436
450
|
extern VALUE
|
437
|
-
find_breakpoint_by_pos(VALUE breakpoints, VALUE source, VALUE pos,
|
438
|
-
VALUE binding)
|
451
|
+
find_breakpoint_by_pos(VALUE breakpoints, VALUE source, VALUE pos, VALUE bind)
|
439
452
|
{
|
440
|
-
VALUE
|
453
|
+
VALUE breakpoint;
|
441
454
|
char *file;
|
442
455
|
int line;
|
443
456
|
int i;
|
@@ -446,32 +459,32 @@ find_breakpoint_by_pos(VALUE breakpoints, VALUE source, VALUE pos,
|
|
446
459
|
line = FIX2INT(pos);
|
447
460
|
for (i = 0; i < RARRAY_LENINT(breakpoints); i++)
|
448
461
|
{
|
449
|
-
|
450
|
-
if (check_breakpoint_by_pos(
|
451
|
-
check_breakpoint_by_expr(
|
452
|
-
check_breakpoint_by_hit_condition(
|
462
|
+
breakpoint = rb_ary_entry(breakpoints, i);
|
463
|
+
if (check_breakpoint_by_pos(breakpoint, file, line)
|
464
|
+
&& check_breakpoint_by_expr(breakpoint, bind)
|
465
|
+
&& check_breakpoint_by_hit_condition(breakpoint))
|
453
466
|
{
|
454
|
-
return
|
467
|
+
return breakpoint;
|
455
468
|
}
|
456
469
|
}
|
457
470
|
return Qnil;
|
458
471
|
}
|
459
472
|
|
460
473
|
extern VALUE
|
461
|
-
find_breakpoint_by_method(VALUE breakpoints, VALUE klass, ID mid, VALUE
|
474
|
+
find_breakpoint_by_method(VALUE breakpoints, VALUE klass, ID mid, VALUE bind,
|
462
475
|
VALUE self)
|
463
476
|
{
|
464
|
-
VALUE
|
477
|
+
VALUE breakpoint;
|
465
478
|
int i;
|
466
479
|
|
467
480
|
for (i = 0; i < RARRAY_LENINT(breakpoints); i++)
|
468
481
|
{
|
469
|
-
|
470
|
-
if (check_breakpoint_by_method(
|
471
|
-
check_breakpoint_by_expr(
|
472
|
-
check_breakpoint_by_hit_condition(
|
482
|
+
breakpoint = rb_ary_entry(breakpoints, i);
|
483
|
+
if (check_breakpoint_by_method(breakpoint, klass, mid, self)
|
484
|
+
&& check_breakpoint_by_expr(breakpoint, bind)
|
485
|
+
&& check_breakpoint_by_hit_condition(breakpoint))
|
473
486
|
{
|
474
|
-
return
|
487
|
+
return breakpoint;
|
475
488
|
}
|
476
489
|
}
|
477
490
|
return Qnil;
|
@@ -487,18 +500,18 @@ Init_breakpoint(VALUE mByebug)
|
|
487
500
|
rb_define_alloc_func(cBreakpoint, brkpt_create);
|
488
501
|
rb_define_method(cBreakpoint, "initialize", brkpt_initialize, 3);
|
489
502
|
|
490
|
-
rb_define_method(cBreakpoint, "enabled?"
|
491
|
-
rb_define_method(cBreakpoint, "enabled="
|
492
|
-
rb_define_method(cBreakpoint, "expr"
|
493
|
-
rb_define_method(cBreakpoint, "expr="
|
494
|
-
rb_define_method(cBreakpoint, "hit_count"
|
495
|
-
rb_define_method(cBreakpoint, "hit_condition"
|
503
|
+
rb_define_method(cBreakpoint, "enabled?", brkpt_enabled, 0);
|
504
|
+
rb_define_method(cBreakpoint, "enabled=", brkpt_set_enabled, 1);
|
505
|
+
rb_define_method(cBreakpoint, "expr", brkpt_expr, 0);
|
506
|
+
rb_define_method(cBreakpoint, "expr=", brkpt_set_expr, 1);
|
507
|
+
rb_define_method(cBreakpoint, "hit_count", brkpt_hit_count, 0);
|
508
|
+
rb_define_method(cBreakpoint, "hit_condition", brkpt_hit_condition, 0);
|
496
509
|
rb_define_method(cBreakpoint, "hit_condition=", brkpt_set_hit_condition, 1);
|
497
|
-
rb_define_method(cBreakpoint, "hit_value"
|
498
|
-
rb_define_method(cBreakpoint, "hit_value="
|
499
|
-
rb_define_method(cBreakpoint, "id"
|
500
|
-
rb_define_method(cBreakpoint, "pos"
|
501
|
-
rb_define_method(cBreakpoint, "source"
|
510
|
+
rb_define_method(cBreakpoint, "hit_value", brkpt_hit_value, 0);
|
511
|
+
rb_define_method(cBreakpoint, "hit_value=", brkpt_set_hit_value, 1);
|
512
|
+
rb_define_method(cBreakpoint, "id", brkpt_id, 0);
|
513
|
+
rb_define_method(cBreakpoint, "pos", brkpt_pos, 0);
|
514
|
+
rb_define_method(cBreakpoint, "source", brkpt_source, 0);
|
502
515
|
|
503
516
|
idEval = rb_intern("eval");
|
504
517
|
}
|