emacs-diffs
[Top][All Lists]
Advanced

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

feature/native-comp 3d43d45 01/14: Merge remote-tracking branch 'savanna


From: Andrea Corallo
Subject: feature/native-comp 3d43d45 01/14: Merge remote-tracking branch 'savannah/master' into HEAD
Date: Thu, 9 Jul 2020 11:57:50 -0400 (EDT)

branch: feature/native-comp
commit 3d43d45755b2c38d5378496ff6b0fc40538ee924
Merge: 2593bbe df3ece9
Author: Andrea Corallo <akrl@sdf.org>
Commit: Andrea Corallo <akrl@sdf.org>

    Merge remote-tracking branch 'savannah/master' into HEAD
---
 doc/lispref/display.texi               |  12 +--
 doc/lispref/frames.texi                |  13 +--
 doc/misc/tramp.texi                    |   9 +-
 lisp/emacs-lisp/byte-opt.el            | 156 ++++++++++++++++-----------------
 lisp/emacs-lisp/cl-macs.el             |  26 +++---
 lisp/man.el                            |   6 +-
 lisp/progmodes/cc-engine.el            |  30 ++++---
 lisp/progmodes/cc-langs.el             |   2 +-
 lisp/progmodes/gud.el                  |   6 +-
 lisp/progmodes/js.el                   |   4 +-
 lisp/progmodes/project.el              |  31 +++----
 lisp/progmodes/verilog-mode.el         | 112 +++++++++++++++--------
 lisp/simple.el                         |   7 +-
 lisp/textmodes/mhtml-mode.el           |  35 +++++---
 src/json.c                             |   2 +
 src/keyboard.c                         |   2 +-
 src/xdisp.c                            |  27 +++++-
 test/lisp/emacs-lisp/bytecomp-tests.el |  20 ++---
 test/src/json-tests.el                 |  12 +++
 19 files changed, 310 insertions(+), 202 deletions(-)

diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index 6fff199..d7aab4a 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -4274,9 +4274,10 @@ a display specification has the form
 @noindent
 @var{fringe} is either the symbol @code{left-fringe} or
 @code{right-fringe}.  @var{bitmap} is a symbol identifying the bitmap
-to display.  The optional @var{face} names a face whose foreground
-color is used to display the bitmap; this face is automatically merged
-with the @code{fringe} face.
+to display.  The optional @var{face} names a face whose foreground and
+background colors are to be used to display the bitmap; this face is
+automatically merged with the @code{fringe} face.  If @var{face} is
+omitted, that means to use the @code{default} face.
 
   For instance, to display an arrow in the left fringe, using the
 @code{warning} face, you could say something like:
@@ -4980,8 +4981,9 @@ Margins}).
 This display specification on any character of a line of text causes
 the specified @var{bitmap} be displayed in the left or right fringes
 for that line, instead of the characters that have the display
-specification.  The optional @var{face} specifies the colors to be
-used for the bitmap.  @xref{Fringe Bitmaps}, for the details.
+specification.  The optional @var{face} specifies the face whose
+colors are to be used for the bitmap display.  @xref{Fringe Bitmaps},
+for the details.
 
 @item (space-width @var{factor})
 This display specification affects all the space characters within the
diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index a82b585..22d32c0 100644
--- a/doc/lispref/frames.texi
+++ b/doc/lispref/frames.texi
@@ -1599,12 +1599,13 @@ parameters represent the user's stated preference; 
otherwise, use
 This parameter specifies a relative position of the frame's
 window-system window in the stacking (Z-) order of the frame's display.
 
-If this is @code{above}, the frame's window-system window is displayed
-above all other window-system windows that do not have the @code{above}
-property set.  If this is @code{nil}, the frame's window is displayed below all
-windows that have the @code{above} property set and above all windows
-that have the @code{below} property set.  If this is @code{below}, the
-frame's window is displayed below all windows that do not have the
+If this is @code{above}, the window-system will display the window
+that corresponds to the frame above all other window-system windows
+that do not have the @code{above} property set.  If this is
+@code{nil}, the frame's window is displayed below all windows that
+have the @code{above} property set and above all windows that have the
+@code{below} property set.  If this is @code{below}, the frame's
+window is displayed below all windows that do not have the
 @code{below} property set.
 
 To position the frame above or below a specific other frame use the
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index feead3d..c018033 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -1709,10 +1709,11 @@ Integration for LXD containers.  A container is 
accessed via
 @item magit-tramp
 @cindex method @option{git}
 @cindex @option{git} method
-Browing git repositories with @code{magit}.  A versioned file is accessed via
-@file{@trampfn{git,rev@@root-dir,/path/to/file}}.  @samp{rev} is a git
-revision, and @samp{root-dir} is a virtual host name for the root
-directory, specified in @code{magit-tramp-hosts-alist}.
+Browsing git repositories with @code{magit}.  A versioned file is
+accessed via @file{@trampfn{git,rev@@root-dir,/path/to/file}}.
+@samp{rev} is a git revision, and @samp{root-dir} is a virtual host
+name for the root directory, specified in
+@code{magit-tramp-hosts-alist}.
 
 @item tramp-hdfs
 @cindex method @option{hdfs}
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index 12bde8f..194ceee 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -557,7 +557,10 @@
           (let ((args (mapcar #'byte-optimize-form (cdr form))))
             (if (and (get fn 'pure)
                      (byte-optimize-all-constp args))
-                  (list 'quote (apply fn (mapcar #'eval args)))
+                 (let ((arg-values (mapcar #'eval args)))
+                   (condition-case nil
+                       (list 'quote (apply fn arg-values))
+                     (error (cons fn args))))
               (cons fn args)))))))
 
 (defun byte-optimize-all-constp (list)
@@ -672,36 +675,18 @@
            (apply (car form) constants))
        form)))
 
-;; Portable Emacs integers fall in this range.
-(defconst byte-opt--portable-max #x1fffffff)
-(defconst byte-opt--portable-min (- -1 byte-opt--portable-max))
-
-;; True if N is a number that works the same on all Emacs platforms.
-;; Portable Emacs fixnums are exactly representable as floats on all
-;; Emacs platforms, and (except for -0.0) any floating-point number
-;; that equals one of these integers must be the same on all
-;; platforms.  Although other floating-point numbers such as 0.5 are
-;; also portable, it can be tricky to characterize them portably so
-;; they are not optimized.
-(defun byte-opt--portable-numberp (n)
-  (and (numberp n)
-       (<= byte-opt--portable-min n byte-opt--portable-max)
-       (= n (floor n))
-       (not (and (floatp n) (zerop n)
-                 (condition-case () (< (/ n) 0) (error))))))
-
-;; Use OP to reduce any leading prefix of portable numbers in the list
-;; (cons ACCUM ARGS) down to a single portable number, and return the
+;; Use OP to reduce any leading prefix of constant numbers in the list
+;; (cons ACCUM ARGS) down to a single number, and return the
 ;; resulting list A of arguments.  The idea is that applying OP to A
 ;; is equivalent to (but likely more efficient than) applying OP to
 ;; (cons ACCUM ARGS), on any Emacs platform.  Do not make any special
 ;; provision for (- X) or (/ X); for example, it is the caller’s
 ;; responsibility that (- 1 0) should not be "optimized" to (- 1).
 (defun byte-opt--arith-reduce (op accum args)
-  (when (byte-opt--portable-numberp accum)
+  (when (numberp accum)
     (let (accum1)
-      (while (and (byte-opt--portable-numberp (car args))
-                  (byte-opt--portable-numberp
+      (while (and (numberp (car args))
+                  (numberp
                    (setq accum1 (condition-case ()
                                     (funcall op accum (car args))
                                   (error))))
@@ -746,12 +731,11 @@
        ;; (- x -1) --> (1+ x)
        ((equal (cdr args) '(-1))
         (list '1+ (car args)))
-       ;; (- n) -> -n, where n and -n are portable numbers.
+       ;; (- n) -> -n, where n and -n are constant numbers.
        ;; This must be done separately since byte-opt--arith-reduce
        ;; is not applied to (- n).
        ((and (null (cdr args))
-             (byte-opt--portable-numberp (car args))
-             (byte-opt--portable-numberp (- (car args))))
+             (numberp (car args)))
         (- (car args)))
        ;; not further optimized
        ((equal args (cdr form)) form)
@@ -761,8 +745,7 @@
   (let ((args (cdr form)))
     (when (null (cdr args))
       (let ((n (car args)))
-        (when (and (byte-opt--portable-numberp n)
-                   (byte-opt--portable-numberp (1+ n)))
+        (when (numberp n)
           (setq form (1+ n))))))
   form)
 
@@ -770,8 +753,7 @@
   (let ((args (cdr form)))
     (when (null (cdr args))
       (let ((n (car args)))
-        (when (and (byte-opt--portable-numberp n)
-                   (byte-opt--portable-numberp (1- n)))
+        (when (numberp n)
           (setq form (1- n))))))
   form)
 
@@ -813,7 +795,7 @@
    (t ;; This can enable some lapcode optimizations.
     (list (car form) (nth 2 form) (nth 1 form)))))
 
-(defun byte-optimize-predicate (form)
+(defun byte-optimize-constant-args (form)
   (let ((ok t)
        (rest (cdr form)))
     (while (and rest ok)
@@ -828,9 +810,6 @@
 (defun byte-optimize-identity (form)
   (if (and (cdr form) (null (cdr (cdr form))))
       (nth 1 form)
-    (byte-compile-warn "identity called with %d arg%s, but requires 1"
-                      (length (cdr form))
-                      (if (= 1 (length (cdr form))) "" "s"))
     form))
 
 (defun byte-optimize--constant-symbol-p (expr)
@@ -863,21 +842,27 @@
     ;; Arity errors reported elsewhere.
     form))
 
+(defun byte-optimize-assoc (form)
+  ;; Replace 2-argument `assoc' with `assq', `rassoc' with `rassq',
+  ;; if the first arg is a symbol.
+  (if (and (= (length form) 3)
+           (byte-optimize--constant-symbol-p (nth 1 form)))
+      (cons (if (eq (car form) 'assoc) 'assq 'rassq)
+            (cdr form))
+    form))
+
 (defun byte-optimize-memq (form)
   ;; (memq foo '(bar)) => (and (eq foo 'bar) '(bar))
-  (if (/= (length (cdr form)) 2)
-      (byte-compile-warn "memq called with %d arg%s, but requires 2"
-                        (length (cdr form))
-                        (if (= 1 (length (cdr form))) "" "s"))
-    (let ((list (nth 2 form)))
-      (when (and (eq (car-safe list) 'quote)
+  (if (= (length (cdr form)) 2)
+      (let ((list (nth 2 form)))
+        (if (and (eq (car-safe list) 'quote)
                  (listp (setq list (cadr list)))
                  (= (length list) 1))
-        (setq form (byte-optimize-and
-                    `(and ,(byte-optimize-predicate
-                            `(eq ,(nth 1 form) ',(nth 0 list)))
-                          ',list)))))
-    (byte-optimize-predicate form)))
+            `(and (eq ,(nth 1 form) ',(nth 0 list))
+                  ',list)
+          form))
+    ;; Arity errors reported elsewhere.
+    form))
 
 (defun byte-optimize-concat (form)
   "Merge adjacent constant arguments to `concat'."
@@ -910,6 +895,8 @@
 (put 'memq 'byte-optimizer 'byte-optimize-memq)
 (put 'memql  'byte-optimizer 'byte-optimize-member)
 (put 'member 'byte-optimizer 'byte-optimize-member)
+(put 'assoc 'byte-optimizer 'byte-optimize-assoc)
+(put 'rassoc 'byte-optimizer 'byte-optimize-assoc)
 
 (put '+   'byte-optimizer 'byte-optimize-plus)
 (put '*   'byte-optimizer 'byte-optimize-multiply)
@@ -925,31 +912,8 @@
 (put 'string= 'byte-optimizer 'byte-optimize-binary-predicate)
 (put 'string-equal 'byte-optimizer 'byte-optimize-binary-predicate)
 
-(put '<   'byte-optimizer 'byte-optimize-predicate)
-(put '>   'byte-optimizer 'byte-optimize-predicate)
-(put '<=  'byte-optimizer 'byte-optimize-predicate)
-(put '>=  'byte-optimizer 'byte-optimize-predicate)
 (put '1+  'byte-optimizer 'byte-optimize-1+)
 (put '1-  'byte-optimizer 'byte-optimize-1-)
-(put 'not 'byte-optimizer 'byte-optimize-predicate)
-(put 'null  'byte-optimizer 'byte-optimize-predicate)
-(put 'consp 'byte-optimizer 'byte-optimize-predicate)
-(put 'listp 'byte-optimizer 'byte-optimize-predicate)
-(put 'symbolp 'byte-optimizer 'byte-optimize-predicate)
-(put 'stringp 'byte-optimizer 'byte-optimize-predicate)
-(put 'string< 'byte-optimizer 'byte-optimize-predicate)
-(put 'string-lessp  'byte-optimizer 'byte-optimize-predicate)
-(put 'proper-list-p 'byte-optimizer 'byte-optimize-predicate)
-
-(put 'logand 'byte-optimizer 'byte-optimize-predicate)
-(put 'logior 'byte-optimizer 'byte-optimize-predicate)
-(put 'logxor 'byte-optimizer 'byte-optimize-predicate)
-(put 'lognot 'byte-optimizer 'byte-optimize-predicate)
-
-(put 'car 'byte-optimizer 'byte-optimize-predicate)
-(put 'cdr 'byte-optimizer 'byte-optimize-predicate)
-(put 'car-safe 'byte-optimizer 'byte-optimize-predicate)
-(put 'cdr-safe 'byte-optimizer 'byte-optimize-predicate)
 
 (put 'concat 'byte-optimizer 'byte-optimize-concat)
 
@@ -980,7 +944,7 @@
               nil))
        ((null (cdr (cdr form)))
         (nth 1 form))
-       ((byte-optimize-predicate form))))
+       ((byte-optimize-constant-args form))))
 
 (defun byte-optimize-or (form)
   ;; Throw away nil's, and simplify if less than 2 args.
@@ -993,7 +957,7 @@
          (setq form (copy-sequence form)
                rest (setcdr (memq (car rest) form) nil))))
     (if (cdr (cdr form))
-       (byte-optimize-predicate form)
+       (byte-optimize-constant-args form)
       (nth 1 form))))
 
 (defun byte-optimize-cond (form)
@@ -1140,7 +1104,7 @@
          (list 'car (if (zerop (nth 1 form))
                         (nth 2 form)
                       (list 'cdr (nth 2 form))))
-       (byte-optimize-predicate form))
+       form)
     form))
 
 (put 'nthcdr 'byte-optimizer 'byte-optimize-nthcdr)
@@ -1152,7 +1116,7 @@
            (while (>= (setq count (1- count)) 0)
              (setq form (list 'cdr form)))
            form)
-       (byte-optimize-predicate form))
+       form)
     form))
 
 ;; Fixme: delete-char -> delete-region (byte-coded)
@@ -1295,9 +1259,9 @@
 ;; Pure functions are side-effect free functions whose values depend
 ;; only on their arguments, not on the platform.  For these functions,
 ;; calls with constant arguments can be evaluated at compile time.
-;; This may shift runtime errors to compile time.  For example, logand
-;; is pure since its results are machine-independent, whereas ash is
-;; not pure because (ash 1 29)'s value depends on machine word size.
+;; For example, ash is pure since its results are machine-independent,
+;; whereas lsh is not pure because (lsh -1 -1)'s value depends on the
+;; fixnum range.
 ;;
 ;; When deciding whether a function is pure, do not worry about
 ;; mutable strings or markers, as they are so unlikely in real code
@@ -1307,9 +1271,41 @@
 ;; values if a marker is moved.
 
 (let ((pure-fns
-       '(% concat logand logcount logior lognot logxor
-        regexp-opt regexp-quote
-        string-to-char string-to-syntax symbol-name)))
+       '(concat regexp-opt regexp-quote
+        string-to-char string-to-syntax symbol-name
+         eq eql
+         = /= < <= => > min max
+         + - * / % mod abs ash 1+ 1- sqrt
+         logand logior lognot logxor logcount
+         copysign isnan ldexp float logb
+         floor ceiling round truncate
+         ffloor fceiling fround ftruncate
+         string= string-equal string< string-lessp
+         consp atom listp nlistp propert-list-p
+         sequencep arrayp vectorp stringp bool-vector-p hash-table-p
+         null not
+         numberp integerp floatp natnump characterp
+         integer-or-marker-p number-or-marker-p char-or-string-p
+         symbolp keywordp
+         type-of
+         identity ignore
+
+         ;; The following functions are pure up to mutation of their
+         ;; arguments.  This is pure enough for the purposes of
+         ;; constant folding, but not necessarily for all kinds of
+         ;; code motion.
+         car cdr car-safe cdr-safe nth nthcdr last
+         equal
+         length safe-length
+         memq memql member
+         ;; `assoc' and `assoc-default' are excluded since they are
+         ;; impure if the test function is (consider `string-match').
+         assq rassq rassoc
+         plist-get lax-plist-get plist-member
+         aref elt
+         bool-vector-subsetp
+         bool-vector-count-population bool-vector-count-consecutive
+         )))
   (while pure-fns
     (put (car pure-fns) 'pure t)
     (setq pure-fns (cdr pure-fns)))
@@ -2194,7 +2190,7 @@ If FOR-EFFECT is non-nil, the return value is assumed to 
be of no importance."
               (or noninteractive (message "compiling %s...done" x)))
             '(byte-optimize-form
               byte-optimize-body
-              byte-optimize-predicate
+              byte-optimize-constant-args
               byte-optimize-binary-predicate
               ;; Inserted some more than necessary, to speed it up.
               byte-optimize-form-code-walker
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index a3e72c4..6c1426c 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -3138,23 +3138,29 @@ Of course, we really can't know that for sure, so it's 
just a heuristic."
                (cdr (assq sym byte-compile-macro-environment))))))
 
 (pcase-dolist (`(,type . ,pred)
-               '((null         . null)
+               ;; Mostly kept in alphabetical order.
+               '((array                . arrayp)
                  (atom         . atom)
-                 (real         . numberp)
-                 (fixnum       . integerp)
                  (base-char    . characterp)
+                 (boolean      . booleanp)
+                 (bool-vector  . bool-vector-p)
+                 (buffer       . bufferp)
                  (character    . natnump)
-                 ;; "Obvious" mappings.
-                 (string       . stringp)
-                 (list         . listp)
+                 (char-table   . char-table-p)
                  (cons         . consp)
-                 (symbol       . symbolp)
+                 (fixnum       . integerp)
+                 (float                . floatp)
                  (function     . functionp)
                  (integer      . integerp)
-                 (float                . floatp)
-                 (boolean      . booleanp)
+                 (keyword      . keywordp)
+                 (list         . listp)
+                 (number       . numberp)
+                 (null         . null)
+                 (real         . numberp)
+                 (sequence     . sequencep)
+                 (string       . stringp)
+                 (symbol       . symbolp)
                  (vector       . vectorp)
-                 (array                . arrayp)
                  ;; FIXME: Do we really want to consider this a type?
                  (integer-or-marker . integer-or-marker-p)
                  ))
diff --git a/lisp/man.el b/lisp/man.el
index 5278a1a..8a36f3a 100644
--- a/lisp/man.el
+++ b/lisp/man.el
@@ -996,7 +996,11 @@ An \"apropos\" query with -k gives a buffer of matching 
page
 names or descriptions.  The pattern argument is usually an
 \"grep -E\" style regexp.
 
-    -k pattern"
+    -k pattern
+
+Note that in some cases you will need to use \\[quoted-insert] to quote the
+SPC character in the above examples, because this command attempts
+to auto-complete your input based on the installed manual pages."
 
   (interactive
    (list (let* ((default-entry (Man-default-man-entry))
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 1977ead..784a6c7 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -1582,6 +1582,7 @@ comment at the start of cc-engine.el for more info."
          (save-excursion (backward-char)
                          (looking-at "\\s("))
          (c-crosses-statement-barrier-p (point) end)))))
+(make-obsolete 'c-at-expression-start-p nil "5.35")
 
 
 ;; A set of functions that covers various idiosyncrasies in
@@ -3186,6 +3187,24 @@ comment at the start of cc-engine.el for more info."
        c-semi-near-cache-limit (min c-semi-near-cache-limit pos)
        c-full-near-cache-limit (min c-full-near-cache-limit pos)))
 
+(defun c-foreign-truncate-lit-pos-cache (beg _end)
+  "Truncate CC Mode's literal cache.
+
+This function should be added to the `before-change-functions'
+hook by major modes that use CC Mode's filling functionality
+without initializing CC Mode.  Currently (2020-06) these are
+js-mode and mhtml-mode."
+  (c-truncate-lit-pos-cache beg))
+
+(defun c-foreign-init-lit-pos-cache ()
+  "Initialize CC Mode's literal cache.
+
+This function should be called from the mode functions of major
+modes which use CC Mode's filling functionality without
+initializing CC Mode.  Currently (2020-06) these are js-mode and
+mhtml-mode."
+  (c-truncate-lit-pos-cache 1))
+
 
 ;; A system for finding noteworthy parens before the point.
 
@@ -11877,17 +11896,6 @@ comment at the start of cc-engine.el for more info."
                    (cons (list beg) type)))))
        (error nil))))
 
-(defun c-looking-at-bos (&optional _lim)
-  ;; Return non-nil if between two statements or declarations, assuming
-  ;; point is not inside a literal or comment.
-  ;;
-  ;; Obsolete - `c-at-statement-start-p' or `c-at-expression-start-p'
-  ;; are recommended instead.
-  ;;
-  ;; This function might do hidden buffer changes.
-  (c-at-statement-start-p))
-(make-obsolete 'c-looking-at-bos 'c-at-statement-start-p "22.1")
-
 (defun c-looking-at-statement-block ()
   ;; Point is at an opening brace.  If this is a statement block (i.e. the
   ;; elements in the block are terminated by semicolons, or the block is
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index 00babf9..13e3ecc 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -1770,7 +1770,7 @@ ender."
 `comment-start-skip' is initialized from this."
   ;; Default: Allow the last char of the comment starter(s) to be
   ;; repeated, then allow any amount of horizontal whitespace.
-  t (concat "\\("
+  t (concat "\\(?:"
            (c-concat-separated
             (mapcar (lambda (cs)
                       (when cs
diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el
index eb43e8b..092d159 100644
--- a/lisp/progmodes/gud.el
+++ b/lisp/progmodes/gud.el
@@ -2620,9 +2620,9 @@ comint mode, which see."
     (select-window
      (display-buffer
       (get-buffer-create (concat "*gud" filepart "*"))
-      '(display-buffer-reuse-window
-        display-buffer-in-previous-window
-        display-buffer-same-window display-buffer-pop-up-window)))
+      '((display-buffer-reuse-window
+         display-buffer-in-previous-window
+         display-buffer-same-window display-buffer-pop-up-window))))
     (when (and existing-buffer (get-buffer-process existing-buffer))
       (error "This program is already being debugged"))
     ;; Set the dir, in case the buffer already existed with a different dir.
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 04b449e..5c50e2a 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -4570,7 +4570,7 @@ This function is intended for use in 
`after-change-functions'."
 
   ;; Comments
   (setq-local comment-start "// ")
-  (setq-local comment-start-skip "\\(//+\\|/\\*+\\)\\s *")
+  (setq-local comment-start-skip "\\(?://+\\|/\\*+\\)\\s *")
   (setq-local comment-end "")
   (setq-local fill-paragraph-function #'js-fill-paragraph)
   (setq-local normal-auto-fill-function #'js-do-auto-fill)
@@ -4591,6 +4591,8 @@ This function is intended for use in 
`after-change-functions'."
   (setq imenu-create-index-function #'js--imenu-create-index)
 
   ;; for filling, pretend we're cc-mode
+  (c-foreign-init-lit-pos-cache)
+  (add-hook 'before-change-functions #'c-foreign-truncate-lit-pos-cache nil t)
   (setq-local comment-line-break-function #'c-indent-new-comment-line)
   (setq-local comment-multi-line t)
   (setq-local electric-indent-chars
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 0a15939..08798d8 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -1,7 +1,7 @@
 ;;; project.el --- Operations on the current project  -*- lexical-binding: t; 
-*-
 
 ;; Copyright (C) 2015-2020 Free Software Foundation, Inc.
-;; Version: 0.4.0
+;; Version: 0.5.0
 ;; Package-Requires: ((emacs "26.3"))
 
 ;; This is a GNU ELPA :core package.  Avoid using functionality that
@@ -294,11 +294,14 @@ The directory names should be absolute.  Used in the VC 
project
 backend implementation of `project-external-roots'.")
 
 (defun project-try-vc (dir)
-  (let* ((backend (ignore-errors (vc-responsible-backend dir)))
+  (let* ((backend
+          ;; FIXME: This is slow. Cache it.
+          (ignore-errors (vc-responsible-backend dir)))
          (root
           (pcase backend
             ('Git
              ;; Don't stop at submodule boundary.
+             ;; FIXME: Cache for a shorter time.
              (or (vc-file-getprop dir 'project-git-root)
                  (let ((root (vc-call-backend backend 'root dir)))
                    (vc-file-setprop
@@ -800,10 +803,10 @@ Arguments the same as in `compile'."
 ;;;###autoload
 (defun project-switch-to-buffer ()
   "Switch to another buffer that is related to the current project.
-A buffer is related to a project if its `default-directory'
-is inside the directory hierarchy of the project's root."
+A buffer is related to a project if `project-current' returns the
+same (equal) value when called in that buffer."
   (interactive)
-  (let* ((root (project-root (project-current t)))
+  (let* ((pr (project-current t))
          (current-buffer (current-buffer))
          (other-buffer (other-buffer current-buffer))
          (other-name (buffer-name other-buffer))
@@ -811,10 +814,9 @@ is inside the directory hierarchy of the project's root."
           (lambda (buffer)
             ;; BUFFER is an entry (BUF-NAME . BUF-OBJ) of Vbuffer_alist.
             (and (cdr buffer)
-                 (not (eq (cdr buffer) current-buffer))
-                 (when-let ((file (buffer-local-value 'default-directory
-                                                      (cdr buffer))))
-                   (file-in-directory-p file root))))))
+                 (equal pr
+                        (with-current-buffer (cdr buffer)
+                          (project-current)))))))
     (switch-to-buffer
      (read-buffer
       "Switch to buffer: "
@@ -836,13 +838,12 @@ any of the conditions will not be killed."
 
 (defun project--buffer-list (pr)
   "Return the list of all buffers in project PR."
-  (let ((root (project-root pr))
-        bufs)
+  (let (bufs)
     (dolist (buf (buffer-list))
-      (let ((filename (or (buffer-file-name buf)
-                          (buffer-local-value 'default-directory buf))))
-        (when (and filename (file-in-directory-p filename root))
-          (push buf bufs))))
+      (when (equal pr
+                   (with-current-buffer buf
+                     (project-current)))
+        (push buf bufs)))
     (nreverse bufs)))
 
 ;;;###autoload
diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el
index 6400e1e..5a469bb 100644
--- a/lisp/progmodes/verilog-mode.el
+++ b/lisp/progmodes/verilog-mode.el
@@ -9,7 +9,7 @@
 ;; Keywords: languages
 ;; The "Version" is the date followed by the decimal rendition of the Git
 ;;     commit hex.
-;; Version: 2020.02.23.232634261
+;; Version: 2020.06.27.014326051
 
 ;; Yoni Rabkin <yoni@rabkins.net> contacted the maintainer of this
 ;; file on 19/3/2008, and the maintainer agreed that when a bug is
@@ -124,7 +124,7 @@
 ;;
 
 ;; This variable will always hold the version number of the mode
-(defconst verilog-mode-version "2020-02-23-dddb795-vpo-GNU"
+(defconst verilog-mode-version "2020-06-27-0da9923-vpo-GNU"
   "Version of this Verilog mode.")
 (defconst verilog-mode-release-emacs t
   "If non-nil, this version of Verilog mode was released with Emacs itself.")
@@ -1430,7 +1430,7 @@ See also `verilog-case-fold'."
   :type 'hook)
 
 (defvar verilog-imenu-generic-expression
-  '((nil            
"^\\s-*\\(?:m\\(?:odule\\|acromodule\\)\\|p\\(?:rimitive\\|rogram\\|ackage\\)\\)\\s-+\\([a-zA-Z0-9_.:]+\\)"
 1)
+  '((nil            
"^\\s-*\\(?:connectmodule\\|m\\(?:odule\\|acromodule\\)\\|p\\(?:rimitive\\|rogram\\|ackage\\)\\)\\s-+\\([a-zA-Z0-9_.:]+\\)"
 1)
     ("*Variables*"  
"^\\s-*\\(reg\\|wire\\|logic\\)\\s-+\\(\\|\\[[^]]+\\]\\s-+\\)\\([A-Za-z0-9_]+\\)"
 3)
     ("*Classes*"    
"^\\s-*\\(?:\\(?:virtual\\|interface\\)\\s-+\\)?class\\s-+\\([A-Za-z_][A-Za-z0-9_]+\\)"
 1)
     ("*Tasks*"      
"^\\s-*\\(?:\\(?:static\\|pure\\|virtual\\|local\\|protected\\)\\s-+\\)*task\\s-+\\(?:\\(?:static\\|automatic\\)\\s-+\\)?\\([A-Za-z_][A-Za-z0-9_:]+\\)"
 1)
@@ -2515,11 +2515,13 @@ find the errors."
          (eval-when-compile
            (verilog-regexp-words
             '( "begin"
+               "connectmodule"
                "else"
                "end"
                "endcase"
                "endclass"
                "endclocking"
+               "endconnectmodule"
                "endgroup"
                "endfunction"
                "endmodule"
@@ -2562,6 +2564,7 @@ find the errors."
           "\\(sequence\\)\\|"     ; 14
          "\\(clocking\\)\\|"      ; 15
          "\\(property\\)\\|"      ; 16
+         "\\(connectmodule\\)\\|" ; 17
          "\\)\\>\\)"))
 (defconst verilog-end-block-re
   (eval-when-compile
@@ -2722,6 +2725,7 @@ find the errors."
        "endclass"
        "endclocking"
        "endconfig"
+       "endconnectmodule"
        "endfunction"
        "endgenerate"
        "endgroup"
@@ -2740,7 +2744,7 @@ find the errors."
 (defconst verilog-declaration-opener
   (eval-when-compile
     (verilog-regexp-words
-     '("module" "begin" "task" "function"))))
+     '("connectmodule" "module" "begin" "task" "function"))))
 
 (defconst verilog-declaration-prefix-re
   (eval-when-compile
@@ -2802,9 +2806,9 @@ find the errors."
 (defconst verilog-declaration-re-1-no-macro (concat "^" 
verilog-declaration-re-2-no-macro))
 
 (defconst verilog-defun-re
-  (eval-when-compile (verilog-regexp-words '("macromodule" "module" "class" 
"program" "interface" "package" "primitive" "config"))))
+  (eval-when-compile (verilog-regexp-words '("macromodule" "connectmodule" 
"module" "class" "program" "interface" "package" "primitive" "config"))))
 (defconst verilog-end-defun-re
-  (eval-when-compile (verilog-regexp-words '("endmodule" "endclass" 
"endprogram" "endinterface" "endpackage" "endprimitive" "endconfig"))))
+  (eval-when-compile (verilog-regexp-words '("endconnectmodule" "endmodule" 
"endclass" "endprogram" "endinterface" "endpackage" "endprimitive" 
"endconfig"))))
 (defconst verilog-zero-indent-re
   (concat verilog-defun-re "\\|" verilog-end-defun-re))
 (defconst verilog-inst-comment-re
@@ -2836,7 +2840,7 @@ find the errors."
        "generate" "endgenerate"
        "initial"
        "interface" "endinterface"
-       "module" "macromodule" "endmodule"
+       "connectmodule" "module" "macromodule" "endconnectmodule" "endmodule"
        "package" "endpackage"
        "primitive" "endprimitive"
        "program" "endprogram"
@@ -2904,14 +2908,14 @@ find the errors."
 (defconst verilog-defun-level-not-generate-re
   (eval-when-compile
     (verilog-regexp-words
-     '( "module" "macromodule" "primitive" "class" "program"
+     '( "connectmodule" "module" "macromodule" "primitive" "class" "program"
         "interface" "package" "config"))))
 
 (defconst verilog-defun-level-re
   (eval-when-compile
     (verilog-regexp-words
      (append
-      '( "module" "macromodule" "primitive" "class" "program"
+      '( "connectmodule" "module" "macromodule" "primitive" "class" "program"
          "interface" "package" "config")
       '( "initial" "final" "always" "always_comb" "always_ff"
          "always_latch" "endtask" "endfunction" )))))
@@ -2926,7 +2930,7 @@ find the errors."
   (eval-when-compile
     (verilog-regexp-words
      '(
-       "endmodule" "endprimitive" "endinterface" "endpackage" "endprogram" 
"endclass"
+       "endconnectmodule" "endmodule" "endprimitive" "endinterface" 
"endpackage" "endprogram" "endclass"
        ))))
 
 (defconst verilog-dpi-import-export-re
@@ -2947,7 +2951,7 @@ find the errors."
   (eval-when-compile
     (verilog-regexp-words
      '(
-       "always" "assign" "always_latch" "always_ff" "always_comb" "constraint"
+       "always" "assign" "always_latch" "always_ff" "always_comb" 
"connectmodule" "constraint"
        "import" "initial" "final" "module" "macromodule" "repeat" "randcase" 
"while"
        "if" "for" "forever" "foreach" "else" "parameter" "do" "localparam" 
"assert"
        ))))
@@ -3065,6 +3069,8 @@ find the errors."
             "sync_reject_on" "unique0" "until" "until_with" "untyped" "weak"
             ;; 1800-2012
             "implements" "interconnect" "nettype" "soft"
+            ;; AMS
+            "connectmodule" "endconnectmodule"
             ))
   "List of Verilog keywords.")
 
@@ -3211,7 +3217,7 @@ See also `verilog-font-lock-extra-types'.")
              "atan2" "atanh" "branch" "ceil" "connect" "connectmodule"
              "connectrules" "continuous" "cos" "cosh" "ddt" "ddt_nature"
              "ddx" "discipline" "discrete" "domain" "driver_update"
-             "endconnectrules" "enddiscipline" "endnature" "endparamset"
+             "endconnectmodule" "endconnectrules" "enddiscipline" "endnature" 
"endparamset"
              "exclude" "exp" "final_step" "flicker_noise" "floor" "flow"
              "from" "ground" "hypot" "idt" "idt_nature" "idtmod" "inf"
              "initial_step" "laplace_nd" "laplace_np" "laplace_zd"
@@ -3290,9 +3296,9 @@ See also `verilog-font-lock-extra-types'.")
                (list
                 ;; Fontify module definitions
                 (list
-                 
"\\<\\(\\(macro\\)?module\\|primitive\\|class\\|program\\|interface\\|package\\|task\\)\\>\\s-*\\(\\sw+\\)"
+                 
"\\<\\(\\(macro\\|connect\\)?module\\|primitive\\|class\\|program\\|interface\\|package\\|task\\)\\>\\s-*\\(\\sw+\\)"
                  '(1 font-lock-keyword-face)
-                 '(3 font-lock-function-name-face 'prepend))
+                 '(3 font-lock-function-name-face prepend))
                 ;; Fontify function definitions
                 (list
                  (concat 
"\\<function\\>\\s-+\\(integer\\|real\\(time\\)?\\|time\\)\\s-+\\(\\sw+\\)" )
@@ -3302,7 +3308,16 @@ See also `verilog-font-lock-extra-types'.")
                   (1 font-lock-keyword-face)
                   (2 font-lock-constant-face append))
                 '("\\<function\\>\\s-+\\(\\sw+\\)"
-                  1 'font-lock-constant-face append))))
+                  1 'font-lock-constant-face append)
+                 ;; Fontify variable names in declarations
+                 (list ;; Implemented as an anchored-matcher
+                  (concat verilog-declaration-re
+                          " *\\(" verilog-range-re "\\)?")
+                  (list ;; anchored-highlighter
+                   (concat "\\_<\\(" verilog-symbol-re "\\)"
+                           " *\\(" verilog-range-re "\\)?*")
+                   nil nil '(1 font-lock-variable-name-face))))))
+
 
   (setq verilog-font-lock-keywords-2
        (append verilog-font-lock-keywords-1
@@ -3608,7 +3623,7 @@ Use filename, if current buffer being edited shorten to 
just buffer name."
              (setq found 't))))))
      ((looking-at verilog-end-block-re)
       (verilog-leap-to-head))
-     ((looking-at 
"\\(endmodule\\>\\)\\|\\(\\<endprimitive\\>\\)\\|\\(\\<endclass\\>\\)\\|\\(\\<endprogram\\>\\)\\|\\(\\<endinterface\\>\\)\\|\\(\\<endpackage\\>\\)")
+     ((looking-at 
"\\(endmodule\\>\\)\\|\\(\\<endprimitive\\>\\)\\|\\(\\<endclass\\>\\)\\|\\(\\<endprogram\\>\\)\\|\\(\\<endinterface\\>\\)\\|\\(\\<endpackage\\>\\)\\|\\(\\<endconnectmodule\\>\\)")
       (cond
        ((match-end 1)
        (verilog-re-search-backward "\\<\\(macro\\)?module\\>" nil 'move))
@@ -3622,6 +3637,8 @@ Use filename, if current buffer being edited shorten to 
just buffer name."
        (verilog-re-search-backward "\\<interface\\>" nil 'move))
        ((match-end 6)
        (verilog-re-search-backward "\\<package\\>" nil 'move))
+       ((match-end 7)
+       (verilog-re-search-backward "\\<connectmodule\\>" nil 'move))
        (t
        (goto-char st)
        (backward-sexp 1))))
@@ -3747,7 +3764,8 @@ Use filename, if current buffer being edited shorten to 
just buffer name."
                   "\\(\\<class\\>\\)\\|"
                   "\\(\\<program\\>\\)\\|"
                   "\\(\\<interface\\>\\)\\|"
-                  "\\(\\<package\\>\\)"))
+                  "\\(\\<package\\>\\)\\|"
+                  "\\(\\<connectmodule\\>\\)"))
       (cond
        ((match-end 1)
        (verilog-re-search-forward "\\<endmodule\\>" nil 'move))
@@ -3761,6 +3779,8 @@ Use filename, if current buffer being edited shorten to 
just buffer name."
        (verilog-re-search-forward "\\<endinterface\\>" nil 'move))
        ((match-end 6)
        (verilog-re-search-forward "\\<endpackage\\>" nil 'move))
+       ((match-end 7)
+       (verilog-re-search-forward "\\<endconnectmodule\\>" nil 'move))
        (t
        (goto-char st)
        (if (= (following-char) ?\) )
@@ -4568,13 +4588,13 @@ More specifically, point @ in the line foo : @ begin"
          (let ((nest 1))
            (while t
              (verilog-re-search-backward
-              (concat 
"\\(\\<module\\>\\)\\|\\(\\<randcase\\>\\|\\<case[xz]?\\>[^:]\\)\\|"
+              (concat 
"\\(\\<module\\>\\)\\|\\(\\<connectmodule\\>\\)\\|\\(\\<randcase\\>\\|\\<case[xz]?\\>[^:]\\)\\|"
                       "\\(\\<endcase\\>\\)\\>")
               nil 'move)
              (cond
-              ((match-end 3)
+              ((match-end 4)
                (setq nest (1+ nest)))
-              ((match-end 2)
+              ((match-end 3)
                (if (= nest 1)
                    (throw 'found 1))
                (setq nest (1- nest)))
@@ -4609,13 +4629,15 @@ More specifically, after a generate and before an 
endgenerate."
        (while (and
                (/= nest 0)
                (verilog-re-search-backward
-                "\\<\\(module\\)\\|\\(generate\\)\\|\\(endgenerate\\)\\>" nil 
'move)
+                
"\\<\\(module\\)\\|\\(connectmodule\\)\\|\\(generate\\)\\|\\(endgenerate\\)\\>" 
nil 'move)
                (cond
                 ((match-end 1) ; module - we have crawled out
                  (throw 'done 1))
-                ((match-end 2) ; generate
+                ((match-end 2) ; connectmodule - we have crawled out
+                 (throw 'done 1))
+                ((match-end 3) ; generate
                  (setq nest (1- nest)))
-                ((match-end 3) ; endgenerate
+                ((match-end 4) ; endgenerate
                  (setq nest (1+ nest))))))))
     (= nest 0) )) ; return nest
 
@@ -5078,6 +5100,8 @@ primitive or interface named NAME."
                       (setq reg "\\(\\<clocking\\>\\)\\|\\<endclocking\\>"))
                      ((match-end 16)  ; of verilog-end-block-ordered-re
                       (setq reg "\\(\\<property\\>\\)\\|\\<endproperty\\>"))
+                     ((match-end 17)  ; of verilog-end-block-ordered-re
+                      (setq reg 
"\\(\\<connectmodule\\>\\)\\|\\<endconnectmodule\\>"))
 
                      (t (error "Problem in verilog-set-auto-endcomments")))
                     (let (b e)
@@ -5103,7 +5127,7 @@ primitive or interface named NAME."
                           (setq string (buffer-substring b e)))
                          (t
                           (ding 't)
-                          (setq string "unmatched 
end(function|task|module|primitive|interface|package|class|clocking)")))))
+                          (setq string "unmatched 
end(function|task|module|connectmodule|primitive|interface|package|class|clocking)")))))
                     (end-of-line)
                     (insert (concat " // " string )))
                   ))))))))))
@@ -5574,7 +5598,7 @@ Return a list of two elements: (INDENT-TYPE 
INDENT-LEVEL)."
           (case-fold-search nil)
           (par 0)
           (begin (looking-at "[ \t]*begin\\>"))
-          (lim (save-excursion (verilog-re-search-backward 
"\\(\\<begin\\>\\)\\|\\(\\<module\\>\\)" nil t)))
+          (lim (save-excursion (verilog-re-search-backward 
"\\(\\<begin\\>\\)\\|\\(\\<\\(connect\\)?module\\>\\)" nil t)))
            (structres nil)
           (type (catch 'nesting
                   ;; Keep working backwards until we can figure out
@@ -7127,7 +7151,7 @@ BASEIND is the base indent to offset everything."
   (let ((pos (point-marker))
        (lim (save-excursion
               ;; (verilog-re-search-backward verilog-declaration-opener nil 
'move)
-              (verilog-re-search-backward 
"\\(\\<begin\\>\\)\\|\\(\\<module\\>\\)\\|\\(\\<task\\>\\)" nil 'move)
+              (verilog-re-search-backward 
"\\(\\<begin\\>\\)\\|\\(\\<\\(connect\\)?module\\>\\)\\|\\(\\<task\\>\\)" nil 
'move)
               (point)))
        (ind)
        (val)
@@ -7286,7 +7310,7 @@ it displays a list of all possible completions.")
 \(integer, real, reg...)")
 
 (defvar verilog-cpp-keywords
-  '("module" "macromodule" "primitive" "timescale" "define" "ifdef" "ifndef" 
"else"
+  '("connectmodule" "module" "macromodule" "primitive" "timescale" "define" 
"ifdef" "ifndef" "else"
     "endif")
   "Keywords to complete when at first word of a line in declarative scope.
 \(initial, always, begin, assign...)
@@ -7297,7 +7321,7 @@ will be completed at runtime and should not be added to 
this list.")
   (append
    '(
      "always" "always_comb" "always_ff" "always_latch" "assign"
-     "begin" "end" "generate" "endgenerate" "module" "endmodule"
+     "begin" "end" "connectmodule" "endconnectmodule" "generate" "endgenerate" 
"module" "endmodule"
      "specify" "endspecify" "function" "endfunction" "initial" "final"
      "task" "endtask" "primitive" "endprimitive"
      )
@@ -7394,9 +7418,9 @@ TYPE is `module', `tf' for task or function, or t if 
unknown."
   (if (string= verilog-str "")
       (setq verilog-str "[a-zA-Z_]"))
   (let ((verilog-str (concat (cond
-                              ((eq type 'module) "\\<\\(module\\)\\s +")
+                              ((eq type 'module) 
"\\<\\(module\\|connectmodule\\)\\s +")
                               ((eq type 'tf) "\\<\\(task\\|function\\)\\s +")
-                              (t "\\<\\(task\\|function\\|module\\)\\s +"))
+                              (t 
"\\<\\(task\\|function\\|module\\|connectmodule\\)\\s +"))
                              "\\<\\(" verilog-str "[a-zA-Z0-9_.]*\\)\\>"))
        match)
 
@@ -7738,7 +7762,7 @@ If search fails, other files are checked based on
        (first 1)
        (prevpos (point-min))
         (final-context-start (make-marker))
-       (regexp "\\(module\\s-+\\w+\\s-*(\\)\\|\\(\\w+\\s-+\\w+\\s-*(\\)"))
+       (regexp 
"\\(\\(connect\\)?module\\s-+\\w+\\s-*(\\)\\|\\(\\w+\\s-+\\w+\\s-*(\\)"))
     (with-output-to-temp-buffer "*Occur*"
       (save-excursion
        (message "Searching for %s ..." regexp)
@@ -8459,7 +8483,8 @@ Optional NUM-PARAM and MAX-PARAM check for a specific 
number of parameters."
   (let ((olist))
     (save-excursion
       ;; /*AUTOPUNT("parameter", "parameter")*/
-      (backward-sexp 1)
+      (when (not (eq (char-before) ?\*))  ; Not .*
+        (backward-sexp 1))
       (while (looking-at "(?\\s *\"\\([^\"]*\\)\"\\s *,?")
         (setq olist (cons (match-string-no-properties 1) olist))
        (goto-char (match-end 0))))
@@ -9909,7 +9934,7 @@ Allows version control to check out the file if need be."
             (while (and
                     ;; It may be tempting to look for verilog-defun-re,
                     ;; don't, it slows things down a lot!
-                    (verilog-re-search-forward-quick 
"\\<\\(module\\|interface\\|program\\)\\>" nil t)
+                    (verilog-re-search-forward-quick 
"\\<\\(connectmodule\\|module\\|interface\\|program\\)\\>" nil t)
                     (setq type (match-string-no-properties 0))
                     (verilog-re-search-forward-quick "[(;]" nil t))
               (if (equal module (verilog-read-module-name))
@@ -10937,9 +10962,9 @@ shown) will make this into:
   ;; Presume one module per file.
   (save-excursion
     (goto-char (point-min))
-    (while (verilog-re-search-forward-quick "\\<module\\>" nil t)
+    (while (verilog-re-search-forward-quick "\\<\\(connect\\)?module\\>" nil t)
       (let ((endmodp (save-excursion
-                      (verilog-re-search-forward-quick "\\<endmodule\\>" nil t)
+                      (verilog-re-search-forward-quick 
"\\<end\\(connect\\)?module\\>" nil t)
                       (point))))
        ;; See if there's already a comment .. inside a comment so not 
verilog-re-search
        (when (not (re-search-forward "/\\*AUTOARG\\*/" endmodp t))
@@ -11583,6 +11608,9 @@ Replace the pin connections to an instantiation or 
interface
 declaration with ones automatically derived from the module or
 interface header of the instantiated item.
 
+You may also provide an optional regular expression, in which
+case only I/O matching the regular expression will be included.
+
 If `verilog-auto-star-expand' is set, also expand SystemVerilog .* ports,
 and delete them before saving unless `verilog-auto-star-save' is set.
 See `verilog-auto-star' for more information.
@@ -11901,7 +11929,9 @@ For more information see the \\[verilog-faq] and forums 
at URL
 `https://www.veripool.org'."
   (save-excursion
     ;; Find beginning
-    (let* ((pt (point))
+    (let* ((params (verilog-read-auto-params 0 1))
+           (regexp (nth 0 params))
+           (pt (point))
            (for-star (save-excursion (backward-char 2) (looking-at "\\.\\*")))
           (indent-pt (save-excursion (verilog-backward-open-paren)
                                      (1+ (current-column))))
@@ -11946,6 +11976,8 @@ For more information see the \\[verilog-faq] and forums 
at URL
                              (verilog-decls-get-vars submoddecls)
                              skip-pins)))
              (vl-dir "interfaced"))
+          (when regexp
+            (setq sig-list (verilog-signals-matching-regexp sig-list regexp)))
          (when (and sig-list
                     verilog-auto-inst-interfaced-ports)
             ;; Note these are searched for in verilog-read-sub-decls.
@@ -11956,6 +11988,8 @@ For more information see the \\[verilog-faq] and forums 
at URL
                         (verilog-decls-get-interfaces submoddecls)
                         skip-pins))
              (vl-dir "interface"))
+          (when regexp
+            (setq sig-list (verilog-signals-matching-regexp sig-list regexp)))
          (when sig-list
             ;; Note these are searched for in verilog-read-sub-decls.
             (verilog-auto-inst-port-list "// Interfaces\n"
@@ -11965,6 +11999,8 @@ For more information see the \\[verilog-faq] and forums 
at URL
                         (verilog-decls-get-outputs submoddecls)
                         skip-pins))
              (vl-dir "output"))
+          (when regexp
+            (setq sig-list (verilog-signals-matching-regexp sig-list regexp)))
          (when sig-list
             (verilog-auto-inst-port-list "// Outputs\n"
                                          sig-list indent-pt moddecls
@@ -11973,6 +12009,8 @@ For more information see the \\[verilog-faq] and forums 
at URL
                         (verilog-decls-get-inouts submoddecls)
                         skip-pins))
              (vl-dir "inout"))
+          (when regexp
+            (setq sig-list (verilog-signals-matching-regexp sig-list regexp)))
          (when sig-list
             (verilog-auto-inst-port-list "// Inouts\n"
                                          sig-list indent-pt moddecls
@@ -11981,6 +12019,8 @@ For more information see the \\[verilog-faq] and forums 
at URL
                         (verilog-decls-get-inputs submoddecls)
                         skip-pins))
              (vl-dir "input"))
+          (when regexp
+            (setq sig-list (verilog-signals-matching-regexp sig-list regexp)))
          (when sig-list
             (verilog-auto-inst-port-list "// Inputs\n"
                                          sig-list indent-pt moddecls
diff --git a/lisp/simple.el b/lisp/simple.el
index a28d10f..2f92238 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -1622,8 +1622,11 @@ display the result of expression evaluation."
   (let ((minibuffer-completing-symbol t))
     (minibuffer-with-setup-hook
         (lambda ()
-          ;; FIXME: call emacs-lisp-mode (see also
-          ;; `eldoc--eval-expression-setup')?
+          ;; FIXME: instead of just applying the syntax table, maybe
+          ;; use a special major mode tailored to reading Lisp
+          ;; expressions from the minibuffer? (`emacs-lisp-mode'
+          ;; doesn't preserve the necessary keybindings.)
+          (set-syntax-table emacs-lisp-mode-syntax-table)
           (add-hook 'completion-at-point-functions
                     #'elisp-completion-at-point nil t)
           (run-hooks 'eval-expression-minibuffer-setup-hook))
diff --git a/lisp/textmodes/mhtml-mode.el b/lisp/textmodes/mhtml-mode.el
index 1ae07c0..54e2077 100644
--- a/lisp/textmodes/mhtml-mode.el
+++ b/lisp/textmodes/mhtml-mode.el
@@ -73,7 +73,9 @@ code();
 
 (defconst mhtml--crucial-variable-prefix
   (regexp-opt '("comment-" "uncomment-" "electric-indent-"
-                "smie-" "forward-sexp-function" "completion-" "major-mode"))
+                "smie-" "forward-sexp-function" "completion-" "major-mode"
+                "adaptive-fill-" "fill-" "normal-auto-fill-function"
+                "paragraph-"))
   "Regexp matching the prefix of \"crucial\" buffer-locals we want to 
capture.")
 
 (defconst mhtml--variable-prefix
@@ -255,17 +257,14 @@ This is used by `mhtml--pre-command'.")
    sgml-syntax-propertize-rules))
 
 (defun mhtml-syntax-propertize (start end)
-  ;; First remove our special settings from the affected text.  They
-  ;; will be re-applied as needed.
-  (remove-list-of-text-properties start end
-                                  '(syntax-table local-map mhtml-submode))
-  (goto-char start)
-  ;; Be sure to look back one character, because START won't yet have
-  ;; been propertized.
-  (unless (bobp)
-    (let ((submode (get-text-property (1- (point)) 'mhtml-submode)))
-      (if submode
-          (mhtml--syntax-propertize-submode submode end))))
+  (let ((submode (get-text-property start 'mhtml-submode)))
+    ;; First remove our special settings from the affected text.  They
+    ;; will be re-applied as needed.
+    (remove-list-of-text-properties start end
+                                    '(syntax-table local-map mhtml-submode))
+    (goto-char start)
+    (if submode
+        (mhtml--syntax-propertize-submode submode end)))
   (sgml-syntax-propertize (point) end mhtml--syntax-propertize))
 
 (defun mhtml-indent-line ()
@@ -333,6 +332,18 @@ the rules from `css-mode'."
   ;: Hack
   (js--update-quick-match-re)
 
+  ;; Setup the appropriate js-mode value of auto-fill-function.
+  (setf (mhtml--submode-crucial-captured-locals mhtml--js-submode)
+        (push (cons 'auto-fill-function
+                    (if (and (boundp 'auto-fill-function) auto-fill-function)
+                        #'js-do-auto-fill
+                      nil))
+              (mhtml--submode-crucial-captured-locals mhtml--js-submode)))
+
+  ;; This mode might be using CC Mode's filling functionality.
+  (c-foreign-init-lit-pos-cache)
+  (add-hook 'before-change-functions #'c-foreign-truncate-lit-pos-cache nil t)
+
   ;; This is sort of a prog-mode as well as a text mode.
   (run-hooks 'prog-mode-hook))
 
diff --git a/src/json.c b/src/json.c
index 3002767..814afc6 100644
--- a/src/json.c
+++ b/src/json.c
@@ -365,6 +365,7 @@ lisp_to_json_toplevel_1 (Lisp_Object lisp,
           Lisp_Object key = HASH_KEY (h, i);
           if (!EQ (key, Qunbound))
             {
+              CHECK_STRING (key);
               Lisp_Object ekey = json_encode (key);
               /* We can't specify the length, so the string must be
                NUL-terminated.  */
@@ -975,6 +976,7 @@ usage: (json-parse-string STRING &rest ARGS) */)
 #endif
 
   Lisp_Object string = args[0];
+  CHECK_STRING (string);
   Lisp_Object encoded = json_encode (string);
   check_string_without_embedded_nuls (encoded);
   struct json_configuration conf =
diff --git a/src/keyboard.c b/src/keyboard.c
index f9b9399..5fa58ab 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -10531,7 +10531,7 @@ The value is always a vector.  */)
 DEFUN ("clear-this-command-keys", Fclear_this_command_keys,
        Sclear_this_command_keys, 0, 1, 0,
        doc: /* Clear out the vector that `this-command-keys' returns.
-Also clear the record of the last 100 events, unless optional arg
+Also clear the record of the last 300 input events, unless optional arg
 KEEP-RECORD is non-nil.  */)
   (Lisp_Object keep_record)
 {
diff --git a/src/xdisp.c b/src/xdisp.c
index e454fd7..97c55cd 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -1872,10 +1872,13 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int 
*x, int *y,
                  /* Account for line-number display, if IT3 still
                     didn't.  This can happen if START - 1 is the
                     first or the last character on its display line.  */
-                 if (it3.lnum_pixel_width > 0)
-                   top_x += it3.lnum_pixel_width;
-                 else if (it.line_number_produced_p)
-                   top_x += it.lnum_pixel_width;
+                 if (!it3.line_number_produced_p)
+                   {
+                     if (it3.lnum_pixel_width > 0)
+                       top_x += it3.lnum_pixel_width;
+                     else if (it.line_number_produced_p)
+                       top_x += it.lnum_pixel_width;
+                   }
                  /* Normally, we would exit the above loop because we
                     found the display element whose character
                     position is CHARPOS.  For the contingency that we
@@ -26382,6 +26385,22 @@ decode_mode_spec (struct window *w, register int c, 
int field_width,
        startpos = marker_position (w->start);
        startpos_byte = marker_byte_position (w->start);
        height = WINDOW_TOTAL_LINES (w);
+       /* We cannot cope with w->start being outside of the
+          accessible portion of the buffer; in particular,
+          display_count_lines call below will infloop if called with
+          startpos_byte outside of the [BEGV_BYTE..ZV_BYTE] region.
+          Such w->start means we were called in some "creative" way
+          when the buffer's restriction was changed, but the window
+          wasn't yet redisplayed after that.  If that happens, we
+          need to determine a new base line.  */
+       if (!(BUF_BEGV_BYTE (b) <= startpos_byte
+             && startpos_byte <= BUF_ZV_BYTE (b)))
+         {
+           startpos = BUF_BEGV (b);
+           startpos_byte = BUF_BEGV_BYTE (b);
+           w->base_line_pos = 0;
+           w->base_line_number = 0;
+         }
 
        /* If we decided that this buffer isn't suitable for line numbers,
           don't forget that too fast.  */
diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el 
b/test/lisp/emacs-lisp/bytecomp-tests.el
index bfe2d06..c235dd4 100644
--- a/test/lisp/emacs-lisp/bytecomp-tests.el
+++ b/test/lisp/emacs-lisp/bytecomp-tests.el
@@ -363,10 +363,10 @@ bytecompiled code, and their results compared.")
        (byte-compile-warnings nil)
        (v0 (condition-case nil
                (eval pat)
-             (error nil)))
+             (error 'bytecomp-check-error)))
        (v1 (condition-case nil
                (funcall (byte-compile (list 'lambda nil pat)))
-             (error nil))))
+             (error 'bytecomp-check-error))))
     (equal v0 v1)))
 
 (put 'bytecomp-check-1 'ert-explainer 'bytecomp-explain-1)
@@ -374,10 +374,10 @@ bytecompiled code, and their results compared.")
 (defun bytecomp-explain-1 (pat)
   (let ((v0 (condition-case nil
                (eval pat)
-             (error nil)))
+             (error 'bytecomp-check-error)))
        (v1 (condition-case nil
                (funcall (byte-compile (list 'lambda nil pat)))
-             (error nil))))
+             (error 'bytecomp-check-error))))
     (format "Expression `%s' gives `%s' if directly evalled, `%s' if compiled."
            pat v0 v1)))
 
@@ -402,10 +402,10 @@ Subtests signal errors if something goes wrong."
     (dolist (pat byte-opt-testsuite-arith-data)
       (condition-case nil
          (setq v0 (eval pat))
-       (error (setq v0 nil)))
+       (error (setq v0 'bytecomp-check-error)))
       (condition-case nil
          (setq v1 (funcall (byte-compile (list 'lambda nil pat))))
-       (error (setq v1 nil)))
+       (error (setq v1 'bytecomp-check-error)))
       (insert (format "%s" pat))
       (indent-to-column 65)
       (if (equal v0 v1)
@@ -561,11 +561,11 @@ bytecompiled code, and their results compared.")
        (byte-compile-warnings nil)
        (v0 (condition-case nil
                (eval pat t)
-             (error nil)))
+             (error 'bytecomp-check-error)))
        (v1 (condition-case nil
                (funcall (let ((lexical-binding t))
                            (byte-compile `(lambda nil ,pat))))
-             (error nil))))
+             (error 'bytecomp-check-error))))
     (equal v0 v1)))
 
 (put 'bytecomp-lexbind-check-1 'ert-explainer 'bytecomp-lexbind-explain-1)
@@ -573,11 +573,11 @@ bytecompiled code, and their results compared.")
 (defun bytecomp-lexbind-explain-1 (pat)
   (let ((v0 (condition-case nil
                (eval pat t)
-             (error nil)))
+             (error 'bytecomp-check-error)))
        (v1 (condition-case nil
                (funcall (let ((lexical-binding t))
                            (byte-compile (list 'lambda nil pat))))
-             (error nil))))
+             (error 'bytecomp-check-error))))
     (format "Expression `%s' gives `%s' if directly evalled, `%s' if compiled."
            pat v0 v1)))
 
diff --git a/test/src/json-tests.el b/test/src/json-tests.el
index 7eeef88..028f92f 100644
--- a/test/src/json-tests.el
+++ b/test/src/json-tests.el
@@ -296,5 +296,17 @@ Test with both unibyte and multibyte strings."
                          (1+ most-positive-fixnum)
                          (1- most-negative-fixnum)))))
 
+(ert-deftest json-parse-string/wrong-type ()
+  "Check that Bug#42113 is fixed."
+  (skip-unless (fboundp 'json-parse-string))
+  (should-error (json-parse-string 1) :type 'wrong-type-argument))
+
+(ert-deftest json-serialize/wrong-hash-key-type ()
+  "Check that Bug#42113 is fixed."
+  (skip-unless (fboundp 'json-serialize))
+  (let ((table (make-hash-table :test #'eq)))
+    (puthash 1 2 table)
+    (should-error (json-serialize table) :type 'wrong-type-argument)))
+
 (provide 'json-tests)
 ;;; json-tests.el ends here



reply via email to

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