[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:6

From: ko1 atdot.net
Date: 4 Jun 2005 00:12:20 -0000
Subject: [yarv-diff:6] r161 - trunk

Author: ko1
Date: 2005-06-04 09:12:20 +0900 (Sat, 04 Jun 2005)
New Revision: 161

Modified:
   trunk/ChangeLog
   trunk/compile.c
   trunk/test.rb
Log:
	* compile.c : fix some point



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2005-06-03 22:33:10 UTC (rev 160)
+++ trunk/ChangeLog	2005-06-04 00:12:20 UTC (rev 161)
@@ -4,6 +4,11 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2005-06-04(Sat) 09:12:13 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* compile.c : fix some point
+
+
 2005-06-04(Sat) 07:31:21 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* compile.c, insns.def : optimize case/when statement

Modified: trunk/compile.c
===================================================================
--- trunk/compile.c	2005-06-03 22:33:10 UTC (rev 160)
+++ trunk/compile.c	2005-06-04 00:12:20 UTC (rev 161)
@@ -1022,13 +1022,13 @@
   if(nd_type(node) == NODE_LIT){
     VALUE v     = node->nd_lit;
     VALUE klass = CLASS_OF(v);
-    
-    if(klass == rb_cString ||
-       klass == rb_cSymbol ||
-       rb_obj_is_kind_of(v, rb_cNumeric)){
+    if(klass == rb_cSymbol || rb_obj_is_kind_of(v, rb_cNumeric)){
       return v;
     }
   }
+  else if(nd_type(node) == NODE_STR){
+    return node->nd_lit;
+  }
   return Qfalse;
 }
 
@@ -1279,7 +1279,6 @@
     break;
   }
   case NODE_CASE:{
-#if 0
     VALUE head = COMPILE("case base", node->nd_head);
     NODE* vals;
     NODE* val;
@@ -1303,7 +1302,6 @@
     
     ADD_SEQ (ret, head); /* case VAL */
     
-    
     while(type == NODE_WHEN){
       l1  = NEW_LABEL(nd_line(node));
       ADD_LABEL(body_seq, l1);
@@ -1369,75 +1367,6 @@
     ADD_SEQ  (ret, body_seq);
     ADD_LABEL(ret, endlabel);
     break;
-
-#else
-    VALUE head = COMPILE("case base", node->nd_head);
-    NODE* vals;
-    NODE* val;
-    NODE* tempnode = node;
-    VALUE endlabel;
-    VALUE body_seq;
-    
-    node = node->nd_body;
-    type = nd_type(node);
-
-    if(type != NODE_WHEN){
-      COMPILE_ERROR(("NODE_CASE: unexpected node. must be NODE_WHEN, byt %s", node_name(type)));
-    }
-    
-    ret      = NEW_SEQ();
-    body_seq = NEW_SEQ();
-    endlabel = NEW_LABEL(nd_line(node));
-    
-    ADD_SEQ (ret, head); /* case VAL */
-    
-    while(type == NODE_WHEN){
-      l1  = NEW_LABEL(nd_line(node));
-      ADD_LABEL(body_seq, l1);
-      ADD_INSN (body_seq, nd_line(node), pop);
-      ADD_SEQ  (body_seq, COMPILE_("when body", node->nd_body, poped));
-      ADD_INSNL(body_seq, nd_line(node), jump, endlabel);
-
-      vals = node->nd_head;
-      if(vals && nd_type(vals) == NODE_ARRAY){
-        while(vals){
-          val = vals->nd_head;
-          ADD_SEQ  (ret, COMPILE("when cond", val));
-          ADD_INSN1(ret, nd_line(node), topn, INT2FIX(1));
-          ADD_SEND (ret, nd_line(node), ID2SYM(idEqq), INT2FIX(1));
-          ADD_INSNL(ret, nd_line(node), if, l1);
-          vals = vals->nd_next;
-        }
-      }
-      else{
-        COMPILE_ERROR(("NODE_CASAE: must be NODE_ARRAY, but %s\n", node_name(nd_type(vals))));
-      }
-      
-      node = node->nd_next;
-      if(!node){
-        break;
-      }
-      type = nd_type(node);
-    }
-    /* else */
-    if(node){
-      ADD_INSN (ret, nd_line(node), pop);
-      ADD_SEQ  (ret,                COMPILE_("else", node, poped));
-      ADD_INSNL(ret, nd_line(node), jump, endlabel);
-    }
-    else{
-      debugs("== else(implicit)\n");
-      ADD_INSN (ret, nd_line(tempnode), pop);
-      if(!poped){
-        ADD_INSN (ret, nd_line(tempnode), putnil);
-      }
-      ADD_INSNL(ret, nd_line(tempnode), jump, endlabel);
-    }
-
-    ADD_SEQ  (ret, body_seq);
-    ADD_LABEL(ret, endlabel);
-    break;
-#endif
   }
   case NODE_WHEN:{
     NODE* vals;

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2005-06-03 22:33:10 UTC (rev 160)
+++ trunk/test.rb	2005-06-04 00:12:20 UTC (rev 161)
@@ -9,6 +9,30 @@
 ###########################################################
 $prog =<<'__EOP__'
 
+
+i=0
+while i<100000
+  i+=1
+  case 'xxx'
+  when 'aaa'
+  when 'bbb'
+  when 'ccc'
+  when 'ddd'
+  when 'eee'
+  when 'fff'
+  when 'ggg'
+  when 'hhh'
+  when 'iii'
+  when 'jjj'
+  when 'kkk'
+  when 'lll'
+  when 'mmm'
+  when 'nnn'
+  else
+  end
+end
+
+__END__
 case :z
 when :x
   p :x


--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]