summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2021-09-18 21:28:35 +0900
committerYusuke Endoh <mame@ruby-lang.org>2021-09-18 21:28:35 +0900
commited9d9cee76ee941c504ccea33c70c0eb5d825813 (patch)
tree2233a3f509d49be4a3cc40926746dfa5f8d49209
parent1c07c98229aa16bf13cbd3997d32230d5324b4f2 (diff)
ast.c: AST.of checks if a given method object is defined in C
[Bug #18178]
-rw-r--r--ast.c3
-rw-r--r--test/ruby/test_ast.rb5
2 files changed, 8 insertions, 0 deletions
diff --git a/ast.c b/ast.c
index 202527f53f..e1c044e24c 100644
--- a/ast.c
+++ b/ast.c
@@ -213,6 +213,9 @@ ast_s_of(rb_execution_context_t *ec, VALUE module, VALUE body, VALUE keep_script
else {
iseq = rb_method_iseq(body);
}
+ if (!iseq) {
+ rb_raise(rb_eArgError, "cannot get AST for method that is not defined in Ruby");
+ }
if (rb_iseq_from_eval_p(iseq)) {
rb_raise(rb_eArgError, "cannot get AST for method defined in eval");
}
diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb
index 3af67b1495..0b5c41058c 100644
--- a/test/ruby/test_ast.rb
+++ b/test/ruby/test_ast.rb
@@ -231,6 +231,11 @@ class TestAst < Test::Unit::TestCase
assert_raise(ArgumentError) { RubyVM::AbstractSyntaxTree.of(method) }
end
+ def test_of_c_method
+ c = Class.new { attr_reader :foo }
+ assert_raise(ArgumentError) { RubyVM::AbstractSyntaxTree.of(c.instance_method(:foo)) }
+ end
+
def test_scope_local_variables
node = RubyVM::AbstractSyntaxTree.parse("_x = 0")
lv, _, body = *node.children