From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: npostavs@users.sourceforge.net Newsgroups: gmane.emacs.bugs Subject: bug#25122: 24.5; function describe-variable hangs on large variables Date: Mon, 13 Mar 2017 10:01:13 -0400 Message-ID: <87innd6zti.fsf@users.sourceforge.net> References: <20161206022112.GF25778@E15-2016.optimum.net> <87twahk19y.fsf@gmail.com> <87d1h4fld5.fsf@users.sourceforge.net> <871sxkyv2m.fsf@gmail.com> <87mvcs8j7w.fsf@users.sourceforge.net> <87lgsbtxwe.fsf@gmail.com> <871su38ogm.fsf@users.sourceforge.net> <87d1dnrq96.fsf@gmail.com> <87wpbu7f9i.fsf@users.sourceforge.net> <87r32278wf.fsf@users.sourceforge.net> <87lgs97pg5.fsf@users.sourceforge.net> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: blaine.gmane.org 1489413678 21127 195.159.176.226 (13 Mar 2017 14:01:18 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Mon, 13 Mar 2017 14:01:18 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) Cc: 25122@debbugs.gnu.org, Stefan Monnier , Boruch Baum To: Thierry Volpiatto Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Mar 13 15:01:13 2017 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cnQX8-0004aR-Ii for geb-bug-gnu-emacs@m.gmane.org; Mon, 13 Mar 2017 15:01:10 +0100 Original-Received: from localhost ([::1]:52295 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cnQXC-0004ZR-U8 for geb-bug-gnu-emacs@m.gmane.org; Mon, 13 Mar 2017 10:01:14 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:49161) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cnQX4-0004YL-Q6 for bug-gnu-emacs@gnu.org; Mon, 13 Mar 2017 10:01:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cnQX0-0002dz-DL for bug-gnu-emacs@gnu.org; Mon, 13 Mar 2017 10:01:06 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:55768) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cnQX0-0002do-9S for bug-gnu-emacs@gnu.org; Mon, 13 Mar 2017 10:01:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1cnQWz-00075N-S4 for bug-gnu-emacs@gnu.org; Mon, 13 Mar 2017 10:01:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: npostavs@users.sourceforge.net Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 13 Mar 2017 14:01:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 25122 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 25122-submit@debbugs.gnu.org id=B25122.148941360627110 (code B ref 25122); Mon, 13 Mar 2017 14:01:01 +0000 Original-Received: (at 25122) by debbugs.gnu.org; 13 Mar 2017 14:00:06 +0000 Original-Received: from localhost ([127.0.0.1]:53966 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cnQW5-00073B-LE for submit@debbugs.gnu.org; Mon, 13 Mar 2017 10:00:06 -0400 Original-Received: from mail-io0-f194.google.com ([209.85.223.194]:34850) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cnQW3-00072A-B6 for 25122@debbugs.gnu.org; Mon, 13 Mar 2017 10:00:04 -0400 Original-Received: by mail-io0-f194.google.com with SMTP id f103so13330883ioi.2 for <25122@debbugs.gnu.org>; Mon, 13 Mar 2017 07:00:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=NlFl3SwmYkAbsWws8V9o2UCUv9NbAO+JLbaiS282FNo=; b=J8yumtg11gcLcUmwEpinJEPTYvF8EPoTKmJV6XdPZzzwhaf6WswvoxPV+/ABHwleLW tNL+Q189Q9Mkljn1hCOTqxq620//4Mgw3QvFQ0r7yD33BuBnGUrFCl4wkB7LLJU/1r0T BQ+29pD10z0cpJHRlfaThTiusNNIoLKJbzlIWVS437GBOSjZAG3nWPyEdxdQwNITC8ma F8bcgBrT2R+RKKYtFjY3jaoGQ3p8pRylF3LpOBafJMr46UhkXNnfwqelQ6AXSBctLTVm h6/hG0q6WJPw1D+fDG7VA//YLHB2kqAFizYmYe0+gvtwAJhCxix4sRNv7rp2lcLNBD5U y7pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=NlFl3SwmYkAbsWws8V9o2UCUv9NbAO+JLbaiS282FNo=; b=K2zDWrPPlVW0lfFMp51xZPMl6qzuVAaectTKbemr9NjwlV3RMPfEcQ1m3qPzAiv3dY CcJAbUBFfwpg6+2OYDPMz7QpawkdpIHfkvOmzGfnFpMIImBDTTUvEUQXnsGVtefU6JPJ xkt7l8NTD+pLcHsRXVXMfg8DucLTP3oDPoFNyV/FR4x75EsKmthr2x7Kk2+jDgUfjtkk jD7HOmdSQAXYBUb9CCGtEktDrlQ0KTmo6LvoJDRfO8jt7zdxD1hnJhiZOYT2O3Uk3BsU RnYqff9Rd+xCU4V8GjEikxg9jCQPLk4MF4JvPWLo+BW7BoibHk4uzTaEPrnjY1ULctiK B+Gw== X-Gm-Message-State: AMke39k6y7fqxCQq/mWFyPoOm93eqeFmeIKC+ZPyRGZpX3ZLmvHXEjECBGLLcJiVjnahnA== X-Received: by 10.107.136.41 with SMTP id k41mr31118497iod.160.1489413597642; Mon, 13 Mar 2017 06:59:57 -0700 (PDT) Original-Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id a197sm3699691ita.1.2017.03.13.06.59.56 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 13 Mar 2017 06:59:56 -0700 (PDT) In-Reply-To: <87lgs97pg5.fsf@users.sourceforge.net> (npostavs@users.sourceforge.net's message of "Mon, 13 Mar 2017 00:47:38 -0400") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:130537 Archived-At: --=-=-= Content-Type: text/plain npostavs@users.sourceforge.net writes: > npostavs@users.sourceforge.net writes: > >> Also, this doesn't really solve the performance problem, it just makes >> it much less likely to occur, e.g., (pp (list load-history)) is still >> slow. > > Okay, I think I found the real fix now: Missed a corner case. --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=v2-0001-Don-t-reparse-the-sexp-in-indent-sexp-Bug-25122.patch Content-Description: patch >From b8dd372f65ce8979324c00b12a9ae767c1ffabda Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sun, 12 Mar 2017 23:59:19 -0400 Subject: [PATCH v2] Don't reparse the sexp in indent-sexp (Bug#25122) * lisp/emacs-lisp/lisp-mode.el (calculate-lisp-indent): Let PARSE-START be a parse state that can be reused. (indent-sexp): Pass the running parse state to calculate-lisp-indent instead of the sexp beginning position. Saving the CONTAINING-SEXP-START returned by `calculate-lisp-indent' is no longer needed. * test/lisp/emacs-lisp/lisp-mode-tests.el (indent-sexp): Add blank line to test case. --- lisp/emacs-lisp/lisp-mode.el | 71 ++++++++++++++++++--------------- test/lisp/emacs-lisp/lisp-mode-tests.el | 5 ++- 2 files changed, 42 insertions(+), 34 deletions(-) diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el index eb07c18b03..3fefb69066 100644 --- a/lisp/emacs-lisp/lisp-mode.el +++ b/lisp/emacs-lisp/lisp-mode.el @@ -781,6 +781,10 @@ calculate-lisp-indent If the value is nil, that means don't change the indentation because the line starts inside a string. +PARSE-START may be a buffer position to start parsing from, or a +parse state as returned by calling `parse-partial-sexp' up to the +beginning of the current line. + The value can also be a list of the form (COLUMN CONTAINING-SEXP-START). This means that following lines at the same level of indentation should not necessarily be indented the same as this line. @@ -794,12 +798,14 @@ calculate-lisp-indent (desired-indent nil) (retry t) calculate-lisp-indent-last-sexp containing-sexp) - (if parse-start - (goto-char parse-start) - (beginning-of-defun)) - ;; Find outermost containing sexp - (while (< (point) indent-point) - (setq state (parse-partial-sexp (point) indent-point 0))) + (cond ((or (markerp parse-start) (integerp parse-start)) + (goto-char parse-start)) + ((null parse-start) (beginning-of-defun)) + (t (setq state parse-start))) + (unless state + ;; Find outermost containing sexp + (while (< (point) indent-point) + (setq state (parse-partial-sexp (point) indent-point 0)))) ;; Find innermost containing sexp (while (and retry state @@ -1070,11 +1076,6 @@ indent-sexp ENDPOS is encountered." (interactive) (let* ((indent-stack (list nil)) - ;; If ENDPOS is non-nil, use beginning of defun as STARTING-POINT. - ;; If ENDPOS is nil, it is safe not to scan before point - ;; since every line we indent is more deeply nested than point is. - (starting-point (save-excursion (if endpos (beginning-of-defun)) - (point))) ;; Use `syntax-ppss' to get initial state so we don't get ;; confused by starting inside a string. We don't use ;; `syntax-ppss' in the loop, because this is measurably @@ -1093,16 +1094,21 @@ indent-sexp (save-excursion (while (< (point) endpos) ;; Parse this line so we can learn the state to indent the - ;; next line. - (while (progn - (setq state (parse-partial-sexp - last-syntax-point (progn (end-of-line) (point)) - nil nil state)) - ;; Skip over newlines within strings. - (nth 3 state)) - (setq state (parse-partial-sexp (point) (point-max) - nil nil state 'syntax-table)) - (setq last-syntax-point (point))) + ;; next line. Preserve element 2 of the state (last sexp) for + ;; `calculate-lisp-indent'. + (let ((last-sexp (nth 2 state))) + (while (progn + (setq state (parse-partial-sexp + last-syntax-point (progn (end-of-line) (point)) + nil nil state)) + (setq last-sexp (or (nth 2 state) last-sexp)) + ;; Skip over newlines within strings. + (nth 3 state)) + (setq state (parse-partial-sexp (point) (point-max) + nil nil state 'syntax-table)) + (setq last-sexp (or (nth 2 state) last-sexp)) + (setq last-syntax-point (point))) + (setf (nth 2 state) last-sexp)) (setq next-depth (car state)) ;; If the line contains a comment indent it now with ;; `indent-for-comment'. @@ -1115,6 +1121,8 @@ indent-sexp (make-list (- init-depth next-depth) nil)) last-depth (- last-depth next-depth) next-depth init-depth)) + ;; Now indent the next line according to what we learned from + ;; parsing the previous one. (forward-line 1) (when (< (point) endpos) (let ((depth-delta (- next-depth last-depth))) @@ -1124,28 +1132,25 @@ indent-sexp (setq indent-stack (nconc (make-list depth-delta nil) indent-stack)))) (setq last-depth next-depth)) - ;; Now indent the next line according - ;; to what we learned from parsing the previous one. - (skip-chars-forward " \t") ;; But not if the line is blank, or just a comment (we ;; already called `indent-for-comment' above). + (skip-chars-forward " \t") (unless (or (eolp) (eq (char-syntax (char-after)) ?<)) - (let ((this-indent (car indent-stack))) - (when (listp this-indent) - (let ((val (calculate-lisp-indent - (or (car this-indent) starting-point)))) - (setq - this-indent + (indent-line-to + (or (car indent-stack) + ;; The state here is actually to the end of the + ;; previous line, but that's fine for our purposes. + ;; And parsing over the newline would only destroy + ;; element 2 (last sexp position). + (let ((val (calculate-lisp-indent state))) (cond ((integerp val) (setf (car indent-stack) val)) ((consp val) ; (COLUMN CONTAINING-SEXP-START) - (setf (car indent-stack) (cdr val)) (car val)) ;; `calculate-lisp-indent' only returns nil ;; when we're in a string, but this won't ;; happen because we skip strings above. - (t (error "This shouldn't happen!")))))) - (indent-line-to this-indent)))))))) + (t (error "This shouldn't happen!")))))))))))) (defun indent-pp-sexp (&optional arg) "Indent each line of the list starting just after point, or prettyprint it. diff --git a/test/lisp/emacs-lisp/lisp-mode-tests.el b/test/lisp/emacs-lisp/lisp-mode-tests.el index 2801f23df6..848dd7ca3e 100644 --- a/test/lisp/emacs-lisp/lisp-mode-tests.el +++ b/test/lisp/emacs-lisp/lisp-mode-tests.el @@ -31,6 +31,9 @@ 1 2) 2) + (fun arg1 + + arg2) (1 \"string noindent\" (\"string2 @@ -58,7 +61,7 @@ (save-excursion (let ((n 0)) (while (not (eobp)) - (unless (looking-at "noindent") + (unless (looking-at "noindent\\|^[[:blank:]]*$") (insert (make-string n ?\s))) (cl-incf n) (forward-line)))) -- 2.11.1 --=-=-=--