branch: elpa/logview commit 6a4e3f06d9084c261f2f96f977315622b2e9649f Author: Paul Pogonyshev <pogonys...@gmail.com> Commit: Paul Pogonyshev <pogonys...@gmail.com>
Cache entry timestamp parsing result. --- logview.el | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/logview.el b/logview.el index 6290e388de..13c0b53b16 100644 --- a/logview.el +++ b/logview.el @@ -781,6 +781,7 @@ this face is used." ;; - 2-9: group 1-4 (timestamp, level, name, thread) begin/end offsets; ;; - 10: details (second line) start offset, or nil if there is no second line; ;; - 11: entry level as a number; +;; - 12: entry timestamp as a float (or nil, if not parsed yet). ;; ;; Offsets are relative to the entry beginning. We store offsets so that values remain ;; valid even if buffer text is shifted forwards or backwards. @@ -813,6 +814,11 @@ this face is used." (defsubst logview--entry-level (entry) (aref entry 11)) +;; Parse entry timestamp. This value is cached. +(defsubst logview--entry-timestamp (entry start) + (or (aref entry 12) + (aset entry 12 (funcall logview--submode-timestamp-parser (logview--entry-group entry start logview--timestamp-group))))) + ;; The following (inlined) functions are needed when applying ;; 'invisible' property. Generally we count entry from start of its @@ -1787,8 +1793,8 @@ difference bases (appointed with `\\<logview-mode-map>\\[logview-thread-differen (logview--assert 'timestamp) (logview--std-temporarily-widening (logview--locate-current-entry entry start - (unless (and (equal (car logview--timestamp-difference-base) start) (null logview--timestamp-difference-per-thread-bases)) - (setq logview--timestamp-difference-base (logview--difference-base entry start) + (unless (and (equal (cdr logview--timestamp-difference-base) start) (null logview--timestamp-difference-per-thread-bases)) + (setq logview--timestamp-difference-base (cons entry start) logview--timestamp-difference-per-thread-bases nil) (logview--refontify-buffer))))) @@ -1801,10 +1807,10 @@ it stays in effect for other threads." (logview--std-temporarily-widening (logview--locate-current-entry entry start (let ((thread (logview--entry-group entry start logview--thread-group))) - (unless (and logview--timestamp-difference-per-thread-bases (equal (car (gethash thread logview--timestamp-difference-per-thread-bases)) start)) + (unless (and logview--timestamp-difference-per-thread-bases (equal (cdr (gethash thread logview--timestamp-difference-per-thread-bases)) start)) (unless logview--timestamp-difference-per-thread-bases (setq logview--timestamp-difference-per-thread-bases (make-hash-table :test #'equal))) - (puthash thread (logview--difference-base entry start) logview--timestamp-difference-per-thread-bases) + (puthash thread (cons entry start) logview--timestamp-difference-per-thread-bases) (logview--refontify-buffer)))))) (defun logview-go-to-difference-base-entry () @@ -1813,16 +1819,15 @@ it stays in effect for other threads." (logview--std-temporarily-widening (logview--locate-current-entry entry start (let* ((thread (logview--entry-group entry start logview--thread-group)) - (difference-base (car (or (when logview--timestamp-difference-per-thread-bases - (gethash thread logview--timestamp-difference-per-thread-bases)) - logview--timestamp-difference-base)))) + (difference-base (or (when logview--timestamp-difference-per-thread-bases + (gethash thread logview--timestamp-difference-per-thread-bases)) + logview--timestamp-difference-base))) (unless difference-base (user-error "There is no timestamp difference base for the current entry")) (when (invisible-p difference-base) (user-error "Timestamp difference base for the current entry is currently hidden")) - (let* ((entry+start (logview--do-locate-current-entry difference-base)) - (entry (car entry+start)) - (start (cdr entry+start))) + (let* ((entry (car difference-base)) + (start (cdr difference-base))) (unless (and (< start (logview--point-max)) (> (logview--entry-end entry start) (logview--point-min))) (user-error "Difference base entry is outside the narrowing region")) (goto-char (logview--entry-message-start entry start)) @@ -1849,9 +1854,6 @@ it stays in effect for other threads." (remhash thread logview--timestamp-difference-per-thread-bases) (logview--refontify-buffer))))) -(defun logview--difference-base (entry start) - (cons start (funcall logview--submode-timestamp-parser (logview--entry-group entry start logview--timestamp-group)))) - ;;; Option changing commands. @@ -2714,7 +2716,7 @@ next line, which is usually one line beyond END." (have-next-entry (re-search-forward logview--entry-regexp nil t)) (entry-end (if have-next-entry (match-beginning 0) (point-max))) ;; See description of `logview-entry' above. - (logview-entry (make-vector 12 nil))) + (logview-entry (make-vector 13 nil))) (aset logview-entry 0 (- entry-end entry-start)) (let ((points (cdr match-data))) (dotimes (k num-points) @@ -2933,14 +2935,14 @@ This list is preserved across Emacs session in (let ((difference-base (or (when difference-bases-per-thread (gethash (logview--entry-group entry start logview--thread-group) difference-bases-per-thread)) difference-base))) - (when (and difference-base (not (= (car difference-base) start))) + (when (and difference-base (not (= (cdr difference-base) start))) ;; FIXME: It is possible that fractionals are not the last ;; thing in the timestamp, in which case it would be ;; nicer to add some spaces on the right. However, ;; it's not easy to do and is also quite unlikely, ;; so ignoring that for now. - (let* ((difference (- (funcall logview--submode-timestamp-parser (buffer-substring-no-properties from to)) - (cdr difference-base))) + (let* ((difference (- (logview--entry-timestamp entry start) + (logview--entry-timestamp (car difference-base) (cdr difference-base)))) (difference-string (format difference-format-string difference)) (length-delta (- to from (length difference-string)))) (when (> length-delta 0)