From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.bugs Subject: bug#10761: 24.0.93; variable declared with defvar is not recognized as special Date: Thu, 09 Feb 2012 16:52:20 -0500 Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: dough.gmane.org 1328824381 30014 80.91.229.3 (9 Feb 2012 21:53:01 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Thu, 9 Feb 2012 21:53:01 +0000 (UTC) Cc: 10761-done@debbugs.gnu.org To: Oleksandr Manzyuk Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Feb 09 22:53:00 2012 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1RvbvH-0003Ic-SK for geb-bug-gnu-emacs@m.gmane.org; Thu, 09 Feb 2012 22:53:00 +0100 Original-Received: from localhost ([::1]:56215 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvbvH-0002Qo-32 for geb-bug-gnu-emacs@m.gmane.org; Thu, 09 Feb 2012 16:52:59 -0500 Original-Received: from eggs.gnu.org ([140.186.70.92]:45446) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvbvD-0002QG-GP for bug-gnu-emacs@gnu.org; Thu, 09 Feb 2012 16:52:57 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RvbvA-0007Gr-WD for bug-gnu-emacs@gnu.org; Thu, 09 Feb 2012 16:52:55 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:58727) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvbvA-0007Gh-UP for bug-gnu-emacs@gnu.org; Thu, 09 Feb 2012 16:52:52 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1RvbwH-00032P-ML for bug-gnu-emacs@gnu.org; Thu, 09 Feb 2012 16:54:01 -0500 Resent-From: Stefan Monnier Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-To: bug-gnu-emacs@gnu.org Resent-Date: Thu, 09 Feb 2012 21:54:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: cc-closed 10761 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Mail-Followup-To: 10761@debbugs.gnu.org, monnier@IRO.UMontreal.CA Original-Received: via spool by 10761-done@debbugs.gnu.org id=D10761.132882441511640 (code D ref 10761); Thu, 09 Feb 2012 21:54:01 +0000 Original-Received: (at 10761-done) by debbugs.gnu.org; 9 Feb 2012 21:53:35 +0000 Original-Received: from localhost ([127.0.0.1]:34117 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1Rvbvp-00031g-Gi for submit@debbugs.gnu.org; Thu, 09 Feb 2012 16:53:34 -0500 Original-Received: from pruche.dit.umontreal.ca ([132.204.246.22]:56959) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1Rvbvn-00031Y-2I for 10761-done@debbugs.gnu.org; Thu, 09 Feb 2012 16:53:32 -0500 Original-Received: from faina.iro.umontreal.ca (lechon.iro.umontreal.ca [132.204.27.242]) by pruche.dit.umontreal.ca (8.14.1/8.14.1) with ESMTP id q19LqKkC008355; Thu, 9 Feb 2012 16:52:20 -0500 Original-Received: by faina.iro.umontreal.ca (Postfix, from userid 20848) id 37D96130009; Thu, 9 Feb 2012 16:52:20 -0500 (EST) In-Reply-To: (Oleksandr Manzyuk's message of "Wed, 8 Feb 2012 09:21:58 +0000") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.92 (gnu/linux) X-NAI-Spam-Flag: NO X-NAI-Spam-Threshold: 5 X-NAI-Spam-Score: 0 X-NAI-Spam-Rules: 1 Rules triggered RV4127=0 X-NAI-Spam-Version: 2.2.0.9309 : core <4127> : streams <727185> : uri <1062791> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:56741 Archived-At: > 1. emacs -Q > 2. M-: (boundp 'pcomplete-stub) RET ==> nil > 3. M-x shell > 4. M-: (boundp 'pcomplete-stub) RET ==> t > 5. M-: (special-variable-p 'pcomplete-stub) RET ==> nil > 6. Open the file `pcomplete.el' (for example, by looking up the variable > `pcomplete-stub') and M-x eval-buffer. Now (special-variable-p > 'pcomplete-stub) evaluates to t. Thanks for catching this. It's actually a pretty bad bug. I've installed the patch below which I believe fixes the problem, Stefan === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2012-02-09 20:27:54 +0000 +++ lisp/ChangeLog 2012-02-09 21:50:23 +0000 @@ -1,3 +1,11 @@ +2012-02-09 Stefan Monnier + + * emacs-lisp/bytecomp.el (byte-compile-file-form-defvar): + Don't fallback on byte-compile-defvar. Optimize (defvar foo) away. + (byte-compile-tmp-var): New const. + (byte-compile-defvar): Use it to minimize .elc size. + Just use `defvar' rather than simulate it (bug#10761). + 2012-02-09 Glenn Morris * files.el (rename-uniquely): Doc fix. (Bug#3806) === modified file 'lisp/emacs-lisp/bytecomp.el' --- lisp/emacs-lisp/bytecomp.el 2012-01-19 07:21:25 +0000 +++ lisp/emacs-lisp/bytecomp.el 2012-02-09 19:09:21 +0000 @@ -2237,10 +2237,6 @@ (put 'defvar 'byte-hunk-handler 'byte-compile-file-form-defvar) (put 'defconst 'byte-hunk-handler 'byte-compile-file-form-defvar) (defun byte-compile-file-form-defvar (form) - (if (null (nth 3 form)) - ;; Since there is no doc string, we can compile this as a normal form, - ;; and not do a file-boundary. - (byte-compile-keep-pending form) (when (and (symbolp (nth 1 form)) (not (string-match "[-*/:$]" (symbol-name (nth 1 form)))) (byte-compile-warning-enabled-p 'lexical)) @@ -2249,6 +2245,9 @@ (push (nth 1 form) byte-compile-bound-variables) (if (eq (car form) 'defconst) (push (nth 1 form) byte-compile-const-variables)) + (if (and (null (cddr form)) ;No `value' provided. + (eq (car form) 'defvar)) ;Just a declaration. + nil (cond ((consp (nth 2 form)) (setq form (copy-sequence form)) (setcar (cdr (cdr form)) @@ -4124,8 +4123,10 @@ (push (nth 1 (nth 1 form)) byte-compile-global-not-obsolete-vars)) (byte-compile-normal-call form)) +(defconst byte-compile-tmp-var (make-symbol "def-tmp-var")) + (defun byte-compile-defvar (form) - ;; This is not used for file-level defvar/consts with doc strings. + ;; This is not used for file-level defvar/consts. (when (and (symbolp (nth 1 form)) (not (string-match "[-*/:$]" (symbol-name (nth 1 form)))) (byte-compile-warning-enabled-p 'lexical)) @@ -4148,32 +4149,21 @@ (push var byte-compile-bound-variables) (if (eq fun 'defconst) (push var byte-compile-const-variables)) - (byte-compile-body-do-effect - (list - ;; Put the defined variable in this library's load-history entry - ;; just as a real defvar would, but only in top-level forms. - (when (and (cddr form) (null byte-compile-current-form)) - `(setq current-load-list (cons ',var current-load-list))) - (when (> (length form) 3) (when (and string (not (stringp string))) (byte-compile-warn "third arg to `%s %s' is not a string: %s" fun var string)) - `(put ',var 'variable-documentation ,string)) + (byte-compile-form-do-effect (if (cddr form) ; `value' provided - (let ((byte-compile-not-obsolete-vars (list var))) - (if (eq fun 'defconst) - ;; `defconst' sets `var' unconditionally. - (let ((tmp (make-symbol "defconst-tmp-var"))) ;; Quote with `quote' to prevent byte-compiling the body, ;; which would lead to an inf-loop. - `(funcall '(lambda (,tmp) (defconst ,var ,tmp)) - ,value)) - ;; `defvar' sets `var' only when unbound. - `(if (not (default-boundp ',var)) (setq-default ,var ,value)))) - (when (eq fun 'defconst) + `(funcall '(lambda (,byte-compile-tmp-var) + (,fun ,var ,byte-compile-tmp-var ,@(nthcdr 3 form))) + ,value) + (if (eq fun 'defconst) ;; This will signal an appropriate error at runtime. - `(eval ',form))) - `',var)))) + `(eval ',form) + ;; A simple (defvar foo) just returns foo. + `',var))))) (defun byte-compile-autoload (form) (byte-compile-set-symbol-position 'autoload)