From: Stefan Monnier Date: Thu, 1 Oct 2009 17:47:38 +0000 (+0000) Subject: * eval.c (Fcalled_interactively_p): Add `kind' argument. X-Git-Tag: emacs-pretest-23.1.90~1004 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=9d28c33edefe1b366f4c6944886a3e4cf294cf60;p=emacs.git * eval.c (Fcalled_interactively_p): Add `kind' argument. * subr.el (interactive-p): Mark obsolete. (called-interactively-p): Make the optional-ness of `kind' obsolete. * emacs-lisp/bytecomp.el (byte-compile-fdefinition): Make it obey advertised-signature-table for subroutines as well. --- diff --git a/etc/NEWS b/etc/NEWS index 1f39f8171e0..5f2c39afd8f 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -246,6 +246,8 @@ Command*'. * Lisp changes in Emacs 23.2 +** called-interactively-p now takes one argument and replaces interactive-p +which is now marked obsolete. ** New function set-advertised-calling-convention makes it possible to obsolete arguments as well as make some arguments mandatory. ** eval-next-after-load is obsolete. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 505f9b847c6..b4953592726 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,10 @@ 2009-10-01 Stefan Monnier + * subr.el (interactive-p): Mark obsolete. + (called-interactively-p): Make the optional-ness of `kind' obsolete. + * emacs-lisp/bytecomp.el (byte-compile-fdefinition): Make it obey + advertised-signature-table for subroutines as well. + * emacs-lisp/byte-run.el (advertised-signature-table): New var. (set-advertised-calling-convention): New function. (make-obsolete, define-obsolete-function-alias) diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index f411576c883..1262264e9ec 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -1248,7 +1248,11 @@ Each function's symbol gets added to `byte-compile-noruntime-functions'." (and (not macro-p) (byte-code-function-p (symbol-function fn))))) (setq fn (symbol-function fn))) - (let ((advertised (gethash fn advertised-signature-table t))) + (let ((advertised (gethash (if (and (symbolp fn) (fboundp fn)) + ;; Could be a subr. + (symbol-function fn) + fn) + advertised-signature-table t))) (cond ((listp advertised) (if macro-p @@ -3104,14 +3108,14 @@ That command is designed for interactive use only" bytecomp-fn)) ;; which have special byte codes just for speed. (defmacro byte-defop-compiler (function &optional compile-handler) - ;; add a compiler-form for FUNCTION. - ;; If function is a symbol, then the variable "byte-SYMBOL" must name - ;; the opcode to be used. If function is a list, the first element - ;; is the function and the second element is the bytecode-symbol. - ;; The second element may be nil, meaning there is no opcode. - ;; COMPILE-HANDLER is the function to use to compile this byte-op, or - ;; may be the abbreviations 0, 1, 2, 3, 0-1, or 1-2. - ;; If it is nil, then the handler is "byte-compile-SYMBOL." + "Add a compiler-form for FUNCTION. +If function is a symbol, then the variable \"byte-SYMBOL\" must name +the opcode to be used. If function is a list, the first element +is the function and the second element is the bytecode-symbol. +The second element may be nil, meaning there is no opcode. +COMPILE-HANDLER is the function to use to compile this byte-op, or +may be the abbreviations 0, 1, 2, 3, 0-1, or 1-2. +If it is nil, then the handler is \"byte-compile-SYMBOL.\"" (let (opcode) (if (symbolp function) (setq opcode (intern (concat "byte-" (symbol-name function)))) diff --git a/lisp/subr.el b/lisp/subr.el index a7d3fcd600c..20a692c22a8 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -1008,6 +1008,39 @@ and `event-end' functions." ;;;; Obsolescent names for functions. +(define-obsolete-function-alias 'window-dot 'window-point "22.1") +(define-obsolete-function-alias 'set-window-dot 'set-window-point "22.1") +(define-obsolete-function-alias 'read-input 'read-string "22.1") +(define-obsolete-function-alias 'show-buffer 'set-window-buffer "22.1") +(define-obsolete-function-alias 'eval-current-buffer 'eval-buffer "22.1") +(define-obsolete-function-alias 'string-to-int 'string-to-number "22.1") + +(make-obsolete 'char-bytes "now always returns 1." "20.4") +(make-obsolete 'forward-point "use (+ (point) N) instead." "23.1") + +(defun insert-string (&rest args) + "Mocklisp-compatibility insert function. +Like the function `insert' except that any argument that is a number +is converted into a string by expressing it in decimal." + (dolist (el args) + (insert (if (integerp el) (number-to-string el) el)))) +(make-obsolete 'insert-string 'insert "22.1") + +(defun makehash (&optional test) (make-hash-table :test (or test 'eql))) +(make-obsolete 'makehash 'make-hash-table "22.1") + +;; These are used by VM and some old programs +(defalias 'focus-frame 'ignore "") +(make-obsolete 'focus-frame "it does nothing." "22.1") +(defalias 'unfocus-frame 'ignore "") +(make-obsolete 'unfocus-frame "it does nothing." "22.1") +(make-obsolete 'make-variable-frame-local + "explicitly check for a frame-parameter instead." "22.2") +(make-obsolete 'interactive-p 'called-interactively-p "23.2") +(set-advertised-calling-convention 'called-interactively-p '(kind)) + +;;;; Obsolescence declarations for variables, and aliases. + ;; Special "default-FOO" variables which contain the default value of ;; the "FOO" variable are nasty. Their implementation is brittle, and ;; slows down several unrelated variable operations; furthermore, they @@ -1047,37 +1080,6 @@ and `event-end' functions." (make-obsolete-variable 'default-enable-multibyte-characters "use enable-multibyte-characters or set-buffer-multibyte instead" "23.2") -(define-obsolete-function-alias 'window-dot 'window-point "22.1") -(define-obsolete-function-alias 'set-window-dot 'set-window-point "22.1") -(define-obsolete-function-alias 'read-input 'read-string "22.1") -(define-obsolete-function-alias 'show-buffer 'set-window-buffer "22.1") -(define-obsolete-function-alias 'eval-current-buffer 'eval-buffer "22.1") -(define-obsolete-function-alias 'string-to-int 'string-to-number "22.1") - -(make-obsolete 'char-bytes "now always returns 1." "20.4") -(make-obsolete 'forward-point "use (+ (point) N) instead." "23.1") - -(defun insert-string (&rest args) - "Mocklisp-compatibility insert function. -Like the function `insert' except that any argument that is a number -is converted into a string by expressing it in decimal." - (dolist (el args) - (insert (if (integerp el) (number-to-string el) el)))) -(make-obsolete 'insert-string 'insert "22.1") - -(defun makehash (&optional test) (make-hash-table :test (or test 'eql))) -(make-obsolete 'makehash 'make-hash-table "22.1") - -;; These are used by VM and some old programs -(defalias 'focus-frame 'ignore "") -(make-obsolete 'focus-frame "it does nothing." "22.1") -(defalias 'unfocus-frame 'ignore "") -(make-obsolete 'unfocus-frame "it does nothing." "22.1") -(make-obsolete 'make-variable-frame-local - "explicitly check for a frame-parameter instead." "22.2") - -;;;; Obsolescence declarations for variables, and aliases. - (make-obsolete-variable 'define-key-rebound-commands nil "23.2") (make-obsolete-variable 'redisplay-end-trigger-functions 'jit-lock-register "23.1") (make-obsolete 'window-redisplay-end-trigger nil "23.1") diff --git a/src/ChangeLog b/src/ChangeLog index 3e36b223142..afdfff07562 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,6 +1,10 @@ +2009-10-01 Stefan Monnier + + * eval.c (Fcalled_interactively_p): Add `kind' argument. + 2009-10-01 Michael Albinus - * fileio.c (Fdelete_directory_internal): Renamed from + * fileio.c (Fdelete_directory_internal): Rename from Fdelete_directory. It is not a command anymore. It has no file name handler. diff --git a/src/eval.c b/src/eval.c index 8d446de09fc..20988392e5f 100644 --- a/src/eval.c +++ b/src/eval.c @@ -608,19 +608,31 @@ use `called-interactively-p'. */) } -DEFUN ("called-interactively-p", Fcalled_interactively_p, Scalled_interactively_p, 0, 0, 0, +DEFUN ("called-interactively-p", Fcalled_interactively_p, Scalled_interactively_p, 0, 1, 0, doc: /* Return t if the containing function was called by `call-interactively'. -This includes being called as the binding of a key, or called from a -keyboard macro (unlike `interactive-p'). +If KIND is `interactive', then only return t if the call was made +interactively by the user, i.e. not in `noninteractive' mode nor +when `executing-kbd-macro'. +If KIND is `any', on the other hand, it will return t for any kind of +interactive call, including being called as the binding of a key, or +from a keyboard macro, or in `noninteractive' mode. + +The only known proper use of `interactive' for KIND is in deciding +whether to display a helpful message, or how to display it. If you're +thinking of using it for any other purpose, it is quite likely that +you're making a mistake. Think: what do you want to do when the +command is called from a keyboard macro? This function is meant for implementing advice and other function-modifying features. Instead of using this, it is sometimes cleaner to give your function an extra optional argument whose `interactive' spec specifies non-nil unconditionally (\"p\" is a good -way to do this). */) - () +way to do this), or via (not (or executing-kbd-macro noninteractive)). */) + (kind) + Lisp_Object kind; { - return interactive_p (1) ? Qt : Qnil; + return ((INTERACTIVE || !EQ (kind, intern ("interactive"))) + && interactive_p (1)) ? Qt : Qnil; }