summaryrefslogtreecommitdiff
path: root/proc.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-24 03:38:56 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-24 03:38:56 +0000
commit8af67e3072e7c6a778c72de01e32988a70dd5bc5 (patch)
treee6e7107399ba2f776bd9c9a712a8fd019c78bf97 /proc.c
parent1dec79c324d93b365f699bafa1a65de5752988ea (diff)
* proc.c (proc_call): get rid of optimazation-out by clang.
* proc.c (rb_proc_call, rb_proc_call_with_block): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34117 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'proc.c')
-rw-r--r--proc.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/proc.c b/proc.c
index 228d02ce94..cdbf40e4a4 100644
--- a/proc.c
+++ b/proc.c
@@ -544,6 +544,7 @@ proc_lambda(void)
static VALUE
proc_call(int argc, VALUE *argv, VALUE procval)
{
+ VALUE vret;
rb_proc_t *proc;
rb_block_t *blockptr = 0;
rb_iseq_t *iseq;
@@ -560,8 +561,10 @@ proc_call(int argc, VALUE *argv, VALUE procval)
}
}
- return rb_vm_invoke_proc(GET_THREAD(), proc, proc->block.self,
+ vret = rb_vm_invoke_proc(GET_THREAD(), proc, proc->block.self,
argc, argv, blockptr);
+ RB_GC_GUARD(procval);
+ return vret;
}
#if SIZEOF_LONG > SIZEOF_INT
@@ -581,15 +584,20 @@ check_argc(long argc)
VALUE
rb_proc_call(VALUE self, VALUE args)
{
+ VALUE vret;
rb_proc_t *proc;
GetProcPtr(self, proc);
- return rb_vm_invoke_proc(GET_THREAD(), proc, proc->block.self,
+ vret = rb_vm_invoke_proc(GET_THREAD(), proc, proc->block.self,
check_argc(RARRAY_LEN(args)), RARRAY_PTR(args), 0);
+ RB_GC_GUARD(self);
+ RB_GC_GUARD(args);
+ return vret;
}
VALUE
rb_proc_call_with_block(VALUE self, int argc, VALUE *argv, VALUE pass_procval)
{
+ VALUE vret;
rb_proc_t *proc;
rb_block_t *block = 0;
GetProcPtr(self, proc);
@@ -600,8 +608,11 @@ rb_proc_call_with_block(VALUE self, int argc, VALUE *argv, VALUE pass_procval)
block = &pass_proc->block;
}
- return rb_vm_invoke_proc(GET_THREAD(), proc, proc->block.self,
+ vret = rb_vm_invoke_proc(GET_THREAD(), proc, proc->block.self,
argc, argv, block);
+ RB_GC_GUARD(self);
+ RB_GC_GUARD(pass_procval);
+ return vret;
}
/*