更改功能签名的字节码格式?

时间:2013-10-01 18:33:21

标签: emacs elisp magit

(defun magit-max-args-internal (function)
    "Return the maximum number of arguments accepted by FUNCTION."
    (if (symbolp function)
        (setq function (symbol-function function)))
    (if (subrp function)
        (let ((max (cdr (subr-arity function))))
          (if (eq 'many max)
              most-positive-fixnum
            max))
      (if (eq 'macro (car-safe function))
          (setq function (cdr function)))
      (let ((arglist (if (byte-code-function-p function)
                         (aref function 0) ; <--------- format changed
                       (cadr function))))
        (if (memq '&rest arglist)
            most-positive-fixnum
          (length (remq '&optional arglist))))))

我不得不重新编译magit.el并在他们的代码中发现了这个问题。如果我正确地遵循代码,那么他们在这之后的是函数的arity,但他们得到一些“奇怪的”数字。发生了什么事?


此外,这篇文章:Elisp get function arity?提供了一个更好的解决方案(工作得很好,AndreasRöhler的答案。所以我可能会尝试向magit维护者提出建议。

1 个答案:

答案 0 :(得分:1)

确实为lexical-binding引入了“aref字节码0”中的“数字”。更好的解决方法是丢弃magit-max-args-internal并改为使用(condition-case nil (delete-directory <args>) (wrong-number-of-arguments (delete-directory <fewerargs>))