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

yarv-diff:252

From: ko1 atdot.net
Date: 14 Feb 2006 05:59:02 -0000
Subject: [yarv-diff:252] r415 - in trunk: . rb yarvtest

Author: ko1
Date: 2006-02-14 14:59:01 +0900 (Tue, 14 Feb 2006)
New Revision: 415

Modified:
   trunk/
   trunk/ChangeLog
   trunk/compile.c
   trunk/insns.def
   trunk/rb/makedocs.rb
   trunk/test.rb
   trunk/vm.c
   trunk/yarvtest/test_syntax.rb
Log:
 r621@lermite:  ko1 | 2006-02-14 14:58:38 +0900
 	* compile.c, insns.def : support "defined?($1)", ...
 
 	* yarvtest/test_syntax.rb : add a test for above
 
 	* rb/makedocs.rb : fix template directory path
 
 	* vm.c : fix to handle break from proc
 



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:618
   + 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:621

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-02-14 03:51:57 UTC (rev 414)
+++ trunk/ChangeLog	2006-02-14 05:59:01 UTC (rev 415)
@@ -4,6 +4,17 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2006-02-14(Tue) 14:55:51 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* compile.c, insns.def : support "defined?($1)", ...
+
+	* yarvtest/test_syntax.rb : add a test for above
+
+	* rb/makedocs.rb : fix template directory path
+
+	* vm.c : fix to handle break from proc
+
+
 2006-02-14(Tue) 12:42:59 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* eval.c : fix rb_iterate hook

Modified: trunk/compile.c
===================================================================
--- trunk/compile.c	2006-02-14 03:51:57 UTC (rev 414)
+++ trunk/compile.c	2006-02-14 05:59:01 UTC (rev 415)
@@ -2324,8 +2324,8 @@
 
       case NODE_NTH_REF:
 	ADD_INSN(ret, nd_line(node), putnil);
-	ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_REF), 0,
-		  needstr);
+	ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_REF),
+		  INT2FIX(node->nd_nth), needstr);
 	return 1;
 
       case NODE_ZSUPER:

Modified: trunk/insns.def
===================================================================
--- trunk/insns.def	2006-02-14 03:51:57 UTC (rev 414)
+++ trunk/insns.def	2006-02-14 05:59:01 UTC (rev 415)
@@ -940,7 +940,8 @@
 {
     VALUE klass;
     char *expr_type = 0;
-
+    char buf[0x10];
+    
     val = Qnil;
 
     switch (type) {
@@ -1005,10 +1006,19 @@
 	      if (rb_method_boundp(klass, ip->defined_method_id, 0)) {
 		  expr_type = "super";
 	      }
-
 	  }
 	  break;
       }
+      case DEFINED_REF:{
+	  int nth = FIX2INT(obj);
+	  VALUE backref = *lfp_svar(GET_LFP(), 1);
+	  
+	  if (rb_reg_nth_match(nth, backref) != Qnil) {
+	      snprintf(buf, 0x10, "$%d", nth);
+	      expr_type = buf;
+	  }
+	  break;
+      }
       default:
 	rb_bug("unimplemented defined? type (VM)");
 	break;

Modified: trunk/rb/makedocs.rb
===================================================================
--- trunk/rb/makedocs.rb	2006-02-14 03:51:57 UTC (rev 414)
+++ trunk/rb/makedocs.rb	2006-02-14 05:59:01 UTC (rev 415)
@@ -51,7 +51,7 @@
     tbl << "<td>#{chg insn.rets.reverse}</td>"
     tbl << "</tr>\n"
   }
-  f.puts ERB.new(File.read($srcdir + '/tmpl/insnstbl.html')).result(binding)
+  f.puts ERB.new(File.read($srcdir + '/template/insnstbl.html')).result(binding)
 }
 
 begin

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2006-02-14 03:51:57 UTC (rev 414)
+++ trunk/test.rb	2006-02-14 05:59:01 UTC (rev 415)
@@ -1,71 +1,71 @@
+__END__
+p eval("proc{break :ok}").call
 
-class E
-  include Enumerable
+__END__
 
-  def each(&block)
-    [1, 2, 3].each(&block)
-  end
+eval('proc{break}.call')
+
+__END__
+
+def iter &b
+  eval('b.call')
 end
 
-p E.new.find {|x| x == 2 }
+iter{
+  break
+}
 
 __END__
 
-[].each.each
-__END__
-a = [1].each
-a.each{|e| p e}
-__END__
 
+def iter &b
+  b
+end
 
-BEGIN{a = 1}
-p defined?(a) #=> 
+def m b
+  b.call
+  b
+end
+  
+def iter2 &b
+  m(b)
+end
 
+m(iter2{
+  break
+})
+__END__
+iter{
+  break
+}.call
 
-BEGIN{
-  A = 1
-  p A
-}
-p A
 __END__
-a = 4 if p a 
 
-BEGIN{
-  a = 1
-  p a
-  BEGIN{
-    a = 2
-    p a
-  }
-  a = 3
-  p a
-}
-
-
+proc{
+  break
+}.call
 __END__
-
-def m a, b
-  p [a, b]
-  a + b
+def iter &b
+  b.call
 end
 
-m(1, begin
-       raise
-     rescue
-       2
-     end) +
-     m(10, begin
-       raise
-     rescue
-       20
-     ensure
-       30
-     end)
+iter{
+  break
+}
 
+
 __END__
+eval("
+  proc{
+    break
+  }
+  ").call
+__END__
+1.times{
+  p 1
+  proc{
+    break
+  }.call
+  p 2
+}
 
-begin
-  1.times(&lambda{})
-  raise
-rescue
-end

Modified: trunk/vm.c
===================================================================
--- trunk/vm.c	2006-02-14 03:51:57 UTC (rev 414)
+++ trunk/vm.c	2006-02-14 05:59:01 UTC (rev 415)
@@ -619,7 +619,8 @@
     VALUE val = Qundef;
     int state;
     NODE *stored_special_cref_stack = 0;
-
+    yarv_control_frame_t *cfp = th->cfp;
+    
     if (proc->special_cref_stack) {
 	stored_special_cref_stack =
 	    lfp_set_special_cref(proc->block.lfp, proc->special_cref_stack);
@@ -631,8 +632,7 @@
 	    val = th_invoke_yield_cfunc(th, &proc->block, argc, argv);
 	}
 	else {
-	    val =
-		th_invoke_proc_under(th, proc, argc, argv, proc->block.self);
+	    val = th_invoke_proc_under(th, proc, argc, argv, proc->block.self);
 	}
     }
     else {
@@ -644,6 +644,17 @@
 	lfp_set_special_cref(proc->block.lfp, stored_special_cref_stack);
     }
 
+    if (state == TAG_BREAK) {
+	VALUE err = th->errinfo;
+	VALUE *escape_dfp = GET_THROWOBJ_CATCH_POINT(err);
+	VALUE *cdfp = proc->block.dfp;
+	if (escape_dfp == cdfp) {
+	    state = 0;
+	    th->errinfo = Qnil;
+	    val = GET_THROWOBJ_VAL(err);
+	}
+    }
+    
     if (state) {
 	JUMP_TAG(state);
     }

Modified: trunk/yarvtest/test_syntax.rb
===================================================================
--- trunk/yarvtest/test_syntax.rb	2006-02-14 03:51:57 UTC (rev 414)
+++ trunk/yarvtest/test_syntax.rb	2006-02-14 05:59:01 UTC (rev 415)
@@ -491,8 +491,13 @@
       end
       C.new.test + [defined?(C.new.m3)]
     }
+    ae %q{
+      $ans = [defined?($1), defined?($2), defined?($3), defined?($4)]
+      /(a)(b)/ =~ 'ab'
+      $ans + [defined?($1), defined?($2), defined?($3), defined?($4)]
+    }
   end
-
+  
   def test_condition
     ae %q{
 


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

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