summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNARUSE, Yui <naruse@airemix.jp>2022-01-30 18:57:52 +0900
committerNARUSE, Yui <naruse@airemix.jp>2022-01-30 19:01:11 +0900
commit20091ccad34904cb5ded13a8787f6662a8e2df68 (patch)
tree2ed0c3645e6663978d8898b9d3f23c74976681d1
parentfb4df44d1670e9d25aef6b235a7281199a177edb (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.c11
-rw-r--r--test/ruby/test_ast.rb5
-rw-r--r--version.h8
3 files changed, 16 insertions, 8 deletions
diff --git a/ast.c b/ast.c
index 466e7a6a2e..0515689a29 100644
--- a/ast.c
+++ b/ast.c
@@ -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
diff --git a/version.h b/version.h
index 6510edbf71..5c32027929 100644
--- a/version.h
+++ b/version.h
@@ -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"