From: nobu.nakada@... Date: 2002-06-17T22:59:18+09:00 Subject: [ruby-dev:17493] [PATCH] reduce recursion level なかだです。 value_expr()と連続する論理演算子で再帰レベルを減らすパッチです。 Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.184 diff -u -2 -p -w -r1.184 parse.y --- parse.y 2002/06/14 06:27:18 1.184 +++ parse.y 2002/06/17 13:48:51 @@ -4644,6 +4644,5 @@ value_expr(node) NODE *node; { - if (node == 0) return Qtrue; - + while (node) { switch (nd_type(node)) { case NODE_CLASS: @@ -4667,18 +4666,24 @@ value_expr(node) node = node->nd_next; } - return value_expr(node->nd_head); + node = node->nd_head; + break; case NODE_BEGIN: - return value_expr(node->nd_body); + node = node->nd_body; + break; case NODE_IF: - return value_expr(node->nd_body) && value_expr(node->nd_else); + if (!value_expr(node->nd_body)) return Qfalse; + node = node->nd_else; + break; case NODE_AND: case NODE_OR: - return value_expr(node->nd_2nd); + node = node->nd_2nd; + break; case NODE_NEWLINE: - return value_expr(node->nd_next); + node = node->nd_next; + break; default: @@ -4687,4 +4692,7 @@ value_expr(node) } + return Qtrue; +} + static void void_expr(node) @@ -4959,4 +4967,8 @@ logop(type, left, right) { value_expr(left); + if (nd_type(left) == type) { + NODE *node = left; + while (nd_type(node->nd_2nd) == type) { + node = node->nd_2nd; + } + node->nd_2nd = rb_node_newnode(type, node->nd_2nd, right, 0); + return left; + } return rb_node_newnode(type, left, right, 0); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦