On 4/26/07, Mauricio Fernandez <mfp@acm.org> wrote:
On Thu, Apr 26, 2007 at 06:55:46PM +0900, Mauricio Fernandez wrote:
> $ ruby19 -v -e "p proc{}.arity"
> ruby 1.9.0 (2007-02-07 patchlevel 0) [i686-linux]
> 0
> $ ./ruby19 -v -e "p proc{}.arity"
> ruby 1.9.0 (2007-04-26 patchlevel 0) [i686-linux]
> -1
>
> However, the RDoc documentation attached to proc_arity still says that it
> should return 0, so there's a bug, either in the code (wrong iseq->argc ?) or
> in the docs (if the latter, the patch below should do).
It seems it's a regression after all; no time to fix it now, but I've found
when it happened:
ruby-trunk-12116$ ./ruby -v -e "p proc{}.arity"
ruby 1.9.0 (2007-03-21 patchlevel 0) [i686-linux]
0
ruby-trunk-12117$ ./ruby -v -e "p proc{}.arity"
ruby 1.9.0 (2007-03-21 patchlevel 0) [i686-linux]
-1
This makes arity behave like the docs specify for both
method.arity and proc.arity. I'm sure it's naive, but it seems to work.
-Adam
Index: proc.c
===================================================================
--- proc.c (revision 12226)
+++ proc.c (working copy)
@@ -434,11 +434,11 @@
GetProcPtr(self, proc);
iseq = proc->block.iseq;
if (iseq && BUILTIN_TYPE(iseq) != T_NODE) {
- if (iseq->arg_rest == 0 && iseq->arg_opts == 0) {
- return INT2FIX(iseq->argc);
- }
+ if( iseq->arg_rest < 0 ) {
+ return INT2FIX(iseq->argc);
+ }
else {
- return INT2FIX(-iseq->argc - 1);
+ return INT2FIX(-(iseq->argc + 1));
}
}
else {