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