1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* vm_core.h: add members to rb_trace_arg_t:

* `klass_solved' represents klass and id is checked.
* `line' represents line calculated from cfp.
* `file' represents line calculated from cfp.
* vm_trace.c: fix to use above data stractures.
  No need to calculate klass and id, line and file
  pairs for each trace points.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37874 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2012-11-26 23:01:45 +00:00
parent 253938067a
commit 8c138db3d2
3 changed files with 57 additions and 39 deletions

View file

@ -1,3 +1,14 @@
Tue Nov 27 07:58:03 2012 Koichi Sasada <ko1@atdot.net>
* vm_core.h: add members to rb_trace_arg_t:
* `klass_solved' represents klass and id is checked.
* `line' represents line calculated from cfp.
* `file' represents line calculated from cfp.
* vm_trace.c: fix to use above data stractures.
No need to calculate klass and id, line and file
pairs for each trace points.
Tue Nov 27 07:47:09 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* thread.c (rb_thread_terminate_all): add RUBY_VM_CHECK_INTS_BLOCKING().

View file

@ -905,6 +905,12 @@ typedef struct rb_trace_arg_struct {
ID id;
VALUE klass;
VALUE data;
int klass_solved;
/* calc from cfp */
int line;
VALUE file;
} rb_trace_arg_t;
void rb_threadptr_exec_event_hooks(rb_trace_arg_t *trace_arg);
@ -920,6 +926,8 @@ void rb_threadptr_exec_event_hooks(rb_trace_arg_t *trace_arg);
trace_arg.id = (id_); \
trace_arg.klass = (klass_); \
trace_arg.data = (data_); \
trace_arg.file = Qundef; \
trace_arg.klass_solved = 0; \
rb_threadptr_exec_event_hooks(&trace_arg); \
} \
} \

View file

@ -642,51 +642,62 @@ rb_control_frame_t *rb_vm_get_ruby_level_next_cfp(rb_thread_t *th, rb_control_fr
int rb_vm_control_frame_id_and_class(rb_control_frame_t *cfp, ID *idp, VALUE *klassp);
VALUE rb_binding_new_with_cfp(rb_thread_t *th, rb_control_frame_t *src_cfp);
static void
fill_file_and_line(rb_trace_arg_t *trace_arg)
{
if (trace_arg->file == Qundef) {
rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(trace_arg->th, trace_arg->cfp);
if (cfp) {
trace_arg->file = cfp->iseq->location.path;
trace_arg->line = rb_vm_get_sourceline(cfp);
}
else {
trace_arg->file = Qnil;
trace_arg->line = 0;
}
}
}
VALUE
rb_tracepoint_attr_line(VALUE tpval)
{
rb_tp_t *tp = tpptr(tpval);
rb_control_frame_t *cfp;
tp_attr_check_active(tp);
cfp = rb_vm_get_ruby_level_next_cfp(tp->trace_arg->th, tp->trace_arg->cfp);
if (cfp) {
return INT2FIX(rb_vm_get_sourceline(cfp));
}
else {
return INT2FIX(0);
}
fill_file_and_line(tp->trace_arg);
return INT2FIX(tp->trace_arg->line);
}
VALUE
rb_tracepoint_attr_file(VALUE tpval)
{
rb_tp_t *tp = tpptr(tpval);
rb_control_frame_t *cfp;
tp_attr_check_active(tp);
cfp = rb_vm_get_ruby_level_next_cfp(tp->trace_arg->th, tp->trace_arg->cfp);
if (cfp) {
return cfp->iseq->location.path;
}
else {
return Qnil;
}
fill_file_and_line(tp->trace_arg);
return tp->trace_arg->file;
}
static void
fill_id_and_klass(rb_trace_arg_t *trace_arg)
{
if (!trace_arg->klass)
rb_vm_control_frame_id_and_class(trace_arg->cfp, &trace_arg->id, &trace_arg->klass);
if (!trace_arg->klass_solved) {
if (!trace_arg->klass) {
rb_vm_control_frame_id_and_class(trace_arg->cfp, &trace_arg->id, &trace_arg->klass);
}
if (trace_arg->klass) {
if (RB_TYPE_P(trace_arg->klass, T_ICLASS)) {
trace_arg->klass = RBASIC(trace_arg->klass)->klass;
if (trace_arg->klass) {
if (RB_TYPE_P(trace_arg->klass, T_ICLASS)) {
trace_arg->klass = RBASIC(trace_arg->klass)->klass;
}
else if (FL_TEST(trace_arg->klass, FL_SINGLETON)) {
trace_arg->klass = rb_iv_get(trace_arg->klass, "__attached__");
}
}
else if (FL_TEST(trace_arg->klass, FL_SINGLETON)) {
trace_arg->klass = rb_iv_get(trace_arg->klass, "__attached__");
else {
trace_arg->klass = Qnil;
}
trace_arg->klass_solved = 1;
}
}
@ -696,12 +707,7 @@ rb_tracepoint_attr_id(VALUE tpval)
rb_tp_t *tp = tpptr(tpval);
tp_attr_check_active(tp);
fill_id_and_klass(tp->trace_arg);
if (tp->trace_arg->id) {
return ID2SYM(tp->trace_arg->id);
}
else {
return Qnil;
}
return tp->trace_arg->id ? ID2SYM(tp->trace_arg->id) : Qnil;
}
VALUE
@ -710,13 +716,7 @@ rb_tracepoint_attr_klass(VALUE tpval)
rb_tp_t *tp = tpptr(tpval);
tp_attr_check_active(tp);
fill_id_and_klass(tp->trace_arg);
if (tp->trace_arg->klass) {
return tp->trace_arg->klass;
}
else {
return Qnil;
}
return tp->trace_arg->klass;
}
VALUE
@ -780,7 +780,6 @@ rb_tracepoint_attr_raised_exception(VALUE tpval)
return tp->trace_arg->data;
}
static void
tp_call_trace(VALUE tpval, rb_trace_arg_t *trace_arg)
{