summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-20 14:20:46 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-20 14:20:46 +0000
commitbccd171907ac73deffb00fdbe4e1c0eceaf1b593 (patch)
tree8c3d17373c3c1ebc60a7555f2f2743f2704f9fc8
parent53ced68e7b4e71fb3ed679ff9d7433f7023e7c0e (diff)
downloadruby-bccd171907ac73deffb00fdbe4e1c0eceaf1b593.tar.gz
ruby-bccd171907ac73deffb00fdbe4e1c0eceaf1b593.tar.xz
ruby-bccd171907ac73deffb00fdbe4e1c0eceaf1b593.zip
* vm_eval.c (rb_iterate): remove SEGV (use the original patch).
[ruby-dev:39874] git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@26130 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--vm_eval.c24
2 files changed, 18 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index d10ab9bec..c7c3877a0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Dec 20 23:18:23 2009 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * vm_eval.c (rb_iterate): remove SEGV (use the original patch).
+ [ruby-dev:39874]
+
Sun Dec 20 21:26:05 2009 Yusuke Endoh <mame@tsg.ne.jp>
* vm_eval.c (rb_iterate): pass current block when the argument bl_proc
diff --git a/vm_eval.c b/vm_eval.c
index f64aa4afe..889edee9d 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -820,24 +820,26 @@ rb_iterate(VALUE (* it_proc) (VALUE), VALUE data1,
{
int state;
volatile VALUE retval = Qnil;
+ NODE *node = NEW_IFUNC(bl_proc, data2);
rb_thread_t *th = GET_THREAD();
rb_control_frame_t *volatile cfp = th->cfp;
- rb_block_t *blockptr;
- if (bl_proc) {
- blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(th->cfp);
- blockptr->iseq = (void *)NEW_IFUNC(bl_proc, data2);
- blockptr->proc = 0;
- }
- else {
- blockptr = GC_GUARDED_PTR_REF(th->cfp->lfp[0]);
- }
- *(rb_block_t *volatile *)&blockptr = blockptr;
TH_PUSH_TAG(th);
state = TH_EXEC_TAG();
if (state == 0) {
iter_retry:
- th->passed_block = *(rb_block_t *volatile *)&blockptr;
+ {
+ rb_block_t *blockptr;
+ if (bl_proc) {
+ blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(th->cfp);
+ blockptr->iseq = (void *)NEW_IFUNC(bl_proc, data2);
+ blockptr->proc = 0;
+ }
+ else {
+ blockptr = GC_GUARDED_PTR_REF(th->cfp->lfp[0]);
+ }
+ th->passed_block = blockptr;
+ }
retval = (*it_proc) (data1);
}
else {