summaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/vm.c b/vm.c
index 417ab542c8..78b19f6249 100644
--- a/vm.c
+++ b/vm.c
@@ -1198,7 +1198,16 @@ rb_proc_dup(VALUE self)
rb_proc_t *src;
GetProcPtr(self, src);
- procval = proc_create(rb_obj_class(self), &src->block, src->is_from_method, src->is_lambda);
+
+ switch (vm_block_type(&src->block)) {
+ case block_type_ifunc:
+ procval = rb_func_proc_dup(self);
+ break;
+ default:
+ procval = proc_create(rb_obj_class(self), &src->block, src->is_from_method, src->is_lambda);
+ break;
+ }
+
if (RB_OBJ_SHAREABLE_P(self)) FL_SET_RAW(procval, RUBY_FL_SHAREABLE);
RB_GC_GUARD(self); /* for: body = rb_proc_dup(body) */
return procval;