diff options
author | Yusuke Endoh <[email protected]> | 2021-06-17 23:43:08 +0900 |
---|---|---|
committer | Yusuke Endoh <[email protected]> | 2021-06-18 02:34:27 +0900 |
commit | acae5f363dfaedd9c2873cee68c9498da3c072f5 (patch) | |
tree | 8919487eefdc8610b2914366abe637ac34812331 /parse.y | |
parent | c639b58823cd8cc62853acf00a49b67ac359ea73 (diff) |
ast.rb: RubyVM::AST.parse and .of accepts `save_script_lines: true`
This option makes the parser keep the original source as an array of
the original code lines. This feature exploits the mechanism of
`SCRIPT_LINES__` but records only the specified code that is passed to
RubyVM::AST.of or .parse, instead of recording all parsed program texts.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/4581
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 17 |
1 files changed, 17 insertions, 0 deletions
@@ -337,6 +337,7 @@ struct parser_params { unsigned int do_loop: 1; unsigned int do_chomp: 1; unsigned int do_split: 1; + unsigned int save_script_lines: 1; NODE *eval_tree_begin; NODE *eval_tree; @@ -6241,6 +6242,13 @@ yycompile0(VALUE arg) cov = Qtrue; } } + if (p->save_script_lines) { + if (!p->debug_lines) { + p->debug_lines = rb_ary_new(); + } + + RB_OBJ_WRITE(p->ast, &p->ast->body.script_lines, p->debug_lines); + } parser_prepare(p); #define RUBY_DTRACE_PARSE_HOOK(name) \ @@ -13186,6 +13194,15 @@ rb_parser_set_context(VALUE vparser, const struct rb_iseq_struct *base, int main p->parent_iseq = base; return vparser; } + +void +rb_parser_save_script_lines(VALUE vparser) +{ + struct parser_params *p; + + TypedData_Get_Struct(vparser, struct parser_params, &parser_data_type, p); + p->save_script_lines = 1; +} #endif #ifdef RIPPER |