diff options
author | NARUSE, Yui <naruse@airemix.jp> | 2022-01-30 18:57:52 +0900 |
---|---|---|
committer | NARUSE, Yui <naruse@airemix.jp> | 2022-01-30 19:01:11 +0900 |
commit | 20091ccad34904cb5ded13a8787f6662a8e2df68 (patch) | |
tree | 2ed0c3645e6663978d8898b9d3f23c74976681d1 | |
parent | fb4df44d1670e9d25aef6b235a7281199a177edb (diff) |
merge revision(s) 0dc7816c4350683ccd020f5759eee4914de0085d: [Backport #18434]
Make RubyVM::AST.of work with code written in `-e` command-line
option
[Bug #18434]
---
ast.c | 11 +++++++----
test/ruby/test_ast.rb | 5 +++++
2 files changed, 12 insertions(+), 4 deletions(-)
-rw-r--r-- | ast.c | 11 | ||||
-rw-r--r-- | test/ruby/test_ast.rb | 5 | ||||
-rw-r--r-- | version.h | 8 |
3 files changed, 16 insertions, 8 deletions
@@ -195,7 +195,7 @@ script_lines(VALUE path) static VALUE ast_s_of(rb_execution_context_t *ec, VALUE module, VALUE body, VALUE keep_script_lines) { - VALUE path, node, lines = Qnil; + VALUE node, lines = Qnil; const rb_iseq_t *iseq; int node_id; @@ -223,15 +223,18 @@ ast_s_of(rb_execution_context_t *ec, VALUE module, VALUE body, VALUE keep_script return Qnil; } lines = iseq->body->variable.script_lines; - if (NIL_P(lines) && rb_iseq_from_eval_p(iseq)) { + + VALUE path = rb_iseq_path(iseq); + int e_option = RSTRING_LEN(path) == 2 && memcmp(RSTRING_PTR(path), "-e", 2) == 0; + + if (NIL_P(lines) && rb_iseq_from_eval_p(iseq) && !e_option) { rb_raise(rb_eArgError, "cannot get AST for method defined in eval"); } - path = rb_iseq_path(iseq); if (!NIL_P(lines) || !NIL_P(lines = script_lines(path))) { node = rb_ast_parse_array(lines, keep_script_lines); } - else if (RSTRING_LEN(path) == 2 && memcmp(RSTRING_PTR(path), "-e", 2) == 0) { + else if (e_option) { node = rb_ast_parse_str(rb_e_script, keep_script_lines); } else { diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index ce0942a6fb..a4edfd3cbe 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -537,4 +537,9 @@ dummy assert_equal("{ 1 + 2 }", node_proc.source) assert_equal("def test_keep_script_lines_for_of\n", node_method.source.lines.first) end + + def test_e_option + assert_in_out_err(["-e", "def foo; end; pp RubyVM::AbstractSyntaxTree.of(method(:foo)).type"], + "", [":SCOPE"], []) + end end @@ -11,11 +11,11 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 0 +#define RUBY_PATCHLEVEL 1 -#define RUBY_RELEASE_YEAR 2021 -#define RUBY_RELEASE_MONTH 12 -#define RUBY_RELEASE_DAY 25 +#define RUBY_RELEASE_YEAR 2022 +#define RUBY_RELEASE_MONTH 1 +#define RUBY_RELEASE_DAY 30 #include "ruby/version.h" |