From c08e8886badd47890a54bdc54f1c09de7ad5c8e8 Mon Sep 17 00:00:00 2001 From: mame Date: Wed, 20 Dec 2017 04:24:14 +0000 Subject: compile.c: add a RUBY_EVENT_COVERAGE_LINE event for line coverage 2.5's line coverage measurement was about two times slower than 2.4 because of two reasons; (1) vm_trace uses rb_iseq_event_flags (which takes O(n) currently where n is the length of iseq) to get an event type, and (2) RUBY_EVENT_LINE uses setjmp to call an event hook. This change adds a special event for line coverage, RUBY_EVENT_COVERAGE_LINE, and adds `tracecoverage` instructions where the event occurs in iseq. `tracecoverage` instruction calls an event hook without vm_trace. And, RUBY_EVENT_COVERAGE_LINE is an internal event which does not use setjmp. This change also cancells lineno change due to the deletion of trace instructions [Feature #14104]. So fixes [Bug #14191]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61350 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- iseq.c | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'iseq.c') diff --git a/iseq.c b/iseq.c index f0239ccde1..186f8622e7 100644 --- a/iseq.c +++ b/iseq.c @@ -350,21 +350,9 @@ finish_iseq_build(rb_iseq_t *iseq) { struct iseq_compile_data *data = ISEQ_COMPILE_DATA(iseq); VALUE err = data->err_info; - unsigned int i; ISEQ_COMPILE_DATA_CLEAR(iseq); compile_data_free(data); - if (ISEQ_COVERAGE(iseq) && ISEQ_LINE_COVERAGE(iseq)) { - for (i = 0; i < iseq->body->insns_info_size; i++) { - if (iseq->body->insns_info[i].events & RUBY_EVENT_LINE) { - int line_no = iseq->body->insns_info[i].line_no - 1; - if (0 <= line_no && line_no < RARRAY_LEN(ISEQ_LINE_COVERAGE(iseq))) { - RARRAY_ASET(ISEQ_LINE_COVERAGE(iseq), line_no, INT2FIX(0)); - } - } - } - } - if (RTEST(err)) { VALUE path = pathobj_path(iseq->body->location.pathobj); if (err == Qtrue) err = rb_exc_new_cstr(rb_eSyntaxError, "compile error"); -- cgit v1.2.3