ruby-changes:73779
From: Samuel <ko1@a...>
Date: Thu, 29 Sep 2022 05:45:07 +0900 (JST)
Subject: [ruby-changes:73779] 9dd902b831 (master): Add `eval: true/false` flag to `Coverage.setup`.
https://git.ruby-lang.org/ruby.git/commit/?id=9dd902b831 From 9dd902b83186ad6f9d0a553da2ca114bac6ab7b5 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuel.williams@o...> Date: Wed, 28 Sep 2022 23:35:42 +1300 Subject: Add `eval: true/false` flag to `Coverage.setup`. --- ext/coverage/coverage.c | 21 +++++++++++---------- internal/thread.h | 1 + iseq.c | 8 +++++--- test/coverage/test_coverage.rb | 8 ++++---- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/ext/coverage/coverage.c b/ext/coverage/coverage.c index 2f760c8eb6..6978bb24cb 100644 --- a/ext/coverage/coverage.c +++ b/ext/coverage/coverage.c @@ -25,10 +25,10 @@ static VALUE me2counter = Qnil; https://github.com/ruby/ruby/blob/trunk/ext/coverage/coverage.c#L25 /* * call-seq: - * Coverage.setup => nil - * Coverage.setup(:all) => nil - * Coverage.setup(lines: bool, branches: bool, methods: bool) => nil - * Coverage.setup(oneshot_lines: true) => nil + * Coverage.setup => nil + * Coverage.setup(:all) => nil + * Coverage.setup(lines: bool, branches: bool, methods: bool, eval: bool) => nil + * Coverage.setup(oneshot_lines: true) => nil * * Set up the coverage measurement. * @@ -53,7 +53,7 @@ rb_coverage_setup(int argc, VALUE *argv, VALUE klass) https://github.com/ruby/ruby/blob/trunk/ext/coverage/coverage.c#L53 mode = 0; /* compatible mode */ } else if (opt == ID2SYM(rb_intern("all"))) { - mode = COVERAGE_TARGET_LINES | COVERAGE_TARGET_BRANCHES | COVERAGE_TARGET_METHODS; + mode = COVERAGE_TARGET_LINES | COVERAGE_TARGET_BRANCHES | COVERAGE_TARGET_METHODS | COVERAGE_TARGET_EVAL; } else { mode = 0; @@ -71,6 +71,8 @@ rb_coverage_setup(int argc, VALUE *argv, VALUE klass) https://github.com/ruby/ruby/blob/trunk/ext/coverage/coverage.c#L71 mode |= COVERAGE_TARGET_LINES; mode |= COVERAGE_TARGET_ONESHOT_LINES; } + if (RTEST(rb_hash_lookup(opt, ID2SYM(rb_intern("eval"))))) + mode |= COVERAGE_TARGET_EVAL; } if (mode & COVERAGE_TARGET_METHODS) { @@ -93,7 +95,6 @@ rb_coverage_setup(int argc, VALUE *argv, VALUE klass) https://github.com/ruby/ruby/blob/trunk/ext/coverage/coverage.c#L95 rb_raise(rb_eRuntimeError, "cannot change the measuring target during coverage measurement"); } - return Qnil; } @@ -124,10 +125,10 @@ rb_coverage_resume(VALUE klass) https://github.com/ruby/ruby/blob/trunk/ext/coverage/coverage.c#L125 /* * call-seq: - * Coverage.start => nil - * Coverage.start(:all) => nil - * Coverage.start(lines: bool, branches: bool, methods: bool) => nil - * Coverage.start(oneshot_lines: true) => nil + * Coverage.start => nil + * Coverage.start(:all) => nil + * Coverage.start(lines: bool, branches: bool, methods: bool, eval: bool) => nil + * Coverage.start(oneshot_lines: true) => nil * * Enables the coverage measurement. * See the documentation of Coverage class in detail. diff --git a/internal/thread.h b/internal/thread.h index 63f03bb94a..6394f88d34 100644 --- a/internal/thread.h +++ b/internal/thread.h @@ -20,6 +20,7 @@ struct rb_thread_struct; /* in vm_core.h */ https://github.com/ruby/ruby/blob/trunk/internal/thread.h#L20 #define COVERAGE_TARGET_BRANCHES 2 #define COVERAGE_TARGET_METHODS 4 #define COVERAGE_TARGET_ONESHOT_LINES 8 +#define COVERAGE_TARGET_EVAL 16 VALUE rb_obj_is_mutex(VALUE obj); VALUE rb_suppress_tracing(VALUE (*func)(VALUE), VALUE arg); diff --git a/iseq.c b/iseq.c index 0d4e014999..5b1d9de106 100644 --- a/iseq.c +++ b/iseq.c @@ -929,9 +929,11 @@ rb_iseq_new_main(const rb_ast_body_t *ast, VALUE path, VALUE realpath, const rb_ https://github.com/ruby/ruby/blob/trunk/iseq.c#L929 rb_iseq_t * rb_iseq_new_eval(const rb_ast_body_t *ast, VALUE name, VALUE path, VALUE realpath, int first_lineno, const rb_iseq_t *parent, int isolated_depth) { - VALUE coverages = rb_get_coverages(); - if (RTEST(coverages) && RTEST(path) && !RTEST(rb_hash_has_key(coverages, path))) { - iseq_setup_coverage(coverages, path, ast, first_lineno - 1); + if (rb_get_coverage_mode() & COVERAGE_TARGET_EVAL) { + VALUE coverages = rb_get_coverages(); + if (RTEST(coverages) && RTEST(path) && !RTEST(rb_hash_has_key(coverages, path))) { + iseq_setup_coverage(coverages, path, ast, first_lineno - 1); + } } return rb_iseq_new_with_opt(ast, name, path, realpath, first_lineno, diff --git a/test/coverage/test_coverage.rb b/test/coverage/test_coverage.rb index 1bb85b67b3..f9f9b2c04d 100644 --- a/test/coverage/test_coverage.rb +++ b/test/coverage/test_coverage.rb @@ -147,11 +147,11 @@ class TestCoverage < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/coverage/test_coverage.rb#L147 end assert_in_out_err(%w[-W0 -rcoverage], <<-"end;", ["[1, 1, 1, 400, nil, nil, nil, nil, nil, nil, nil]"], [], bug13305) - Coverage.start + Coverage.start(:all) tmp = Dir.pwd require tmp + '/test.rb' add_method(Class.new) - p Coverage.result[tmp + "/test.rb"] + p Coverage.result[tmp + "/test.rb"][:lines] end; } } @@ -159,7 +159,7 @@ class TestCoverage < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/coverage/test_coverage.rb#L159 def test_eval_coverage assert_in_out_err(%w[-rcoverage], <<-"end;", ["[1, nil, 1, nil]"], []) - Coverage.start + Coverage.start(eval: true, lines: true) eval(<<-RUBY, TOPLEVEL_BINDING, "test.rb") s = String.new @@ -168,7 +168,7 @@ class TestCoverage < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/coverage/test_coverage.rb#L168 bar".freeze; end RUBY - p Coverage.result["test.rb"] + p Coverage.result["test.rb"][:lines] end; end -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/