mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* compile.h, insns.def: reduce insn operand of "trace".
* include/ruby/ruby.h: add RUBY_EVENT_COVERAGE event. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17785 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ab109c36f1
commit
9a61579c16
5 changed files with 41 additions and 31 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
Wed Jul 2 03:10:41 2008 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* compile.h, insns.def: reduce insn operand of "trace".
|
||||||
|
|
||||||
|
* include/ruby/ruby.h: add RUBY_EVENT_COVERAGE event.
|
||||||
|
|
||||||
Wed Jul 2 02:02:34 2008 Koichi Sasada <ko1@atdot.net>
|
Wed Jul 2 02:02:34 2008 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* proc.c, vm.c: fix to refer next ruby level cfp to make binding.
|
* proc.c, vm.c: fix to refer next ruby level cfp to make binding.
|
||||||
|
|
|
@ -164,14 +164,11 @@ PRINTF_ARGS(void ruby_debug_printf(const char*, ...), 1, 2);
|
||||||
|
|
||||||
#define ADD_TRACE(seq, line, event) \
|
#define ADD_TRACE(seq, line, event) \
|
||||||
do { \
|
do { \
|
||||||
VALUE coverage = Qfalse; \
|
|
||||||
if ((event) == RUBY_EVENT_LINE && iseq->coverage && RARRAY_PTR(iseq->coverage)[(line) - 1] == Qnil) { \
|
if ((event) == RUBY_EVENT_LINE && iseq->coverage && RARRAY_PTR(iseq->coverage)[(line) - 1] == Qnil) { \
|
||||||
RARRAY_PTR(iseq->coverage)[(line) - 1] = INT2FIX(0); \
|
RARRAY_PTR(iseq->coverage)[(line) - 1] = INT2FIX(0); \
|
||||||
coverage = iseq->coverage; \
|
ADD_INSN1(seq, line, trace, INT2FIX(RUBY_EVENT_COVERAGE)); \
|
||||||
} \
|
|
||||||
if (iseq->compile_data->option->trace_instruction || coverage) { \
|
|
||||||
ADD_INSN2(seq, line, trace, INT2FIX(event), coverage); \
|
|
||||||
} \
|
} \
|
||||||
|
ADD_INSN1(seq, line, trace, INT2FIX(event)); \
|
||||||
}while(0);
|
}while(0);
|
||||||
|
|
||||||
/* add label */
|
/* add label */
|
||||||
|
|
|
@ -1001,18 +1001,19 @@ void ruby_sysinit(int *, char ***);
|
||||||
#define HAVE_NATIVETHREAD
|
#define HAVE_NATIVETHREAD
|
||||||
int ruby_native_thread_p(void);
|
int ruby_native_thread_p(void);
|
||||||
|
|
||||||
#define RUBY_EVENT_NONE 0x00
|
#define RUBY_EVENT_NONE 0x0000
|
||||||
#define RUBY_EVENT_LINE 0x01
|
#define RUBY_EVENT_LINE 0x0001
|
||||||
#define RUBY_EVENT_CLASS 0x02
|
#define RUBY_EVENT_CLASS 0x0002
|
||||||
#define RUBY_EVENT_END 0x04
|
#define RUBY_EVENT_END 0x0004
|
||||||
#define RUBY_EVENT_CALL 0x08
|
#define RUBY_EVENT_CALL 0x0008
|
||||||
#define RUBY_EVENT_RETURN 0x10
|
#define RUBY_EVENT_RETURN 0x0010
|
||||||
#define RUBY_EVENT_C_CALL 0x20
|
#define RUBY_EVENT_C_CALL 0x0020
|
||||||
#define RUBY_EVENT_C_RETURN 0x40
|
#define RUBY_EVENT_C_RETURN 0x0040
|
||||||
#define RUBY_EVENT_RAISE 0x80
|
#define RUBY_EVENT_RAISE 0x0080
|
||||||
#define RUBY_EVENT_ALL 0xff
|
#define RUBY_EVENT_ALL 0xffff
|
||||||
#define RUBY_EVENT_VM 0x100
|
#define RUBY_EVENT_VM 0x10000
|
||||||
#define RUBY_EVENT_SWITCH 0x200
|
#define RUBY_EVENT_SWITCH 0x20000
|
||||||
|
#define RUBY_EVENT_COVERAGE 0x40000
|
||||||
|
|
||||||
typedef unsigned int rb_event_flag_t;
|
typedef unsigned int rb_event_flag_t;
|
||||||
typedef void (*rb_event_hook_func_t)(rb_event_flag_t, VALUE data, VALUE, ID, VALUE klass);
|
typedef void (*rb_event_hook_func_t)(rb_event_flag_t, VALUE data, VALUE, ID, VALUE klass);
|
||||||
|
|
28
insns.def
28
insns.def
|
@ -847,23 +847,29 @@ defined
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
trace
|
trace
|
||||||
(rb_num_t nf, VALUE coverage)
|
(rb_num_t nf)
|
||||||
()
|
()
|
||||||
()
|
()
|
||||||
{
|
{
|
||||||
rb_event_flag_t flag = nf;
|
rb_event_flag_t flag = nf;
|
||||||
if (coverage) {
|
|
||||||
long line = rb_sourceline() - 1;
|
if (flag == RUBY_EVENT_COVERAGE) {
|
||||||
long count;
|
VALUE coverage = GET_ISEQ()->coverage;
|
||||||
if (RARRAY_PTR(coverage)[line] == Qnil) {
|
if (coverage) {
|
||||||
rb_bug("bug");
|
long line = vm_get_sourceline(GET_CFP()) - 1;
|
||||||
}
|
long count;
|
||||||
count = FIX2LONG(RARRAY_PTR(coverage)[line]) + 1;
|
if (RARRAY_PTR(coverage)[line] == Qnil) {
|
||||||
if (POSFIXABLE(count)) {
|
rb_bug("bug");
|
||||||
RARRAY_PTR(coverage)[line] = LONG2FIX(count);
|
}
|
||||||
|
count = FIX2LONG(RARRAY_PTR(coverage)[line]) + 1;
|
||||||
|
if (POSFIXABLE(count)) {
|
||||||
|
RARRAY_PTR(coverage)[line] = LONG2FIX(count);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXEC_EVENT_HOOK(th, flag, GET_SELF(), 0, 0 /* TODO: id, klass */);
|
else {
|
||||||
|
EXEC_EVENT_HOOK(th, flag, GET_SELF(), 0, 0 /* TODO: id, klass */);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
|
|
4
thread.c
4
thread.c
|
@ -3280,7 +3280,7 @@ call_trace_proc(VALUE args, int tracing)
|
||||||
rb_thread_method_id_and_class(GET_THREAD(), &id, &klass);
|
rb_thread_method_id_and_class(GET_THREAD(), &id, &klass);
|
||||||
}
|
}
|
||||||
if (id == ID_ALLOCATOR)
|
if (id == ID_ALLOCATOR)
|
||||||
return Qnil;
|
return Qnil;
|
||||||
if (klass) {
|
if (klass) {
|
||||||
if (TYPE(klass) == T_ICLASS) {
|
if (TYPE(klass) == T_ICLASS) {
|
||||||
klass = RBASIC(klass)->klass;
|
klass = RBASIC(klass)->klass;
|
||||||
|
@ -3296,7 +3296,7 @@ call_trace_proc(VALUE args, int tracing)
|
||||||
argv[3] = id ? ID2SYM(id) : Qnil;
|
argv[3] = id ? ID2SYM(id) : Qnil;
|
||||||
argv[4] = p->self ? rb_binding_new() : Qnil;
|
argv[4] = p->self ? rb_binding_new() : Qnil;
|
||||||
argv[5] = klass ? klass : Qnil;
|
argv[5] = klass ? klass : Qnil;
|
||||||
|
|
||||||
return rb_proc_call_with_block(p->proc, 6, argv, Qnil);
|
return rb_proc_call_with_block(p->proc, 6, argv, Qnil);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue