[前][次][番号順一覧][スレッド一覧]

ruby-changes:54455

From: mame <ko1@a...>
Date: Tue, 1 Jan 2019 10:41:28 +0900 (JST)
Subject: [ruby-changes:54455] mame:r66670 (trunk): compile.c: support branch coverage for `a&.foo = 1`

mame	2019-01-01 10:41:23 +0900 (Tue, 01 Jan 2019)

  New Revision: 66670

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=66670

  Log:
    compile.c: support branch coverage for `a&.foo = 1`
    
    [Bug #15476]

  Modified files:
    trunk/compile.c
    trunk/test/coverage/test_coverage.rb
Index: test/coverage/test_coverage.rb
===================================================================
--- test/coverage/test_coverage.rb	(revision 66669)
+++ test/coverage/test_coverage.rb	(revision 66670)
@@ -348,15 +348,22 @@ class TestCoverage < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/test/coverage/test_coverage.rb#L348
   def test_branch_coverage_for_safe_method_invocation
     result = {
       :branches=>{
-        [:"&.", 0, 3, 0, 3, 6] => {[:then, 1, 3, 0, 3, 6]=>1, [:else, 2, 3, 0, 3, 6]=>0},
-        [:"&.", 3, 4, 0, 4, 6] => {[:then, 4, 4, 0, 4, 6]=>0, [:else, 5, 4, 0, 4, 6]=>1},
+        [:"&.", 0, 6, 0, 6,  6] => {[:then,  1, 6, 0, 6,  6]=>1, [:else,  2, 6, 0, 6,  6]=>0},
+        [:"&.", 3, 7, 0, 7,  6] => {[:then,  4, 7, 0, 7,  6]=>0, [:else,  5, 7, 0, 7,  6]=>1},
+        [:"&.", 6, 8, 0, 8, 10] => {[:then,  7, 8, 0, 8, 10]=>1, [:else,  8, 8, 0, 8, 10]=>0},
+        [:"&.", 9, 9, 0, 9, 10] => {[:then, 10, 9, 0, 9, 10]=>0, [:else, 11, 9, 0, 9, 10]=>1},
       }
     }
     assert_coverage(<<~"end;", { branches: true }, result)
-      a = 10
+      class Dummy; def foo; end; def foo=(x); end; end
+      a = Dummy.new
       b = nil
-      a&.abs
-      b&.hoo
+      c = Dummy.new
+      d = nil
+      a&.foo
+      b&.foo
+      c&.foo = 1
+      d&.foo = 1
     end;
   end
 
Index: compile.c
===================================================================
--- compile.c	(revision 66669)
+++ compile.c	(revision 66670)
@@ -7462,8 +7462,10 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L7462
 	DECL_ANCHOR(args);
 	unsigned int flag = 0;
 	ID mid = node->nd_mid;
-	LABEL *lskip = 0;
+	LABEL *else_label = 0;
+	LABEL *end_label = 0;
 	VALUE argc;
+	VALUE branches = 0;
 
 	/* optimization shortcut
 	 *   obj["literal"] = value -> opt_aset_with(obj, "literal", value)
@@ -7503,8 +7505,11 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L7505
 	    /* safe nav attr */
 	    mid = rb_id_attrset(mid);
 	    ADD_INSN(recv, line, dup);
-	    lskip = NEW_LABEL(line);
-	    ADD_INSNL(recv, line, branchnil, lskip);
+            else_label = NEW_LABEL(line);
+            end_label = NEW_LABEL(line);
+            DECL_BRANCH_BASE(branches, nd_first_lineno(node), nd_first_column(node), nd_last_lineno(node), nd_last_column(node), "&.");
+	    ADD_INSNL(recv, line, branchnil, else_label);
+            ADD_TRACE_BRANCH_COVERAGE(recv, nd_first_lineno(node), nd_first_column(node), nd_last_lineno(node), nd_last_column(node), "then", branches);
 	}
 	if (!popped) {
 	    ADD_INSN(ret, line, putnil);
@@ -7536,7 +7541,12 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L7541
 	    ADD_SEQ(ret, args);
 	}
 	ADD_SEND_WITH_FLAG(ret, line, mid, argc, INT2FIX(flag));
-	if (lskip) ADD_LABEL(ret, lskip);
+	if (else_label && end_label) {
+	    ADD_INSNL(ret, line, jump, end_label);
+            ADD_LABEL(ret, else_label);
+	    ADD_TRACE_BRANCH_COVERAGE(ret, nd_first_lineno(node), nd_first_column(node), nd_last_lineno(node), nd_last_column(node), "else", branches);
+            ADD_LABEL(ret, end_label);
+        }
 	ADD_INSN(ret, line, pop);
 
 	break;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]