Skip to content

Commit bb6b3b4

Browse files
[prism/compiler] end_cursor should never be NULL
This fixes a failed assertion reported to SimpleCov simplecov-ruby/simplecov#1113 This can be repro'd as follows: 1. Create a file `test.rb` containing the following code ``` @foo&.(@bar) ``` 2. require it with branch coverage enabled ``` ruby -rcoverage -e "Coverage.start(branches: true); require_relative 'test.rb'" ``` The assertion is failing because the Prism compiler is incorrectly detecting the start and end cursor position of the call site for the implicit call .() This patch replicates the parse.y behaviour of setting the default end_cursor to be the final closing location of the call node. This behaviour can be verified against `parse.y` by modifying the test command as follows: ``` ruby --parser=parse.y -rcoverage -e "Coverage.start(branches: true); require_relative 'test.rb'" ``` [Bug #20866]
1 parent 811dfa7 commit bb6b3b4

File tree

2 files changed

+5
-0
lines changed

2 files changed

+5
-0
lines changed

prism_compile.c

+1
Original file line numberDiff line numberDiff line change
@@ -3630,6 +3630,7 @@ pm_compile_call(rb_iseq_t *iseq, const pm_call_node_t *call_node, LINK_ANCHOR *c
36303630
const uint8_t *end_cursor = cursors[0];
36313631
end_cursor = (end_cursor == NULL || cursors[1] == NULL) ? cursors[1] : (end_cursor > cursors[1] ? end_cursor : cursors[1]);
36323632
end_cursor = (end_cursor == NULL || cursors[2] == NULL) ? cursors[2] : (end_cursor > cursors[2] ? end_cursor : cursors[2]);
3633+
if (!end_cursor) end_cursor = call_node->closing_loc.end;
36333634

36343635
const pm_line_column_t start_location = PM_NODE_START_LINE_COLUMN(scope_node->parser, call_node);
36353636
const pm_line_column_t end_location = pm_newline_list_line_column(&scope_node->parser->newline_list, end_cursor, scope_node->parser->start_line);

test/coverage/test_coverage.rb

+4
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,8 @@ def test_branch_coverage_for_safe_method_invocation
463463
[:"&.", 3, 7, 0, 7, 6] => {[:then, 4, 7, 0, 7, 6]=>0, [:else, 5, 7, 0, 7, 6]=>1},
464464
[:"&.", 6, 8, 0, 8, 10] => {[:then, 7, 8, 0, 8, 10]=>1, [:else, 8, 8, 0, 8, 10]=>0},
465465
[:"&.", 9, 9, 0, 9, 10] => {[:then, 10, 9, 0, 9, 10]=>0, [:else, 11, 9, 0, 9, 10]=>1},
466+
[:"&.", 12, 10, 0, 10, 6] => {[:then, 13, 10, 0, 10, 6] => 0, [:else, 14, 10, 0, 10, 6] => 1},
467+
[:"&.", 15, 11, 0, 11, 5] => {[:then, 16, 11, 0, 11, 5] => 0, [:else, 17, 11, 0, 11, 5] => 1},
466468
}
467469
}
468470
assert_coverage(<<~"end;", { branches: true }, result)
@@ -475,6 +477,8 @@ class Dummy; def foo; end; def foo=(x); end; end
475477
b&.foo
476478
c&.foo = 1
477479
d&.foo = 1
480+
d&.(b)
481+
d&.()
478482
end;
479483
end
480484

0 commit comments

Comments
 (0)