[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/compat 044acff 58/99: Optionally let compat-func-arity
From: |
ELPA Syncer |
Subject: |
[elpa] externals/compat 044acff 58/99: Optionally let compat-func-arity handle advice |
Date: |
Sun, 17 Oct 2021 05:57:57 -0400 (EDT) |
branch: externals/compat
commit 044acff588345479be01713b3059d4facfac381b
Author: Philip Kaludercic <philipk@posteo.net>
Commit: Philip Kaludercic <philipk@posteo.net>
Optionally let compat-func-arity handle advice
With an optional argument, currently only used by compat-maxargs-/=,
compat-func-arity can check the arity of the effective advised
function, without the oldfun argument. This is necessary to ensure
that conditional advice can properly check if the right number of
arguments are being handled.
---
compat.el | 43 +++++++++++++++++++++++++++++++++++--------
1 file changed, 35 insertions(+), 8 deletions(-)
diff --git a/compat.el b/compat.el
index aea3a1b..ed2c118 100644
--- a/compat.el
+++ b/compat.el
@@ -43,17 +43,43 @@
;;;; Core functionality
+(declare-function ad-is-advised "advice" (function))
+(declare-function ad-is-active "advice" (function))
+(declare-function ad-get-advice-info-field "advice" (function field))
+
;; The implementation is extracted here so that compatibility advice
;; can check if the right number of arguments are being handled.
-(defun compat-func-arity (func)
- "A reimplementation of `func-arity' for FUNC."
+(defun compat-func-arity (func &optional handle-advice)
+ "A reimplementation of `func-arity' for FUNC.
+If HANDLE-ADVICE is non-nil, return the effective arity of the
+advice."
(cond
- ((null func)
+ ((or (null func) (and (symbolp func) (not (fboundp func))) )
(signal 'void-function func))
+ ((and handle-advice
+ (featurep 'nadvice)
+ (advice--p func))
+ (let* ((adv (advice--car (symbol-function #'alist-get)))
+ (arity (compat-func-arity adv)))
+ (cons (1- (car arity))
+ (if (numberp (cdr arity))
+ (1- (cdr arity))
+ (cdr arity)))))
+ ((and handle-advice
+ (featurep 'advice)
+ ;; See `ad-advice-p'
+ (ad-is-advised func)
+ (ad-is-active func))
+ (let* ((adv (symbol-function
+ (ad-get-advice-info-field
+ func 'advicefunname)))
+ (arity (compat-func-arity adv)))
+ (cons (1- (car arity))
+ (if (numberp (cdr arity))
+ (1- (cdr arity))
+ (cdr arity)))))
((and (symbolp func) (not (null func)))
- (compat-func-arity (condition-case nil
- (indirect-function func)
- (void-function nil))))
+ (compat-func-arity (symbol-function func)))
((eq (car-safe func) 'macro)
(compat-func-arity (cdr func)))
((subrp func)
@@ -93,8 +119,9 @@
(defun compat-maxargs-/= (func n)
"Non-nil when FUNC doesn't accept at most N arguments."
- (not (eq (cdr (compat-func-arity func)) n)))
-
+ (condition-case nil
+ (not (eq (cdr (compat-func-arity func t)) n))
+ (void-function t)))
;; Suppress errors triggered by requiring non-existent libraries in
;; older versions of Emacs (e.g. subr-x).
- [elpa] externals/compat 09bf8d8 75/99: Declare nadvice functions for compat-func-arity, (continued)
- [elpa] externals/compat 09bf8d8 75/99: Declare nadvice functions for compat-func-arity, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 80ab781 77/99: Use advice.el for advising functions previously to Emacs 24.4, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 20afc89 78/99: Add :cond checks to json-* functions in compat-27.1, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 72c0781 81/99: Mention Chris Wellons' article on lambdas and byte compilation, ELPA Syncer, 2021/10/17
- [elpa] externals/compat ee068f0 82/99: Revert back to manual advising, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 7bef68b 84/99: Mark regexp-opt as part of regexp-opt.el, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 7619f21 89/99: Display version number of manual advice docstring, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 7245918 96/99: Fix handling of file-missing in require advice, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 29dc297 98/99: Ensure that compat-maxargs-/= is visible at compile time, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 61a1da1 44/99: Remove indirect-function compatibility, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 044acff 58/99: Optionally let compat-func-arity handle advice,
ELPA Syncer <=
- [elpa] externals/compat a46ab78 19/99: Add button-buttonize to emacs-28.1, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 9c6818c 20/99: Add directory-name-p compatibility function, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 070384b 24/99: Fix compat-tests for older versions, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 05092cb 25/99: Fix compat-test indentation in compat-tests, ELPA Syncer, 2021/10/17
- [elpa] externals/compat cb339dd 31/99: Add :cond where applicable, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 2d50e5c 32/99: Implement func-arity, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 36ef438 35/99: Implement and use mounted-file-systems, ELPA Syncer, 2021/10/17
- [elpa] externals/compat e5a573f 37/99: Declare mouse-set-point, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 2089c90 41/99: Declare gensym for with-existing-directory, ELPA Syncer, 2021/10/17
- [elpa] externals/compat 2faab78 42/99: Add debug specification for setq-local, ELPA Syncer, 2021/10/17