From: Eric Wong <normalperson@...>
Date: 2014-09-12T10:22:04+00:00
Subject: [ruby-core:64995] Re: [ruby-trunk - Bug #10212] MRI is not for lambda calculus

SASADA Koichi <ko1@atdot.net> wrote:
> (2014/09/12 19:03), Eric Wong wrote:
> > Yes, I think the following API is OK.  rb_proc_t is big.
> > The new inline rb_proc_alloc() takes 7(!) parameters.
> > Maybe we can drop klass since that is always rb_cProc.
> 
> Nice.
> 
> Additionally, I recommend to move the definition from vm_core.h to vm.c

OK, I think I'll move the inline to vm.c

> (and expose it) because proc_dup() in proc.c is minor function.

But exposing it seems worse, even.  In other words: the new rb_proc_alloc
is the wrong interface for rb_proc_dup.  I like the following much
more (still using rb_proc_wrap):

--- a/proc.c
+++ b/proc.c
@@ -106,12 +106,13 @@ rb_obj_is_proc(VALUE proc)
 static VALUE
 proc_dup(VALUE self)
 {
-    rb_proc_t *src;
+    rb_proc_t *src, *dst;
 
     GetProcPtr(self, src);
 
-    return rb_proc_alloc(rb_cProc, &src->block, src->envval, src->blockprocval,
-			src->safe_level, src->is_from_method, src->is_lambda);
+    dst = ALLOC(rb_proc_t);
+    *dst = *src;
+    return rb_proc_wrap(rb_cProc, dst);
 }
 
 /* :nodoc: */