Merge remote-tracking branch 'savannah/master' into HEAD

This commit is contained in:
Andrea Corallo 2020-07-07 20:44:39 +01:00
commit 3d43d45755
19 changed files with 310 additions and 202 deletions

View file

@ -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

View file

@ -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

View file

@ -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}

View file

@ -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 callers
;; 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"))
(if (= (length (cdr form)) 2)
(let ((list (nth 2 form)))
(when (and (eq (car-safe list) 'quote)
(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

View file

@ -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)
))

View file

@ -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))

View file

@ -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

View file

@ -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

View file

@ -2620,9 +2620,9 @@ comint mode, which see."
(select-window
(display-buffer
(get-buffer-create (concat "*gud" filepart "*"))
'(display-buffer-reuse-window
'((display-buffer-reuse-window
display-buffer-in-previous-window
display-buffer-same-window display-buffer-pop-up-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.

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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))

View file

@ -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)
(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)
;; 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))))
(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))

View file

@ -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 =

View file

@ -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)
{

View file

@ -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.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. */

View file

@ -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)))

View file

@ -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