summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-07-01 18:13:22 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-07-01 18:13:22 +0000
commit9a61579c1658502a87f62c857ec29cd831d5db41 (patch)
tree4e0a94fae643781bef9670c5f058f12100e6eccc
parentab109c36f19aeaef088e975fa1de3ca6e6cce6f0 (diff)
* 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
-rw-r--r--ChangeLog6
-rw-r--r--compile.h9
-rw-r--r--include/ruby/ruby.h25
-rw-r--r--insns.def28
-rw-r--r--thread.c4
5 files changed, 41 insertions, 31 deletions
diff --git a/ChangeLog b/ChangeLog
index f4901afaf5..a62b101b72 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
* proc.c, vm.c: fix to refer next ruby level cfp to make binding.
diff --git a/compile.h b/compile.h
index 73a2567468..92f573c8b7 100644
--- a/compile.h
+++ b/compile.h
@@ -164,14 +164,11 @@ PRINTF_ARGS(void ruby_debug_printf(const char*, ...), 1, 2);
#define ADD_TRACE(seq, line, event) \
do { \
- VALUE coverage = Qfalse; \
if ((event) == RUBY_EVENT_LINE && iseq->coverage && RARRAY_PTR(iseq->coverage)[(line) - 1] == Qnil) { \
- RARRAY_PTR(iseq->coverage)[(line) - 1] = INT2FIX(0); \
- coverage = iseq->coverage; \
- } \
- if (iseq->compile_data->option->trace_instruction || coverage) { \
- ADD_INSN2(seq, line, trace, INT2FIX(event), coverage); \
+ RARRAY_PTR(iseq->coverage)[(line) - 1] = INT2FIX(0); \
+ ADD_INSN1(seq, line, trace, INT2FIX(RUBY_EVENT_COVERAGE)); \
} \
+ ADD_INSN1(seq, line, trace, INT2FIX(event)); \
}while(0);
/* add label */
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index fe10e4aef3..2698b98b62 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -1001,18 +1001,19 @@ void ruby_sysinit(int *, char ***);
#define HAVE_NATIVETHREAD
int ruby_native_thread_p(void);
-#define RUBY_EVENT_NONE 0x00
-#define RUBY_EVENT_LINE 0x01
-#define RUBY_EVENT_CLASS 0x02
-#define RUBY_EVENT_END 0x04
-#define RUBY_EVENT_CALL 0x08
-#define RUBY_EVENT_RETURN 0x10
-#define RUBY_EVENT_C_CALL 0x20
-#define RUBY_EVENT_C_RETURN 0x40
-#define RUBY_EVENT_RAISE 0x80
-#define RUBY_EVENT_ALL 0xff
-#define RUBY_EVENT_VM 0x100
-#define RUBY_EVENT_SWITCH 0x200
+#define RUBY_EVENT_NONE 0x0000
+#define RUBY_EVENT_LINE 0x0001
+#define RUBY_EVENT_CLASS 0x0002
+#define RUBY_EVENT_END 0x0004
+#define RUBY_EVENT_CALL 0x0008
+#define RUBY_EVENT_RETURN 0x0010
+#define RUBY_EVENT_C_CALL 0x0020
+#define RUBY_EVENT_C_RETURN 0x0040
+#define RUBY_EVENT_RAISE 0x0080
+#define RUBY_EVENT_ALL 0xffff
+#define RUBY_EVENT_VM 0x10000
+#define RUBY_EVENT_SWITCH 0x20000
+#define RUBY_EVENT_COVERAGE 0x40000
typedef unsigned int rb_event_flag_t;
typedef void (*rb_event_hook_func_t)(rb_event_flag_t, VALUE data, VALUE, ID, VALUE klass);
diff --git a/insns.def b/insns.def
index f0eaefe66e..e378260c4b 100644
--- a/insns.def
+++ b/insns.def
@@ -847,23 +847,29 @@ defined
*/
DEFINE_INSN
trace
-(rb_num_t nf, VALUE coverage)
+(rb_num_t nf)
()
()
{
rb_event_flag_t flag = nf;
- if (coverage) {
- long line = rb_sourceline() - 1;
- long count;
- if (RARRAY_PTR(coverage)[line] == Qnil) {
- rb_bug("bug");
- }
- count = FIX2LONG(RARRAY_PTR(coverage)[line]) + 1;
- if (POSFIXABLE(count)) {
- RARRAY_PTR(coverage)[line] = LONG2FIX(count);
+
+ if (flag == RUBY_EVENT_COVERAGE) {
+ VALUE coverage = GET_ISEQ()->coverage;
+ if (coverage) {
+ long line = vm_get_sourceline(GET_CFP()) - 1;
+ long count;
+ if (RARRAY_PTR(coverage)[line] == Qnil) {
+ rb_bug("bug");
+ }
+ 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 */);
+ }
}
/**********************************************************/
diff --git a/thread.c b/thread.c
index bac4715ca2..b021e2e337 100644
--- a/thread.c
+++ b/thread.c
@@ -3280,7 +3280,7 @@ call_trace_proc(VALUE args, int tracing)
rb_thread_method_id_and_class(GET_THREAD(), &id, &klass);
}
if (id == ID_ALLOCATOR)
- return Qnil;
+ return Qnil;
if (klass) {
if (TYPE(klass) == T_ICLASS) {
klass = RBASIC(klass)->klass;
@@ -3296,7 +3296,7 @@ call_trace_proc(VALUE args, int tracing)
argv[3] = id ? ID2SYM(id) : Qnil;
argv[4] = p->self ? rb_binding_new() : Qnil;
argv[5] = klass ? klass : Qnil;
-
+
return rb_proc_call_with_block(p->proc, 6, argv, Qnil);
}