mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
parse.y: remove coverage-related code fragments
The code fragments that initializes coverage data were scattered into both parse.y and compile.c. parse.y allocated a coverage data, and compile.c initialize the data. To remove this cross-cutting concern, this change moves the allocation from "coverage" function of parse.y to "rb_iseq_new_top" of iseq.c. For the sake, parse.y just counts the line number of the original source code, and the number is passed via rb_ast_body_t. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64508 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
52bd0d1900
commit
d65f7458bc
6 changed files with 13 additions and 31 deletions
|
@ -1244,6 +1244,7 @@ new_child_iseq(rb_iseq_t *iseq, const NODE *const node,
|
||||||
|
|
||||||
ast.root = node;
|
ast.root = node;
|
||||||
ast.compile_option = 0;
|
ast.compile_option = 0;
|
||||||
|
ast.line_count = -1;
|
||||||
|
|
||||||
debugs("[new_child_iseq]> ---------------------------------------\n");
|
debugs("[new_child_iseq]> ---------------------------------------\n");
|
||||||
ret_iseq = rb_iseq_new_with_opt(&ast, name,
|
ret_iseq = rb_iseq_new_with_opt(&ast, name,
|
||||||
|
|
8
iseq.c
8
iseq.c
|
@ -647,6 +647,14 @@ rb_iseq_new(const rb_ast_body_t *ast, VALUE name, VALUE path, VALUE realpath,
|
||||||
rb_iseq_t *
|
rb_iseq_t *
|
||||||
rb_iseq_new_top(const rb_ast_body_t *ast, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent)
|
rb_iseq_new_top(const rb_ast_body_t *ast, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent)
|
||||||
{
|
{
|
||||||
|
VALUE coverages = rb_get_coverages();
|
||||||
|
if (RTEST(coverages)) {
|
||||||
|
if (ast->line_count >= 0) {
|
||||||
|
VALUE coverage = rb_default_coverage(ast->line_count);
|
||||||
|
rb_hash_aset(coverages, path, coverage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return rb_iseq_new_with_opt(ast, name, path, realpath, INT2FIX(0), parent, ISEQ_TYPE_TOP,
|
return rb_iseq_new_with_opt(ast, name, path, realpath, INT2FIX(0), parent, ISEQ_TYPE_TOP,
|
||||||
&COMPILE_OPTION_DEFAULT);
|
&COMPILE_OPTION_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
1
node.h
1
node.h
|
@ -470,6 +470,7 @@ typedef struct node_buffer_struct node_buffer_t;
|
||||||
typedef struct rb_ast_body_struct {
|
typedef struct rb_ast_body_struct {
|
||||||
const NODE *root;
|
const NODE *root;
|
||||||
VALUE compile_option;
|
VALUE compile_option;
|
||||||
|
int line_count;
|
||||||
} rb_ast_body_t;
|
} rb_ast_body_t;
|
||||||
typedef struct rb_ast_struct {
|
typedef struct rb_ast_struct {
|
||||||
VALUE flags;
|
VALUE flags;
|
||||||
|
|
24
parse.y
24
parse.y
|
@ -266,7 +266,6 @@ struct parser_params {
|
||||||
NODE *eval_tree;
|
NODE *eval_tree;
|
||||||
VALUE error_buffer;
|
VALUE error_buffer;
|
||||||
VALUE debug_lines;
|
VALUE debug_lines;
|
||||||
VALUE coverage;
|
|
||||||
const struct rb_block *base_block;
|
const struct rb_block *base_block;
|
||||||
#else
|
#else
|
||||||
/* Ripper only */
|
/* Ripper only */
|
||||||
|
@ -4845,21 +4844,6 @@ debug_lines(VALUE fname)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
|
||||||
coverage(VALUE fname, int n)
|
|
||||||
{
|
|
||||||
VALUE coverages = rb_get_coverages();
|
|
||||||
if (RTEST(coverages) && RBASIC(coverages)->klass == 0) {
|
|
||||||
VALUE coverage = rb_default_coverage(n);
|
|
||||||
VALUE lines = RARRAY_AREF(coverage, COVERAGE_INDEX_LINES);
|
|
||||||
|
|
||||||
rb_hash_aset(coverages, fname, coverage);
|
|
||||||
|
|
||||||
return lines == Qnil ? Qfalse : lines;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
e_option_supplied(struct parser_params *p)
|
e_option_supplied(struct parser_params *p)
|
||||||
{
|
{
|
||||||
|
@ -4885,7 +4869,6 @@ yycompile0(VALUE arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!e_option_supplied(p)) {
|
if (!e_option_supplied(p)) {
|
||||||
p->coverage = coverage(p->ruby_sourcefile_string, p->ruby_sourceline);
|
|
||||||
cov = Qtrue;
|
cov = Qtrue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4899,7 +4882,6 @@ yycompile0(VALUE arg)
|
||||||
n = yyparse(p);
|
n = yyparse(p);
|
||||||
RUBY_DTRACE_PARSE_HOOK(END);
|
RUBY_DTRACE_PARSE_HOOK(END);
|
||||||
p->debug_lines = 0;
|
p->debug_lines = 0;
|
||||||
p->coverage = 0;
|
|
||||||
|
|
||||||
p->lex.strterm = 0;
|
p->lex.strterm = 0;
|
||||||
p->lex.pcur = p->lex.pbeg = p->lex.pend = 0;
|
p->lex.pcur = p->lex.pbeg = p->lex.pend = 0;
|
||||||
|
@ -4928,6 +4910,7 @@ yycompile0(VALUE arg)
|
||||||
p->ast->body.compile_option = opt;
|
p->ast->body.compile_option = opt;
|
||||||
}
|
}
|
||||||
p->ast->body.root = tree;
|
p->ast->body.root = tree;
|
||||||
|
p->ast->body.line_count = p->line_count;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4989,10 +4972,8 @@ lex_getline(struct parser_params *p)
|
||||||
rb_enc_associate(line, p->enc);
|
rb_enc_associate(line, p->enc);
|
||||||
rb_ary_push(p->debug_lines, line);
|
rb_ary_push(p->debug_lines, line);
|
||||||
}
|
}
|
||||||
if (p->coverage) {
|
|
||||||
rb_ary_push(p->coverage, Qnil);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
p->line_count++;
|
||||||
return line;
|
return line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5173,7 +5154,6 @@ nextline(struct parser_params *p)
|
||||||
p->heredoc_end = 0;
|
p->heredoc_end = 0;
|
||||||
}
|
}
|
||||||
p->ruby_sourceline++;
|
p->ruby_sourceline++;
|
||||||
p->line_count++;
|
|
||||||
p->lex.pbeg = p->lex.pcur = RSTRING_PTR(v);
|
p->lex.pbeg = p->lex.pcur = RSTRING_PTR(v);
|
||||||
p->lex.pend = p->lex.pcur + RSTRING_LEN(v);
|
p->lex.pend = p->lex.pcur + RSTRING_LEN(v);
|
||||||
token_flush(p);
|
token_flush(p);
|
||||||
|
|
|
@ -127,15 +127,6 @@ class TestCoverage < Test::Unit::TestCase
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_nonpositive_linenumber
|
|
||||||
bug12517 = '[ruby-core:76141] [Bug #12517]'
|
|
||||||
assert_in_out_err(%w[-W0 -rcoverage], <<-"end;", ['{"<compiled>"=>[nil]}'], [], bug12517)
|
|
||||||
Coverage.start
|
|
||||||
RubyVM::InstructionSequence.compile(":ok", nil, "<compiled>", 0)
|
|
||||||
p Coverage.result
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_eval
|
def test_eval
|
||||||
bug13305 = '[ruby-core:80079] [Bug #13305]'
|
bug13305 = '[ruby-core:80079] [Bug #13305]'
|
||||||
|
|
||||||
|
|
1
vm.c
1
vm.c
|
@ -970,6 +970,7 @@ rb_binding_add_dynavars(VALUE bindval, rb_binding_t *bind, int dyncount, const I
|
||||||
rb_node_init(&tmp_node, NODE_SCOPE, (VALUE)dyns, 0, 0);
|
rb_node_init(&tmp_node, NODE_SCOPE, (VALUE)dyns, 0, 0);
|
||||||
ast.root = &tmp_node;
|
ast.root = &tmp_node;
|
||||||
ast.compile_option = 0;
|
ast.compile_option = 0;
|
||||||
|
ast.line_count = -1;
|
||||||
|
|
||||||
if (base_iseq) {
|
if (base_iseq) {
|
||||||
iseq = rb_iseq_new(&ast, base_iseq->body->location.label, path, realpath, base_iseq, ISEQ_TYPE_EVAL);
|
iseq = rb_iseq_new(&ast, base_iseq->body->location.label, path, realpath, base_iseq, ISEQ_TYPE_EVAL);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue