emacs-devel
[Top][All Lists]
Advanced

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

Re: c-forward-sws: Is the code right?


From: Alan Mackenzie
Subject: Re: c-forward-sws: Is the code right?
Date: Tue, 27 Mar 2018 16:41:56 +0000
User-agent: Mutt/1.7.2 (2016-11-26)

Hello, zhang.

On Tue, Mar 27, 2018 at 14:44:43 +0000, zhang cc wrote:
> In functon c-forward-sws:

>     ((and c-opt-cpp-prefix
>   (looking-at c-noise-macro-name-re))
>      ;; Skip over a noise macro.
>      (goto-char (match-end 1))
>      (not (eobp)))))

> c-noise-macro-name-re’ value is "\\<\\>”, which doesn’t have a group. Then 
> (match-end 1) should always return nil. And (goto-char nil) will signal an 
> error.

The intention is that "\\<\\>" will never match at all, hence that
match-end will never be executed.  "\\<" means "beginning of word" and
"\\>" means "end of word".  Could there be something in your environment
whereby an end of word might be at the same position as the beginning of
a word?  If this is the case, then I will need to come up with an actual
regexp which can never match anything.

Possibly, the bug could lie somewhere else in c-forward-sws.

Is the bug reproducible?  If so, could you possibly patch that bit of
code to add (not (equal c-opt-cpp-prefix "\\<\\>")) before the
(looking-at ...) form, and see if that stops the error.


> Debugger entered--Lisp error: (wrong-type-argument integer-or-marker-p nil) 
> c-forward-sws() c-unfind-coalesced-tokens(87 92) c-before-change(87 92) 
> delete-region(87 #<marker at 92 in c.cpp>) (if (= (progn (or (and (memq 
> (type-of field) cl-struct-yas--field-tags) t) (signal 'wrong-type-argument 
> (list 'yas--field field))) (aref field 2)) (progn (or (and (memq (type-of 
> field) cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 
> 'yas--field field))) (aref field 3))) nil (delete-region (or from (progn (or 
> (and (memq (type-of field) cl-struct-yas--field-tags) t) (signal 
> 'wrong-type-argument (list 'yas--field field))) (aref field 2))) (progn (or 
> (and (memq (type-of field) cl-struct-yas--field-tags) t) (signal 
> 'wrong-type-argument (list 'yas--field field))) (aref field 3)))) 
> yas--skip-and-clear(#s(yas--field :number 1 :start #<marker at 86 in c.cpp> 
> :end #<marker at 92 in c.cpp> :parent-field nil :mirrors nil :transform nil 
> :modified-p t :next nil) 87) (progn (yas--skip-and-clear field end)) (if 
> (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (lambda nil (if 
> (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet))() funcall((lambda nil (if 
> (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet))) (let nil (funcall '(lambda nil (if 
> (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet)))) eval((let nil (funcall '(lambda nil (if 
> (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet))))) (let* ((syms (mapcar (function car) 
> envvar)) (vals (mapcar (function (lambda (v-f) (eval (car (cdr v-f))))) 
> envvar)) (body (function (lambda nil (if (yas--skip-and-clear-field-p field 
> beg end length) (progn (yas--skip-and-clear field end))) (progn (or (and 
> (memq (type-of field) cl-struct-yas--field-tags) t) (signal 
> 'wrong-type-argument (list 'yas--field field))) (let* ((v field)) (aset v 7 
> t))) (yas--advance-end-maybe field (overlay-end overlay)) (save-excursion 
> (yas--field-update-display field)) (yas--update-mirrors snippet)))) (binds 
> nil)) (while syms (setq binds (cons (list (car-safe (prog1 syms (setq syms 
> (cdr syms)))) (list 'quote (car-safe (prog1 vals (setq vals (cdr vals)))))) 
> binds))) (eval (list 'let binds (list 'funcall (list 'quote body))))) (progn 
> (let* ((syms (mapcar (function car) envvar)) (vals (mapcar (function (lambda 
> (v-f) (eval (car (cdr v-f))))) envvar)) (body (function (lambda nil (if 
> (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet)))) (binds nil)) (while syms (setq binds (cons 
> (list (car-safe (prog1 syms (setq syms (cdr syms)))) (list 'quote (car-safe 
> (prog1 vals (setq vals (cdr vals)))))) binds))) (eval (list 'let binds (list 
> 'funcall (list 'quote body)))))) (let ((envvar (progn (or (and (memq (type-of 
> snippet) cl-struct-yas--snippet-tags) t) (signal 'wrong-type-argument (list 
> 'yas--snippet snippet))) (aref snippet 1)))) (progn (let* ((syms (mapcar 
> (function car) envvar)) (vals (mapcar (function (lambda (v-f) (eval (car (cdr 
> v-f))))) envvar)) (body (function (lambda nil (if 
> (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet)))) (binds nil)) (while syms (setq binds (cons 
> (list (car-safe (prog1 syms (setq syms (cdr syms)))) (list 'quote (car-safe 
> (prog1 vals (setq vals (cdr vals)))))) binds))) (eval (list 'let binds (list 
> 'funcall (list 'quote body))))))) (progn (let ((envvar (progn (or (and (memq 
> (type-of snippet) cl-struct-yas--snippet-tags) t) (signal 
> 'wrong-type-argument (list 'yas--snippet snippet))) (aref snippet 1)))) 
> (progn (let* ((syms (mapcar (function car) envvar)) (vals (mapcar (function 
> (lambda (v-f) (eval (car (cdr v-f))))) envvar)) (body (function (lambda nil 
> (if (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet)))) (binds nil)) (while syms (setq binds (cons 
> (list (car-safe (prog1 syms (setq syms (cdr syms)))) (list 'quote (car-safe 
> (prog1 vals (setq vals (cdr vals)))))) binds))) (eval (list 'let binds (list 
> 'funcall (list 'quote body)))))))) (unwind-protect (progn (let ((envvar 
> (progn (or (and (memq (type-of snippet) cl-struct-yas--snippet-tags) t) 
> (signal 'wrong-type-argument (list 'yas--snippet snippet))) (aref snippet 
> 1)))) (progn (let* ((syms (mapcar (function car) envvar)) (vals (mapcar 
> (function (lambda (v-f) (eval (car (cdr v-f))))) envvar)) (body (function 
> (lambda nil (if (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet)))) (binds nil)) (while syms (setq binds (cons 
> (list (car-safe (prog1 syms (setq syms (cdr syms)))) (list 'quote (car-safe 
> (prog1 vals (setq vals (cdr vals)))))) binds))) (eval (list 'let binds (list 
> 'funcall (list 'quote body)))))))) (set-match-data save-match-data-internal 
> 'evaporate)) (let ((save-match-data-internal (match-data))) (unwind-protect 
> (progn (let ((envvar (progn (or (and (memq (type-of snippet) 
> cl-struct-yas--snippet-tags) t) (signal 'wrong-type-argument (list 
> 'yas--snippet snippet))) (aref snippet 1)))) (progn (let* ((syms (mapcar 
> (function car) envvar)) (vals (mapcar (function (lambda (v-f) (eval (car (cdr 
> v-f))))) envvar)) (body (function (lambda nil (if 
> (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet)))) (binds nil)) (while syms (setq binds (cons 
> (list (car-safe (prog1 syms (setq syms (cdr syms)))) (list 'quote (car-safe 
> (prog1 vals (setq vals (cdr vals)))))) binds))) (eval (list 'let binds (list 
> 'funcall (list 'quote body)))))))) (set-match-data save-match-data-internal 
> 'evaporate))) (if (yas--snippet-live-p snippet) (let 
> ((save-match-data-internal (match-data))) (unwind-protect (progn (let 
> ((envvar (progn (or (and (memq (type-of snippet) cl-struct-yas--snippet-tags) 
> t) (signal 'wrong-type-argument (list 'yas--snippet snippet))) (aref snippet 
> 1)))) (progn (let* ((syms (mapcar (function car) envvar)) (vals (mapcar 
> (function (lambda (v-f) (eval (car (cdr v-f))))) envvar)) (body (function 
> (lambda nil (if (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet)))) (binds nil)) (while syms (setq binds (cons 
> (list (car-safe (prog1 syms (setq syms (cdr syms)))) (list 'quote (car-safe 
> (prog1 vals (setq vals (cdr vals)))))) binds))) (eval (list 'let binds (list 
> 'funcall (list 'quote body)))))))) (set-match-data save-match-data-internal 
> 'evaporate))) (lwarn '(yasnippet zombie) :warning "Killing zombie snippet!") 
> (delete-overlay overlay)) (let* ((inhibit-modification-hooks nil) 
> (yas--inhibit-overlay-hooks t) (field (overlay-get overlay 'yas--field)) 
> (snippet (overlay-get yas--active-field-overlay 'yas--snippet))) (if 
> (yas--snippet-live-p snippet) (let ((save-match-data-internal (match-data))) 
> (unwind-protect (progn (let ((envvar (progn (or (and (memq (type-of snippet) 
> cl-struct-yas--snippet-tags) t) (signal 'wrong-type-argument (list 
> 'yas--snippet snippet))) (aref snippet 1)))) (progn (let* ((syms (mapcar 
> (function car) envvar)) (vals (mapcar (function (lambda (v-f) (eval (car (cdr 
> v-f))))) envvar)) (body (function (lambda nil (if 
> (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet)))) (binds nil)) (while syms (setq binds (cons 
> (list (car-safe (prog1 syms (setq syms (cdr syms)))) (list 'quote (car-safe 
> (prog1 vals (setq vals (cdr vals)))))) binds))) (eval (list 'let binds (list 
> 'funcall (list 'quote body)))))))) (set-match-data save-match-data-internal 
> 'evaporate))) (lwarn '(yasnippet zombie) :warning "Killing zombie snippet!") 
> (delete-overlay overlay))) (if (or (not after\?) yas--inhibit-overlay-hooks 
> (not (overlayp yas--active-field-overlay)) (not (overlay-buffer overlay)) 
> (yas--undo-in-progress)) nil (let* ((inhibit-modification-hooks nil) 
> (yas--inhibit-overlay-hooks t) (field (overlay-get overlay 'yas--field)) 
> (snippet (overlay-get yas--active-field-overlay 'yas--snippet))) (if 
> (yas--snippet-live-p snippet) (let ((save-match-data-internal (match-data))) 
> (unwind-protect (progn (let ((envvar (progn (or (and (memq (type-of snippet) 
> cl-struct-yas--snippet-tags) t) (signal 'wrong-type-argument (list 
> 'yas--snippet snippet))) (aref snippet 1)))) (progn (let* ((syms (mapcar 
> (function car) envvar)) (vals (mapcar (function (lambda (v-f) (eval (car (cdr 
> v-f))))) envvar)) (body (function (lambda nil (if 
> (yas--skip-and-clear-field-p field beg end length) (progn 
> (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) 
> cl-struct-yas--field-tags) t) (signal 'wrong-type-argument (list 'yas--field 
> field))) (let* ((v field)) (aset v 7 t))) (yas--advance-end-maybe field 
> (overlay-end overlay)) (save-excursion (yas--field-update-display field)) 
> (yas--update-mirrors snippet)))) (binds nil)) (while syms (setq binds (cons 
> (list (car-safe (prog1 syms (setq syms (cdr syms)))) (list 'quote (car-safe 
> (prog1 vals (setq vals (cdr vals)))))) binds))) (eval (list 'let binds (list 
> 'funcall (list 'quote body)))))))) (set-match-data save-match-data-internal 
> 'evaporate))) (lwarn '(yasnippet zombie) :warning "Killing zombie snippet!") 
> (delete-overlay overlay)))) yas--on-field-overlay-modification(#<overlay from 
> 86 to 92 in c.cpp> t 86 87 0) self-insert-command(1) 
> funcall-interactively(self-insert-command 1) 
> call-interactively(self-insert-command nil nil) 
> command-execute(self-insert-command)

-- 
Alan Mackenzie (Nuremberg, Germany).



reply via email to

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