yarv-diff:250
From: ko1 atdot.net
Date: 14 Feb 2006 03:51:35 -0000
Subject: [yarv-diff:250] r413 - in trunk: . test
Author: ko1
Date: 2006-02-14 12:51:35 +0900 (Tue, 14 Feb 2006)
New Revision: 413
Modified:
trunk/
trunk/ChangeLog
trunk/eval.c
trunk/eval_proc.c
trunk/runruby.rb
trunk/test.rb
trunk/test/runner.rb
trunk/vm.c
Log:
r617@lermite: ko1 | 2006-02-14 12:03:55 +0900
* eval.c : fix to check passed block at block_given_p
* eval_proc.c : fix to pass block at Method#call
* runruby.rb : fix to apply ruby
* test/runner.rb : GC.stress (comment out)
* vm.c : fix indnet
Property changes on: trunk
___________________________________________________________________
Name: svk:merge
- 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:613
+ 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:617
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/ChangeLog 2006-02-14 03:51:35 UTC (rev 413)
@@ -4,6 +4,19 @@
# from Mon, 03 May 2004 01:24:19 +0900
#
+2006-02-14(Tue) 12:01:06 +0900 Koichi Sasada <ko1 atdot.net>
+
+ * eval.c : fix to check passed block at block_given_p
+
+ * eval_proc.c : fix to pass block at Method#call
+
+ * runruby.rb : fix to apply ruby
+
+ * test/runner.rb : GC.stress (comment out)
+
+ * vm.c : fix indnet
+
+
2006-02-14(Tue) 08:04:33 +0900 Minero Aoki <aamine loveruby.net>
* lib/tempfile.rb: use Mutex instead of Thread.critical.
Modified: trunk/eval.c
===================================================================
--- trunk/eval.c 2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/eval.c 2006-02-14 03:51:35 UTC (rev 413)
@@ -1093,7 +1093,9 @@
int
rb_block_given_p()
{
- if (GC_GUARDED_PTR_REF(GET_THREAD()->cfp->lfp[0])) {
+ yarv_thread_t *th = GET_THREAD();
+ if (GC_GUARDED_PTR_REF(th->cfp->lfp[0]) ||
+ th->passed_block) {
return Qtrue;
}
else {
@@ -1135,7 +1137,8 @@
yarv_thread_t *th = GET_THREAD();
yarv_control_frame_t *cfp = th->cfp;
cfp = th_get_ruby_level_cfp(th, YARV_PREVIOUS_CONTROL_FRAME(cfp));
- if (GC_GUARDED_PTR_REF(cfp->lfp[0])) {
+ if (GC_GUARDED_PTR_REF(cfp->lfp[0]) ||
+ th->passed_block) {
return Qtrue;
}
else {
@@ -1361,15 +1364,8 @@
}
VALUE
-#ifdef HAVE_STDARG_PROTOTYPES
rb_rescue2(VALUE (*b_proc) (ANYARGS), VALUE data1, VALUE (*r_proc) (ANYARGS),
VALUE data2, ...)
-#else
-rb_rescue2(b_proc, data1, r_proc, data2, va_alist)
- VALUE (*b_proc) (ANYARGS), (*r_proc) (ANYARGS);
- VALUE data1, data2;
- va_dcl
-#endif
{
int state;
volatile VALUE result;
Modified: trunk/eval_proc.c
===================================================================
--- trunk/eval_proc.c 2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/eval_proc.c 2006-02-14 03:51:35 UTC (rev 413)
@@ -438,7 +438,7 @@
ID oid = id;
again:
- if ((body = rb_get_method_body(klass, id, &id)) == 0) {
+ if ((body = rb_get_method_body(klass, id, 0)) == 0) {
print_undef(rklass, oid);
}
@@ -459,6 +459,7 @@
method = Data_Make_Struct(mklass, struct METHOD, bm_mark, -1, data);
data->klass = klass;
data->recv = obj;
+
data->id = id;
data->body = body;
data->rklass = rklass;
@@ -807,6 +808,7 @@
ruby_safe_level = 4;
}
if ((state = EXEC_TAG()) == 0) {
+ PASS_PASSED_BLOCK();
result = th_call0(GET_THREAD(),
data->klass, data->recv, data->id, data->oid,
argc, argv, data->body, 0);
Modified: trunk/runruby.rb
===================================================================
--- trunk/runruby.rb 2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/runruby.rb 2006-02-14 03:51:35 UTC (rev 413)
@@ -56,4 +56,7 @@
end
end
-exec ruby, *ARGV
+# ruby = "gdb --args #{ruby}"
+cmd = [ruby, *ARGV].join(' ')
+p cmd
+exec cmd
Modified: trunk/test/runner.rb
===================================================================
--- trunk/test/runner.rb 2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/test/runner.rb 2006-02-14 03:51:35 UTC (rev 413)
@@ -5,5 +5,5 @@
rcsid = %w$Id: runner.rb,v 1.14 2005/02/17 04:50:49 ntalbott Exp $
Version = rcsid[2].scan(/\d+/).collect!(&method(:Integer)).freeze
Release = rcsid[3].freeze
-
+# GC.stress = true
exit Test::Unit::AutoRunner.run(true, File.dirname($0))
Modified: trunk/test.rb
===================================================================
--- trunk/test.rb 2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/test.rb 2006-02-14 03:51:35 UTC (rev 413)
@@ -1,3 +1,10 @@
+[].each.each
+__END__
+a = [1].each
+a.each{|e| p e}
+__END__
+
+
BEGIN{a = 1}
p defined?(a) #=>
Modified: trunk/vm.c
===================================================================
--- trunk/vm.c 2006-02-13 23:05:37 UTC (rev 412)
+++ trunk/vm.c 2006-02-14 03:51:35 UTC (rev 413)
@@ -392,7 +392,7 @@
VALUE val;
yarv_block_t *blockptr = 0;
- //printf("id: %s, argc: %d\n", rb_id2name(id), argc);
+ if (0) printf("id: %s (%p), nd: %s, argc: %d, passed: %p\n", rb_id2name(id), id, node_name(nd_type(body)), argc, th->passed_block);
//SDR2(th->cfp);
if (th->passed_block) {
@@ -400,67 +400,67 @@
th->passed_block = 0;
}
switch (nd_type(body)) {
- case YARV_METHOD_NODE:{
- yarv_control_frame_t *reg_cfp;
- int i;
- const int flag = 0;
+ case YARV_METHOD_NODE:{
+ yarv_control_frame_t *reg_cfp;
+ int i;
+ const int flag = 0;
- th_set_finish_env(th);
- reg_cfp = th->cfp;
- for (i = 0; i < argc; i++) {
- *reg_cfp->sp++ = argv[i];
- }
- macro_eval_invoke_func(body->nd_body, recv, klass, blockptr,
- argc);
- val = th_eval_body(th);
- break;
- }
- case NODE_CFUNC:{
- yarv_control_frame_t *reg_cfp = th->cfp;
- struct yarv_cmethod_info cmi = { 0, id, klass };
+ th_set_finish_env(th);
+ reg_cfp = th->cfp;
+ for (i = 0; i < argc; i++) {
+ *reg_cfp->sp++ = argv[i];
+ }
+ macro_eval_invoke_func(body->nd_body, recv, klass, blockptr,
+ argc);
+ val = th_eval_body(th);
+ break;
+ }
+ case NODE_CFUNC:{
+ yarv_control_frame_t *reg_cfp = th->cfp;
+ struct yarv_cmethod_info cmi = { 0, id, klass };
- th_set_env(th, (yarv_iseq_t *)&cmi,
- FRAME_MAGIC_CFUNC, recv, (VALUE)blockptr,
- 0, reg_cfp->sp, 0, 0, 0, 0);
+ th_set_env(th, (yarv_iseq_t *)&cmi,
+ FRAME_MAGIC_CFUNC, recv, (VALUE)blockptr,
+ 0, reg_cfp->sp, 0, 0, 0, 0);
- val = call_cfunc(body->nd_cfnc, recv, body->nd_argc, argc, argv);
+ val = call_cfunc(body->nd_cfnc, recv, body->nd_argc, argc, argv);
- th->cfp = reg_cfp; /* pop control stack frame */
- break;
- }
- case NODE_ATTRSET:{
- if (argc != 1) {
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
- argc);
- }
- val = rb_ivar_set(recv, body->nd_vid, argv[0]);
- break;
- }
- case NODE_IVAR:{
- if (argc != 0) {
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)",
- argc);
- }
- val = rb_attr_get(recv, body->nd_vid);
- break;
- }
- case NODE_BMETHOD:{
- yarv_control_frame_t *reg_cfp;
- int i;
+ th->cfp = reg_cfp; /* pop control stack frame */
+ break;
+ }
+ case NODE_ATTRSET:{
+ if (argc != 1) {
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
+ argc);
+ }
+ val = rb_ivar_set(recv, body->nd_vid, argv[0]);
+ break;
+ }
+ case NODE_IVAR:{
+ if (argc != 0) {
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)",
+ argc);
+ }
+ val = rb_attr_get(recv, body->nd_vid);
+ break;
+ }
+ case NODE_BMETHOD:{
+ yarv_control_frame_t *reg_cfp;
+ int i;
- th_set_finish_env(th);
+ th_set_finish_env(th);
- reg_cfp = th->cfp;
+ reg_cfp = th->cfp;
- for (i = 0; i < argc; i++) {
- *reg_cfp->sp++ = argv[i];
- }
- macro_eval_invoke_bmethod(body->nd_cval, recv, klass, blockptr,
- argc);
- val = th_eval_body(th);
- break;
- }
- default:
+ for (i = 0; i < argc; i++) {
+ *reg_cfp->sp++ = argv[i];
+ }
+ macro_eval_invoke_bmethod(body->nd_cval, recv, klass, blockptr,
+ argc);
+ val = th_eval_body(th);
+ break;
+ }
+ default:
rb_bug("unsupported: thread_call0");
}
YARV_CHECK_INTS();
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml