summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-11-30 14:38:15 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-11-30 14:38:15 +0000
commitd69b1e3b305a79659f4686f3cffc5c03c18ea832 (patch)
tree2d25d5356f6a5680daf45022d7156fbc4f96efa4
parent9ad02399920e67053063b122f10e9973c50d6ed8 (diff)
merge revision(s) 58499,58500: [Backport #13181]
parse.y: fix line in rescue * parse.y (set_line_body, primary): fix line number of bodystmt as the beginning of the block. [ruby-core:79388] [Bug #13181] parse.y: set_line_body is not used in ripper git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@60947 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog7
-rw-r--r--parse.y20
-rw-r--r--test/ruby/test_parse.rb13
-rw-r--r--version.h2
4 files changed, 38 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index b5822344fb..395f11c9f9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Thu Nov 30 23:37:08 2017 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ parse.y: fix line in rescue
+
+ * parse.y (set_line_body, primary): fix line number of bodystmt as the
+ beginning of the block. [Bug #13181]
+
Thu Nov 30 23:29:00 2017 SHIBATA Hiroshi <hsbt@ruby-lang.org>
Merge rubygems-2.6.14 changes.
diff --git a/parse.y b/parse.y
index 8774014a6b..aba64e6920 100644
--- a/parse.y
+++ b/parse.y
@@ -389,6 +389,17 @@ static int parser_yyerror(struct parser_params*, const char*);
static int yylex(YYSTYPE*, struct parser_params*);
+static inline void
+set_line_body(NODE *body, int line)
+{
+ if (!body) return;
+ switch (nd_type(body)) {
+ case NODE_RESCUE:
+ case NODE_ENSURE:
+ nd_set_line(body, line);
+ }
+}
+
#ifndef RIPPER
#define yyparse ruby_yyparse
@@ -2688,9 +2699,7 @@ primary : literal
$$ = NEW_NIL();
}
else {
- if (nd_type($3) == NODE_RESCUE ||
- nd_type($3) == NODE_ENSURE)
- nd_set_line($3, $<num>2);
+ set_line_body($3, $<num>2);
$$ = NEW_BEGIN($3);
}
nd_set_line($$, $<num>2);
@@ -2975,6 +2984,7 @@ primary : literal
{
/*%%%*/
$$ = NEW_CLASS($2, $5, $3);
+ set_line_body($5, $<num>4);
nd_set_line($$, $<num>4);
/*%
$$ = dispatch3(class, $2, $3, $5);
@@ -2994,6 +3004,7 @@ primary : literal
{
/*%%%*/
$$ = NEW_SCLASS($3, $6);
+ set_line_body($6, nd_line($3));
fixpos($$, $3);
/*%
$$ = dispatch2(sclass, $3, $6);
@@ -3017,6 +3028,7 @@ primary : literal
{
/*%%%*/
$$ = NEW_MODULE($2, $4);
+ set_line_body($4, $<num>3);
nd_set_line($$, $<num>3);
/*%
$$ = dispatch2(module, $2, $4);
@@ -3041,6 +3053,7 @@ primary : literal
NODE *body = remove_begin($6);
reduce_nodes(&body);
$$ = NEW_DEFN($2, $5, body, METHOD_VISI_PRIVATE);
+ set_line_body(body, $<num>1);
nd_set_line($$, $<num>1);
/*%
$$ = dispatch3(def, $2, $5, $6);
@@ -3066,6 +3079,7 @@ primary : literal
NODE *body = remove_begin($8);
reduce_nodes(&body);
$$ = NEW_DEFS($2, $5, $7, body);
+ set_line_body(body, $<num>1);
nd_set_line($$, $<num>1);
/*%
$$ = dispatch5(defs, $2, $3, $5, $7, $8);
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index 5181ee4f21..f48928b85e 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -886,6 +886,19 @@ x = __ENCODING__
assert_equal(-100, e.backtrace_locations.first.lineno, bug)
end
+ def test_method_location_in_rescue
+ bug = '[ruby-core:79388] [Bug #13181]'
+ obj, line = Object.new, __LINE__+1
+ def obj.location
+ #
+ raise
+ rescue
+ caller_locations(1, 1)[0]
+ end
+
+ assert_equal(line, obj.location.lineno, bug)
+ end
+
=begin
def test_past_scope_variable
assert_warning(/past scope/) {catch {|tag| eval("BEGIN{throw tag}; tap {a = 1}; a")}}
diff --git a/version.h b/version.h
index 26b69494e8..53257f61ce 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.3.6"
#define RUBY_RELEASE_DATE "2017-11-30"
-#define RUBY_PATCHLEVEL 379
+#define RUBY_PATCHLEVEL 380
#define RUBY_RELEASE_YEAR 2017
#define RUBY_RELEASE_MONTH 11