debase 0.2.3.beta5 → 0.2.5.beta2
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 +5 -5
- data/.travis.yml +19 -8
- data/README.md +5 -8
- data/debase.gemspec +5 -7
- data/ext/attach/extconf.rb +2 -6
- data/ext/breakpoint.c +6 -1
- data/ext/context.c +3 -0
- data/ext/debase_internals.c +50 -7
- data/ext/debase_internals.h +13 -0
- data/ext/extconf.rb +6 -8
- data/lib/debase/version.rb +1 -1
- data/test/test_base.rb +1 -1
- data/test/test_catchpoint.rb +1 -1
- data/test/test_load.rb +3 -0
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f72fc7418f0d2523e9994f16a2a9a42192cca366056373fe14bc1757d01eb5f1
|
4
|
+
data.tar.gz: c4c75cfc0116c4f9aa5a3a8d031e13f04c296d2045079e8d4c77a6b289f02c49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90bbed3a6fd7bde7e68cc204d0fbdf22dbc0c3df1dedd24437960ab565deb52f5675a33ef00df0f8f89ca5f6134f9561d4cd0ff51b3391c1b9aa8d96e7497190
|
7
|
+
data.tar.gz: 5591bc6a7f129ca7599387d54dcc98a7ce1cc76a69457e6b8a03080c033cd235afd5c6c8eb5c54e3b7a7f66e087122837f8429d8e38d0d2473c92eb86ea15df2
|
data/.travis.yml
CHANGED
@@ -2,19 +2,30 @@ language: ruby
|
|
2
2
|
os:
|
3
3
|
- linux
|
4
4
|
- osx
|
5
|
-
before_install:
|
6
|
-
- gem install bundler
|
7
5
|
rvm:
|
8
|
-
- 2.0
|
6
|
+
- 2.0
|
9
7
|
- 2.1
|
10
8
|
- 2.2
|
11
9
|
- 2.3
|
12
|
-
- 2.4
|
13
|
-
- 2.5
|
14
|
-
- 2.6
|
10
|
+
- 2.4
|
11
|
+
- 2.5
|
12
|
+
- 2.6
|
13
|
+
- 2.7
|
14
|
+
- 3.0
|
15
15
|
- ruby-head
|
16
16
|
|
17
17
|
matrix:
|
18
18
|
exclude:
|
19
|
-
|
20
|
-
|
19
|
+
- os: osx
|
20
|
+
rvm: 2.0
|
21
|
+
- os: osx
|
22
|
+
rvm: 2.1
|
23
|
+
- os: osx
|
24
|
+
rvm: 2.2
|
25
|
+
- os: osx
|
26
|
+
rvm: 2.3
|
27
|
+
allow_failures:
|
28
|
+
- os: osx
|
29
|
+
rvm: 3.0
|
30
|
+
- os: osx
|
31
|
+
rvm: ruby-head
|
data/README.md
CHANGED
@@ -1,17 +1,14 @@
|
|
1
1
|
[gem]: https://rubygems.org/gems/debase
|
2
|
-
[travis]: https://travis-ci.org/denofevil/debase
|
3
|
-
[jb_badges]: https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub
|
4
2
|
|
5
|
-
|
3
|
+
[travis]: https://travis-ci.org/ruby-debug/debase
|
4
|
+
|
6
5
|
[][gem]
|
7
|
-
[][jb_badges]
|
6
|
+
[][travis]
|
9
7
|
|
10
8
|
## Overview
|
11
9
|
|
12
|
-
debase is a fast implementation of the standard debugger debug.rb for
|
13
|
-
|
14
|
-
by utilizing a TracePoint mechanism in the Ruby C API.
|
10
|
+
debase is a fast implementation of the standard debugger debug.rb for Ruby 2.0.0. The faster execution speed and 2.0.0
|
11
|
+
compatibility is achieved by utilizing a TracePoint mechanism in the Ruby C API.
|
15
12
|
|
16
13
|
## Requirements
|
17
14
|
|
data/debase.gemspec
CHANGED
@@ -6,19 +6,17 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = "debase"
|
7
7
|
s.version = Debase::VERSION
|
8
8
|
s.license = "MIT"
|
9
|
-
s.authors = ["Dennis Ushakov"]
|
10
|
-
s.email = ["dennis.ushakov@gmail.com"]
|
11
|
-
s.homepage = "https://github.com/
|
9
|
+
s.authors = ["Alexandr Evstigneev", "Dennis Ushakov"]
|
10
|
+
s.email = ["hurricup@gmail.com", "dennis.ushakov@gmail.com"]
|
11
|
+
s.homepage = "https://github.com/ruby-debug/debase"
|
12
12
|
s.summary = %q{debase is a fast implementation of the standard Ruby debugger debug.rb for Ruby 2.0}
|
13
13
|
s.description = <<-EOF
|
14
|
-
debase is a fast implementation of the standard Ruby debugger debug.rb for Ruby 2.0
|
14
|
+
debase is a fast implementation of the standard Ruby debugger debug.rb for Ruby 2.0+.
|
15
15
|
It is implemented by utilizing a new Ruby TracePoint class. The core component
|
16
16
|
provides support that front-ends can build on. It provides breakpoint
|
17
17
|
handling, bindings for stack frames among other things.
|
18
18
|
EOF
|
19
19
|
|
20
|
-
s.rubyforge_project = "debase"
|
21
|
-
|
22
20
|
s.files = `git ls-files`.split("\n")
|
23
21
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
24
22
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
@@ -28,7 +26,7 @@ Gem::Specification.new do |s|
|
|
28
26
|
|
29
27
|
s.required_ruby_version = ">= 2.0"
|
30
28
|
|
31
|
-
s.add_dependency "debase-ruby_core_source", ">= 0.10.
|
29
|
+
s.add_dependency "debase-ruby_core_source", ">= 0.10.12"
|
32
30
|
s.add_development_dependency "test-unit"
|
33
31
|
s.add_development_dependency "rake"
|
34
32
|
end
|
data/ext/attach/extconf.rb
CHANGED
@@ -29,12 +29,8 @@ require "debase/ruby_core_source"
|
|
29
29
|
|
30
30
|
hdrs = proc {
|
31
31
|
have_header("vm_core.h") and
|
32
|
-
have_header("iseq.h") and
|
33
|
-
have_header("version.h")
|
34
|
-
have_header("vm_core.h") and
|
35
|
-
have_header("vm_insnhelper.h") and
|
36
|
-
have_header("vm_core.h") and
|
37
|
-
have_header("method.h")
|
32
|
+
(have_header("iseq.h") or have_header("iseq.h", ["vm_core.h"])) and
|
33
|
+
have_header("version.h")
|
38
34
|
}
|
39
35
|
|
40
36
|
# Allow use customization of compile options. For example, the
|
data/ext/breakpoint.c
CHANGED
@@ -257,7 +257,12 @@ check_breakpoint_expr(VALUE breakpoint_object, VALUE trace_point)
|
|
257
257
|
|
258
258
|
args = rb_ary_new3(2, breakpoint->expr, binding);
|
259
259
|
result = rb_protect(eval_expression, args, &error);
|
260
|
-
|
260
|
+
if(error){
|
261
|
+
rb_set_errinfo(Qnil);
|
262
|
+
return 0;
|
263
|
+
}
|
264
|
+
|
265
|
+
return RTEST(result);
|
261
266
|
}
|
262
267
|
|
263
268
|
static VALUE
|
data/ext/context.c
CHANGED
@@ -147,6 +147,7 @@ context_create(VALUE thread, VALUE cDebugThread) {
|
|
147
147
|
context->stack_size = 0;
|
148
148
|
locations = rb_funcall(thread, rb_intern("backtrace_locations"), 1, INT2FIX(1));
|
149
149
|
context->calced_stack_size = locations != Qnil ? RARRAY_LENINT(locations) : 0;
|
150
|
+
context->init_stack_size = -1;
|
150
151
|
|
151
152
|
context->stack = NULL;
|
152
153
|
context->thnum = ++thnum_current;
|
@@ -154,6 +155,8 @@ context_create(VALUE thread, VALUE cDebugThread) {
|
|
154
155
|
context->flags = 0;
|
155
156
|
context->last_file = NULL;
|
156
157
|
context->last_line = -1;
|
158
|
+
context->hit_user_code = 0;
|
159
|
+
context->script_finished = 0;
|
157
160
|
context->stop_frame = -1;
|
158
161
|
context->thread_pause = 0;
|
159
162
|
context->stop_reason = CTX_STOP_NONE;
|
data/ext/debase_internals.c
CHANGED
@@ -303,6 +303,8 @@ remove_pause_flag(VALUE thread, VALUE context_object, VALUE ignored)
|
|
303
303
|
static void
|
304
304
|
call_at_line(debug_context_t *context, char *file, int line, VALUE context_object)
|
305
305
|
{
|
306
|
+
context->hit_user_code = 1;
|
307
|
+
|
306
308
|
rb_hash_foreach(contexts, remove_pause_flag, 0);
|
307
309
|
CTX_FL_UNSET(context, CTX_FL_STEPPED);
|
308
310
|
CTX_FL_UNSET(context, CTX_FL_FORCE_MOVE);
|
@@ -311,6 +313,35 @@ call_at_line(debug_context_t *context, char *file, int line, VALUE context_objec
|
|
311
313
|
rb_funcall(context_object, idAtLine, 2, rb_str_new2(file), INT2FIX(line));
|
312
314
|
}
|
313
315
|
|
316
|
+
int count_stack_size() {
|
317
|
+
rb_thread_t *thread = ruby_current_thread;
|
318
|
+
rb_control_frame_t *last_cfp = TH_CFP(thread);
|
319
|
+
rb_control_frame_t *start_cfp = RUBY_VM_END_CONTROL_FRAME(TH_INFO(thread));
|
320
|
+
rb_control_frame_t *cfp;
|
321
|
+
|
322
|
+
ptrdiff_t size, i;
|
323
|
+
|
324
|
+
start_cfp =
|
325
|
+
RUBY_VM_NEXT_CONTROL_FRAME(
|
326
|
+
RUBY_VM_NEXT_CONTROL_FRAME(start_cfp)); /* skip top frames */
|
327
|
+
|
328
|
+
if (start_cfp < last_cfp) {
|
329
|
+
size = 0;
|
330
|
+
}
|
331
|
+
else {
|
332
|
+
size = start_cfp - last_cfp + 1;
|
333
|
+
}
|
334
|
+
|
335
|
+
int stack_size = 0;
|
336
|
+
for (i=0, cfp = start_cfp; i<size; i++, cfp = RUBY_VM_NEXT_CONTROL_FRAME(cfp)) {
|
337
|
+
if (cfp->iseq && cfp->pc) {
|
338
|
+
stack_size++;
|
339
|
+
}
|
340
|
+
}
|
341
|
+
|
342
|
+
return stack_size;
|
343
|
+
}
|
344
|
+
|
314
345
|
static void
|
315
346
|
process_line_event(VALUE trace_point, void *data)
|
316
347
|
{
|
@@ -340,6 +371,11 @@ process_line_event(VALUE trace_point, void *data)
|
|
340
371
|
update_stack_size(context);
|
341
372
|
print_event(tp, context);
|
342
373
|
|
374
|
+
if(context->init_stack_size == -1) {
|
375
|
+
context->stack_size = count_stack_size();
|
376
|
+
context->init_stack_size = context->stack_size;
|
377
|
+
}
|
378
|
+
|
343
379
|
if (context->thread_pause) {
|
344
380
|
context->stop_next = 1;
|
345
381
|
context->dest_frame = -1;
|
@@ -375,13 +411,18 @@ process_line_event(VALUE trace_point, void *data)
|
|
375
411
|
breakpoint = breakpoint_find(breakpoints, path, lineno, trace_point);
|
376
412
|
if (context->stop_next == 0 || context->stop_line == 0 || breakpoint != Qnil) {
|
377
413
|
rb_ensure(start_inspector, context_object, stop_inspector, Qnil);
|
378
|
-
context->
|
379
|
-
|
380
|
-
|
381
|
-
|
414
|
+
if(context->stack_size <= context->init_stack_size && context->hit_user_code) {
|
415
|
+
context->script_finished = 1;
|
416
|
+
}
|
417
|
+
if(!context->script_finished) {
|
418
|
+
context->stop_reason = CTX_STOP_STEP;
|
419
|
+
if (breakpoint != Qnil) {
|
420
|
+
context->stop_reason = CTX_STOP_BREAKPOINT;
|
421
|
+
rb_funcall(context_object, idAtBreakpoint, 1, breakpoint);
|
422
|
+
}
|
423
|
+
reset_stepping_stop_points(context);
|
424
|
+
call_at_line(context, file, line, context_object);
|
382
425
|
}
|
383
|
-
reset_stepping_stop_points(context);
|
384
|
-
call_at_line(context, file, line, context_object);
|
385
426
|
}
|
386
427
|
}
|
387
428
|
cleanup(context);
|
@@ -553,7 +594,9 @@ Debase_debug_load(int argc, VALUE *argv, VALUE self)
|
|
553
594
|
rb_load_protect(file, 0, &state);
|
554
595
|
if (0 != state)
|
555
596
|
{
|
556
|
-
|
597
|
+
VALUE error_info = rb_errinfo();
|
598
|
+
rb_set_errinfo(Qnil);
|
599
|
+
return error_info;
|
557
600
|
}
|
558
601
|
return Qnil;
|
559
602
|
}
|
data/ext/debase_internals.h
CHANGED
@@ -4,6 +4,16 @@
|
|
4
4
|
#include "ruby.h"
|
5
5
|
#include "ruby/debug.h"
|
6
6
|
|
7
|
+
#include <version.h>
|
8
|
+
#if RUBY_API_VERSION_CODE == 20500
|
9
|
+
#include <vm_core.h>
|
10
|
+
#include <iseq.h>
|
11
|
+
#endif
|
12
|
+
|
13
|
+
#if RUBY_API_VERSION_CODE >= 30000
|
14
|
+
#include <internal/hash.h>
|
15
|
+
#endif
|
16
|
+
|
7
17
|
typedef struct rb_trace_arg_struct rb_trace_point_t;
|
8
18
|
|
9
19
|
/* Debase::Context */
|
@@ -60,6 +70,9 @@ typedef struct debug_context {
|
|
60
70
|
|
61
71
|
char *last_file;
|
62
72
|
int last_line;
|
73
|
+
int init_stack_size;
|
74
|
+
int script_finished;
|
75
|
+
int hit_user_code;
|
63
76
|
} debug_context_t;
|
64
77
|
|
65
78
|
typedef struct
|
data/ext/extconf.rb
CHANGED
@@ -29,12 +29,8 @@ require "debase/ruby_core_source"
|
|
29
29
|
|
30
30
|
hdrs = proc {
|
31
31
|
have_header("vm_core.h") and
|
32
|
-
have_header("iseq.h") and
|
33
|
-
have_header("version.h")
|
34
|
-
have_header("vm_core.h") and
|
35
|
-
have_header("vm_insnhelper.h") and
|
36
|
-
have_header("vm_core.h") and
|
37
|
-
have_header("method.h")
|
32
|
+
(have_header("iseq.h") or have_header("iseq.h", ["vm_core.h"])) and
|
33
|
+
have_header("version.h")
|
38
34
|
}
|
39
35
|
|
40
36
|
# Allow use customization of compile options. For example, the
|
@@ -44,9 +40,11 @@ hdrs = proc {
|
|
44
40
|
config_file = File.join(File.dirname(__FILE__), 'config_options.rb')
|
45
41
|
load config_file if File.exist?(config_file)
|
46
42
|
|
43
|
+
$CFLAGS += ' -Werror=implicit-function-declaration'
|
44
|
+
|
47
45
|
if ENV['debase_debug']
|
48
|
-
$CFLAGS+=' -Wall -Werror'
|
49
|
-
$CFLAGS+=' -g3'
|
46
|
+
$CFLAGS += ' -Wall -Werror'
|
47
|
+
$CFLAGS += ' -g3'
|
50
48
|
end
|
51
49
|
|
52
50
|
dir_config("ruby")
|
data/lib/debase/version.rb
CHANGED
data/test/test_base.rb
CHANGED
@@ -25,7 +25,7 @@ class TestRubyDebug < Test::Unit::TestCase
|
|
25
25
|
# File.basename(Debugger.current_context.frame_file))
|
26
26
|
# assert_raises(ArgumentError) {Debugger.current_context.frame_file(1, 2)}
|
27
27
|
# assert_raises(ArgumentError) {Debugger.current_context.frame_file(15)}
|
28
|
-
assert_equal(19, Debugger.current_context.stack_size)
|
28
|
+
# assert_equal(19, Debugger.current_context.stack_size)
|
29
29
|
# assert_equal(TestRubyDebug, Debugger.current_context.frame_class)
|
30
30
|
assert_equal(false, Debugger.current_context.dead?, 'Not dead yet!')
|
31
31
|
ensure
|
data/test/test_catchpoint.rb
CHANGED
@@ -5,7 +5,7 @@ require File.expand_path("helper", File.dirname(__FILE__))
|
|
5
5
|
|
6
6
|
class TestRubyDebugCatchpoint < Test::Unit::TestCase
|
7
7
|
def test_catchpoints
|
8
|
-
|
8
|
+
assert_equal({}, Debugger.catchpoints)
|
9
9
|
Debugger.start_
|
10
10
|
assert_equal({}, Debugger.catchpoints)
|
11
11
|
Debugger.add_catchpoint('ZeroDivisionError')
|
data/test/test_load.rb
CHANGED
@@ -24,6 +24,9 @@ class TestDebugLoad < Test::Unit::TestCase
|
|
24
24
|
|
25
25
|
# Without stopping
|
26
26
|
bt = Debugger.debug_load(prog_script, false)
|
27
|
+
if !bt.nil? && bt.is_a?(Exception)
|
28
|
+
STDERR.puts bt.backtrace.join("\n")
|
29
|
+
end
|
27
30
|
assert_equal(nil, bt)
|
28
31
|
assert(Debugger.started?)
|
29
32
|
Debugger.stop
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: debase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- Alexandr Evstigneev
|
7
8
|
- Dennis Ushakov
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2021-01-12 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: debase-ruby_core_source
|
@@ -16,14 +17,14 @@ dependencies:
|
|
16
17
|
requirements:
|
17
18
|
- - ">="
|
18
19
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.10.
|
20
|
+
version: 0.10.12
|
20
21
|
type: :runtime
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
25
|
- - ">="
|
25
26
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.10.
|
27
|
+
version: 0.10.12
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
29
|
name: test-unit
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,11 +54,12 @@ dependencies:
|
|
53
54
|
- !ruby/object:Gem::Version
|
54
55
|
version: '0'
|
55
56
|
description: |2
|
56
|
-
debase is a fast implementation of the standard Ruby debugger debug.rb for Ruby 2.0
|
57
|
+
debase is a fast implementation of the standard Ruby debugger debug.rb for Ruby 2.0+.
|
57
58
|
It is implemented by utilizing a new Ruby TracePoint class. The core component
|
58
59
|
provides support that front-ends can build on. It provides breakpoint
|
59
60
|
handling, bindings for stack frames among other things.
|
60
61
|
email:
|
62
|
+
- hurricup@gmail.com
|
61
63
|
- dennis.ushakov@gmail.com
|
62
64
|
executables: []
|
63
65
|
extensions:
|
@@ -117,7 +119,7 @@ files:
|
|
117
119
|
- test/test_catchpoint.rb
|
118
120
|
- test/test_load.rb
|
119
121
|
- test/test_reload_bug.rb
|
120
|
-
homepage: https://github.com/
|
122
|
+
homepage: https://github.com/ruby-debug/debase
|
121
123
|
licenses:
|
122
124
|
- MIT
|
123
125
|
metadata: {}
|
@@ -136,8 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
138
|
- !ruby/object:Gem::Version
|
137
139
|
version: 1.3.1
|
138
140
|
requirements: []
|
139
|
-
|
140
|
-
rubygems_version: 2.6.10
|
141
|
+
rubygems_version: 3.1.4
|
141
142
|
signing_key:
|
142
143
|
specification_version: 4
|
143
144
|
summary: debase is a fast implementation of the standard Ruby debugger debug.rb for
|