debase 0.2.2 → 0.2.3.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/attach/extconf.rb +7 -1
- data/ext/context.c +1 -16
- data/ext/debase_internals.c +32 -12
- data/ext/debase_internals.h +6 -4
- data/ext/extconf.rb +7 -2
- data/lib/debase.rb +30 -1
- data/lib/debase/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d0b4ffcf1b88d08e500071b97bd7d2679119dd8
|
4
|
+
data.tar.gz: aea5553eb0fbac211cf081807605bf4226dfd08c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e8c2f94ef8590ee3e94214f641434e5e9d67dc8eb8094830502666772a1896b8df22d9733e885213d6c28018eff2c524e680d12c906baeb7e47f68effdac90b
|
7
|
+
data.tar.gz: a562cc46f2128e1fe54a71052aed7451687c6a2d28a238a7ae7994e8cc2499e23de94c6c93d5fc00c53eb7a718128cd92b543582e7061d78f9e688a3aae1c03b
|
data/ext/attach/extconf.rb
CHANGED
@@ -28,7 +28,13 @@ RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']
|
|
28
28
|
require "debase/ruby_core_source"
|
29
29
|
|
30
30
|
hdrs = proc {
|
31
|
-
have_header("vm_core.h")
|
31
|
+
have_header("vm_core.h") and
|
32
|
+
have_header("iseq.h") and
|
33
|
+
have_header("version.h") and
|
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
38
|
}
|
33
39
|
|
34
40
|
# Allow use customization of compile options. For example, the
|
data/ext/context.c
CHANGED
@@ -135,7 +135,6 @@ Context_mark(debug_context_t *context)
|
|
135
135
|
|
136
136
|
static void
|
137
137
|
Context_free(debug_context_t *context) {
|
138
|
-
xfree(context->init_stack_files);
|
139
138
|
xfree(context);
|
140
139
|
}
|
141
140
|
|
@@ -143,25 +142,11 @@ extern VALUE
|
|
143
142
|
context_create(VALUE thread, VALUE cDebugThread) {
|
144
143
|
debug_context_t *context;
|
145
144
|
VALUE locations;
|
146
|
-
VALUE location;
|
147
|
-
VALUE path;
|
148
|
-
VALUE lineno;
|
149
145
|
|
150
146
|
context = ALLOC(debug_context_t);
|
151
147
|
context->stack_size = 0;
|
152
148
|
locations = rb_funcall(thread, rb_intern("backtrace_locations"), 1, INT2FIX(1));
|
153
|
-
context->
|
154
|
-
|
155
|
-
context->init_stack_files = ruby_xmalloc2((context->init_stack_size),sizeof(char*));
|
156
|
-
|
157
|
-
int i;
|
158
|
-
for (i = 0; i < context->init_stack_size; i++) {
|
159
|
-
location = rb_ary_entry(locations, i);
|
160
|
-
path = rb_funcall(location, rb_intern("path"), 0);
|
161
|
-
lineno = rb_funcall(location, rb_intern("lineno"), 0);
|
162
|
-
context->init_stack_files[i] = path != Qnil ? RSTRING_PTR(path) : "";
|
163
|
-
}
|
164
|
-
|
149
|
+
context->calced_stack_size = locations != Qnil ? RARRAY_LENINT(locations) : 0;
|
165
150
|
|
166
151
|
context->stack = NULL;
|
167
152
|
context->thnum = ++thnum_current;
|
data/ext/debase_internals.c
CHANGED
@@ -323,7 +323,6 @@ process_line_event(VALUE trace_point, void *data)
|
|
323
323
|
char *file;
|
324
324
|
int line;
|
325
325
|
int moved;
|
326
|
-
int not_user_code = 0;
|
327
326
|
|
328
327
|
context_object = Debase_current_context(mDebase);
|
329
328
|
Data_Get_Struct(context_object, debug_context_t, context);
|
@@ -338,16 +337,6 @@ process_line_event(VALUE trace_point, void *data)
|
|
338
337
|
file = RSTRING_PTR(path);
|
339
338
|
line = FIX2INT(lineno);
|
340
339
|
|
341
|
-
int i;
|
342
|
-
if(context->calced_stack_size < context->init_stack_size) {
|
343
|
-
for(i = 0; i < context->init_stack_size; i++)
|
344
|
-
{
|
345
|
-
if(strcmp(file, context->init_stack_files[i]) == 0) {
|
346
|
-
not_user_code = 1;
|
347
|
-
}
|
348
|
-
}
|
349
|
-
}
|
350
|
-
|
351
340
|
update_stack_size(context);
|
352
341
|
print_event(tp, context);
|
353
342
|
|
@@ -384,7 +373,7 @@ process_line_event(VALUE trace_point, void *data)
|
|
384
373
|
}
|
385
374
|
|
386
375
|
breakpoint = breakpoint_find(breakpoints, path, lineno, trace_point);
|
387
|
-
if (
|
376
|
+
if (context->stop_next == 0 || context->stop_line == 0 || breakpoint != Qnil) {
|
388
377
|
rb_ensure(start_inspector, context_object, stop_inspector, Qnil);
|
389
378
|
context->stop_reason = CTX_STOP_STEP;
|
390
379
|
if (breakpoint != Qnil) {
|
@@ -648,6 +637,36 @@ Debase_enable_file_filtering(VALUE self, VALUE value)
|
|
648
637
|
return value;
|
649
638
|
}
|
650
639
|
|
640
|
+
#if RUBY_API_VERSION_CODE >= 20500
|
641
|
+
static const rb_iseq_t *
|
642
|
+
my_iseqw_check(VALUE iseqw)
|
643
|
+
{
|
644
|
+
rb_iseq_t *iseq = DATA_PTR(iseqw);
|
645
|
+
|
646
|
+
if (!iseq->body) {
|
647
|
+
ibf_load_iseq_complete(iseq);
|
648
|
+
}
|
649
|
+
|
650
|
+
if (!iseq->body->location.label) {
|
651
|
+
rb_raise(rb_eTypeError, "uninitialized InstructionSequence");
|
652
|
+
}
|
653
|
+
return iseq;
|
654
|
+
}
|
655
|
+
|
656
|
+
static void
|
657
|
+
Debase_set_trace_flag_to_iseq(VALUE self, VALUE rb_iseq)
|
658
|
+
{
|
659
|
+
if (!SPECIAL_CONST_P(rb_iseq) && RBASIC_CLASS(rb_iseq) == rb_cISeq) {
|
660
|
+
rb_iseq_t *iseq = my_iseqw_check(rb_iseq);
|
661
|
+
rb_iseq_trace_set(iseq, RUBY_EVENT_TRACEPOINT_ALL);
|
662
|
+
}
|
663
|
+
}
|
664
|
+
#else
|
665
|
+
static void
|
666
|
+
Debase_set_trace_flag_to_iseq(VALUE self, VALUE rb_iseq) {
|
667
|
+
}
|
668
|
+
#endif
|
669
|
+
|
651
670
|
static VALUE
|
652
671
|
Debase_init_variables()
|
653
672
|
{
|
@@ -691,6 +710,7 @@ Init_debase_internals()
|
|
691
710
|
rb_define_module_function(mDebase, "enable_trace_points", Debase_enable_trace_points, 0);
|
692
711
|
rb_define_module_function(mDebase, "prepare_context", Debase_prepare_context, 0);
|
693
712
|
rb_define_module_function(mDebase, "init_variables", Debase_init_variables, 0);
|
713
|
+
rb_define_module_function(mDebase, "set_trace_flag_to_iseq", Debase_set_trace_flag_to_iseq, 1);
|
694
714
|
|
695
715
|
idAlive = rb_intern("alive?");
|
696
716
|
idAtLine = rb_intern("at_line");
|
data/ext/debase_internals.h
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
#ifndef DEBASE_INTERNALS
|
2
2
|
#define DEBASE_INTERNALS
|
3
3
|
|
4
|
-
#include
|
4
|
+
#include "ruby.h"
|
5
|
+
#include "vm_core.h"
|
6
|
+
#include "version.h"
|
7
|
+
#include "iseq.h"
|
8
|
+
#include "vm_insnhelper.h"
|
9
|
+
#include "method.h"
|
5
10
|
#include <ruby/debug.h>
|
6
11
|
|
7
12
|
typedef struct rb_trace_arg_struct rb_trace_point_t;
|
@@ -57,9 +62,6 @@ typedef struct debug_context {
|
|
57
62
|
/* dest_frame uses calced_stack_size for stepping */
|
58
63
|
int dest_frame;
|
59
64
|
int calced_stack_size;
|
60
|
-
int init_stack_size;
|
61
|
-
|
62
|
-
char **init_stack_files;
|
63
65
|
|
64
66
|
char *last_file;
|
65
67
|
int last_line;
|
data/ext/extconf.rb
CHANGED
@@ -28,8 +28,13 @@ RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']
|
|
28
28
|
require "debase/ruby_core_source"
|
29
29
|
|
30
30
|
hdrs = proc {
|
31
|
-
have_header("vm_core.h")
|
32
|
-
have_header("
|
31
|
+
have_header("vm_core.h") and
|
32
|
+
have_header("iseq.h") and
|
33
|
+
have_header("version.h") and
|
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")
|
33
38
|
}
|
34
39
|
|
35
40
|
# Allow use customization of compile options. For example, the
|
data/lib/debase.rb
CHANGED
@@ -20,7 +20,21 @@ module Debase
|
|
20
20
|
Debugger.const_set('ARGV', ARGV.clone) unless defined? Debugger::ARGV
|
21
21
|
Debugger.const_set('PROG_SCRIPT', $0) unless defined? Debugger::PROG_SCRIPT
|
22
22
|
Debugger.const_set('INITIAL_DIR', Dir.pwd) unless defined? Debugger::INITIAL_DIR
|
23
|
-
|
23
|
+
|
24
|
+
monkey_patch_prepend
|
25
|
+
|
26
|
+
Debugger.started? ? block && block.call(self) : Debugger.start_(&block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def monkey_patch_prepend
|
30
|
+
class << RubyVM::InstructionSequence
|
31
|
+
def self.prepend(mod, *smth)
|
32
|
+
super
|
33
|
+
if mod.to_s.include? 'Bootsnap'
|
34
|
+
prepend InstructionSequenceMixin
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
24
38
|
end
|
25
39
|
|
26
40
|
# @param [String] file
|
@@ -81,6 +95,21 @@ module Debase
|
|
81
95
|
def file_filter
|
82
96
|
@file_filter ||= FileFilter.new
|
83
97
|
end
|
98
|
+
|
99
|
+
module InstructionSequenceMixin
|
100
|
+
def load_iseq(path)
|
101
|
+
iseq = super(path)
|
102
|
+
|
103
|
+
do_set_flags(iseq)
|
104
|
+
|
105
|
+
iseq
|
106
|
+
end
|
107
|
+
|
108
|
+
def do_set_flags(iseq)
|
109
|
+
Debugger.set_trace_flag_to_iseq(iseq)
|
110
|
+
iseq.each_child{|child_iseq| do_set_flags(child_iseq)}
|
111
|
+
end
|
112
|
+
end
|
84
113
|
end
|
85
114
|
|
86
115
|
class FileFilter
|
data/lib/debase/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.3.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dennis Ushakov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: debase-ruby_core_source
|
@@ -130,9 +130,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
130
130
|
version: '2.0'
|
131
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
132
|
requirements:
|
133
|
-
- - "
|
133
|
+
- - ">"
|
134
134
|
- !ruby/object:Gem::Version
|
135
|
-
version:
|
135
|
+
version: 1.3.1
|
136
136
|
requirements: []
|
137
137
|
rubyforge_project: debase
|
138
138
|
rubygems_version: 2.6.10
|