emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] scratch/accurate-warning-pos 75b18e0: Bring the scratch/ac


From: Alan Mackenzie
Subject: [Emacs-diffs] scratch/accurate-warning-pos 75b18e0: Bring the scratch/accurate-warning-pos branch to full functionality.
Date: Fri, 23 Nov 2018 07:41:42 -0500 (EST)

branch: scratch/accurate-warning-pos
commit 75b18e07e57da7ee4362db800352d6650f5f7290
Author: Alan Mackenzie <address@hidden>
Commit: Alan Mackenzie <address@hidden>

    Bring the scratch/accurate-warning-pos branch to full functionality.
    
    The branch will now make bootstrap.
    
    * src/lisp.h (lisp_h_EQ, etc.): Replace use of lisp_h_FOO by plain FOO.  To
    enable this, some definitions have been moved in the file.
    (XBARE_SYMBOL): Renamed from XSYMBOL.  Create a new XSYMBOL.
    (BASE_EQ): New function.
    
    * src/alloc.c (Fgarbage_collect): Bind symbols-with-pos-enabled to nil.
    
    * src/data.c (Fbare_symbol): Renamed from Fsymbol_with_pos_sym.  It now
    accepts a bare symbol as argument.
    (syms_of_data): Declare Qsymbols_with_pos_enabled as a symbol.
    
    * src/fns.c (hash_lookup): If the key is a symbol with position, replace it 
by
    its bare symbol before proceding.
    
    * src/lread.c (read1): In recursive calls to read1, and calls to other 
reading
    function, use an argument of false for locate_syms when symbols with 
positions
    are decidedly unwanted.
    
    * src/print.c (Vprint_symbols_bare): New variable.
    (print_vectorlike): Strip the position from a symbol with position before
    printing it when Vprint_symbols_bare is non-nil.
    
    * lisp/emacs-lisp/bytecomp.el (byte-compile-strip-s-p-1)
    (byte-compile-strip-symbol-positions): New functions.
    (byte-compile-recurse-toplevel, byte-compile-initial-macro-environment)
    (byte-compile-preprocess, byte-compile-macroexpand-declare-function): Bind
    print-symbols-bare to non-nil around macro
    expansion.
    (byte-compile-warning-prefix): Temporarily output source positions in both 
old
    and new methods in warning messages.
    (byte-compile-warn, ...): Use symbolp in place of symbol-with-pos-p.  
Replace
    symbol-with-pos-sym by bare-symbol.
    (byte-compile--warn-x, byte-compile-form): Replace the erroneous push by 
cons
    when binding
    byte-compile--form-stack.
    (byte-compile-file): Bind symbols-with-pos-enabled to non-nil to use the new
    mechanism.
    (byte-compile-toplevel-file-form): Bind and push a form onto
    byte-compile--form-stack.
    (byte-compile-file-form-autoload, byte-compile-file-form-defvar)
    (byte-compile-file-form-eval, byte-compile-file-form-defmumble)
    (byte-compile-lambda, byte-compile-form, byte-compile-dynamic-variable-op)
    (byte-compile-constant, byte-compile-cond-jump-table): Strip positions from
    symbols before compiling.
    
    * lisp/emacs-lisp/cconv.el (cconv-convert, cconv--analyze-use)
    (cconv--analyze-function, cconv-analyze-form): Replace calls to
    byte-compile-warn with byte-compile--warn-x.
    
    * lisp/emacs-lisp/macroexp.el (macroexp--warn-and-return): Add an extra
    parameter, using it to call byte-compile--warn-x in place of
    byte-compile-warn.
    (macroexp-macroexpand, macroexp--expand-all): Add extra argument to call of
    macroexp--warn-and-return.
    
    * lisp/emacs-lisp/cl-macs.el (cl-macs--strip-s-p-1)
    (cl-macs--strip-symbol-positions): New functions.  These are duplicates of
    new functions in bytecomp.el, written to facilitate bootstrap, but this
    duplication must be resolved somehow.
    (cl-defstruct): Strip positions from symbols.
    
    * lisp/emacs-lisp/cl-generic.el (cl-defmethod)
    * lisp/emacs-lisp/cl-macs.el (cl-symbol-macrolet, cl-defstruct)
    * lisp/emacs-lisp/eieio-core.el (eieio-oref)
    * lisp/emacs-lisp/eieio.el (defclass)
    * lisp/emacs-lisp/gv.el (gv-ref)
    * lisp/emacs-lisp/pcase.el (pcase--u1): Add extra position arguments to the
    calls of macroexp--warn-and-return.
---
 lisp/emacs-lisp/bytecomp.el   | 182 ++++++++++++++++++++++++++++--------------
 lisp/emacs-lisp/cconv.el      |  21 ++---
 lisp/emacs-lisp/cl-generic.el |   4 +-
 lisp/emacs-lisp/cl-macs.el    |  45 +++++++++--
 lisp/emacs-lisp/eieio-core.el |   1 +
 lisp/emacs-lisp/eieio.el      |   1 +
 lisp/emacs-lisp/gv.el         |   5 +-
 lisp/emacs-lisp/macroexp.el   |   7 +-
 lisp/emacs-lisp/pcase.el      |   1 +
 src/alloc.c                   |   5 +-
 src/data.c                    |  13 +--
 src/fns.c                     |   2 +
 src/lisp.h                    |  85 ++++++++++++--------
 src/lread.c                   |  18 ++---
 src/print.c                   |  29 ++++---
 15 files changed, 286 insertions(+), 133 deletions(-)

diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 891f3fd..cad9912 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -453,6 +453,36 @@ This is used by the warning message routines to determine a
 source code position.  The most accessible element is the current
 most deeply nested form.")
 
+(defun byte-compile-strip-s-p-1 (arg)
+  "Strip all positions from symbols with position in ARG, destructively 
modifying ARG
+Return the modified ARG."
+  (cond
+   ((symbolp arg)
+    (bare-symbol arg))
+   ((consp arg)
+    (let ((a arg))
+      (while (consp (cdr a))
+        (setcar a (byte-compile-strip-s-p-1 (car a)))
+        (setq a (cdr a)))
+      (setcar a (byte-compile-strip-s-p-1 (car a)))
+      ;; (if (cdr a)
+      (unless (bare-symbol-p (cdr a))   ; includes (unpositioned) nil.
+        (setcdr a (byte-compile-strip-s-p-1 (cdr a)))))
+    arg)
+   ((vectorp arg)
+    (let ((i 0)
+         (len (length arg)))
+      (while (< i len)
+       (aset arg i (byte-compile-strip-s-p-1 (aref arg i)))
+       (setq i (1+ i))))
+    arg)
+   (t arg)))
+
+(defun byte-compile-strip-symbol-positions (arg)
+  "Strip all positions from symbols (recursively) in ARG.  Don't modify ARG."
+  (let ((arg1 (copy-tree arg t)))
+    (byte-compile-strip-s-p-1 arg1)))
+
 (defun byte-compile-recurse-toplevel (form non-toplevel-case)
   "Implement `eval-when-compile' and `eval-and-compile'.
 Return the compile-time value of FORM."
@@ -461,7 +491,8 @@ Return the compile-time value of FORM."
   ;; 3.2.3.1, "Processing of Top Level Forms".  The semantics are very
   ;; subtle: see test/lisp/emacs-lisp/bytecomp-tests.el for interesting
   ;; cases.
-  (setf form (macroexp-macroexpand form byte-compile-macro-environment))
+  (let ((print-symbols-bare t))
+    (setf form (macroexp-macroexpand form byte-compile-macro-environment)))
   (if (eq (car-safe form) 'progn)
       (cons 'progn
             (mapcar (lambda (subform)
@@ -502,7 +533,8 @@ Return the compile-time value of FORM."
                               ;; Don't compile here, since we don't know
                               ;; whether to compile as byte-compile-form
                               ;; or byte-compile-file-form.
-                              (let ((expanded
+                              (let* ((print-symbols-bare t)
+                                     (expanded
                                      (macroexpand-all
                                       form
                                       macroexpand-all-environment)))
@@ -1167,19 +1199,31 @@ Return nil if such is not found."
                       (integerp byte-compile-read-position)
                        (or offset (not symbols-with-pos-enabled)))
                  (with-current-buffer byte-compile-current-buffer
-                   (format "%d:%d:"
-                           (save-excursion
-                             (goto-char (if symbols-with-pos-enabled
-                                             (+ byte-compile-read-position 
offset)
-                                           byte-compile-last-position)
-                                         )
-                             (1+ (count-lines (point-min) (point-at-bol))))
-                           (save-excursion
-                             (goto-char (if symbols-with-pos-enabled
-                                             (+ byte-compile-read-position 
offset)
-                                           byte-compile-last-position)
-                                         )
-                             (1+ (current-column)))))
+                   ;; (format "%d:%d:"
+                   ;;         (save-excursion
+                   ;;           (goto-char (if symbols-with-pos-enabled
+                    ;;                          (+ byte-compile-read-position 
offset)
+                    ;;                        byte-compile-last-position)
+                    ;;                      )
+                   ;;           (1+ (count-lines (point-min) (point-at-bol))))
+                   ;;         (save-excursion
+                   ;;           (goto-char (if symbols-with-pos-enabled
+                    ;;                          (+ byte-compile-read-position 
offset)
+                    ;;                        byte-compile-last-position)
+                    ;;                      )
+                   ;;           (1+ (current-column))))
+;;;; EXPERIMENTAL STOUGH, 2018-11-22
+                    (let (old-l old-c new-l new-c)
+                      (save-excursion
+                        (goto-char byte-compile-last-position)
+                        (setq old-l (1+ (count-lines (point-min) 
(point-at-bol)))
+                              old-c (1+ (current-column)))
+                        (goto-char (+ byte-compile-read-position offset))
+                        (setq new-l (1+ (count-lines (point-min) 
(point-at-bol)))
+                              new-c (1+ (current-column)))
+                        (format "%d:%d:%d:%d:" old-l old-c new-l new-c)))
+;;;; END OF EXPERIMENTAL STOUGH
+                    )
                ""))
         (form (if (eq byte-compile-current-form :end) "end of data"
                 (or byte-compile-current-form "toplevel form"))))
@@ -1283,8 +1327,8 @@ function directly; use `byte-compile-warn' or
   "Issue a byte compiler warning; use (format-message FORMAT ARGS...) for 
message."
   (setq args
         (mapcar (lambda (arg)
-                  (if (symbol-with-pos-p arg)
-                      (symbol-with-pos-sym arg)
+                  (if (symbolp arg)
+                      (bare-symbol arg)
                     arg))
                 args))
   (setq format (apply #'format-message format args))
@@ -1297,7 +1341,7 @@ function directly; use `byte-compile-warn' or
 ARG is the source element (likely a symbol with position) central to
   the warning, intended to supply source position information.
 FORMAT and ARGS are as in `byte-compile-warn'."
-  (let ((byte-compile--form-stack (push arg byte-compile--form-stack)))
+  (let ((byte-compile--form-stack (cons arg byte-compile--form-stack)))
     (apply #'byte-compile-warn format args)))
 
 (defun byte-compile-warn-obsolete (symbol)
@@ -1979,7 +2023,8 @@ The value is non-nil if there were no errors, nil if 
errors."
       ;; within byte-compile-from-buffer lingers in that buffer.
       (setq output-buffer
            (save-current-buffer
-             (let ((byte-compile-level (1+ byte-compile-level)))
+             (let ((symbols-with-pos-enabled t)
+                    (byte-compile-level (1+ byte-compile-level)))
                 (byte-compile-from-buffer input-buffer))))
       (if byte-compiler-error-flag
          nil
@@ -2390,7 +2435,8 @@ list that represents a doc string reference.
 (defvar byte-compile-force-lexical-warnings nil)
 
 (defun byte-compile-preprocess (form &optional _for-effect)
-  (setq form (macroexpand-all form byte-compile-macro-environment))
+  (let ((print-symbols-bare t))
+    (setq form (macroexpand-all form byte-compile-macro-environment)))
   ;; FIXME: We should run byte-optimize-form here, but it currently does not
   ;; recurse through all the code, so we'd have to fix this first.
   ;; Maybe a good fix would be to merge byte-optimize-form into
@@ -2404,11 +2450,13 @@ list that represents a doc string reference.
 
 ;; byte-hunk-handlers cannot call this!
 (defun byte-compile-toplevel-file-form (top-level-form)
-  (byte-compile-recurse-toplevel
-   top-level-form
-   (lambda (form)
-     (let ((byte-compile-current-form nil)) ; close over this for warnings.
-       (byte-compile-file-form (byte-compile-preprocess form t))))))
+  (let ((byte-compile--form-stack
+         (cons top-level-form byte-compile--form-stack)))
+    (byte-compile-recurse-toplevel
+     top-level-form
+     (lambda (form)
+       (let ((byte-compile-current-form nil)) ; close over this for warnings.
+         (byte-compile-file-form (byte-compile-preprocess form t)))))))
 
 ;; byte-hunk-handlers can call this.
 (defun byte-compile-file-form (form)
@@ -2441,7 +2489,8 @@ list that represents a doc string reference.
      ;; byte-compile-noruntime-functions, in case we have an autoload
      ;; of foo-func following an (eval-when-compile (require 'foo)).
      (unless (fboundp funsym)
-       (push (cons funsym (cons 'autoload (cdr (cdr form))))
+       (push (byte-compile-strip-symbol-positions
+              (cons funsym (cons 'autoload (cdr (cdr form)))))
              byte-compile-function-environment))
      ;; If an autoload occurs _before_ the first call to a function,
      ;; byte-compile-callargs-warn does not add an entry to
@@ -2457,7 +2506,7 @@ list that represents a doc string reference.
              (delq (assq funsym byte-compile-unresolved-functions)
                    byte-compile-unresolved-functions)))))
   (if (stringp (nth 3 form))
-      form
+      (byte-compile-strip-symbol-positions form)
     ;; No doc string, so we can compile this as a normal form.
     (byte-compile-keep-pending form 'byte-compile-normal-call)))
 
@@ -2484,10 +2533,17 @@ list that represents a doc string reference.
   (if (and (null (cddr form))          ;No `value' provided.
            (eq (car form) 'defvar))     ;Just a declaration.
       nil
+    (setq form (copy-sequence form))
     (cond ((consp (nth 2 form))
-           (setq form (copy-sequence form))
            (setcar (cdr (cdr form))
-                   (byte-compile-top-level (nth 2 form) nil 'file))))
+                   (byte-compile-top-level (nth 2 form) nil 'file)))
+          ((symbolp (nth 2 form))
+           (setcar (cddr form) (bare-symbol (nth 2 form))))
+          (t (setcar (cddr form)
+                     (byte-compile-strip-symbol-positions (nth 2 form)))))
+    (setcar form (bare-symbol (car form)))
+    (if (symbolp (nth 1 form))
+        (setcar (cdr form) (bare-symbol (nth 1 form))))
     form))
 
 (put 'define-abbrev-table 'byte-hunk-handler
@@ -2578,7 +2634,7 @@ list that represents a doc string reference.
 (put 'eval 'byte-hunk-handler 'byte-compile-file-form-eval)
 (defun byte-compile-file-form-eval (form)
   (if (eq (car-safe (nth 1 form)) 'quote)
-      (nth 1 (nth 1 form))
+      (byte-compile-strip-symbol-positions (nth 1 (nth 1 form)))
     (byte-compile-keep-pending form)))
 
 (defun byte-compile-file-form-defmumble (name macro arglist body rest)
@@ -2594,23 +2650,24 @@ not to take responsibility for the actual compilation 
of the code."
                       'byte-compile-macro-environment))
          (this-one (assq name (symbol-value this-kind)))
          (that-one (assq name (symbol-value that-kind)))
+         (bare-name (bare-symbol name))
          (byte-compile-current-form name)) ; For warnings.
 
     (byte-compile-set-symbol-position name)
-    (push name byte-compile-new-defuns)
+    (push bare-name byte-compile-new-defuns)
     ;; When a function or macro is defined, add it to the call tree so that
     ;; we can tell when functions are not used.
     (if byte-compile-generate-call-tree
-        (or (assq name byte-compile-call-tree)
+        (or (assq bare-name byte-compile-call-tree)
             (setq byte-compile-call-tree
-                  (cons (list name nil nil) byte-compile-call-tree))))
+                  (cons (list bare-name nil nil) byte-compile-call-tree))))
 
     (if (byte-compile-warning-enabled-p 'redefine)
         (byte-compile-arglist-warn name arglist macro))
 
     (if byte-compile-verbose
         (message "Compiling %s... (%s)"
-                 (or byte-compile-current-file "") name))
+                 (or byte-compile-current-file "") bare-name))
     (cond ((not (or macro (listp body)))
            ;; We do not know positively if the definition is a macro
            ;; or a function, so we shouldn't emit warnings.
@@ -2619,34 +2676,34 @@ not to take responsibility for the actual compilation 
of the code."
           (that-one
            (if (and (byte-compile-warning-enabled-p 'redefine)
                     ;; Don't warn when compiling the stubs in byte-run...
-                    (not (assq name byte-compile-initial-macro-environment)))
+                    (not (assq bare-name 
byte-compile-initial-macro-environment)))
                (byte-compile--warn-x
                 name
                 "`%s' defined multiple times, as both function and macro"
-                name))
+                bare-name))
            (setcdr that-one nil))
           (this-one
            (when (and (byte-compile-warning-enabled-p 'redefine)
                       ;; Hack: Don't warn when compiling the magic internal
                       ;; byte-compiler macros in byte-run.el...
-                      (not (assq name byte-compile-initial-macro-environment)))
+                      (not (assq bare-name 
byte-compile-initial-macro-environment)))
              (byte-compile--warn-x
               name
               "%s `%s' defined multiple times in this file"
               (if macro "macro" "function")
-              name)))
-          ((eq (car-safe (symbol-function name))
+              bare-name)))
+          ((eq (car-safe (symbol-function bare-name))
                (if macro 'lambda 'macro))
            (when (byte-compile-warning-enabled-p 'redefine)
              (byte-compile--warn-x
               name
               "%s `%s' being redefined as a %s"
               (if macro "function" "macro")
-              name
+              bare-name
               (if macro "macro" "function")))
            ;; Shadow existing definition.
            (set this-kind
-                (cons (cons name nil)
+                (cons (cons bare-name nil)
                       (symbol-value this-kind))))
           )
 
@@ -2658,7 +2715,7 @@ not to take responsibility for the actual compilation of 
the code."
       ;; FIXME: We've done that already just above, so this looks wrong!
       ;;(byte-compile-set-symbol-position name)
       (byte-compile--warn-x
-       name "probable `\"' without `\\' in doc string of %s" name))
+       name "probable `\"' without `\\' in doc string of %s" bare-name))
 
     (if (not (listp body))
         ;; The precise definition requires evaluation to find out, so it
@@ -2666,7 +2723,7 @@ not to take responsibility for the actual compilation of 
the code."
         ;; For a macro, that means we can't use that macro in the same file.
         (progn
           (unless macro
-            (push (cons name (if (listp arglist) `(declared ,arglist) t))
+            (push (cons bare-name (if (listp arglist) `(declared ,arglist) t))
                   byte-compile-function-environment))
           ;; Tell the caller that we didn't compile it yet.
           nil)
@@ -2676,10 +2733,10 @@ not to take responsibility for the actual compilation 
of the code."
             ;; A definition in b-c-initial-m-e should always take precedence
             ;; during compilation, so don't let it be redefined.  (Bug#8647)
             (or (and macro
-                     (assq name byte-compile-initial-macro-environment))
+                     (assq bare-name byte-compile-initial-macro-environment))
                 (setcdr this-one code))
           (set this-kind
-               (cons (cons name code)
+               (cons (cons bare-name code)
                      (symbol-value this-kind))))
 
         (if rest
@@ -2697,7 +2754,7 @@ not to take responsibility for the actual compilation of 
the code."
             ;; b-c-output-file-form analyze the defalias.
             (byte-compile-output-docform
              "\n(defalias '"
-             name
+             bare-name
              (if macro `(" '(macro . #[" ,index "])") `(" #[" ,index "]"))
              (append code nil)          ; Turn byte-code-function-p into list.
              (and (atom code) byte-compile-dynamic
@@ -2928,7 +2985,7 @@ for symbols generated by the byte compiler itself."
                         ;; which may include "calls" to
                         ;; internal-make-closure (Bug#29988).
                         (not lexical-binding))
-                  nil
+                   (setq int (byte-compile-strip-symbol-positions int))
                 (setq int `(interactive ,newform)))))
            ((cdr int)
             (byte-compile-warn "malformed interactive spec: %s"
@@ -2943,13 +3000,14 @@ for symbols generated by the byte compiler itself."
                                    (and lexical-binding
                                         (byte-compile-make-lambda-lexenv
                                          arglistvars))
-                                   reserved-csts)))
+                                   reserved-csts))
+          (bare-arglist (byte-compile-strip-symbol-positions arglist)))
       ;; Build the actual byte-coded function.
       (cl-assert (eq 'byte-code (car-safe compiled)))
       (apply #'make-byte-code
              (if lexical-binding
                  (byte-compile-make-args-desc arglist)
-               arglist)
+               bare-arglist)
              (append
               ;; byte-string, constants-vector, stack depth
               (cdr compiled)
@@ -2957,7 +3015,7 @@ for symbols generated by the byte compiler itself."
               (cond ((and lexical-binding arglist)
                      ;; byte-compile-make-args-desc lost the args's names,
                      ;; so preserve them in the docstring.
-                     (list (help-add-fundoc-usage doc arglist)))
+                     (list (help-add-fundoc-usage doc bare-arglist)))
                     ((or doc int)
                      (list doc)))
               ;; optionally, the interactive spec.
@@ -3152,7 +3210,8 @@ for symbols generated by the byte compiler itself."
   (setq byte-compile-noruntime-functions
         (delq fn byte-compile-noruntime-functions))
   ;; Delegate the rest to the normal macro definition.
-  (macroexpand `(declare-function ,fn ,file ,@args)))
+  (let ((print-symbols-bare t))
+    (macroexpand `(declare-function ,fn ,file ,@args))))
 
 
 ;; This is the recursive entry point for compiling each subform of an
@@ -3170,19 +3229,20 @@ for symbols generated by the byte compiler itself."
 ;;
 (defun byte-compile-form (form &optional for-effect)
   (let ((byte-compile--for-effect for-effect)
-        (byte-compile--form-stack (push form byte-compile--form-stack)))
+        (byte-compile--form-stack (cons form byte-compile--form-stack)))
     (cond
      ((not (consp form))
       (cond ((or (not (symbolp form)) (macroexp--const-symbol-p form))
              (when (symbolp form)
                (byte-compile-set-symbol-position form))
-             (byte-compile-constant form))
+             (byte-compile-constant
+              (if (symbolp form) (bare-symbol form) form)))
             ((and byte-compile--for-effect byte-compile-delete-errors)
              (when (symbolp form)
                (byte-compile-set-symbol-position form))
              (setq byte-compile--for-effect nil))
             (t
-             (byte-compile-variable-ref form))))
+             (byte-compile-variable-ref (bare-symbol form)))))
      ((symbolp (car form))
       (let* ((fn (car form))
              (handler (get fn 'byte-compile))
@@ -3413,6 +3473,7 @@ for symbols generated by the byte compiler itself."
         (byte-compile-warn-obsolete var))))
 
 (defsubst byte-compile-dynamic-variable-op (base-op var)
+  (if (symbolp var) (setq var (bare-symbol var)))
   (let ((tmp (assq var byte-compile-variables)))
     (unless tmp
       (setq tmp (list var))
@@ -3474,14 +3535,19 @@ for symbols generated by the byte compiler itself."
 (defun byte-compile-constant (const)
   (if byte-compile--for-effect
       (setq byte-compile--for-effect nil)
-    (inline (byte-compile-push-constant const))))
+    (inline (byte-compile-push-constant
+             (if (symbolp const) (bare-symbol const) const)))))
 
 ;; Use this for a constant that is not the value of its containing form.
 ;; This ignores byte-compile--for-effect.
 (defun byte-compile-push-constant (const)
   (when (symbolp const)
-    (byte-compile-set-symbol-position const))
-  (byte-compile-out 'byte-constant (byte-compile-get-constant const)))
+    (byte-compile-set-symbol-position const)
+    (setq const (bare-symbol const)))
+  (byte-compile-out
+   'byte-constant
+   (byte-compile-get-constant
+    (byte-compile-strip-symbol-positions const))))
 
 ;; Compile those primitive ordinary functions
 ;; which have special byte codes just for speed.
@@ -4272,7 +4338,7 @@ Return a list of the form ((TEST . VAR)  ((VALUE BODY) 
...))"
 
       (dolist (case cases)
         (setq tag (byte-compile-make-tag)
-              test-obj (nth 0 case)
+              test-obj (byte-compile-strip-symbol-positions (nth 0 case))
               body (nth 1 case))
         (byte-compile-out-tag tag)
         (puthash test-obj tag jump-table)
diff --git a/lisp/emacs-lisp/cconv.el b/lisp/emacs-lisp/cconv.el
index 010026b..bfa6d73 100644
--- a/lisp/emacs-lisp/cconv.el
+++ b/lisp/emacs-lisp/cconv.el
@@ -334,7 +334,8 @@ places where they originally did not directly appear."
                (var (if (not (consp binder))
                         (prog1 binder (setq binder (list binder)))
                        (when (cddr binder)
-                         (byte-compile-warn
+                         (byte-compile--warn-x
+                          binder
                           "Malformed `%S' binding: %S"
                           letsym binder))
                       (setq value (cadr binder))
@@ -578,8 +579,8 @@ FORM is the parent form that binds this var."
     (`(,_ nil nil nil nil) nil)
     (`((,(and var (guard (eq ?_ (aref (symbol-name var) 0)))) . ,_)
        ,_ ,_ ,_ ,_)
-     (byte-compile-warn
-      "%s `%S' not left unused" varkind var)))
+     (byte-compile--warn-x
+      var "%s `%S' not left unused" varkind var)))
   (pcase vardata
     (`((,var . ,_) nil ,_ ,_ nil)
      ;; FIXME: This gives warnings in the wrong order, with imprecise line
@@ -591,8 +592,8 @@ FORM is the parent form that binds this var."
               (eq ?_ (aref (symbol-name var) 0))
              ;; As a special exception, ignore "ignore".
              (eq var 'ignored))
-       (byte-compile-warn "Unused lexical %s `%S'"
-                          varkind var)))
+       (byte-compile--warn-x var "Unused lexical %s `%S'"
+                             varkind var)))
     ;; If it's unused, there's no point converting it into a cons-cell, even if
     ;; it's captured and mutated.
     (`(,binder ,_ t t ,_)
@@ -616,7 +617,8 @@ FORM is the parent form that binds this var."
     (dolist (arg args)
       (cond
        ((byte-compile-not-lexical-var-p arg)
-        (byte-compile-warn
+        (byte-compile--warn-x
+         arg
          "Lexical argument shadows the dynamic variable %S"
          arg))
        ((eq ?& (aref (symbol-name arg) 0)) nil) ;Ignore &rest, &optional, ...
@@ -700,7 +702,8 @@ and updates the data stored in ENV."
        (setq forms (cddr forms))))
 
     (`((lambda . ,_) . ,_)             ; First element is lambda expression.
-     (byte-compile-warn
+     (byte-compile--warn-x
+      (nth 1 (car form))
       "Use of deprecated ((lambda %s ...) ...) form" (nth 1 (car form)))
      (dolist (exp `((function ,(car form)) . ,(cdr form)))
        (cconv-analyze-form exp env)))
@@ -728,8 +731,8 @@ and updates the data stored in ENV."
     (`(condition-case ,var ,protected-form . ,handlers)
      (cconv-analyze-form protected-form env)
      (when (and var (symbolp var) (byte-compile-not-lexical-var-p var))
-       (byte-compile-warn
-        "Lexical variable shadows the dynamic variable %S" var))
+       (byte-compile--warn-x
+        var "Lexical variable shadows the dynamic variable %S" var))
      (let* ((varstruct (list var nil nil nil nil)))
        (if var (push varstruct env))
        (dolist (handler handlers)
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el
index c7f0c48..0da434d 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -437,7 +437,8 @@ The set of acceptable TYPEs (also called \"specializers\") 
is defined
              cl-generic-method-args     ; arguments
              lambda-doc                 ; documentation string
              def-body)))                ; part to be debugged
-  (let ((qualifiers nil))
+  (let ((qualifiers nil)
+        (org-name name))
     (while (not (listp args))
       (push args qualifiers)
       (setq args (pop body)))
@@ -451,6 +452,7 @@ The set of acceptable TYPEs (also called \"specializers\") 
is defined
                    (byte-compile-warning-enabled-p 'obsolete))
                (let* ((obsolete (get name 'byte-obsolete-info)))
                  (macroexp--warn-and-return
+                  org-name
                   (macroexp--obsolete-warning name obsolete "generic function")
                   nil)))
          ;; You could argue that `defmethod' modifies rather than defines the
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index 29ddd49..47afc72 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -53,6 +53,36 @@
   `(prog1 (car (cdr ,place))
      (setq ,place (cdr (cdr ,place)))))
 
+(defun cl-macs--strip-s-p-1 (arg)
+  "Strip all positions from symbols with position in ARG, destructively 
modifying ARG
+Return the modified ARG."
+  (cond
+   ((symbolp arg)
+    (bare-symbol arg))
+   ((consp arg)
+    (let ((a arg))
+      (while (consp (cdr a))
+        (setcar a (cl-macs--strip-s-p-1 (car a)))
+        (setq a (cdr a)))
+      (setcar a (cl-macs--strip-s-p-1 (car a)))
+      ;; (if (cdr a)
+      (unless (bare-symbol-p (cdr a))   ; includes (unpositioned) nil.
+          (setcdr a (cl-macs--strip-s-p-1 (cdr a)))))
+    arg)
+   ((vectorp arg)
+    (let ((i 0)
+         (len (length arg)))
+      (while (< i len)
+       (aset arg i (cl-macs--strip-s-p-1 (aref arg i)))
+       (setq i (1+ i))))
+    arg)
+   (t arg)))
+
+(defun cl-macs--strip-symbol-positions (arg)
+  "Strip all positions from symbols (recursively) in ARG.  Don't modify ARG."
+  (let ((arg1 (copy-tree arg t)))
+    (cl-macs--strip-s-p-1 arg1)))
+
 (defvar cl--optimize-safety)
 (defvar cl--optimize-speed)
 
@@ -2280,10 +2310,12 @@ by EXPANSION, and (setq NAME ...) will act like (setf 
EXPANSION ...).
                                                (append bindings venv))
                                          macroexpand-all-environment))))
             (if malformed-bindings
-                (macroexp--warn-and-return
-                 (format-message "Malformed `cl-symbol-macrolet' binding(s): 
%S"
-                                 (nreverse malformed-bindings))
-                 expansion)
+                (let ((rev-malformed-bindings (nreverse malformed-bindings)))
+                  (macroexp--warn-and-return
+                   rev-malformed-bindings
+                   (format-message "Malformed `cl-symbol-macrolet' binding(s): 
%S"
+                                   rev-malformed-bindings)
+                   expansion))
               expansion)))
       (unless advised
         (advice-remove 'macroexpand #'cl--sm-macroexpand)))))
@@ -2886,7 +2918,8 @@ non-nil value, that slot cannot be set via `setf'.
              ;; and pred-check, so changing it is not straightforward.
              (push `(cl-defsubst ,accessor (cl-x)
                        ,(format "Access slot \"%s\" of `%s' struct CL-X."
-                                slot struct)
+                                (cl-macs--strip-symbol-positions slot)
+                                (cl-macs--strip-symbol-positions struct))
                        (declare (side-effect-free t))
                        ,@(and pred-check
                              (list `(or ,pred-check
@@ -2899,6 +2932,7 @@ non-nil value, that slot cannot be set via `setf'.
               (when (cl-oddp (length desc))
                 (push
                  (macroexp--warn-and-return
+                  (car (last desc))
                   (format "Missing value for option `%S' of slot `%s' in 
struct %s!"
                           (car (last desc)) slot name)
                   'nil)
@@ -2908,6 +2942,7 @@ non-nil value, that slot cannot be set via `setf'.
                   (let ((kw (car defaults)))
                     (push
                      (macroexp--warn-and-return
+                      kw
                       (format "  I'll take `%s' to be an option rather than a 
default value."
                               kw)
                       'nil)
diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el
index e5c4f19..1e9555c 100644
--- a/lisp/emacs-lisp/eieio-core.el
+++ b/lisp/emacs-lisp/eieio-core.el
@@ -721,6 +721,7 @@ Argument FN is the function calling this verifier."
                 ((and (or `',name (and name (pred keywordp)))
                       (guard (not (memq name eieio--known-slot-names))))
                  (macroexp--warn-and-return
+                  name
                   (format-message "Unknown slot `%S'" name) exp 'compile-only))
                 (_ exp)))))
   (cl-check-type slot symbol)
diff --git a/lisp/emacs-lisp/eieio.el b/lisp/emacs-lisp/eieio.el
index 98cdd4f..84804a0 100644
--- a/lisp/emacs-lisp/eieio.el
+++ b/lisp/emacs-lisp/eieio.el
@@ -270,6 +270,7 @@ This method is obsolete."
                          (if (not (stringp (car slots)))
                              whole
                            (macroexp--warn-and-return
+                            (car slots)
                             (format "Obsolete name arg %S to constructor %S"
                                     (car slots) (car whole))
                             ;; Keep the name arg, for backward compatibility,
diff --git a/lisp/emacs-lisp/gv.el b/lisp/emacs-lisp/gv.el
index 6bfc32c..704c764 100644
--- a/lisp/emacs-lisp/gv.el
+++ b/lisp/emacs-lisp/gv.el
@@ -540,7 +540,9 @@ This is like the `&' operator of the C language.
 Note: this only works reliably with lexical binding mode, except for very
 simple PLACEs such as (symbol-function \\='foo) which will also work in dynamic
 binding mode."
-  (let ((code
+  (let ((org-place place) ; It's too difficult to determine by inspection 
whether
+                          ; the functions modify place.
+        (code
          (gv-letplace (getter setter) place
            `(cons (lambda () ,getter)
                   (lambda (gv--val) ,(funcall setter 'gv--val))))))
@@ -552,6 +554,7 @@ binding mode."
             (eq (car-safe code) 'cons))
         code
       (macroexp--warn-and-return
+       org-place
        "Use of gv-ref probably requires lexical-binding"
        code))))
 
diff --git a/lisp/emacs-lisp/macroexp.el b/lisp/emacs-lisp/macroexp.el
index 93678ba..e69f93c 100644
--- a/lisp/emacs-lisp/macroexp.el
+++ b/lisp/emacs-lisp/macroexp.el
@@ -121,8 +121,8 @@ and also to avoid outputting the warning during normal 
execution."
 
 (defvar macroexp--warned (make-hash-table :test #'equal :weakness 'key))
 
-(defun macroexp--warn-and-return (msg form &optional compile-only)
-  (let ((when-compiled (lambda () (byte-compile-warn "%s" msg))))
+(defun macroexp--warn-and-return (arg msg form &optional compile-only)
+  (let ((when-compiled (lambda () (byte-compile--warn-x arg "%s" msg))))
     (cond
      ((null msg) form)
      ((macroexp--compiling-p)
@@ -190,6 +190,7 @@ and also to avoid outputting the warning during normal 
execution."
         (let* ((fun (car form))
                (obsolete (get fun 'byte-obsolete-info)))
           (macroexp--warn-and-return
+           fun
            (macroexp--obsolete-warning
             fun obsolete
             (if (symbolp (symbol-function fun))
@@ -252,12 +253,14 @@ Assumes the caller has bound 
`macroexpand-all-environment'."
       (`(,(and fun (or `funcall `apply `mapcar `mapatoms `mapconcat `mapc))
          ',(and f `(lambda . ,_)) . ,args)
        (macroexp--warn-and-return
+        (nth 1 f)
         (format "%s quoted with ' rather than with #'"
                 (list 'lambda (nth 1 f) '...))
         (macroexp--expand-all `(,fun ,f . ,args))))
       ;; Second arg is a function:
       (`(,(and fun (or `sort)) ,arg1 ',(and f `(lambda . ,_)) . ,args)
        (macroexp--warn-and-return
+        (nth 1 f)
         (format "%s quoted with ' rather than with #'"
                 (list 'lambda (nth 1 f) '...))
         (macroexp--expand-all `(,fun ,arg1 ,f . ,args))))
diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
index 2746738..826bafc 100644
--- a/lisp/emacs-lisp/pcase.el
+++ b/lisp/emacs-lisp/pcase.el
@@ -819,6 +819,7 @@ Otherwise, it defers to REST which is a list of branches of 
the form
         (let ((code (pcase--u1 matches code vars rest)))
           (if (eq upat '_) code
             (macroexp--warn-and-return
+             upat
              "Pattern t is deprecated.  Use `_' instead"
              code))))
        ((eq upat 'pcase--dontcare) :pcase--dontcare)
diff --git a/src/alloc.c b/src/alloc.c
index 1b4212f..f37d7d4 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -6001,9 +6001,12 @@ See Info node `(elisp)Garbage Collection'.  */
        attributes: noinline)
   (void)
 {
+  ptrdiff_t count = SPECPDL_INDEX ();
   void *end;
+  specbind (Qsymbols_with_pos_enabled, Qnil);
   SET_STACK_TOP_ADDRESS (&end);
-  return garbage_collect_1 (end);
+  /* return garbage_collect_1 (end); */
+  return unbind_to (count, garbage_collect_1 (end));
 }
 
 /* Mark Lisp objects in glyph matrix MATRIX.  Currently the
diff --git a/src/data.c b/src/data.c
index d311cba..6c65625 100644
--- a/src/data.c
+++ b/src/data.c
@@ -772,12 +772,14 @@ DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0,
   return name;
 }
 
-DEFUN ("symbol-with-pos-sym", Fsymbol_with_pos_sym, Ssymbol_with_pos_sym, 1, 
1, 0,
-       doc: /* Extract the symbol from a symbol with position.  */)
-       (register Lisp_Object ls)
+DEFUN ("bare-symbol", Fbare_symbol, Sbare_symbol, 1, 1, 0,
+       doc: /* Extract, if need be, the bare symbol from SYM, a symbol.  */)
+       (register Lisp_Object sym)
 {
+  if (BARE_SYMBOL_P (sym))
+    return sym;
   /* Type checking is done in the following macro. */
-  return SYMBOL_WITH_POS_SYM (ls);
+  return SYMBOL_WITH_POS_SYM (sym);
 }
 
 DEFUN ("symbol-with-pos-pos", Fsymbol_with_pos_pos, Ssymbol_with_pos_pos, 1, 
1, 0,
@@ -4073,7 +4075,7 @@ syms_of_data (void)
   defsubr (&Sindirect_function);
   defsubr (&Ssymbol_plist);
   defsubr (&Ssymbol_name);
-  defsubr (&Ssymbol_with_pos_sym);
+  defsubr (&Sbare_symbol);
   defsubr (&Ssymbol_with_pos_pos);
   defsubr (&Sposition_symbol);
   defsubr (&Smakunbound);
@@ -4151,6 +4153,7 @@ This variable cannot be set; trying to do so will signal 
an error.  */);
   Vmost_negative_fixnum = make_fixnum (MOST_NEGATIVE_FIXNUM);
   make_symbol_constant (intern_c_string ("most-negative-fixnum"));
 
+  DEFSYM (Qsymbols_with_pos_enabled, "symbols-with-pos-enabled");
   DEFVAR_LISP ("symbols-with-pos-enabled", Vsymbols_with_pos_enabled,
                doc: /* Non-nil when "symbols with position" can be used as 
symbols.
 Bind this to non-nil in applications such as the byte compiler.  */);
diff --git a/src/fns.c b/src/fns.c
index 138cd08..b5bf6ae 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -4141,6 +4141,8 @@ hash_lookup (struct Lisp_Hash_Table *h, Lisp_Object key, 
EMACS_UINT *hash)
   EMACS_UINT hash_code;
   ptrdiff_t start_of_bucket, i;
 
+  if (SYMBOL_WITH_POS_P (key))
+      key = SYMBOL_WITH_POS_SYM (key);
   hash_code = h->test.hashfn (&h->test, key);
   eassert ((hash_code & ~INTMASK) == 0);
   if (hash)
diff --git a/src/lisp.h b/src/lisp.h
index d2391aa..4dfd065 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -398,13 +398,13 @@ typedef EMACS_INT Lisp_Word;
   || (Vsymbols_with_pos_enabled  \
   && (SYMBOL_WITH_POS_P ((x))                        \
       ? BARE_SYMBOL_P ((y))                               \
-        ? (lisp_h_XSYMBOL_WITH_POS((x)))->sym == (y)          \
+        ? (XSYMBOL_WITH_POS((x)))->sym == (y)          \
         : SYMBOL_WITH_POS_P((y))                       \
-          && ((lisp_h_XSYMBOL_WITH_POS((x)))->sym                   \
-              == (lisp_h_XSYMBOL_WITH_POS((y)))->sym)               \
+          && ((XSYMBOL_WITH_POS((x)))->sym                   \
+              == (XSYMBOL_WITH_POS((y)))->sym)               \
       : (SYMBOL_WITH_POS_P ((y))                     \
          && BARE_SYMBOL_P ((x))                           \
-         && ((x) == ((lisp_h_XSYMBOL_WITH_POS ((y)))->sym))))))
+         && ((x) == ((XSYMBOL_WITH_POS ((y)))->sym))))))
 
 #define lisp_h_FIXNUMP(x)                                       \
    (! (((unsigned) (XLI (x) >> (USE_LSB_TAG ? 0 : FIXNUM_BITS)) \
@@ -420,11 +420,11 @@ typedef EMACS_INT Lisp_Word;
 #define lisp_h_SYMBOL_TRAPPED_WRITE_P(sym) (XSYMBOL (sym)->u.s.trapped_write)
 #define lisp_h_SYMBOL_VAL(sym) \
    (eassert ((sym)->u.s.redirect == SYMBOL_PLAINVAL), (sym)->u.s.val.value)
-#define lisp_h_SYMBOL_WITH_POS_P(x) lisp_h_PSEUDOVECTORP (XIL((x)), 
PVEC_SYMBOL_WITH_POS)
+#define lisp_h_SYMBOL_WITH_POS_P(x) PSEUDOVECTORP ((x), PVEC_SYMBOL_WITH_POS)
 #define lisp_h_BARE_SYMBOL_P(x) TAGGEDP ((x), Lisp_Symbol)
 /* verify (NIL_IS_ZERO) */
-#define lisp_h_SYMBOLP(x) ((lisp_h_BARE_SYMBOL_P ((x)) ||               \
-                            (Vsymbols_with_pos_enabled && 
(lisp_h_SYMBOL_WITH_POS_P ((x))))))
+#define lisp_h_SYMBOLP(x) ((BARE_SYMBOL_P ((x)) ||               \
+                            (Vsymbols_with_pos_enabled && (SYMBOL_WITH_POS_P 
((x))))))
 #define lisp_h_TAGGEDP(a, tag) \
    (! (((unsigned) (XLI (a) >> (USE_LSB_TAG ? 0 : VALBITS)) \
        - (unsigned) (tag)) \
@@ -445,7 +445,7 @@ typedef EMACS_INT Lisp_Word;
 # define lisp_h_XFIXNUM(a) (XLI (a) >> INTTYPEBITS)
 # ifdef __CHKP__
 #  define lisp_h_XBARE_SYMBOL(a) \
-    (eassert (BARE_SYMBOL_P ((a))),                             \
+    (eassert (BARE_SYMBOL_P ((a))),                        \
      (struct Lisp_Symbol *) ((char *) XUNTAG ((a), Lisp_Symbol,   \
                                              struct Lisp_Symbol) \
                             + (intptr_t) lispsym))
@@ -464,10 +464,10 @@ typedef EMACS_INT Lisp_Word;
 # define lisp_h_XSYMBOL(a)                      \
      (eassert (SYMBOLP ((a))),                      \
       (!Vsymbols_with_pos_enabled                \
-      ? (lisp_h_XBARE_SYMBOL ((a)))             \
-       : (lisp_h_BARE_SYMBOL_P ((a)))           \
-      ? (lisp_h_XBARE_SYMBOL ((a)))                                    \
-       : lisp_h_XBARE_SYMBOL (lisp_h_XSYMBOL_WITH_POS ((a))->sym)))
+      ? (XBARE_SYMBOL ((a)))             \
+       : (BARE_SYMBOL_P ((a)))           \
+      ? (XBARE_SYMBOL ((a)))                                    \
+       : XBARE_SYMBOL (XSYMBOL_WITH_POS ((a))->sym)))
 
 # define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK))
 #endif
@@ -488,12 +488,13 @@ typedef EMACS_INT Lisp_Word;
 # define XIL(i) lisp_h_XIL (i)
 # define XLP(o) lisp_h_XLP (o)
 # define XPL(p) lisp_h_XPL (p)
+# define BARE_SYMBOL_P(x) lisp_h_BARE_SYMBOL_P (x)
 # define CHECK_FIXNUM(x) lisp_h_CHECK_FIXNUM (x)
 # define CHECK_SYMBOL(x) lisp_h_CHECK_SYMBOL (x)
 # define CHECK_TYPE(ok, predicate, x) lisp_h_CHECK_TYPE (ok, predicate, x)
 # define CONSP(x) lisp_h_CONSP (x)
 # define BASE_EQ(x, y) lisp_h_BASE_EQ (x, y)
-/* # define EQ(x, y) lisp_h_EQ (x, y) */
+/* # define EQ(x, y) lisp_h_EQ (x, y) */ /* X, Y are accessed more than once. 
*/
 # define FLOATP(x) lisp_h_FLOATP (x)
 # define FIXNUMP(x) lisp_h_FIXNUMP (x)
 # define NILP(x) lisp_h_NILP (x)
@@ -501,8 +502,7 @@ typedef EMACS_INT Lisp_Word;
 # define SYMBOL_CONSTANT_P(sym) lisp_h_SYMBOL_CONSTANT_P (sym)
 # define SYMBOL_TRAPPED_WRITE_P(sym) lisp_h_SYMBOL_TRAPPED_WRITE_P (sym)
 # define SYMBOL_VAL(sym) lisp_h_SYMBOL_VAL (sym)
-# define BARE_SYMBOL_P(x) lisp_h_BARE_SYMBOL_P (x)
-/* # define SYMBOLP(x) lisp_h_SYMBOLP (x) */
+/* # define SYMBOLP(x) lisp_h_SYMBOLP (x) */ /* X is accessed more than once. 
*/
 # define TAGGEDP(a, tag) lisp_h_TAGGEDP (a, tag)
 # define VECTORLIKEP(x) lisp_h_VECTORLIKEP (x)
 # define XCAR(c) lisp_h_XCAR (c)
@@ -514,10 +514,10 @@ typedef EMACS_INT Lisp_Word;
 # endif
 # if USE_LSB_TAG
 #  define make_fixnum(n) lisp_h_make_fixnum (n)
+#  define XBARE_SYMBOL(a)  lisp_h_XBARE_SYMBOL (a)
 #  define XFIXNAT(a) lisp_h_XFIXNAT (a)
 #  define XFIXNUM(a) lisp_h_XFIXNUM (a)
-#  define XBARE_SYMBOL(a)  lisp_h_XBARE_SYMBOL (a)
-/* #  define XSYMBOL(a) lisp_h_XSYMBOL (a) */
+/* #  define XSYMBOL(a) lisp_h_XSYMBOL (a) */ /* A is accessed more than once. 
*/
 #  define XTYPE(a) lisp_h_XTYPE (a)
 # endif
 #endif
@@ -1029,6 +1029,18 @@ enum More_Lisp_Bits
 #define MOST_NEGATIVE_FIXNUM (-1 - MOST_POSITIVE_FIXNUM)
 
 INLINE bool
+PSEUDOVECTORP (Lisp_Object a, int code)
+{
+  return lisp_h_PSEUDOVECTORP (a, code);
+}
+
+INLINE bool
+(BARE_SYMBOL_P) (Lisp_Object x)
+{
+  return lisp_h_BARE_SYMBOL_P (x);
+}
+
+INLINE bool
 (SYMBOL_WITH_POS_P) (Lisp_Object x)
 {
   return lisp_h_SYMBOL_WITH_POS_P (x);
@@ -1040,13 +1052,20 @@ INLINE bool
   return lisp_h_SYMBOLP (x);
 }
 
+INLINE struct Lisp_Symbol_With_Pos *
+XSYMBOL_WITH_POS (Lisp_Object a)
+{
+    eassert (SYMBOL_WITH_POS_P (a));
+    return XUNTAG (a, Lisp_Vectorlike, struct Lisp_Symbol_With_Pos);
+}
+
 INLINE struct Lisp_Symbol * ATTRIBUTE_NO_SANITIZE_UNDEFINED
-(XSYMBOL) (Lisp_Object a)
+(XBARE_SYMBOL) (Lisp_Object a)
 {
 #if USE_LSB_TAG
-  return lisp_h_XSYMBOL (a);
+  return lisp_h_XBARE_SYMBOL (a);
 #else
-  eassert (SYMBOLP (a));
+  eassert (BARE_SYMBOL_P (a));
   intptr_t i = (intptr_t) XUNTAG (a, Lisp_Symbol, struct Lisp_Symbol);
   void *p = (char *) lispsym + i;
 # ifdef __CHKP__
@@ -1058,6 +1077,12 @@ INLINE struct Lisp_Symbol * 
ATTRIBUTE_NO_SANITIZE_UNDEFINED
 #endif
 }
 
+INLINE struct Lisp_Symbol * ATTRIBUTE_NO_SANITIZE_UNDEFINED
+(XSYMBOL) (Lisp_Object a)
+{
+  return lisp_h_XSYMBOL (a);
+}
+
 INLINE Lisp_Object
 make_lisp_symbol (struct Lisp_Symbol *sym)
 {
@@ -1194,7 +1219,14 @@ make_fixed_natnum (EMACS_INT n)
 }
 
 /* Return true if X and Y are the same object.  */
+INLINE bool
+(BASE_EQ) (Lisp_Object x, Lisp_Object y)
+{
+  return lisp_h_BASE_EQ (x, y);
+}
 
+/* Return true if X and Y are the same object, reckoning a symbol with
+   position as being the same as the bare symbol.  */
 INLINE bool
 (EQ) (Lisp_Object x, Lisp_Object y)
 {
@@ -1640,12 +1672,6 @@ PSEUDOVECTOR_TYPEP (union vectorlike_header *a, enum 
pvec_type code)
          == (PSEUDOVECTOR_FLAG | (code << PSEUDOVECTOR_AREA_BITS)));
 }
 
-INLINE bool
-PSEUDOVECTORP (Lisp_Object a, int code)
-{
-  return lisp_h_PSEUDOVECTORP (a, code);
-}
-
 /* A boolvector is a kind of vectorlike, with contents like a string.  */
 
 struct Lisp_Bool_Vector
@@ -2525,13 +2551,6 @@ XOVERLAY (Lisp_Object a)
   return XUNTAG (a, Lisp_Vectorlike, struct Lisp_Overlay);
 }
 
-INLINE struct Lisp_Symbol_With_Pos *
-XSYMBOL_WITH_POS (Lisp_Object a)
-{
-    eassert (SYMBOL_WITH_POS_P (a));
-    return XUNTAG (a, Lisp_Vectorlike, struct Lisp_Symbol_With_Pos);
-}
-
 INLINE Lisp_Object
 SYMBOL_WITH_POS_SYM (Lisp_Object a)
 {
diff --git a/src/lread.c b/src/lread.c
index 38a7286..9609770 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -2813,7 +2813,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool 
first_in_list, bool locate_syms)
              /* Accept extended format for hash tables (extensible to
                 other types), e.g.
                 #s(hash-table size 2 test equal data (k1 v1 k2 v2))  */
-             Lisp_Object tmp = read_list (0, readcharfun, locate_syms);
+             Lisp_Object tmp = read_list (0, readcharfun, false);
              Lisp_Object head = CAR_SAFE (tmp);
              Lisp_Object data = Qnil;
              Lisp_Object val = Qnil;
@@ -2899,7 +2899,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool 
first_in_list, bool locate_syms)
          if (c == '[')
            {
              Lisp_Object tmp;
-             tmp = read_vector (readcharfun, 0, locate_syms);
+             tmp = read_vector (readcharfun, 0, false);
              if (ASIZE (tmp) < CHAR_TABLE_STANDARD_SLOTS)
                error ("Invalid size char-table");
              XSETPVECTYPE (XVECTOR (tmp), PVEC_CHAR_TABLE);
@@ -2912,7 +2912,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool 
first_in_list, bool locate_syms)
                {
                  /* Sub char-table can't be read as a regular
                     vector because of a two C integer fields.  */
-                 Lisp_Object tbl, tmp = read_list (1, readcharfun, 
locate_syms);
+                 Lisp_Object tbl, tmp = read_list (1, readcharfun, false);
                  ptrdiff_t size = XFIXNUM (Flength (tmp));
                  int i, depth, min_char;
                  struct Lisp_Cons *cell;
@@ -2950,7 +2950,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool 
first_in_list, bool locate_syms)
       if (c == '&')
        {
          Lisp_Object length;
-         length = read1 (readcharfun, pch, first_in_list, locate_syms);
+         length = read1 (readcharfun, pch, first_in_list, false);
          c = READCHAR;
          if (c == '"')
            {
@@ -2959,7 +2959,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool 
first_in_list, bool locate_syms)
              unsigned char *data;
 
              UNREAD (c);
-             tmp = read1 (readcharfun, pch, first_in_list, locate_syms);
+             tmp = read1 (readcharfun, pch, first_in_list, false);
              if (STRING_MULTIBYTE (tmp)
                  || (size_in_chars != SCHARS (tmp)
                      /* We used to print 1 char too many
@@ -3000,7 +3000,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool 
first_in_list, bool locate_syms)
          int ch;
 
          /* Read the string itself.  */
-         tmp = read1 (readcharfun, &ch, 0, locate_syms);
+         tmp = read1 (readcharfun, &ch, 0, false);
          if (ch != 0 || !STRINGP (tmp))
            invalid_syntax ("#");
          /* Read the intervals and their properties.  */
@@ -3008,14 +3008,14 @@ read1 (Lisp_Object readcharfun, int *pch, bool 
first_in_list, bool locate_syms)
            {
              Lisp_Object beg, end, plist;
 
-             beg = read1 (readcharfun, &ch, 0, locate_syms);
+             beg = read1 (readcharfun, &ch, 0, false);
              end = plist = Qnil;
              if (ch == ')')
                break;
              if (ch == 0)
-               end = read1 (readcharfun, &ch, 0, locate_syms);
+               end = read1 (readcharfun, &ch, 0, false);
              if (ch == 0)
-               plist = read1 (readcharfun, &ch, 0, locate_syms);
+               plist = read1 (readcharfun, &ch, 0, false);
              if (ch)
                invalid_syntax ("Invalid string property list");
              Fset_text_properties (beg, end, plist, tmp);
diff --git a/src/print.c b/src/print.c
index c8432a3..fc5d931 100644
--- a/src/print.c
+++ b/src/print.c
@@ -1397,19 +1397,24 @@ print_vectorlike (Lisp_Object obj, Lisp_Object 
printcharfun, bool escapeflag,
     case PVEC_SYMBOL_WITH_POS:
       {
         struct Lisp_Symbol_With_Pos *sp = XSYMBOL_WITH_POS (obj);
-        print_c_string ("#<symbol ", printcharfun);
-        if (BARE_SYMBOL_P (sp->sym))
+        if (!NILP (Vprint_symbols_bare))
           print_object (sp->sym, printcharfun, escapeflag);
         else
-          print_c_string ("NOT A SYMBOL!!", printcharfun);
-        if (FIXNUMP (sp->pos))
           {
-            print_c_string (" at ", printcharfun);
-            print_object (sp->pos, printcharfun, escapeflag);
+            print_c_string ("#<symbol ", printcharfun);
+            if (BARE_SYMBOL_P (sp->sym))
+              print_object (sp->sym, printcharfun, escapeflag);
+            else
+              print_c_string ("NOT A SYMBOL!!", printcharfun);
+            if (FIXNUMP (sp->pos))
+              {
+                print_c_string (" at ", printcharfun);
+                print_object (sp->pos, printcharfun, escapeflag);
+              }
+            else
+              print_c_string (" NOT A POSITION!!", printcharfun);
+            printchar ('>', printcharfun);
           }
-        else
-          print_c_string (" NOT A POSITION!!", printcharfun);
-        printchar ('>', printcharfun);
       }
       break;
 
@@ -2348,6 +2353,12 @@ priorities.  Values other than nil or t are also treated 
as
 `default'.  */);
   Vprint_charset_text_property = Qdefault;
 
+  DEFVAR_LISP ("print-symbols-bare", Vprint_symbols_bare,
+               doc: /* A flag to control printing of symbols with position.
+If the value is nil, print these objects complete with position.
+Otherwise print just the bare symbol.  */);
+  Vprint_symbols_bare = Qnil;
+
   /* prin1_to_string_buffer initialized in init_buffer_once in buffer.c */
   staticpro (&Vprin1_to_string_buffer);
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]