[前][次][番号順一覧][スレッド一覧]

ruby-changes:3959

From: ko1@a...
Date: Wed, 13 Feb 2008 01:27:04 +0900 (JST)
Subject: [ruby-changes:3959] nobu - Ruby:r15449 (trunk): * parse.y (arg_concat_gen, arg_append_gen): optimize for array concat.

nobu	2008-02-13 01:26:47 +0900 (Wed, 13 Feb 2008)

  New Revision: 15449

  Modified files:
    trunk/ChangeLog
    trunk/parse.y

  Log:
    * parse.y (arg_concat_gen, arg_append_gen): optimize for array concat.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/parse.y?r1=15449&r2=15448&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15449&r2=15448&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15448)
+++ ChangeLog	(revision 15449)
@@ -1,5 +1,7 @@
-Wed Feb 13 01:23:00 2008  Nobuyoshi Nakada  <nobu@r...>
+Wed Feb 13 01:26:45 2008  Nobuyoshi Nakada  <nobu@r...>
 
+	* parse.y (arg_concat_gen, arg_append_gen): optimize for array concat.
+
 	* parse.y (arg_add_gen): removed since identical to arg_append_gen.
 
 Tue Feb 12 21:04:51 2008  Nobuyoshi Nakada  <nobu@r...>
Index: parse.y
===================================================================
--- parse.y	(revision 15448)
+++ parse.y	(revision 15449)
@@ -7794,9 +7794,19 @@
 arg_concat_gen(struct parser_params *parser, NODE *node1, NODE *node2)
 {
     if (!node2) return node1;
-    if (nd_type(node1) == NODE_BLOCK_PASS) {
+    switch (nd_type(node1)) {
+      case NODE_BLOCK_PASS:
 	node1->nd_iter = arg_concat(node1->nd_iter, node2);
 	return node1;
+      case NODE_ARGSPUSH:
+	if (nd_type(node2) != NODE_ARRAY) break;
+	node1->nd_body = list_concat(NEW_LIST(node1->nd_body), node2);
+	nd_set_type(node1, NODE_ARGSCAT);
+	return node1;
+      case NODE_ARGSCAT:
+	if (nd_type(node2) != NODE_ARRAY) break;
+	node1->nd_body = list_concat(node1->nd_body, node2);
+	return node1;
     }
     return NEW_ARGSCAT(node1, node2);
 }
@@ -7811,9 +7821,15 @@
       case NODE_BLOCK_PASS:
 	node1->nd_head = arg_append(node1->nd_head, node2);
 	return node1;
-      default:
-	return NEW_ARGSPUSH(node1, node2);
+      case NODE_ARGSPUSH:
+	node1->nd_body = list_append(NEW_LIST(node1->nd_body), node2);
+	nd_set_type(node1, NODE_ARGSCAT);
+	return node1;
+      case NODE_ARGSCAT:
+	node1->nd_body = list_append(node1->nd_body, node2);
+	return node1;
     }
+    return NEW_ARGSPUSH(node1, node2);
 }
 
 static NODE *

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]