yarv-diff:91
From: ko1 atdot.net
Date: 18 Aug 2005 04:01:49 -0000
Subject: [yarv-diff:91] r247 - in trunk: . yarvtest
Author: ko1
Date: 2005-08-18 13:01:48 +0900 (Thu, 18 Aug 2005)
New Revision: 247
Added:
trunk/test.rb
trunk/test2.rb
Removed:
trunk/test1.rb
Modified:
trunk/ChangeLog
trunk/common.mk
trunk/compile.c
trunk/vm.c
trunk/yarvtest/test_syn.rb
Log:
* common.mk :
* compile.c : fix when clause bug and splat arugment
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/ChangeLog 2005-08-18 04:01:48 UTC (rev 247)
@@ -4,6 +4,13 @@
# from Mon, 03 May 2004 01:24:19 +0900
#
+2005-08-18(Thu) 12:59:38 +0900
+
+ * common.mk :
+
+ * compile.c : fix when clause bug and splat arugment
+
+
2005-08-17(Wed) 05:22:31 +0900
* compile.c : fix block local parameter setting routine and support
Modified: trunk/common.mk
===================================================================
--- trunk/common.mk 2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/common.mk 2005-08-18 04:01:48 UTC (rev 247)
@@ -394,16 +394,16 @@
yarv-test-each: all
$(BASERUBY) -I$(srcdir) $(srcdir)/yarvtest/test_$(ITEM).rb $(OPT) yarv=$(MINIRUBY) ruby=$(BASERUBY)
-run: all
+run2: all
$(BASERUBY) -I$(srcdir)/lib $(srcdir)/test.rb $(MINIRUBY) $(BASERUBY) $(RUNOPT)
-run1: all
+run: all
$(MINIRUBY) $(srcdir)/test1.rb
parse: all
$(MINIRUBY) $(srcdir)/rb/parse.rb $(srcdir)/test1.rb
-run1p: all
+runp: all
$(MINIRUBY) $(srcdir)/rb/parse.rb $(srcdir)/test1.rb
$(MINIRUBY) $(srcdir)/test1.rb
Modified: trunk/compile.c
===================================================================
--- trunk/compile.c 2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/compile.c 2005-08-18 04:01:48 UTC (rev 247)
@@ -788,21 +788,33 @@
case NODE_MASGN:{
int i;
nelem = node->nd_var->nd_head;
- iseqobj->argc = node->nd_var->nd_head->nd_alen;
- for(i=0; i<iseqobj->argc; i++, nelem = nelem->nd_next){
- if(nd_type(nelem->nd_head) == NODE_DASGN_CURR){
- rb_ary_push(vars, ID2SYM(nelem->nd_head->nd_vid));
- debugi("block arg", nelem->nd_head->nd_vid);
+ if(nelem != 0){
+ iseqobj->argc = node->nd_var->nd_head->nd_alen;
+ for(i=0; i<iseqobj->argc; i++, nelem = nelem->nd_next){
+ if(nd_type(nelem->nd_head) == NODE_DASGN_CURR){
+ rb_ary_push(vars, ID2SYM(nelem->nd_head->nd_vid));
+ debugi("block arg", nelem->nd_head->nd_vid);
+ }
+ else{
+ char buff[0x20];
+ ID id;
+ int idx = iseqobj->argc - RARRAY(vars)->len;
+ snprintf(buff, 0x20, "#blp%d", idx);
+ id = rb_intern(buff);
+ rb_ary_push(vars, ID2SYM(id));
+ debugi("block arg (auto)", id);
+ search_block_local_variables(nelem->nd_head, local_vars);
+ }
}
+ }
+ if(node->nd_var->nd_args){
+ NODE *sn = node->nd_var->nd_args;
+ if(nd_type(sn) == NODE_DASGN_CURR){
+ rb_ary_push(vars, ID2SYM(sn->nd_vid));
+ }
else{
- char buff[0x20];
- ID id;
- int idx = iseqobj->argc - RARRAY(vars)->len;
- snprintf(buff, 0x20, "#blp%d", idx);
- id = rb_intern(buff);
- rb_ary_push(vars, ID2SYM(id));
- debugi("block arg (auto)", id);
- search_block_local_variables(nelem->nd_head, local_vars);
+ rb_ary_push(vars, ID2SYM(rb_intern("#blp_splat")));
+ debugi("block/splat (auto)", rb_intern("#blp_splat"));
}
}
break;
@@ -884,12 +896,9 @@
if(node->nd_var){
NODE *nargs = node->nd_var;
switch(nd_type(nargs)){
- case NODE_MASGN:
- if(nargs->nd_head == 0){
- rb_bug("unsupport this type block parameter");
- }
- else{
- int i=0;
+ case NODE_MASGN:{
+ int i=0;
+ if(nargs->nd_head != 0){
nargs = nargs->nd_head;
while(nargs){
if(nd_type(nargs->nd_head) != NODE_DASGN_CURR){
@@ -902,7 +911,16 @@
nargs = nargs->nd_next;
}
}
+ if(node->nd_var->nd_args){
+ iseqobj->argc++;
+ iseqobj->arg_rest = i;
+ if(nd_type(node->nd_var->nd_args) != NODE_DASGN_CURR){
+ ADD_INSN2(anchor, nd_line(node), getdynamic, I2F(iseqobj->local_size - i), I2F(0));
+ set_block_initializer(self, iseqobj, node->nd_var->nd_args, anchor);
+ }
+ }
break;
+ }
case NODE_DASGN_CURR:
break;
@@ -2233,12 +2251,13 @@
case NODE_WHEN:{
NODE* vals;
NODE* val;
+ NODE* orig_node = node;
LABEL* endlabel;
DECL_ANCHOR(body_seq);
endlabel = NEW_LABEL(nd_line(node));
- while(nd_type(node) == NODE_WHEN){
+ while(node && nd_type(node) == NODE_WHEN){
LABEL *l1 = NEW_LABEL(nd_line(node));
ADD_LABEL(body_seq, l1);
COMPILE_ (body_seq, "when", node->nd_body, poped);
@@ -2260,7 +2279,7 @@
}
/* else */
COMPILE_ (ret, "else", node, poped);
- ADD_INSNL(ret, nd_line(node), jump, endlabel);
+ ADD_INSNL(ret, nd_line(orig_node), jump, endlabel);
ADD_SEQ (ret, body_seq);
ADD_LABEL(ret, endlabel);
@@ -2880,7 +2899,6 @@
VALUE block = 0;
VALUE parent_block = iseqobj->compile_data->current_block;
iseqobj->compile_data->current_block = Qfalse;
-
#if SUPPORT_GOTO
/* only joke */
{
@@ -2961,6 +2979,7 @@
if(parent_block){
if(parent_block & 1){
flag |= VM_CALL_ARGS_BLOCKARG_BIT;
+ //dump_disasm_list((LINK_ANCHOR *)(parent_block & (~1)));
ADD_SEQ(ret, (LINK_ANCHOR *)(parent_block & (~1)));
}
else{
@@ -3383,9 +3402,9 @@
LABEL * retry_end_l = NEW_LABEL(nd_line(node));
DECL_ANCHOR(current_block);
- iseqobj->compile_data->current_block = (VALUE)current_block | 1;
COMPILE(current_block, "block pass proc", node->nd_body);
+ iseqobj->compile_data->current_block = (VALUE)current_block | 1;
ADD_LABEL(ret, retry_label);
COMPILE_ (ret, "iter caller (NODE_BLOCK_PASS)", node->nd_iter, poped);
ADD_LABEL(ret, retry_end_l);
Copied: trunk/test.rb (from rev 245, trunk/test1.rb)
===================================================================
--- trunk/test1.rb 2005-08-16 20:25:28 UTC (rev 245)
+++ trunk/test.rb 2005-08-18 04:01:48 UTC (rev 247)
@@ -0,0 +1,23 @@
+def m *args
+ p args
+end
+
+
+__END__
+def iter
+ yield 1,2
+end
+
+iter{|x, *a|
+ p a
+}
+
+
+__END__
+__END__
+a = 1
+END{
+ p a
+ p :POSTEXE
+}
+p :FINISH
Deleted: trunk/test1.rb
===================================================================
--- trunk/test1.rb 2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/test1.rb 2005-08-18 04:01:48 UTC (rev 247)
@@ -1,14 +0,0 @@
- ary = 1
- p [:x, *ary]
-__END__
-[:x, *]
-__END__
-ary = [1, 2]
-p [:x, *ary]
-
-__END__
-def m
- return 1, *[]
-end
-a, b = m
-p [a, b]
Copied: trunk/test2.rb (from rev 243, trunk/test.rb)
Modified: trunk/vm.c
===================================================================
--- trunk/vm.c 2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/vm.c 2005-08-18 04:01:48 UTC (rev 247)
@@ -384,7 +384,7 @@
argv = RARRAY(argv[0])->ptr;
}
}
-
+
th_set_finish_env(th);
th_set_env(th, block->iseq, FRAME_MAGIC_BLOCK,
block->self, GC_GUARDED_PTR(block->dfp),
Modified: trunk/yarvtest/test_syn.rb
===================================================================
--- trunk/yarvtest/test_syn.rb 2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/yarvtest/test_syn.rb 2005-08-18 04:01:48 UTC (rev 247)
@@ -177,6 +177,17 @@
:ng
end
}
+ ae %q{
+ def test(arg)
+ case 1
+ when 2
+ 3
+ end
+ return arg
+ end
+
+ test(100)
+ }
end
def test_when
@@ -213,16 +224,11 @@
else
:elseok
end)
+
ae %q{
- def test(arg)
- case 1
- when 2
- 3
- end
- return arg
+ case
+ when 1
end
-
- test(100)
}
end
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml