[PRISM] Enable coverage in top and main iseqs

This commit is contained in:
Kevin Newton 2024-04-25 08:48:20 -04:00
Родитель af800bef21
Коммит 49764869af
2 изменённых файлов: 8 добавлений и 21 удалений

18
iseq.c
Просмотреть файл

@ -862,10 +862,8 @@ ast_line_count(const VALUE vast)
} }
static VALUE static VALUE
iseq_setup_coverage(VALUE coverages, VALUE path, const VALUE vast, int line_offset) iseq_setup_coverage(VALUE coverages, VALUE path, int line_count)
{ {
int line_count = line_offset + ast_line_count(vast);
if (line_count >= 0) { if (line_count >= 0) {
int len = (rb_get_coverage_mode() & COVERAGE_TARGET_ONESHOT_LINES) ? 0 : line_count; int len = (rb_get_coverage_mode() & COVERAGE_TARGET_ONESHOT_LINES) ? 0 : line_count;
@ -879,19 +877,19 @@ iseq_setup_coverage(VALUE coverages, VALUE path, const VALUE vast, int line_offs
} }
static inline void static inline void
iseq_new_setup_coverage(VALUE path, const VALUE vast, int line_offset) iseq_new_setup_coverage(VALUE path, int line_count)
{ {
VALUE coverages = rb_get_coverages(); VALUE coverages = rb_get_coverages();
if (RTEST(coverages)) { if (RTEST(coverages)) {
iseq_setup_coverage(coverages, path, vast, line_offset); iseq_setup_coverage(coverages, path, line_count);
} }
} }
rb_iseq_t * rb_iseq_t *
rb_iseq_new_top(const VALUE vast, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent) rb_iseq_new_top(const VALUE vast, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent)
{ {
iseq_new_setup_coverage(path, vast, 0); iseq_new_setup_coverage(path, ast_line_count(vast));
return rb_iseq_new_with_opt(vast, name, path, realpath, 0, parent, 0, return rb_iseq_new_with_opt(vast, name, path, realpath, 0, parent, 0,
ISEQ_TYPE_TOP, &COMPILE_OPTION_DEFAULT, ISEQ_TYPE_TOP, &COMPILE_OPTION_DEFAULT,
@ -904,7 +902,7 @@ rb_iseq_new_top(const VALUE vast, VALUE name, VALUE path, VALUE realpath, const
rb_iseq_t * rb_iseq_t *
pm_iseq_new_top(pm_scope_node_t *node, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent) pm_iseq_new_top(pm_scope_node_t *node, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent)
{ {
// iseq_new_setup_coverage(path, ast, 0); iseq_new_setup_coverage(path, (int) (node->parser->newline_list.size - 1));
return pm_iseq_new_with_opt(node, name, path, realpath, 0, parent, 0, return pm_iseq_new_with_opt(node, name, path, realpath, 0, parent, 0,
ISEQ_TYPE_TOP, &COMPILE_OPTION_DEFAULT); ISEQ_TYPE_TOP, &COMPILE_OPTION_DEFAULT);
@ -913,7 +911,7 @@ pm_iseq_new_top(pm_scope_node_t *node, VALUE name, VALUE path, VALUE realpath, c
rb_iseq_t * rb_iseq_t *
rb_iseq_new_main(const VALUE vast, VALUE path, VALUE realpath, const rb_iseq_t *parent, int opt) rb_iseq_new_main(const VALUE vast, VALUE path, VALUE realpath, const rb_iseq_t *parent, int opt)
{ {
iseq_new_setup_coverage(path, vast, 0); iseq_new_setup_coverage(path, ast_line_count(vast));
return rb_iseq_new_with_opt(vast, rb_fstring_lit("<main>"), return rb_iseq_new_with_opt(vast, rb_fstring_lit("<main>"),
path, realpath, 0, path, realpath, 0,
@ -928,7 +926,7 @@ rb_iseq_new_main(const VALUE vast, VALUE path, VALUE realpath, const rb_iseq_t *
rb_iseq_t * rb_iseq_t *
pm_iseq_new_main(pm_scope_node_t *node, VALUE path, VALUE realpath, const rb_iseq_t *parent, int opt) pm_iseq_new_main(pm_scope_node_t *node, VALUE path, VALUE realpath, const rb_iseq_t *parent, int opt)
{ {
// iseq_new_setup_coverage(path, ast, 0); iseq_new_setup_coverage(path, (int) (node->parser->newline_list.size - 1));
return pm_iseq_new_with_opt(node, rb_fstring_lit("<main>"), return pm_iseq_new_with_opt(node, rb_fstring_lit("<main>"),
path, realpath, 0, path, realpath, 0,
@ -941,7 +939,7 @@ rb_iseq_new_eval(const VALUE vast, VALUE name, VALUE path, VALUE realpath, int f
if (rb_get_coverage_mode() & COVERAGE_TARGET_EVAL) { if (rb_get_coverage_mode() & COVERAGE_TARGET_EVAL) {
VALUE coverages = rb_get_coverages(); VALUE coverages = rb_get_coverages();
if (RTEST(coverages) && RTEST(path) && !RTEST(rb_hash_has_key(coverages, path))) { if (RTEST(coverages) && RTEST(path) && !RTEST(rb_hash_has_key(coverages, path))) {
iseq_setup_coverage(coverages, path, vast, first_lineno - 1); iseq_setup_coverage(coverages, path, ast_line_count(vast) + first_lineno - 1);
} }
} }

Просмотреть файл

@ -24,17 +24,6 @@ MSpec.register(:exclude, "TracePoint.new includes multiple events when multiple
MSpec.register(:exclude, "TracePoint#path equals \"(eval at __FILE__:__LINE__)\" inside an eval for :end event") MSpec.register(:exclude, "TracePoint#path equals \"(eval at __FILE__:__LINE__)\" inside an eval for :end event")
## Library ## Library
MSpec.register(:exclude, "Coverage.peek_result returns the result so far")
MSpec.register(:exclude, "Coverage.peek_result second call after require returns accumulated result")
MSpec.register(:exclude, "Coverage.result gives the covered files as a hash with arrays of count or nil")
MSpec.register(:exclude, "Coverage.result returns results for each mode separately when enabled :all modes")
MSpec.register(:exclude, "Coverage.result returns results for each mode separately when enabled any mode explicitly")
MSpec.register(:exclude, "Coverage.result returns the correct results when eval coverage is enabled")
MSpec.register(:exclude, "Coverage.result returns the correct results when eval coverage is disabled") MSpec.register(:exclude, "Coverage.result returns the correct results when eval coverage is disabled")
MSpec.register(:exclude, "Coverage.result clears counters (sets 0 values) when stop is not specified but clear: true specified")
MSpec.register(:exclude, "Coverage.result does not clear counters when stop is not specified but clear: false specified")
MSpec.register(:exclude, "Coverage.result does not clear counters when stop: false and clear is not specified")
MSpec.register(:exclude, "Coverage.result clears counters (sets 0 values) when stop: false and clear: true specified")
MSpec.register(:exclude, "Coverage.result does not clear counters when stop: false and clear: false specified")
MSpec.register(:exclude, "Coverage.start measures coverage within eval") MSpec.register(:exclude, "Coverage.start measures coverage within eval")
MSpec.register(:exclude, "Socket.gethostbyaddr using an IPv6 address with an explicit address family raises SocketError when the address is not supported by the family") MSpec.register(:exclude, "Socket.gethostbyaddr using an IPv6 address with an explicit address family raises SocketError when the address is not supported by the family")