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