Change old backquote syntax.

(byte-compile-const-symbol-p): New function.
(byte-compile-constp, byte-compile-out-toplevel)
(byte-compile-form, byte-compile-form, byte-compile-variable-ref):
Use it.
This commit is contained in:
Dave Love 2000-02-23 12:29:05 +00:00
parent e1f0df6214
commit 1639b80357

View file

@ -1,6 +1,7 @@
;;; bytecomp.el --- compilation of Lisp code into byte code. ;;; bytecomp.el --- compilation of Lisp code into byte code.
;; Copyright (C) 1985, 1986, 1987, 1992, 1994, 1998 Free Software Foundation, Inc. ;; Copyright (C) 1985, 1986, 1987, 1992, 1994, 1998, 2000
;; Free Software Foundation, Inc.
;; Author: Jamie Zawinski <jwz@lucid.com> ;; Author: Jamie Zawinski <jwz@lucid.com>
;; Hallvard Furuseth <hbf@ulrik.uio.no> ;; Hallvard Furuseth <hbf@ulrik.uio.no>
@ -9,7 +10,7 @@
;;; This version incorporates changes up to version 2.10 of the ;;; This version incorporates changes up to version 2.10 of the
;;; Zawinski-Furuseth compiler. ;;; Zawinski-Furuseth compiler.
(defconst byte-compile-version "$Revision: 2.61 $") (defconst byte-compile-version "$Revision: 2.62 $")
;; This file is part of GNU Emacs. ;; This file is part of GNU Emacs.
@ -1092,12 +1093,15 @@ otherwise pop it")
nil) nil)
(defsubst byte-compile-const-symbol-p (symbol)
(or (memq symbol '(nil t))
(keywordp symbol)))
(defmacro byte-compile-constp (form) (defmacro byte-compile-constp (form)
;; Returns non-nil if FORM is a constant. ;; Returns non-nil if FORM is a constant.
(` (cond ((consp (, form)) (eq (car (, form)) 'quote)) `(cond ((consp ,form) (eq (car ,form) 'quote))
((not (symbolp (, form)))) ((not (symbolp ,form)))
((keywordp (, form))) ((byte-compile-const-symbol-p ,form))))
((memq (, form) '(nil t))))))
(defmacro byte-compile-close-variables (&rest body) (defmacro byte-compile-close-variables (&rest body)
(cons 'let (cons 'let
@ -2213,7 +2217,7 @@ If FORM is a lambda or a macro, byte-compile it as a function."
(if (if (eq (car (car rest)) 'byte-constant) (if (if (eq (car (car rest)) 'byte-constant)
(or (consp tmp) (or (consp tmp)
(and (symbolp tmp) (and (symbolp tmp)
(not (memq tmp '(nil t)))))) (not (byte-compile-const-symbol-p tmp)))))
(if maycall (if maycall
(setq body (cons (list 'quote tmp) body))) (setq body (cons (list 'quote tmp) body)))
(setq body (cons tmp body)))) (setq body (cons tmp body))))
@ -2266,7 +2270,7 @@ If FORM is a lambda or a macro, byte-compile it as a function."
(defun byte-compile-form (form &optional for-effect) (defun byte-compile-form (form &optional for-effect)
(setq form (macroexpand form byte-compile-macro-environment)) (setq form (macroexpand form byte-compile-macro-environment))
(cond ((not (consp form)) (cond ((not (consp form))
(cond ((or (not (symbolp form)) (memq form '(nil t))) (cond ((or (not (symbolp form)) (byte-compile-const-symbol-p form))
(byte-compile-constant form)) (byte-compile-constant form))
((and for-effect byte-compile-delete-errors) ((and for-effect byte-compile-delete-errors)
(setq for-effect nil)) (setq for-effect nil))
@ -2274,7 +2278,7 @@ If FORM is a lambda or a macro, byte-compile it as a function."
((symbolp (car form)) ((symbolp (car form))
(let* ((fn (car form)) (let* ((fn (car form))
(handler (get fn 'byte-compile))) (handler (get fn 'byte-compile)))
(if (memq fn '(t nil)) (if (byte-compile-const-symbol-p fn)
(byte-compile-warn "%s called as a function" fn)) (byte-compile-warn "%s called as a function" fn))
(if (and handler (if (and handler
(or (not (byte-compile-version-cond (or (not (byte-compile-version-cond
@ -2303,7 +2307,7 @@ If FORM is a lambda or a macro, byte-compile it as a function."
(byte-compile-out 'byte-call (length (cdr form)))) (byte-compile-out 'byte-call (length (cdr form))))
(defun byte-compile-variable-ref (base-op var) (defun byte-compile-variable-ref (base-op var)
(if (or (not (symbolp var)) (memq var '(nil t))) (if (or (not (symbolp var)) (byte-compile-const-symbol-p var))
(byte-compile-warn (if (eq base-op 'byte-varbind) (byte-compile-warn (if (eq base-op 'byte-varbind)
"Attempt to let-bind %s %s" "Attempt to let-bind %s %s"
"Variable reference to %s %s") "Variable reference to %s %s")
@ -2340,11 +2344,11 @@ If FORM is a lambda or a macro, byte-compile it as a function."
(byte-compile-out base-op tmp))) (byte-compile-out base-op tmp)))
(defmacro byte-compile-get-constant (const) (defmacro byte-compile-get-constant (const)
(` (or (if (stringp (, const)) `(or (if (stringp ,const)
(assoc (, const) byte-compile-constants) (assoc ,const byte-compile-constants)
(assq (, const) byte-compile-constants)) (assq ,const byte-compile-constants))
(car (setq byte-compile-constants (car (setq byte-compile-constants
(cons (list (, const)) byte-compile-constants)))))) (cons (list ,const) byte-compile-constants)))))
;; Use this when the value of a form is a constant. This obeys for-effect. ;; Use this when the value of a form is a constant. This obeys for-effect.
(defun byte-compile-constant (const) (defun byte-compile-constant (const)
@ -2868,11 +2872,11 @@ If FORM is a lambda or a macro, byte-compile it as a function."
(byte-compile-body (cdr (cdr (cdr form))) t)) (byte-compile-body (cdr (cdr (cdr form))) t))
(defmacro byte-compile-goto-if (cond discard tag) (defmacro byte-compile-goto-if (cond discard tag)
(` (byte-compile-goto `(byte-compile-goto
(if (, cond) (if ,cond
(if (, discard) 'byte-goto-if-not-nil 'byte-goto-if-not-nil-else-pop) (if ,discard 'byte-goto-if-not-nil 'byte-goto-if-not-nil-else-pop)
(if (, discard) 'byte-goto-if-nil 'byte-goto-if-nil-else-pop)) (if ,discard 'byte-goto-if-nil 'byte-goto-if-nil-else-pop))
(, tag)))) ,tag))
(defun byte-compile-if (form) (defun byte-compile-if (form)
(byte-compile-form (car (cdr form))) (byte-compile-form (car (cdr form)))