summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNARUSE, Yui <naruse@airemix.jp>2024-01-30 18:00:47 +0900
committerNARUSE, Yui <naruse@airemix.jp>2024-01-30 18:00:47 +0900
commit9f18cbd7964f32f224e7d0efba79ee0476a442e0 (patch)
treeff2509ad120d8a1ed3045d28b252c20626e40e72
parentd4b780e84e9a6b858d0f6c6a44b22da0d2f5835e (diff)
Revert "merge revision(s) bc002971b6ad483dbf69b8a275c44412bb6ab954: [Backport #20094]"
This reverts commit d4b780e84e9a6b858d0f6c6a44b22da0d2f5835e.
-rw-r--r--compile.c1
-rw-r--r--parse.y36
-rw-r--r--test/ruby/test_whileuntil.rb18
-rw-r--r--version.h2
4 files changed, 16 insertions, 41 deletions
diff --git a/compile.c b/compile.c
index 306272455a..afc2061b12 100644
--- a/compile.c
+++ b/compile.c
@@ -7097,7 +7097,6 @@ iseq_compile_pattern_each(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *c
case NODE_COLON2:
case NODE_COLON3:
case NODE_BEGIN:
- case NODE_BLOCK:
CHECK(COMPILE(ret, "case in literal", node)); // (1)
if (in_single_pattern) {
ADD_INSN1(ret, line_node, dupn, INT2FIX(2));
diff --git a/parse.y b/parse.y
index e507537130..f8e21dc9a3 100644
--- a/parse.y
+++ b/parse.y
@@ -1186,6 +1186,7 @@ static void fixpos(NODE*,NODE*);
static int value_expr_gen(struct parser_params*,NODE*);
static void void_expr(struct parser_params*,NODE*);
static NODE *remove_begin(NODE*);
+static NODE *remove_begin_all(NODE*);
#define value_expr(node) value_expr_gen(p, (node))
static NODE *void_stmts(struct parser_params*,NODE*);
static void reduce_nodes(struct parser_params*,NODE**);
@@ -3893,7 +3894,7 @@ primary : literal
{
/*%%%*/
if (nd_type_p($2, NODE_SELF)) RNODE_SELF($2)->nd_state = 0;
- $$ = NEW_BLOCK($2, &@$);
+ $$ = NEW_BEGIN($2, &@$);
/*% %*/
/*% ripper: paren!($2) %*/
}
@@ -5544,7 +5545,7 @@ p_var_ref : '^' tIDENTIFIER
p_expr_ref : '^' tLPAREN expr_value rparen
{
/*%%%*/
- $$ = NEW_BLOCK($3, &@$);
+ $$ = NEW_BEGIN($3, &@$);
/*% %*/
/*% ripper: begin!($3) %*/
}
@@ -12829,19 +12830,7 @@ kwd_append(rb_node_kw_arg_t *kwlist, rb_node_kw_arg_t *kw)
static NODE *
new_defined(struct parser_params *p, NODE *expr, const YYLTYPE *loc)
{
- NODE *n = expr;
- while (n) {
- if (nd_type_p(n, NODE_BEGIN)) {
- n = RNODE_BEGIN(n)->nd_body;
- }
- else if (nd_type_p(n, NODE_BLOCK) && RNODE_BLOCK(n)->nd_end == n) {
- n = RNODE_BLOCK(n)->nd_head;
- }
- else {
- break;
- }
- }
- return NEW_DEFINED(n, loc);
+ return NEW_DEFINED(remove_begin_all(expr), loc);
}
static NODE*
@@ -13981,6 +13970,16 @@ remove_begin(NODE *node)
return node;
}
+static NODE *
+remove_begin_all(NODE *node)
+{
+ NODE **n = &node, *n1 = node;
+ while (n1 && nd_type_p(n1, NODE_BEGIN)) {
+ *n = n1 = RNODE_BEGIN(n1)->nd_body;
+ }
+ return node;
+}
+
static void
reduce_nodes(struct parser_params *p, NODE **body)
{
@@ -14150,12 +14149,7 @@ cond0(struct parser_params *p, NODE *node, enum cond_type type, const YYLTYPE *l
return NEW_MATCH2(node, NEW_GVAR(idLASTLINE, loc), loc);
case NODE_BLOCK:
- {
- NODE *end = RNODE_BLOCK(node)->nd_end;
- NODE **expr = &RNODE_BLOCK(end)->nd_head;
- if (top) top = node == end;
- *expr = cond0(p, *expr, type, loc, top);
- }
+ RNODE_BLOCK(RNODE_BLOCK(node)->nd_end)->nd_head = cond0(p, RNODE_BLOCK(RNODE_BLOCK(node)->nd_end)->nd_head, type, loc, false);
break;
case NODE_AND:
diff --git a/test/ruby/test_whileuntil.rb b/test/ruby/test_whileuntil.rb
index ff6d29ac4a..121c44817d 100644
--- a/test/ruby/test_whileuntil.rb
+++ b/test/ruby/test_whileuntil.rb
@@ -73,24 +73,6 @@ class TestWhileuntil < Test::Unit::TestCase
}
end
- def test_begin_while
- i = 0
- sum = 0
- begin
- i += 1
- sum += i
- end while i < 10
- assert_equal([10, 55], [i, sum])
-
- i = 0
- sum = 0
- (
- i += 1
- sum += i
- ) while false
- assert_equal([0, 0], [i, sum])
- end
-
def test_until
i = 0
until i>4
diff --git a/version.h b/version.h
index f16555c611..3cc8349a00 100644
--- a/version.h
+++ b/version.h
@@ -11,7 +11,7 @@
# 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 3
+#define RUBY_PATCHLEVEL 2
#include "ruby/version.h"
#include "ruby/internal/abi.h"