ruby-debug-base19x 0.11.30.pre3 → 0.11.30.pre4
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/ruby_debug/ruby_debug.c +38 -83
- metadata +10 -10
data/ext/ruby_debug/ruby_debug.c
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
#include <insns_info.inc>
|
10
10
|
#include "ruby_debug.h"
|
11
11
|
|
12
|
-
#define DEBUG_VERSION "0.11.30.
|
12
|
+
#define DEBUG_VERSION "0.11.30.pre4"
|
13
13
|
|
14
14
|
#define FRAME_N(n) (&debug_context->frames[debug_context->stack_size-(n)-1])
|
15
15
|
#define GET_FRAME (FRAME_N(check_frame_number(debug_context, frame)))
|
@@ -134,55 +134,16 @@ real_class(VALUE klass)
|
|
134
134
|
return klass;
|
135
135
|
}
|
136
136
|
|
137
|
-
inline static void *
|
138
|
-
ruby_method_ptr(VALUE class, ID meth_id)
|
139
|
-
{
|
140
|
-
#ifndef HAVE_RB_METHOD_ENTRY
|
141
|
-
NODE *body, *method;
|
142
|
-
st_lookup(RCLASS_M_TBL(class), meth_id, (st_data_t *)&body);
|
143
|
-
method = (NODE *)body->u2.value;
|
144
|
-
return (void *)method->u2.node->u1.value;
|
145
|
-
#else
|
146
|
-
rb_method_entry_t * method;
|
147
|
-
method = rb_method_entry(class, meth_id);
|
148
|
-
#ifdef HAVE_ST_BODY
|
149
|
-
return (void *)method->body.cfunc.func;
|
150
|
-
#else
|
151
|
-
return (void *)method->def->body.cfunc.func;
|
152
|
-
#endif
|
153
|
-
#endif
|
154
|
-
}
|
155
|
-
|
156
137
|
inline static VALUE
|
157
138
|
ref2id(VALUE obj)
|
158
139
|
{
|
159
|
-
return
|
140
|
+
return obj;
|
160
141
|
}
|
161
142
|
|
162
|
-
static VALUE
|
163
|
-
id2ref_unprotected(VALUE id)
|
164
|
-
{
|
165
|
-
typedef VALUE (*id2ref_func_t)(VALUE, VALUE);
|
166
|
-
static id2ref_func_t f_id2ref = NULL;
|
167
|
-
if(f_id2ref == NULL)
|
168
|
-
{
|
169
|
-
f_id2ref = (id2ref_func_t)ruby_method_ptr(rb_mObjectSpace, rb_intern("_id2ref"));
|
170
|
-
}
|
171
|
-
return f_id2ref(rb_mObjectSpace, id);
|
172
|
-
}
|
173
|
-
|
174
|
-
static VALUE
|
175
|
-
id2ref_error()
|
176
|
-
{
|
177
|
-
if(debug == Qtrue)
|
178
|
-
rb_p(rb_errinfo());
|
179
|
-
return Qnil;
|
180
|
-
}
|
181
|
-
|
182
|
-
static VALUE
|
143
|
+
inline static VALUE
|
183
144
|
id2ref(VALUE id)
|
184
145
|
{
|
185
|
-
return
|
146
|
+
return id;
|
186
147
|
}
|
187
148
|
|
188
149
|
inline static VALUE
|
@@ -256,10 +217,22 @@ remove_from_locked()
|
|
256
217
|
return thread;
|
257
218
|
}
|
258
219
|
|
220
|
+
static int is_living_thread(VALUE thread);
|
221
|
+
|
259
222
|
static int
|
260
|
-
threads_table_mark_keyvalue(
|
223
|
+
threads_table_mark_keyvalue(st_data_t key, st_data_t value, st_data_t tbl)
|
261
224
|
{
|
262
|
-
|
225
|
+
VALUE thread = id2ref((VALUE)key);
|
226
|
+
if (!value) {
|
227
|
+
return ST_CONTINUE;
|
228
|
+
}
|
229
|
+
rb_gc_mark((VALUE)value);
|
230
|
+
if (is_living_thread(thread)) {
|
231
|
+
rb_gc_mark(thread);
|
232
|
+
}
|
233
|
+
else {
|
234
|
+
st_insert((st_table *)tbl, key, 0);
|
235
|
+
}
|
263
236
|
return ST_CONTINUE;
|
264
237
|
}
|
265
238
|
|
@@ -267,7 +240,8 @@ static void
|
|
267
240
|
threads_table_mark(void* data)
|
268
241
|
{
|
269
242
|
threads_table_t *threads_table = (threads_table_t*)data;
|
270
|
-
|
243
|
+
st_table *tbl = threads_table->tbl;
|
244
|
+
st_foreach(tbl, threads_table_mark_keyvalue, (st_data_t)tbl);
|
271
245
|
}
|
272
246
|
|
273
247
|
static void
|
@@ -279,7 +253,7 @@ threads_table_free(void* data)
|
|
279
253
|
}
|
280
254
|
|
281
255
|
static VALUE
|
282
|
-
threads_table_create()
|
256
|
+
threads_table_create(void)
|
283
257
|
{
|
284
258
|
threads_table_t *threads_table;
|
285
259
|
|
@@ -288,44 +262,40 @@ threads_table_create()
|
|
288
262
|
return Data_Wrap_Struct(cThreadsTable, threads_table_mark, threads_table_free, threads_table);
|
289
263
|
}
|
290
264
|
|
291
|
-
static int
|
292
|
-
threads_table_clear_i(VALUE key, VALUE value, VALUE dummy)
|
293
|
-
{
|
294
|
-
return ST_DELETE;
|
295
|
-
}
|
296
|
-
|
297
265
|
static void
|
298
266
|
threads_table_clear(VALUE table)
|
299
267
|
{
|
300
268
|
threads_table_t *threads_table;
|
301
269
|
|
302
270
|
Data_Get_Struct(table, threads_table_t, threads_table);
|
303
|
-
|
271
|
+
st_clear(threads_table->tbl);
|
304
272
|
}
|
305
273
|
|
306
|
-
static
|
274
|
+
static int
|
307
275
|
is_thread_alive(VALUE thread)
|
308
276
|
{
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
{
|
313
|
-
f_thread_alive = (thread_alive_func_t)ruby_method_ptr(rb_cThread, rb_intern("alive?"));
|
314
|
-
}
|
315
|
-
return f_thread_alive(thread);
|
277
|
+
rb_thread_t *th;
|
278
|
+
GetThreadPtr(thread, th);
|
279
|
+
return th->status != THREAD_KILLED;
|
316
280
|
}
|
317
281
|
|
318
282
|
static int
|
319
|
-
|
283
|
+
is_living_thread(VALUE thread)
|
284
|
+
{
|
285
|
+
return rb_obj_is_kind_of(thread, rb_cThread) && is_thread_alive(thread);
|
286
|
+
}
|
287
|
+
|
288
|
+
static int
|
289
|
+
threads_table_check_i(st_data_t key, st_data_t value, st_data_t dummy)
|
320
290
|
{
|
321
291
|
VALUE thread;
|
322
292
|
|
323
|
-
|
324
|
-
if(!rb_obj_is_kind_of(thread, rb_cThread))
|
293
|
+
if(!value)
|
325
294
|
{
|
326
295
|
return ST_DELETE;
|
327
296
|
}
|
328
|
-
|
297
|
+
thread = id2ref((VALUE)key);
|
298
|
+
if(!is_living_thread(thread))
|
329
299
|
{
|
330
300
|
return ST_DELETE;
|
331
301
|
}
|
@@ -333,7 +303,7 @@ threads_table_check_i(VALUE key, VALUE value, VALUE dummy)
|
|
333
303
|
}
|
334
304
|
|
335
305
|
static void
|
336
|
-
check_thread_contexts()
|
306
|
+
check_thread_contexts(void)
|
337
307
|
{
|
338
308
|
threads_table_t *threads_table;
|
339
309
|
|
@@ -740,11 +710,6 @@ debug_event_hook(rb_event_flag_t event, VALUE data, VALUE self, ID mid, VALUE kl
|
|
740
710
|
char *file = (char*)rb_sourcefile();
|
741
711
|
int line = rb_sourceline();
|
742
712
|
int moved = 0;
|
743
|
-
#ifndef HAVE_RB_METHOD_ENTRY
|
744
|
-
NODE *node = NULL;
|
745
|
-
#else
|
746
|
-
rb_method_entry_t *me = NULL;
|
747
|
-
#endif
|
748
713
|
rb_thread_t *thread = GET_THREAD();
|
749
714
|
struct rb_iseq_struct *iseq = thread->cfp->iseq;
|
750
715
|
|
@@ -762,12 +727,6 @@ debug_event_hook(rb_event_flag_t event, VALUE data, VALUE self, ID mid, VALUE kl
|
|
762
727
|
|
763
728
|
if (mid == ID_ALLOCATOR) return;
|
764
729
|
|
765
|
-
#ifndef HAVE_RB_METHOD_ENTRY
|
766
|
-
node = rb_method_node(klass, mid);
|
767
|
-
#else
|
768
|
-
me = rb_method_entry(klass, mid);
|
769
|
-
#endif
|
770
|
-
|
771
730
|
/* return if thread is marked as 'ignored'.
|
772
731
|
debugger's threads are marked this way
|
773
732
|
*/
|
@@ -978,11 +937,7 @@ debug_event_hook(rb_event_flag_t event, VALUE data, VALUE self, ID mid, VALUE kl
|
|
978
937
|
case RUBY_EVENT_C_RETURN:
|
979
938
|
{
|
980
939
|
/* note if a block is given we fall through! */
|
981
|
-
|
982
|
-
if(!node || !c_call_new_frame_p(klass, mid))
|
983
|
-
#else
|
984
|
-
if(!me || !c_call_new_frame_p(klass, mid))
|
985
|
-
#endif
|
940
|
+
if(!rb_method_boundp(klass, mid, 0) || !c_call_new_frame_p(klass, mid))
|
986
941
|
break;
|
987
942
|
}
|
988
943
|
case RUBY_EVENT_RETURN:
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-debug-base19x
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.30.
|
4
|
+
version: 0.11.30.pre4
|
5
5
|
prerelease: 8
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-11-14 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: columnize
|
16
|
-
requirement: &
|
16
|
+
requirement: &70102561752300 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.3.1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70102561752300
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ruby_core_source
|
27
|
-
requirement: &
|
27
|
+
requirement: &70102561751820 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.1.4
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70102561751820
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: linecache19
|
38
|
-
requirement: &
|
38
|
+
requirement: &70102561751340 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.5.11
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70102561751340
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
|
-
requirement: &
|
49
|
+
requirement: &70102561767260 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: 0.8.1
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70102561767260
|
58
58
|
description: ! 'ruby-debug is a fast implementation of the standard Ruby debugger
|
59
59
|
debug.rb.
|
60
60
|
|