https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2019-01-01T11:09:25Z
Ruby Issue Tracking System
Ruby master - Feature #15477: Proc#arity returns -1 for composed lambda Procs of known arguments
https://bugs.ruby-lang.org/issues/15477?journal_id=76031
2019-01-01T11:09:25Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul><li><strong>Tracker</strong> changed from <i>Bug</i> to <i>Feature</i></li><li><strong>ruby -v</strong> deleted (<del><i>ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]</i></del>)</li><li><strong>Backport</strong> deleted (<del><i>2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN</i></del>)</li></ul><p>Looks not a bug to me. Moving to the feature tracker.</p>
<p>A patch is attached.</p>
<pre><code class="diff syntaxhl" data-language="diff"><span class="gh">diff --git a/proc.c b/proc.c
index c09e845ec0..45e2a21551 100644
</span><span class="gd">--- a/proc.c
</span><span class="gi">+++ b/proc.c
</span><span class="p">@@ -3063,6 +3063,16 @@</span> compose(VALUE dummy, VALUE args, int argc, VALUE *argv, VALUE passed_proc)
return rb_funcallv(f, idCall, 1, &fargs);
}
<span class="gi">+static VALUE
+compose_proc_new(VALUE procs)
+{
+ VALUE first_proc = RARRAY_AREF(procs, 1);
+ int max_arity, min_arity = rb_proc_min_max_arity(first_proc, &max_arity);
+ int lambda_p = rb_proc_lambda_p(first_proc);
+ struct vm_ifunc *ifunc = rb_vm_ifunc_new((rb_block_call_func_t) compose, (void *)procs, min_arity, max_arity);
+ return cfunc_proc_new(rb_cProc, (VALUE)ifunc, lambda_p);
+}
+
</span> /*
* call-seq:
* prc << g -> a_proc
<span class="p">@@ -3089,7 +3099,7 @@</span> proc_compose_to_left(VALUE self, VALUE g)
GetProcPtr(self, procp);
is_lambda = procp->is_lambda;
<span class="gd">- proc = rb_proc_new(compose, args);
</span><span class="gi">+ proc = compose_proc_new(args);
</span> GetProcPtr(proc, procp);
procp->is_lambda = is_lambda;
<span class="p">@@ -3122,7 +3132,7 @@</span> proc_compose_to_right(VALUE self, VALUE g)
GetProcPtr(self, procp);
is_lambda = procp->is_lambda;
<span class="gd">- proc = rb_proc_new(compose, args);
</span><span class="gi">+ proc = compose_proc_new(args);
</span> GetProcPtr(proc, procp);
procp->is_lambda = is_lambda;
</code></pre>
Ruby master - Feature #15477: Proc#arity returns -1 for composed lambda Procs of known arguments
https://bugs.ruby-lang.org/issues/15477?journal_id=76191
2019-01-10T08:04:28Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul></ul><p>Yes, please.</p>
<p>Matz.</p>
Ruby master - Feature #15477: Proc#arity returns -1 for composed lambda Procs of known arguments
https://bugs.ruby-lang.org/issues/15477?journal_id=77120
2019-03-15T12:39:49Z
majjoha (Mathias Jean Johansen)
<ul></ul><p>For what it is worth, this appears to be an issue when dealing with curried procs as well.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">curried_proc</span> <span class="o">=</span> <span class="o">-></span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="p">}.</span><span class="nf">curry</span> <span class="c1"># => <Proc:0x00007fa7698e7700 (lambda)></span>
<span class="n">first</span> <span class="o">=</span> <span class="n">curried_proc</span><span class="o">.</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># => <Proc:0x00007fa76991a0d8 (lambda)></span>
<span class="n">curried_proc</span><span class="p">.</span><span class="nf">arity</span> <span class="c1"># => -1</span>
<span class="n">first</span><span class="p">.</span><span class="nf">arity</span> <span class="c1"># => -1</span>
</code></pre>