From debbugs-submit-bounces@debbugs.gnu.org Fri Mar 11 10:12:55 2016 Received: (at submit) by debbugs.gnu.org; 11 Mar 2016 15:12:55 +0000 Received: from localhost ([127.0.0.1]:45261 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeOkJ-0005y9-AO for submit@debbugs.gnu.org; Fri, 11 Mar 2016 10:12:55 -0500 Received: from eggs.gnu.org ([208.118.235.92]:33628) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeOkI-0005xx-1t for submit@debbugs.gnu.org; Fri, 11 Mar 2016 10:12:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aeOk9-000179-2N for submit@debbugs.gnu.org; Fri, 11 Mar 2016 10:12:48 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:55196) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aeOk8-000175-VZ for submit@debbugs.gnu.org; Fri, 11 Mar 2016 10:12:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52811) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aeOk3-0007Tn-CB for bug-gnu-emacs@gnu.org; Fri, 11 Mar 2016 10:12:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aeOk0-00015w-5m for bug-gnu-emacs@gnu.org; Fri, 11 Mar 2016 10:12:39 -0500 Received: from mail.muc.de ([193.149.48.3]:58568) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aeOjz-00015g-Lx for bug-gnu-emacs@gnu.org; Fri, 11 Mar 2016 10:12:36 -0500 Received: (qmail 9489 invoked by uid 3782); 11 Mar 2016 15:12:33 -0000 Received: from acm.muc.de (p579E8E6B.dip0.t-ipconnect.de [87.158.142.107]) by colin.muc.de (tmda-ofmipd) with ESMTP; Fri, 11 Mar 2016 16:12:32 +0100 Received: (qmail 4653 invoked by uid 1000); 11 Mar 2016 15:15:12 -0000 Date: Fri, 11 Mar 2016 15:15:12 +0000 To: bug-gnu-emacs@gnu.org Subject: syntax-ppss returns wrong result. Message-ID: <20160311151512.GD2888@acm.fritz.box> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-detected-operating-system: by eggs.gnu.org: FreeBSD 9.x X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -4.4 (----) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -4.4 (----) Hello, Emacs. The fundamental contract in syntax-ppss is that (syntax-ppss POS) returns the same value as (parse-partial-sexp (point-min) POS) (with the exception of elements 2 and 6). This is currently not always the case. In the master branch, emacs -Q and visit xdisp.c with C-x C-f. Follow this recipe: M-: (syntax-ppss-flush-cache 1) M-: (setq ppss-0 (syntax-ppss 40000)) M-< C-s #include " M-> C-x n n M-: (setq ppss-1 (syntax-ppss 40000)) M-: (setq parse (parse-partial-sexp (point-min) 40000)) At this point, `ppss-1' and `parse' should match (apart from elements 2 and 6). What we actually have is: ppss-1: (2 39992 nil nil nil nil 2 nil nil (39975 39992)) parse: (0 nil 15674 34 nil nil 0 nil 15675 nil) . -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Fri Mar 11 15:31:59 2016 Received: (at 22983) by debbugs.gnu.org; 11 Mar 2016 20:31:59 +0000 Received: from localhost ([127.0.0.1]:45469 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeTj5-0006h4-8t for submit@debbugs.gnu.org; Fri, 11 Mar 2016 15:31:59 -0500 Received: from mail-wm0-f42.google.com ([74.125.82.42]:37394) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeTj3-0006gm-UK for 22983@debbugs.gnu.org; Fri, 11 Mar 2016 15:31:58 -0500 Received: by mail-wm0-f42.google.com with SMTP id p65so31787101wmp.0 for <22983@debbugs.gnu.org>; Fri, 11 Mar 2016 12:31:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=U1X4wY/XLwr/yGNYf1kJ+ecyLkyF2zNmWq7bXOHQwZU=; b=Ag1G6iMwD/M//qP6vS1Y0HJKITkMaIaUxaoqyeuBbIKjlgY51A33hxKCGUPkY9FmWi ijyIEPsgJNEP+JmiJXPcyyeKoUtlSaF3KaqviLnxI4qP9AQj9+CQk2niT9dGVWsbE3x+ O475V2OPJiE20e/pnmQe1mp7JUIbFt+V87854krik2CQQxtUXM1CVibHEgpOwYszJGsR hbB/V5LQjb0VFFAH+6dLr2aSmoj60JOcWNbQkYJ89JgfwO+MqDWxksoZP9VSrZlmPhEp G4Cn13F7yhHrpQQYjVxop3CCJxc+28ByqF2JgMnrcFiSDbJEeVxvrtF2PtiCY7MVjN9U +7Ow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=U1X4wY/XLwr/yGNYf1kJ+ecyLkyF2zNmWq7bXOHQwZU=; b=aUxL0AeXYsMB7GbG5nuLMPx6nDeyPQWKdB/Wcr3jlN6db9++8TC6Pqkjt7OlIC+Zu+ fAQ8MOzbRyhK9BrPcDyhqkcKQrc5bboyuGCFokZIwh9nYxSQIdfCPQJ8xS1nAgMda0hU o9x5JMStwJYCSOX+d5wgZ/9GRcU/xepX+oOfAgZ1+6lW1BocCQT/gPuvcddYt25Z1jcq 171vxGMbj+Kxm+ckvcedIP/9m/rqOVxrtRjV3YAthb2P2U89Y9fHckusoH3zcsMS1+na 9QhvMntHUnJwNzzv+nPGCM0tURjBsiJ+iCv6bZrAq9bX4C/1WMF1XZKZQ/CBAZRR2aUW qmNQ== X-Gm-Message-State: AD7BkJJrJ7vAUhcPwX67VCJ67Hn4dbKdV3k7V7MetpvUyUx9a/8vvzsQbh7mO1VRT3FmPw== X-Received: by 10.28.186.214 with SMTP id k205mr5003259wmf.23.1457728312180; Fri, 11 Mar 2016 12:31:52 -0800 (PST) Received: from [192.168.1.2] ([185.105.175.24]) by smtp.googlemail.com with ESMTPSA id v2sm3860915wmd.24.2016.03.11.12.31.51 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 11 Mar 2016 12:31:51 -0800 (PST) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie , 22983@debbugs.gnu.org References: <20160311151512.GD2888@acm.fritz.box> From: Dmitry Gutov Message-ID: Date: Fri, 11 Mar 2016 22:31:50 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <20160311151512.GD2888@acm.fritz.box> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.5 (/) X-Debbugs-Envelope-To: 22983 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 03/11/2016 05:15 PM, Alan Mackenzie wrote: > At this point, `ppss-1' and `parse' should match (apart from elements 2 > and 6). What we actually have is: > > ppss-1: (2 39992 nil nil nil nil 2 nil nil (39975 39992)) > parse: (0 nil 15674 34 nil nil 0 nil 15675 nil) I think you mean that ppss-0 and ppss-1 must match independent of narrowing, and also match (parse-partial-sexp 1 40000). Considering narrowing can change point-min arbitrarily, specifying (syntax-ppss pos) as (parse-partial-sexp (point-min) pos) is a losing proposition if you want consistency. Alas, we have some code out there that implements multiple-major-mode functionality using narrowing and some hacking of syntax-ppss-last syntax-ppss-cache values. Changing syntax-ppss to be independent of narrowing will break it, and we'll need to provide some alternative first. We could introduce a syntax-ppss-dont-widen variable, though. Similar to font-lock-dont-widen. From debbugs-submit-bounces@debbugs.gnu.org Fri Mar 11 16:21:34 2016 Received: (at 22983) by debbugs.gnu.org; 11 Mar 2016 21:21:34 +0000 Received: from localhost ([127.0.0.1]:45521 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeUV4-0007zu-Bm for submit@debbugs.gnu.org; Fri, 11 Mar 2016 16:21:34 -0500 Received: from mail.muc.de ([193.149.48.3]:57800) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeUV2-0007zl-ID for 22983@debbugs.gnu.org; Fri, 11 Mar 2016 16:21:33 -0500 Received: (qmail 3781 invoked by uid 3782); 11 Mar 2016 21:21:31 -0000 Received: from acm.muc.de (p579E8E6B.dip0.t-ipconnect.de [87.158.142.107]) by colin.muc.de (tmda-ofmipd) with ESMTP; Fri, 11 Mar 2016 22:21:30 +0100 Received: (qmail 6723 invoked by uid 1000); 11 Mar 2016 21:24:10 -0000 Date: Fri, 11 Mar 2016 21:24:10 +0000 To: Dmitry Gutov Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20160311212410.GG2888@acm.fritz.box> References: <20160311151512.GD2888@acm.fritz.box> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry. On Fri, Mar 11, 2016 at 10:31:50PM +0200, Dmitry Gutov wrote: > On 03/11/2016 05:15 PM, Alan Mackenzie wrote: > > At this point, `ppss-1' and `parse' should match (apart from elements 2 > > and 6). What we actually have is: > > ppss-1: (2 39992 nil nil nil nil 2 nil nil (39975 39992)) > > parse: (0 nil 15674 34 nil nil 0 nil 15675 nil) > I think you mean that ppss-0 and ppss-1 must match independent of > narrowing, and also match (parse-partial-sexp 1 40000). Er no, I meant what I wrote: the result of (syntax-ppss pos) must match that of (parse-partial-sexp (point-min) pos). I think ppss-0 and ppss-1 did actually match (but I can't quite remember). > Considering narrowing can change point-min arbitrarily, specifying > (syntax-ppss pos) as (parse-partial-sexp (point-min) pos) is a losing > proposition if you want consistency. Indeed. But that is how syntax-ppss is specified, and (partially) how it is implemented. > Alas, we have some code out there that implements multiple-major-mode > functionality using narrowing and some hacking of syntax-ppss-last > syntax-ppss-cache values. > Changing syntax-ppss to be independent of narrowing will break it, and > we'll need to provide some alternative first. syntax-ppss is broken, and can't be fixed. The only sensible fix would be to specify that (syntax-ppss pos) is the same as (parse-partial-sexp 1 pos). But that is then a totally different function, and there are around 200 uses in the Emacs sources to check and fix, to say nothing of external code. > We could introduce a syntax-ppss-dont-widen variable, though. Similar to > font-lock-dont-widen. I'm trying to figure that out. Wouldn't that still leave you with problems when point-min is inside a string? -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Fri Mar 11 16:35:18 2016 Received: (at 22983) by debbugs.gnu.org; 11 Mar 2016 21:35:18 +0000 Received: from localhost ([127.0.0.1]:45529 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeUiL-0008Ji-TX for submit@debbugs.gnu.org; Fri, 11 Mar 2016 16:35:18 -0500 Received: from mail-wm0-f41.google.com ([74.125.82.41]:34109) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeUiK-0008JV-RE for 22983@debbugs.gnu.org; Fri, 11 Mar 2016 16:35:17 -0500 Received: by mail-wm0-f41.google.com with SMTP id p65so33715393wmp.1 for <22983@debbugs.gnu.org>; Fri, 11 Mar 2016 13:35:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=aIoibPXfW/WZ6cPlrBuy+f++GBE0LQLbPtRxHQR8PjU=; b=ibk7dPwL3eREHjvRP+HucMp/Gn7A1m2SeYH1BeVFmgPuzwVxSXY50/8YwTa6GoRprQ cGYnWIofvxcB1eN6EshJ9Vj61dHZq/XrzConwt9CYbP8YjBlWwYi8+/pc30YQJEbwluB 8zVO+azh/bdG5WVYbFIdScVkr/UbkiUB5Pa12kF9klSHFIRpBjo9izWZjfY6wZJX2hqU mgbawp4iBHhEe2xVarKn51jGw/QJzxpoQGS5244PxrlbHTofRtzOSB2riuikUO9iBWdx 2PqvbcTxARdFy8wWnToL3H4O5MMVnEJtzm+84dMvRcnIp2XDX29YDd3qgrnmc3Eda0pw L5pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:cc:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=aIoibPXfW/WZ6cPlrBuy+f++GBE0LQLbPtRxHQR8PjU=; b=ARruz85E6gQ6EqLLk19qKsN4F+wWjkkwGYK23NzWk5nb6k0EVjq5qboo7up6IiNq1Q OR9BWdpVGboNgANTUmZznEvvGrU0iF65LLD1KDlK1eSsv3vkw/A5GpB4CQk6WCacYdbT gFhl1ZbivlNlF3R9IQjJnfN6s/Mo0Lo4olqo3p0latFEOzdKzUSgQeEP6JWEMdDCBsGl AufYrc6izqLNGn8unWsuXWVPA+1vP80TJ1VFLwsJji4DlUmMQal96jHxsPfvgNT5luvU V2gCEDpUS9jOE4r2pxriS36M5ZOaugjlQT/RkgJ9yUe64RF0i7AeLNlnY65Glvz1V+ev UtTw== X-Gm-Message-State: AD7BkJIec9thOPh7mOk6hpsjoY6uzlhs6qBvhbjlvzkYMYv+Rq8kyAB06MZbyC85xSpnMg== X-Received: by 10.28.184.148 with SMTP id i142mr5229306wmf.22.1457732111036; Fri, 11 Mar 2016 13:35:11 -0800 (PST) Received: from [192.168.1.2] ([185.105.175.24]) by smtp.googlemail.com with ESMTPSA id up6sm10251376wjc.6.2016.03.11.13.35.09 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 11 Mar 2016 13:35:10 -0800 (PST) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie References: <20160311151512.GD2888@acm.fritz.box> <20160311212410.GG2888@acm.fritz.box> From: Dmitry Gutov Message-ID: <73903215-f94b-e194-7bfe-0d6350c95769@yandex.ru> Date: Fri, 11 Mar 2016 23:35:08 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <20160311212410.GG2888@acm.fritz.box> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.5 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 03/11/2016 11:24 PM, Alan Mackenzie wrote: >> I think you mean that ppss-0 and ppss-1 must match independent of >> narrowing, and also match (parse-partial-sexp 1 40000). > > Er no, I meant what I wrote: the result of (syntax-ppss pos) must match > that of (parse-partial-sexp (point-min) pos). I think ppss-0 and ppss-1 > did actually match (but I can't quite remember). I imagine they didn't. I got the same value in all three cases, though, so your scenario could use some revising. >> Considering narrowing can change point-min arbitrarily, specifying >> (syntax-ppss pos) as (parse-partial-sexp (point-min) pos) is a losing >> proposition if you want consistency. > > Indeed. But that is how syntax-ppss is specified, and (partially) how > it is implemented. That part of specification can be rephrased. >> Alas, we have some code out there that implements multiple-major-mode >> functionality using narrowing and some hacking of syntax-ppss-last >> syntax-ppss-cache values. > >> Changing syntax-ppss to be independent of narrowing will break it, and >> we'll need to provide some alternative first. > > syntax-ppss is broken, and can't be fixed. It's used ubiquitously, so it must be working. > The only sensible fix would > be to specify that (syntax-ppss pos) is the same as (parse-partial-sexp > 1 pos). But that is then a totally different function, and there are > around 200 uses in the Emacs sources to check and fix, to say nothing of > external code. Not entirely different, no. AFAIK, these are the semantics the vast majority of its usages expect. Except the multiple-major-mode case, which we'd ideally try to accommodate, too. >> We could introduce a syntax-ppss-dont-widen variable, though. Similar to >> font-lock-dont-widen. > > I'm trying to figure that out. Wouldn't that still leave you with > problems when point-min is inside a string? syntax-ppss-dont-widen would be nil by default, it would be an escape hatch toward the current semantics, for when the caller knows how to manage narrowings, etc. From debbugs-submit-bounces@debbugs.gnu.org Fri Mar 11 17:13:03 2016 Received: (at 22983) by debbugs.gnu.org; 11 Mar 2016 22:13:03 +0000 Received: from localhost ([127.0.0.1]:45535 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeVIs-0000ld-VS for submit@debbugs.gnu.org; Fri, 11 Mar 2016 17:13:03 -0500 Received: from mail.muc.de ([193.149.48.3]:56509) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeVIr-0000lE-Ug for 22983@debbugs.gnu.org; Fri, 11 Mar 2016 17:13:02 -0500 Received: (qmail 15964 invoked by uid 3782); 11 Mar 2016 22:13:00 -0000 Received: from acm.muc.de (p579E8E6B.dip0.t-ipconnect.de [87.158.142.107]) by colin.muc.de (tmda-ofmipd) with ESMTP; Fri, 11 Mar 2016 23:12:59 +0100 Received: (qmail 6895 invoked by uid 1000); 11 Mar 2016 22:15:40 -0000 Date: Fri, 11 Mar 2016 22:15:40 +0000 To: Dmitry Gutov Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20160311221540.GH2888@acm.fritz.box> References: <20160311151512.GD2888@acm.fritz.box> <20160311212410.GG2888@acm.fritz.box> <73903215-f94b-e194-7bfe-0d6350c95769@yandex.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <73903215-f94b-e194-7bfe-0d6350c95769@yandex.ru> User-Agent: Mutt/1.5.24 (2015-08-30) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry. On Fri, Mar 11, 2016 at 11:35:08PM +0200, Dmitry Gutov wrote: > On 03/11/2016 11:24 PM, Alan Mackenzie wrote: > > Er no, I meant what I wrote: the result of (syntax-ppss pos) must match > > that of (parse-partial-sexp (point-min) pos). I think ppss-0 and ppss-1 > > did actually match (but I can't quite remember). > I imagine they didn't. I got the same value in all three cases, though, > so your scenario could use some revising. Sorry about that. > >> Considering narrowing can change point-min arbitrarily, specifying > >> (syntax-ppss pos) as (parse-partial-sexp (point-min) pos) is a losing > >> proposition if you want consistency. > > Indeed. But that is how syntax-ppss is specified, and (partially) how > > it is implemented. > That part of specification can be rephrased. It's more than the specification which needs redoing. The implementation (sometimes) returns the equivalent of (parse-partial-sexp (point-min) pos)), when point-min is not in a "safe place". > >> Alas, we have some code out there that implements multiple-major-mode > >> functionality using narrowing and some hacking of syntax-ppss-last > >> syntax-ppss-cache values. > >> Changing syntax-ppss to be independent of narrowing will break it, and > >> we'll need to provide some alternative first. > > syntax-ppss is broken, and can't be fixed. > It's used ubiquitously, so it must be working. It might well be ubiquitous, but it's broken. Consider this: syntax-ppss will return the result of a parse based at point-min. In general, the caller does not know whether point-min is in a string or not. Therefore the result is of little value, UNLESS the caller takes special action, such as widening the buffer before every call to syntax-ppss. > > The only sensible fix would be to specify that (syntax-ppss pos) is > > the same as (parse-partial-sexp 1 pos). But that is then a totally > > different function, and there are around 200 uses in the Emacs > > sources to check and fix, to say nothing of external code. > Not entirely different, no. AFAIK, these are the semantics the vast > majority of its usages expect. But it's not the semantics these .el files get. What's probably keeping them functional is the rarity with which buffers are narrowed to an "awkward" point-min. > Except the multiple-major-mode case, which we'd ideally try to > accommodate, too. How does this code handle the changeover of syntax tables at a mode boundary? > >> We could introduce a syntax-ppss-dont-widen variable, though. Similar to > >> font-lock-dont-widen. > > I'm trying to figure that out. Wouldn't that still leave you with > > problems when point-min is inside a string? > syntax-ppss-dont-widen would be nil by default, it would be an escape > hatch toward the current semantics, for when the caller knows how to > manage narrowings, etc. Ah, OK. I think I see that now. Maybe. Surely the trouble is that either ALL calls or NONE must have s-p-dont-widen set. When that flag is toggled, all the caches have to be cleared. Maybe there should be some initialisation flag in some initialisation function. Or something like that. (It's getting late!). It strikes me that the multiple major mode stuff could do with a substantially enhanced version of syntax-ppss which would smoothly handle going over a mode boundary. But I don't know how you're implementing that. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Fri Mar 11 17:38:58 2016 Received: (at 22983) by debbugs.gnu.org; 11 Mar 2016 22:38:58 +0000 Received: from localhost ([127.0.0.1]:45558 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeVhy-0001Yz-7A for submit@debbugs.gnu.org; Fri, 11 Mar 2016 17:38:58 -0500 Received: from mail-wm0-f43.google.com ([74.125.82.43]:34372) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aeVhx-0001Ym-3c for 22983@debbugs.gnu.org; Fri, 11 Mar 2016 17:38:57 -0500 Received: by mail-wm0-f43.google.com with SMTP id p65so35139575wmp.1 for <22983@debbugs.gnu.org>; Fri, 11 Mar 2016 14:38:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=O5AkkYz7AEcBoyO4eVu1fQNDNPKkpvrPxnxWp+cIBvs=; b=ODtjpkghd4X7Qrj6C0Mu0MqulPD7uqBIVj7fqjFahwIFyH8wjXicAB++PmoiNSt/js MAk1t7x0u8j42yy1YFcB7xtVAPLRoRuUgVmmJlwu9AyIm4wVcM7rcpMgRWy4mYbEcZmV 5C9ZlTPM6UK56z9mQUwWesvNfjejH+QVPNCw8KF8AyWoNMq9Z/TNrXbdd81o01U8odTC IcBW42Z8fBhZaFSkJRcnoROKqOq9rpVxSsggy+4ChWJGvnEVpLhqFKy5qTgB674vPQ87 Bb5UPuPtjTIgP/SR9jrFiELHiPk7zJO8pradySzxcMfF5q3l9K3b170p3I42ibzw0YQt pf6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:cc:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=O5AkkYz7AEcBoyO4eVu1fQNDNPKkpvrPxnxWp+cIBvs=; b=CfHaLklLUemk7V7ZW71fuRQqo6bnCnMd1A0UvDYsUtODI9yDwJMWXesXZhYxPDTOog RLxUaYr4oKWejZZV7aI3K5OYlUDww9bPOnm5RvwEc0VgQo+vPiKrUAYEKOBw+XwsGX05 o4t2DlrZElvThsdwiF2nxfFWujufHkSgYa8Az5i/0d3CtY4Lhk1Xx9V4NztcejU3CAQL WDG8BsH0ZwflnaRKMoYfmskLs7cBOrf0MjZh8JspgIuVkXil2GhbWfoY6dRMUQS2YMRB A39VjXn71CXfvsRdfHudAwbbBIspWs+UcB/a8I6utGkmZWCN/IVO13ji2NfD4ZBMaV7q BISQ== X-Gm-Message-State: AD7BkJJojMC5GR5Jw7HF80xXaL5zCZfZhHwBdTU3Vx/7m5Hd17YSOn9KtbeZ+PdfIniPEQ== X-Received: by 10.28.218.145 with SMTP id r139mr5640182wmg.52.1457735931343; Fri, 11 Mar 2016 14:38:51 -0800 (PST) Received: from [192.168.1.2] ([185.105.175.24]) by smtp.googlemail.com with ESMTPSA id hq2sm10428641wjb.3.2016.03.11.14.38.50 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 11 Mar 2016 14:38:50 -0800 (PST) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie References: <20160311151512.GD2888@acm.fritz.box> <20160311212410.GG2888@acm.fritz.box> <73903215-f94b-e194-7bfe-0d6350c95769@yandex.ru> <20160311221540.GH2888@acm.fritz.box> From: Dmitry Gutov Message-ID: <2c301ec9-041d-9172-d628-479062314b23@yandex.ru> Date: Sat, 12 Mar 2016 00:38:49 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <20160311221540.GH2888@acm.fritz.box> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.5 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 03/12/2016 12:15 AM, Alan Mackenzie wrote: >> That part of specification can be rephrased. > > It's more than the specification which needs redoing. The implementation > (sometimes) returns the equivalent of (parse-partial-sexp (point-min) > pos)), when point-min is not in a "safe place". Sure. I just meant that we shouldn't get hung up on that element of the specification. >>>> Changing syntax-ppss to be independent of narrowing will break it, and >>>> we'll need to provide some alternative first. > >>> syntax-ppss is broken, and can't be fixed. > >> It's used ubiquitously, so it must be working. > > It might well be ubiquitous, but it's broken. And yet, it can be fixed. > Consider this: syntax-ppss > will return the result of a parse based at point-min. In general, the > caller does not know whether point-min is in a string or not. Therefore > the result is of little value, UNLESS the caller takes special action, > such as widening the buffer before every call to syntax-ppss. You can say that. >> Not entirely different, no. AFAIK, these are the semantics the vast >> majority of its usages expect. > > But it's not the semantics these .el files get. What's probably keeping > them functional is the rarity with which buffers are narrowed to an > "awkward" point-min. Another thing that keeps it together, is that narrowing, as a user-level operator, is not that popular. Personally, I consider it an anti-feature. >> Except the multiple-major-mode case, which we'd ideally try to >> accommodate, too. > > How does this code handle the changeover of syntax tables at a mode > boundary? The "inner" regions start with an "empty", top-level state. This is actually fine, because these are usually small enough not to benefit from the syntax-ppss cache too much (and syntax-ppss-last still helps). The parts of the outer region following a subregion with different syntax table... rely on a few hacks, and a manual application of a `syntax-table' property when necessary. We need a better solution there, but it's probably out of scope for this discussion. >> syntax-ppss-dont-widen would be nil by default, it would be an escape >> hatch toward the current semantics, for when the caller knows how to >> manage narrowings, etc. > > Ah, OK. I think I see that now. Maybe. Surely the trouble is that > either ALL calls or NONE must have s-p-dont-widen set. Hmm, you're right. This variable still seems essential, but to be safe, mmm-mode and friends should probably also advise syntax-ppss, to always perform narrowing as appropriate. > When that flag is > toggled, all the caches have to be cleared. Maybe there should be some > initialisation flag in some initialisation function. Or something like > that. (It's getting late!). Is the syntax-ppss-dont-widen really relevant for your comment cache? It would be used only by certain major modes, and worst comes to worst, you could disable the cache in those buffers. > It strikes me that the multiple major mode stuff could do with a > substantially enhanced version of syntax-ppss which would smoothly handle > going over a mode boundary. But I don't know how you're implementing > that. So far, we're just wrapping the font-lock and indentation code, and otherwise hope for the best. From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 13 13:33:07 2016 Received: (at 22983) by debbugs.gnu.org; 13 Mar 2016 17:33:07 +0000 Received: from localhost ([127.0.0.1]:47161 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1af9t5-0000qj-HO for submit@debbugs.gnu.org; Sun, 13 Mar 2016 13:33:07 -0400 Received: from ironport2-out.teksavvy.com ([206.248.154.181]:52918) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1af9t2-0000qF-4M for 22983@debbugs.gnu.org; Sun, 13 Mar 2016 13:33:05 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0A2FgA731xV/5L/d0tcgxCEAoVVwwsEAgKBPDwRAQEBAQEBAYEKQQWDXQEBAwFWIwULCw4mEhQYDSSINwjPIwEBAQEGAQEBAR6LOoUFB4QtAQSzP4FFI4QUIoJ4AQEB X-IPAS-Result: A0A2FgA731xV/5L/d0tcgxCEAoVVwwsEAgKBPDwRAQEBAQEBAYEKQQWDXQEBAwFWIwULCw4mEhQYDSSINwjPIwEBAQEGAQEBAR6LOoUFB4QtAQSzP4FFI4QUIoJ4AQEB X-IronPort-AV: E=Sophos;i="5.13,465,1427774400"; d="scan'208";a="196110390" Received: from 75-119-255-146.dsl.teksavvy.com (HELO pastel.home) ([75.119.255.146]) by ironport2-out.teksavvy.com with ESMTP; 13 Mar 2016 13:32:58 -0400 Received: by pastel.home (Postfix, from userid 20848) id 6B1F6612AD; Sun, 13 Mar 2016 13:32:58 -0400 (EDT) From: Stefan Monnier To: Alan Mackenzie Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: References: <20160311151512.GD2888@acm.fritz.box> <20160311212410.GG2888@acm.fritz.box> Date: Sun, 13 Mar 2016 13:32:58 -0400 In-Reply-To: <20160311212410.GG2888@acm.fritz.box> (Alan Mackenzie's message of "Fri, 11 Mar 2016 21:24:10 +0000") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.3 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org, Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.3 (/) > Er no, I meant what I wrote: the result of (syntax-ppss pos) must match > that of (parse-partial-sexp (point-min) pos). That's what the docstring says, but is it the result you're looking for? Stefan From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 13 13:37:34 2016 Received: (at 22983) by debbugs.gnu.org; 13 Mar 2016 17:37:34 +0000 Received: from localhost ([127.0.0.1]:47165 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1af9xO-0000zE-2j for submit@debbugs.gnu.org; Sun, 13 Mar 2016 13:37:34 -0400 Received: from ironport2-out.teksavvy.com ([206.248.154.181]:13855) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1af9xM-0000z1-Oo for 22983@debbugs.gnu.org; Sun, 13 Mar 2016 13:37:32 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0AZIgA731xV/5L/d0tcgxCEAoVVv06DPQQCAoE8PBEBAQEBAQEBgQpBBYNdAQEDAVYjBQsLDiYSFBgNJIg3CM8jAQEBAQYBAQEBHos6hQUHhC0Fsz+BRSOEFCKCeAEBAQ X-IPAS-Result: A0AZIgA731xV/5L/d0tcgxCEAoVVv06DPQQCAoE8PBEBAQEBAQEBgQpBBYNdAQEDAVYjBQsLDiYSFBgNJIg3CM8jAQEBAQYBAQEBHos6hQUHhC0Fsz+BRSOEFCKCeAEBAQ X-IronPort-AV: E=Sophos;i="5.13,465,1427774400"; d="scan'208";a="196110856" Received: from 75-119-255-146.dsl.teksavvy.com (HELO pastel.home) ([75.119.255.146]) by ironport2-out.teksavvy.com with ESMTP; 13 Mar 2016 13:37:27 -0400 Received: by pastel.home (Postfix, from userid 20848) id 2D6AC612AD; Sun, 13 Mar 2016 13:37:27 -0400 (EDT) From: Stefan Monnier To: Dmitry Gutov Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: References: <20160311151512.GD2888@acm.fritz.box> <20160311212410.GG2888@acm.fritz.box> <73903215-f94b-e194-7bfe-0d6350c95769@yandex.ru> <20160311221540.GH2888@acm.fritz.box> <2c301ec9-041d-9172-d628-479062314b23@yandex.ru> Date: Sun, 13 Mar 2016 13:37:27 -0400 In-Reply-To: <2c301ec9-041d-9172-d628-479062314b23@yandex.ru> (Dmitry Gutov's message of "Sat, 12 Mar 2016 00:38:49 +0200") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.3 (/) X-Debbugs-Envelope-To: 22983 Cc: Alan Mackenzie , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.3 (/) >> But it's not the semantics these .el files get. What's probably keeping >> them functional is the rarity with which buffers are narrowed to an >> "awkward" point-min. > Another thing that keeps it together, is that narrowing, as a user-level > operator, is not that popular. Luckily, yes. > Personally, I consider it an anti-feature. Same here. Luckily also, as pointed out elsewhere, the semantics of it is unclear, so that in several important cases, whichever behavior we end up choosing will be both correct for some users and incorrect for others. Hence, so far, I didn't make any effort to try and "do the right thing" for user-activated narrowing, since these are just not well defined enough to even determine what is "the right thing". Stefan From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 13 14:51:05 2016 Received: (at submit) by debbugs.gnu.org; 13 Mar 2016 18:51:06 +0000 Received: from localhost ([127.0.0.1]:47170 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afB6X-0002fu-Si for submit@debbugs.gnu.org; Sun, 13 Mar 2016 14:51:05 -0400 Received: from eggs.gnu.org ([208.118.235.92]:36662) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afB6X-0002fR-3X for submit@debbugs.gnu.org; Sun, 13 Mar 2016 14:51:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1afB6Q-0000Fc-Tk for submit@debbugs.gnu.org; Sun, 13 Mar 2016 14:50:59 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:47043) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1afB6Q-0000FY-Op for submit@debbugs.gnu.org; Sun, 13 Mar 2016 14:50:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55846) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1afB6P-000710-R5 for bug-gnu-emacs@gnu.org; Sun, 13 Mar 2016 14:50:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1afB6M-0000EO-Ju for bug-gnu-emacs@gnu.org; Sun, 13 Mar 2016 14:50:57 -0400 Received: from mout.kundenserver.de ([212.227.126.130]:61500) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1afB6L-0000EF-QA for bug-gnu-emacs@gnu.org; Sun, 13 Mar 2016 14:50:54 -0400 Received: from [192.168.178.35] ([95.119.43.24]) by mrelayeu.kundenserver.de (mreue003) with ESMTPSA (Nemesis) id 0Mh8o1-1aRkzI0Pzd-00MLGJ for ; Sun, 13 Mar 2016 19:50:52 +0100 Subject: Re: bug#22983: syntax-ppss returns wrong result. To: bug-gnu-emacs@gnu.org References: <20160311151512.GD2888@acm.fritz.box> From: =?UTF-8?Q?Andreas_R=c3=b6hler?= Message-ID: <56E5B6DD.7090405@easy-emacs.de> Date: Sun, 13 Mar 2016 19:52:13 +0100 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:38.0) Gecko/20100101 Icedove/38.5.0 MIME-Version: 1.0 In-Reply-To: <20160311151512.GD2888@acm.fritz.box> Content-Type: multipart/mixed; boundary="------------080801060104010809000107" X-Provags-ID: V03:K0:4wush85KTaA83+ZzB9kcsRAnj1F/bdMdJC+9fWVquiX9ygWS0KM +2R98/ebrplu6KS94T5p9qM8mJnS+Fx6ln4XIop/eJUIpcUSYnINK6dJIDnaOvJAYIqGigx f6pUuMJ1lQMaBz3nCeui3tj+/A9utI4ujlNAU0sQBIBBK0irJ+fRHUQnU9Hc6w4CeYixvxc 7KRn5goezOc0VDihq09+Q== X-UI-Out-Filterresults: notjunk:1;V01:K0:yIrK/JVHUes=:/BjBgh8vLMrNIJnpujWcCM brScvq3WNWCoZ+mhaQnVTKnKjZP2iEmZg+GSu59eWwVBub5zYJJGLQOBkcZsIdtdkm9s5YaVj eY6TixRNtvyUUsNuLmXS2eE8ksTBo0Ue+smYlB3ANnm9dswhH5oBlc2zxmB7btUeC0tuUSE52 1YfXEi6bDIW5eFi+KAXyHCXBERQjmorJ8H/7mtZkzn7Bl287hZHwS25B7Lhq8oRl0NGSVl+S4 XXzvO+puVR0R7VxSNkqPRQMoMI5ciCQds2YIfuko574+ppu03xwRLzfhLd3Caq3Kh3oXoB6qS 4ZqK7xMAJk6jq+SE8PU1DjecIB2W+w6kN8l8DVeDqPLHhhBWpjbO6925NnnqHk+p4gFkgbpdA 70fYfBbnCHUa5iI9xzJDJoZyYiJlLSRiEyBpwPOcSdh1lzX18K7samQks5m4E+dxWjt60c6ME IGb23qfBNHinw2ZdwCjF7V6ECStb3T/Vm+IJSSYnkcQl02GLggHwLZ6FeeYIX0mFXANzLTzep /KhBKjZUgo1rzTT5TMk3BYlSyfc9Li669JVD2ytK71D+qIFHkvj0iVKWl7AbGWkqN3w9fWLXD xQKnX7cxm7fGyO444uzevFNsyldRi32EbNrPHAuIgmIqhTTqBosFTJg7wbCazSYx3T77Et3T5 bpXUtRsPaGqVmUlL6COFe7WTD9Lc9vGLtK/IgzeuDIqstdg== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" This is a multi-part message in MIME format. --------------080801060104010809000107 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit On 11.03.2016 16:15, Alan Mackenzie wrote: > Hello, Emacs. > > The fundamental contract in syntax-ppss is that (syntax-ppss POS) > returns the same value as (parse-partial-sexp (point-min) POS) (with the > exception of elements 2 and 6). This is currently not always the case. > > In the master branch, emacs -Q and visit xdisp.c with C-x C-f. Follow > this recipe: > > M-: (syntax-ppss-flush-cache 1) > M-: (setq ppss-0 (syntax-ppss 40000)) (setq ppss-0 (syntax-ppss 40000) moved point - see attachment. Should it? --------------080801060104010809000107 Content-Type: image/png; name="moves-point.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="moves-point.png" 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 70as1ty9ykUCkf4ENWqtWsQXsZ0Ek8NgfffdPbNV2ruLbTq4lqXdKLz+Z99Xl+VePm/r6mXp 4OToHdBcCdx4QiKiztNE3s/cM0LfquM/PXjjLmPG0DMohvPcWgot+Ty+QqPQpdSr642qmGha r2mfRH+ybti6QzcPjQsZp//aq/5JYc+dgNfQKW3yLBup0cvE1AYXwMqTKy0EFglLEthHIitO rCiWFnOHIeQLiWhar2lPB9zzhRf2TRVjCrzfxf+9JxCJpm2NtnRwIqLYr9fWlZc0Pnbre8Jg X+rt/Nxk775D9dOtHF2MLLCystLFxYUAAJ5QXCMihg6lmBi6eZMWLSKJhKKjacgQ028oLS3J 25tu3WpYVakoLe1ublAQ3bx5dzU5uWEoS2vCyMwkubxhOSWFOnQgdnJ5jrqIaNUqKimh5GSq qaHly1twgE5OVFt7T4q9PQUEUG0tDRp0zz8jOxXsi8jG4z4uk4WG0vLldOkSeXg0TO1vzHG1 NHhW9+7d0/QvCz0uPQTd5luOPWxn7covvHjPPIwCS55W2YJaLBx4qpq7d4K1euNJOnQTKCqZ 6oxmR5i0tK5+3v0u511Ou5P2au9Xsyuz4/Pi+3n1M/m2z0Jg4W7vLimXsKtqrTqrMkuX6+vk m3bnbuvdLrut+zHbvGEQkVtI35KUxKpcSZfnp9YW55b8fdUtuI/+n2VFRUV8fHx+fr4xpYls eXY+fFUdufYV6P9jB2Jx4DiVJhDyhWJH8c3ihr+ienV9RnnjqQYcLB3qlE38MDwuZJxaq95x bUd8XvzUnvd8DjCnMkepabhoJOWSjjYdrUWNH3OZhXkvAIaYv4r+mtR9EnuzzhBjzNcqbC1s fRx96pR1fT376v+zEFiYViAxzJ305KBnX2Rv1olhyiV/G9xJZG1r5+atkte5duml/08gsjCy wNTU1J49DT+dAAB4THF1AMLC6JdfKDycBAIaNoy2bbs78Ka+nqRSYh+QssvsOB9uc+bQ9u10 /TqpVPTxx1RRcTdrwQI6doxOnSKtls6coYMHacE/U4xwhMFNKqUPPySlkv7+m77/nubNM1zX kSP07be0ezf5+tKePbR1K+3da1RdRDRkCMXF0YkTJJHQnTsNie+8Q5s30969pFSSUkmXLtGG DcYWGBJCJ05QSgrduUPGPIvmOC7TREXR0aMkkxERJSRQefndBy8Gj6ulwbOGDx+elJQk1/Xb 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 2bNns08epk2bpj/kqbkIWxNGcy2v4+XllZuba7AcAAAAAODw2HQAZDJZo8HrYWFhpaWlWVlZ p06dysvLO3HiRFFRETtqhd3gzJkz4/5x4sSJRgV26NBh2bJl27dvHzFixL59++Li4th0f39/ 3Ve6AgICqqura2pqiGj8+PFhYWH9+/fv3r37woULL168yG5TWVlZWlr6888/9/jH8uXLVSpV QUEBx+HY2dk5OzvrZuRkGCYrK0uXm52dzY4gYnXq1Ck3N5f7A2EGW4ODl5eXbtnW1lYqlRKR VCqtrKz09/dn03k8nu7VBY4IWxNGcy2vY2NjU1dXZ7AcAAAAAODw2HwJ2MXFhf2xXCcwMNDL yys+Pj4yMnLDhg1Hjx719/fv2LGj7iVRNze3QYMGscv6L7YSUVlZ2a5du37++eeUlJSXXnrp 3Llzw4YNY7PUarVuM3aZfb3VysoqNjb22rVrFy5c2LVr17Zt2y5cuBAWFsbmLliwYPTo0fpV sDU2+uKvrnCVSsUwjP6rvSKRSH9Zpbr7hQSVSiUSiTg+HmxMa3BosmS2Rv3W0A+puQhbE0Zz La9TWVnp4uJisBwAAAAA4PDYdAC6d+9+/xD2oUOHxsTE3Lx58+jRo1988UV0dPSQIUN0t7N9 +vTp06dPo11SU1NXr1596tSpTp06LVy4cNasWY3uKSUSiUKhsLS0JKKUlBR3d3cbm7svKoSG hoaGhr755pt+fn5//PFHWFiYvb19QEBAbW2trrOhz9HRsaqqSr9wdiCNQqEoKCjo2rUrmy4S ibp06cIOmCGioKAg/YNNTk5mB9tw426NlrK0tPT29r516xa7qlKp0tLS2GFO3BGaHAZ3yxNR ampqz549TTscAAAAAGCZfwiQRkFqGaOSMbpltYxr7IqRhg8fnpSUJJfL9RPDwsJ++eWX8PBw gUAwbNiwbdu2GRxqkpKS4uTkFBUVlZKSsnz58vt/Ua6pqfnoo4+USmVycvKPP/44Z84cNj0q Kuro0aMymYyIEhISysvLdb9qv/POO5s3b967d69SqVQqlZcuXdqwYQOb1bNnz7S0tD/++EOt Vm/duvXvv//WVbRjx465c+f26dNHJBKtW7dOf+rMBQsWHDt27NSpU1qt9syZMwcPHlywYIHB JuJojfr6eqlUyo6fYZfZcT7c5syZs3379uvXr6tUqo8//riiosKYCE04KazmWp6lVCoTExNH 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 yjCMn5+ftbW1l5eXVqvVn2O+yeC5PeACm2Sui013YbdorxZxcXFp9G5JYGCgl5dXfHx8ZGTk hg0bIiMjL1261LFjx0ad/8rKShcXl7YLDAAAANrkCcCqVatKSkqSk5OHDx++fPnyzZs3c28f HBy8bNmy+9N1wzk4djxw4MCwYcOIaOjQofv372/RT6FjxoyxtrZu7m3IysrKkydPvvLKK0Qk FAr79u175coVXW5CQkKvXr3YH7xbGcYjxc7Ojs9v6BaOHTv2o48+Kigo4P6mwahRo4YPH752 7dqEhATuhmprVVVVRGRhYaFUKk+fPr18+fLXX3+dzdq6devmzZvlcnmju1794DlKfogFNtL6 i03/wm473bt3Z6f00Td06NCYmJibN28ePXr0iy++iI6OHjJkCI/H098mNTW1Z8+e9xdYUVGR lpYmFovFYnEbxg0AANAOmP8JwJEjR7799tvdu3f7+vru2bNn69ate/fu5d6lS5cuy5pisAPQ pUuX9PR0ds6ZIUOGpKWl6QZDZ2ZmRkdHJyUlEdH169ejo6MzMjIa7c7n8xctWhQXF6efmJ+f Hxsbu23btvDwcCsrK90A5Xnz5p07d27fvn0ajebQoUORkZELFy40GIZBFy9ejNZTWlrKpqtU quh7tehDvMZ75ZVX9u7dW1lZqVKpYmJivvrqq5EjR7L3ZMuWLXN1dZ06dWpqaqpSqbx27dry 5cubLGTNmjWXL18+ffo0cTYU9yFzZzWnqqoqPj4+Li5u165d77zzTlBQUGhoaHR0dE1NzbRp 03RPk1599VWZTPbHH39wB9+c1hTY5KlsUYH6TL7mm7uw28jw4cOTkpIaDSELCwv75ZdfwsPD BQLBsGHDtm3b1mj8j1KpTExMHDFixP0FRkVFDR48+P55hAAAAKDFzPsdgKysLCcnp//7v//T pXzxxRf29vZNziXfev/973+JiC2cnR3l008/ZbNWr17d6EhXrlzJZgkEgs8++4xdLikpsbCw IL3vABCRSCTy8/N7/fXX8/LydHVptdolS5YIBAIi4vP5ixcv1mq1BsPgwM5838ju3bsZhnn7 7bfvzyorK2Pa4DsAy5Yt039Le+zYscXFxbrcW7duDRo0SJc7ZcoUNl1/5ntWv379Bg0axN1Q HIfMkcVh4MCB7JZCodDHx2f69OkSiYRhmCVLlnTo0IH9zgNLq9V6eHjMnz+fO/jmmFxgc6eS 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 --------------080801060104010809000107-- From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 13 14:55:17 2016 Received: (at 22983) by debbugs.gnu.org; 13 Mar 2016 18:55:17 +0000 Received: from localhost ([127.0.0.1]:47173 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afBAb-0002lZ-Am for submit@debbugs.gnu.org; Sun, 13 Mar 2016 14:55:17 -0400 Received: from mail.muc.de ([193.149.48.3]:33462) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afBAa-0002lR-AA for 22983@debbugs.gnu.org; Sun, 13 Mar 2016 14:55:16 -0400 Received: (qmail 31897 invoked by uid 3782); 13 Mar 2016 18:55:14 -0000 Received: from acm.muc.de (p5B146B5E.dip0.t-ipconnect.de [91.20.107.94]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sun, 13 Mar 2016 19:55:13 +0100 Received: (qmail 1579 invoked by uid 1000); 13 Mar 2016 18:57:55 -0000 Date: Sun, 13 Mar 2016 18:57:55 +0000 To: Stefan Monnier Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20160313185755.GG1871@acm.fritz.box> References: <20160311151512.GD2888@acm.fritz.box> <20160311212410.GG2888@acm.fritz.box> <73903215-f94b-e194-7bfe-0d6350c95769@yandex.ru> <20160311221540.GH2888@acm.fritz.box> <2c301ec9-041d-9172-d628-479062314b23@yandex.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org, Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Stefan. On Sun, Mar 13, 2016 at 01:37:27PM -0400, Stefan Monnier wrote: > >> But it's not the semantics these .el files get. What's probably keeping > >> them functional is the rarity with which buffers are narrowed to an > >> "awkward" point-min. > > Another thing that keeps it together, is that narrowing, as a user-level > > operator, is not that popular. > Luckily, yes. I happen to use it frequently. I expect other users do, to. It's useful. > > Personally, I consider it an anti-feature. > Same here. Luckily also, as pointed out elsewhere, the semantics of it > is unclear, so that in several important cases, whichever behavior we > end up choosing will be both correct for some users and incorrect > for others. That's pure sophistry. The semantics needed are quite clear: What were strings and comments before narrowing should remain strings and comments after narrowing. Otherwise, nothing would work in such a narrowed buffer. font-locking, for example, behaves properly in a narrowed buffer. > Hence, so far, I didn't make any effort to try and "do the right thing" > for user-activated narrowing, since these are just not well defined > enough to even determine what is "the right thing". Lets define them as I said in the previous paragraph. Or can you conceive of a use case where one would want narrowing to invert strings and non-strings, leaving comments totally random? Do you have any views on how the bug should be resolved? > Stefan -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 13 14:56:19 2016 Received: (at 22983) by debbugs.gnu.org; 13 Mar 2016 18:56:19 +0000 Received: from localhost ([127.0.0.1]:47177 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afBBb-0002nD-JM for submit@debbugs.gnu.org; Sun, 13 Mar 2016 14:56:19 -0400 Received: from mail-wm0-f52.google.com ([74.125.82.52]:34853) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afBBa-0002my-9w for 22983@debbugs.gnu.org; Sun, 13 Mar 2016 14:56:18 -0400 Received: by mail-wm0-f52.google.com with SMTP id l68so80498259wml.0 for <22983@debbugs.gnu.org>; Sun, 13 Mar 2016 11:56:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=QNLzLRvLhOlXyNieXdQfd/4xP477jkgq3RIcg4awHNQ=; b=kwmskOL3Q9cWI92NQ/ZbUP60Vd42HKNHBB//7CXS47OPq7cYl+pT5tqOBI5BMEI3Td Ue18Vg1Li5W0ixEkW12l8SyqXtypi4euU9WdAeGXFHFnWEvG23bIUapNyX1SQStUiR4S 3vWXI4jQ/uhXqmptqRNW8YKPl737WHiEwQyAJnoUltM3MMbbwFrtK2nek4Td0Z0W4w32 QycUW8PiT5OGNKVcfxR1CuKtQ0BXzi3Sa7AltAscqDY/G2BcK0WKwAnUXoDEvFxFsbbE 0stmMvebaArPoWcwP2IWdimykOH1cQxUw4uFhtgiOdmQDEEC2RUjcjhIFi2LV1d7M5Ge hLdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=QNLzLRvLhOlXyNieXdQfd/4xP477jkgq3RIcg4awHNQ=; b=VpUpkWElJGSjj3wzdXLwXNlBcSSkGfKZJJ7DSVxvIIdqy05dzzdRs7KRui+1b5ERBz npdfyiQXX2QemxLZlmoIozEONdNPQtn4M0FSQepQW8SskXRWcp9dQbzrcZcTr9KXqZu0 +SF1xcrsSf7TFIaDllBsegfJ7umeoks1H9fGO4eNAPOTwRbGOzMEwwS4ZMhM/blN9nDB tdpVeqJBXZEoY4g2lNMEQixdON2Rc7ezvC47t5T2wV73CwNGq5KHwIjRQCNsPECBJy7o qEH+RXERpglRUCYWu1/YpS0CQcgEpxBBWmNOF6DCL+Hn03odXhGPF6dFYxKHjFSPtIx5 oJ9w== X-Gm-Message-State: AD7BkJKnG0bBPzZpxeqEuDNxC5MDdNvcURqC18WnC4LC6YreCXFM/XMtWmNCcDx4iHPJig== X-Received: by 10.194.189.71 with SMTP id gg7mr20734803wjc.127.1457895372395; Sun, 13 Mar 2016 11:56:12 -0700 (PDT) Received: from [192.168.1.2] ([185.105.175.24]) by smtp.googlemail.com with ESMTPSA id 77sm12706679wmp.18.2016.03.13.11.56.10 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 13 Mar 2016 11:56:11 -0700 (PDT) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: =?UTF-8?Q?Andreas_R=c3=b6hler?= , 22983@debbugs.gnu.org References: <20160311151512.GD2888@acm.fritz.box> <56E5B6DD.7090405@easy-emacs.de> From: Dmitry Gutov Message-ID: <3897a108-5542-c9cf-a84d-8b1b4f7eae06@yandex.ru> Date: Sun, 13 Mar 2016 20:56:09 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <56E5B6DD.7090405@easy-emacs.de> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Score: -0.5 (/) X-Debbugs-Envelope-To: 22983 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 03/13/2016 08:52 PM, Andreas Röhler wrote: > (setq ppss-0 (syntax-ppss 40000) > > moved point - see attachment. Should it? Yes. See the last sentence in its docstring. From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 13 20:47:59 2016 Received: (at 22983) by debbugs.gnu.org; 14 Mar 2016 00:47:59 +0000 Received: from localhost ([127.0.0.1]:47260 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afGfu-0002Vi-PC for submit@debbugs.gnu.org; Sun, 13 Mar 2016 20:47:58 -0400 Received: from mail-wm0-f52.google.com ([74.125.82.52]:38163) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afGft-0002VV-4N for 22983@debbugs.gnu.org; Sun, 13 Mar 2016 20:47:57 -0400 Received: by mail-wm0-f52.google.com with SMTP id l68so82869467wml.1 for <22983@debbugs.gnu.org>; Sun, 13 Mar 2016 17:47:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=aALpMA7WYYqrvZdaxnuRbUGmtOyNvHaaX0Earj6a9u4=; b=uOiwvmLEE5XxUcuOcgg3bVHCi6V30FKEdfg6pheQVPVAyJWMApola4O8MYAuUQpmMX kaFBHavSp4TpVLeaT33cGiSEM3tztRgyWUEa+Mgvyf1sRDNpEOXIGOvZqxbg10QrA9Ey UdEun2HVv0qm7BNCom04yZ+fYIf5mSluszimPi8EEQzqVLG83UXvRg6pL0aez+IIxrzB jZhppmmSboqxs5P1kZx84USz1yRYWsbtpOq0CnDvztOyE1+HEJJEOdw/Yrne9wLgDzxP GBus+IiM7B7EZKlpXXebS/PbzJVN+Wm5SDc+YcEvI6Q4FSNXoc0YaqXgIsnrE1ZlpWJF 8zFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:cc:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=aALpMA7WYYqrvZdaxnuRbUGmtOyNvHaaX0Earj6a9u4=; b=NjHQs55Lbbvpkxl20QNJ/p1Sbl3inH5BBB8oYmw2BFO3AA9N6mrDOV79BUK4r1C5Pl y5KAeoQhE+KrP0G8NMV3rXX40ufY5O7WeoKQpTTaKyhLYKmDPKGc34L2wYUv3taz4i4k JW4tw6omVXSMA6YL2v7hl5Lz9Tme1tVsKER1/QPb9KnXTFIqcka4/lsUuZNDtpzvmsAj 7JChFHuwUWVbpAjZ+sI2LvcBGvUzd28LCpWI2O5622EeZgTmPHRYcouRiyJW7FV9sv8o aMSZd/LwMuAc70fIbdNTcX3+SP7kRXGbxoMkhcsVZ0mJdMjJDD12bzkhGF5g/TGOJlYN 2AQA== X-Gm-Message-State: AD7BkJKae8M8ZKudL36azCMvGRJ6xZe7pLQQFsVwmgaE0ew0rN4MnG1H2+kUsfvTobu8bg== X-Received: by 10.194.115.35 with SMTP id jl3mr21074082wjb.76.1457916471466; Sun, 13 Mar 2016 17:47:51 -0700 (PDT) Received: from [192.168.1.2] ([185.105.175.24]) by smtp.googlemail.com with ESMTPSA id l135sm13747815wmb.13.2016.03.13.17.47.50 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 13 Mar 2016 17:47:50 -0700 (PDT) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie , Stefan Monnier References: <20160311151512.GD2888@acm.fritz.box> <20160311212410.GG2888@acm.fritz.box> <73903215-f94b-e194-7bfe-0d6350c95769@yandex.ru> <20160311221540.GH2888@acm.fritz.box> <2c301ec9-041d-9172-d628-479062314b23@yandex.ru> <20160313185755.GG1871@acm.fritz.box> From: Dmitry Gutov Message-ID: <90fbc488-ebb6-2d70-aecd-4f6ff39be1d2@yandex.ru> Date: Mon, 14 Mar 2016 02:47:49 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <20160313185755.GG1871@acm.fritz.box> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.5 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 03/13/2016 08:57 PM, Alan Mackenzie wrote: > I happen to use it frequently. I expect other users do, to. It's > useful. It might be, but it's not very well-designed. If you only want to hide some parts of buffer from being displayed, changing point-min and point-max, which affect quite a lot of Lisp functions, seems unnecessary. Introducing a couple of global variables that would only be read by the display code, seems like a better approach. I don't think that narrow-to-region should be a user-level function. Introducing a new function, using a different mechanism shouldn't be too hard though, if we reuse the existing binding. > What were > strings and comments before narrowing should remain strings and comments > after narrowing. Otherwise, nothing would work in such a narrowed > buffer. font-locking, for example, behaves properly in a narrowed > buffer. It behaves like we tell it to behave. If I bind font-lock-dont-widen to t, font-lock won't look beyond the narrowing. >> Hence, so far, I didn't make any effort to try and "do the right thing" >> for user-activated narrowing, since these are just not well defined >> enough to even determine what is "the right thing". > > Lets define them as I said in the previous paragraph. Or can you > conceive of a use case where one would want narrowing to invert strings > and non-strings, leaving comments totally random? At risk of inviting further confusion, yes, mmm-mode and polymode (new example!) use narrowing to persuade font-lock and indentation code that there's nothing beyond the narrowed region. We might declare such usages invalid, and that's a possible choice, but I think keeping support for them wouldn't be too hard, at least for a while. Note that if your comment cache always widens the buffer before calculating the values to save, its result might conflict with syntax-ppss in mmm-mode and polymode (right?). Leading to font-lock, indentation and certain commands behaving in different, conflicting ways. That's just conjecture at this point, of course. > Do you have any views on how the bug should be resolved? Stefan probably has another opinion, but I'd either ignore the issue of narrowing, or introduce syntax-ppss-dont-widen like proposed (and thus make syntax-ppss widen by default). Together with adding a command that would replace interactive use of narrow-to-region. From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 13 21:04:28 2016 Received: (at 22983) by debbugs.gnu.org; 14 Mar 2016 01:04:28 +0000 Received: from localhost ([127.0.0.1]:47264 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afGvs-0002sw-8H for submit@debbugs.gnu.org; Sun, 13 Mar 2016 21:04:28 -0400 Received: from aserp1040.oracle.com ([141.146.126.69]:44864) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afGvr-0002sj-2D for 22983@debbugs.gnu.org; Sun, 13 Mar 2016 21:04:27 -0400 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u2E14K1b015801 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 14 Mar 2016 01:04:21 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u2E14I7g001090 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Mon, 14 Mar 2016 01:04:19 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u2E14IXD009160; Mon, 14 Mar 2016 01:04:18 GMT MIME-Version: 1.0 Message-ID: Date: Sun, 13 Mar 2016 18:04:17 -0700 (PDT) From: Drew Adams To: Dmitry Gutov , Alan Mackenzie , Stefan Monnier Subject: RE: bug#22983: syntax-ppss returns wrong result. References: <20160311151512.GD2888@acm.fritz.box> <20160311212410.GG2888@acm.fritz.box> <73903215-f94b-e194-7bfe-0d6350c95769@yandex.ru> <20160311221540.GH2888@acm.fritz.box> <2c301ec9-041d-9172-d628-479062314b23@yandex.ru> <20160313185755.GG1871@acm.fritz.box> <90fbc488-ebb6-2d70-aecd-4f6ff39be1d2@yandex.ru> In-Reply-To: <90fbc488-ebb6-2d70-aecd-4f6ff39be1d2@yandex.ru> X-Priority: 3 X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.9 (901082) [OL 12.0.6744.5000 (x86)] Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) > > I happen to use it frequently. I expect other users do, to. It's > > useful. >=20 > It might be, but it's not very well-designed. If you only want to hide > some parts of buffer from being displayed, changing point-min and > point-max, which affect quite a lot of Lisp functions, seems unnecessary. Well, well, well. All of this is likely OT for this thread. But no - narrowing is in fact explicitly _about_ changing `point-min' and `point-max', so you can act on a particular section of a buffer. It is not only about "hid[ing] some parts of a buffer from being displayed". This is true for both interactive use and in code. > I don't think that narrow-to-region should be a user-level > function. Is this a joke? Maybe you think that because you think it is only about hiding text? > Introducing a new function, using a different mechanism > shouldn't be too hard though, if we reuse the existing binding. Please don't. Please don't even think about it. And if you really think you have something to say about it, then please bring it up in emacs-devel, not in a bug thread that is not especially related to it. > adding a command that would replace interactive use of > narrow-to-region. Ridiculous (IMHO). Add whatever commands you like, but please do not think about replacing `narrow-to-region' willy nilly. It is one of the most useful Emacs commands. From debbugs-submit-bounces@debbugs.gnu.org Sun Mar 13 21:49:35 2016 Received: (at 22983) by debbugs.gnu.org; 14 Mar 2016 01:49:35 +0000 Received: from localhost ([127.0.0.1]:47269 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afHdW-000470-SS for submit@debbugs.gnu.org; Sun, 13 Mar 2016 21:49:35 -0400 Received: from chene.dit.umontreal.ca ([132.204.246.20]:38189) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1afHdU-00046s-Qi for 22983@debbugs.gnu.org; Sun, 13 Mar 2016 21:49:33 -0400 Received: from ceviche.home (lechon.iro.umontreal.ca [132.204.27.242]) by chene.dit.umontreal.ca (8.14.1/8.14.1) with ESMTP id u2E1ntpC031503; Sun, 13 Mar 2016 21:49:56 -0400 Received: by ceviche.home (Postfix, from userid 20848) id C94B366162; Sun, 13 Mar 2016 21:49:30 -0400 (EDT) From: Stefan Monnier To: Alan Mackenzie Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: References: <20160311151512.GD2888@acm.fritz.box> <20160311212410.GG2888@acm.fritz.box> <73903215-f94b-e194-7bfe-0d6350c95769@yandex.ru> <20160311221540.GH2888@acm.fritz.box> <2c301ec9-041d-9172-d628-479062314b23@yandex.ru> <20160313185755.GG1871@acm.fritz.box> Date: Sun, 13 Mar 2016 21:49:30 -0400 In-Reply-To: <20160313185755.GG1871@acm.fritz.box> (Alan Mackenzie's message of "Sun, 13 Mar 2016 18:57:55 +0000") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-NAI-Spam-Flag: NO X-NAI-Spam-Threshold: 5 X-NAI-Spam-Score: 0 X-NAI-Spam-Rules: 1 Rules triggered RV5609=0 X-NAI-Spam-Version: 2.3.0.9418 : core <5609> : inlines <4491> : streams <1602534> : uri <2165323> X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org, Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.3 (-) > That's pure sophistry. The semantics needed are quite clear: For your use case, yes. It's quite clear *in your mind*. There are other use cases. Worse yet: Elisp doesn't generally know if the narrowing was setup by the user or by some Elisp caller up the stack. So even if we were to pretend that the use-case is clear when the narrowing is set by the user, we'd still have to figure out if that's the case. > Lets define them as I said in the previous paragraph. Or can you > conceive of a use case where one would want narrowing to invert strings > and non-strings, leaving comments totally random? There's the case where some Elisp code does (save-restriction (narrow-to-region beg end (with-syntax-table ...))) to parse a sub-part of your buffer in a different way. Of course this completely breaks syntax-ppss and friends. I need to do exactly that in sm-c-mode (when parsing the C code inside CPP directives, since those directives are marked as comments), for example and had to use (let ((syntax-propertize-function nil) (syntax-ppss-cache nil) (syntax-ppss-last nil)) ...) to deal with it. It would be easy/natural to add a binding of syntax-ppss-dont-widen in there (and/or literal-cache-dont-widen for that matter). > Do you have any views on how the bug should be resolved? Look up some past discussions of how to number lines in a narrowed buffer (same basic issue), where we discussed this. We basically need to add information about which kind of narrowing is in effect. IIRC one way suggested was to have 2 narrowing states at the same time: the current one, plus a new one which is a kind of "hard narrowing" (the current narrowing would have to be "narrower" than the "hard narrowing"), with corresponding new kind of "widen". Stefan From debbugs-submit-bounces@debbugs.gnu.org Thu Mar 17 20:49:44 2016 Received: (at 22983) by debbugs.gnu.org; 18 Mar 2016 00:49:44 +0000 Received: from localhost ([127.0.0.1]:51589 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1agibo-00045s-H7 for submit@debbugs.gnu.org; Thu, 17 Mar 2016 20:49:44 -0400 Received: from mail-wm0-f46.google.com ([74.125.82.46]:33551) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1agibm-00045d-TE for 22983@debbugs.gnu.org; Thu, 17 Mar 2016 20:49:43 -0400 Received: by mail-wm0-f46.google.com with SMTP id l68so48473712wml.0 for <22983@debbugs.gnu.org>; Thu, 17 Mar 2016 17:49:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=S94Ph3uyIPWvPW+HrHfOJJ3ky3GSzorcZRTaql/fueA=; b=LGPLAyKlxhH4c6irW8645i/SLn1GkLXwJPtCrVUsQvzWo4UBUp3+W281OnSp6OhCaH E/KJby6LM1y6VltlJVNeiHJv8XI5YS7ZlpVRi+F9Zl0AWDzHkQWUTIZQnGb5cyrSaBIp fdgnERmybcLiNpCxiZzdd1xapajRIOoldCB+Or6vyjUEvxuAphIIbf4hr49fn2d3i1qV 6p5+Q8zXbjfbuiVOily04ydrjeri8PyG9WDR0gN+iLgx01g3d9UL1/lrf5DGm3OYSY8B IXyh26ndnKRR4H0x3u867Wj7iDCEnJ7q7hks6NvRLPHOjE/mdGwWEC+WHUgO5ZvdlZ7M lmfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=S94Ph3uyIPWvPW+HrHfOJJ3ky3GSzorcZRTaql/fueA=; b=gt7Bu7F1yf0HNHM8xT9tSr44gwj0iCjPAL+7kWdEJ3zFT5/DftyxFrEHiD3pGmGghu dSbOvVhwLsZKO5VVJ+blIpTYIOihS9VmrfZBkiwdFyeD4c+S3/tH/ukEJVLior6jSgvL lCjSZoogQ72yUXtMJ3b8HAX2HRX8RiXJGCnEGbT9gRqtGo7EsOp5ZCym5sy0EG//Pnf9 nBjmoOjU+XRxkbmA9T2MWmIdlQm44pDEs0G6CVV3lPgOVwXz1UGZF8DvFmiu8Ey8c6v/ xe28Qtok7FfR0J/LIkxS3iZMLvvdhCnE3REx5LQwxtcqfRHG7KNsB8PsfDHFv9pBVy4i ZB4Q== X-Gm-Message-State: AD7BkJJyNQF1zDIdmGTdkL/lywPeCNJ0az434VJ8SLHvowGWRr5KPG3fxaWVlhHy35OyAQ== X-Received: by 10.194.81.103 with SMTP id z7mr12724892wjx.25.1458262177031; Thu, 17 Mar 2016 17:49:37 -0700 (PDT) Received: from [10.9.0.103] (nat.webazilla.com. [78.140.128.228]) by smtp.googlemail.com with ESMTPSA id jv7sm9948394wjb.36.2016.03.17.17.49.35 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 17 Mar 2016 17:49:36 -0700 (PDT) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie , 22983@debbugs.gnu.org References: <20160311151512.GD2888@acm.fritz.box> From: Dmitry Gutov Message-ID: <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> Date: Fri, 18 Mar 2016 02:49:34 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <20160311151512.GD2888@acm.fritz.box> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.5 (/) X-Debbugs-Envelope-To: 22983 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 03/11/2016 05:15 PM, Alan Mackenzie wrote: This patch should make ppss-0 and ppss-1 match: diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el index e20a210..c1b9d84 100644 --- a/lisp/emacs-lisp/syntax.el +++ b/lisp/emacs-lisp/syntax.el @@ -371,6 +371,11 @@ syntax-ppss-max-span We try to make sure that cache entries are at least this far apart from each other, to avoid keeping too much useless info.") +(defvar syntax-ppss-dont-widen nil + "If non-nil, `syntax-ppss' will work on the non-widened buffer. +The code that uses this should create local bindings for +`syntax-ppss-cache' and `syntax-ppss-last' too.") + (defvar syntax-begin-function nil "Function to move back outside of any comment/string/paren. This function should move the cursor back to some syntactically safe @@ -423,12 +428,21 @@ syntax-ppss in the returned list (counting from 0) cannot be relied upon. Point is at POS when this function returns. +IF `syntax-ppss-dont-widen' is nil, the buffer is temporarily +widened. + It is necessary to call `syntax-ppss-flush-cache' explicitly if this function is called while `before-change-functions' is temporarily let-bound, or if the buffer is modified without running the hook." ;; Default values. (unless pos (setq pos (point))) + (save-restriction + (unless syntax-ppss-dont-widen + (widen)) + (syntax-pps--at pos))) + +(defun syntax-ppss--at (pos) (syntax-propertize pos) ;; (let ((old-ppss (cdr syntax-ppss-last)) From debbugs-submit-bounces@debbugs.gnu.org Sat Mar 19 08:25:17 2016 Received: (at 22983) by debbugs.gnu.org; 19 Mar 2016 12:25:18 +0000 Received: from localhost ([127.0.0.1]:53239 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ahFwT-0001j3-OF for submit@debbugs.gnu.org; Sat, 19 Mar 2016 08:25:17 -0400 Received: from mail.muc.de ([193.149.48.3]:16365) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ahFwR-0001iu-Mo for 22983@debbugs.gnu.org; Sat, 19 Mar 2016 08:25:16 -0400 Received: (qmail 38936 invoked by uid 3782); 19 Mar 2016 12:25:14 -0000 Received: from acm.muc.de (p548A5545.dip0.t-ipconnect.de [84.138.85.69]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sat, 19 Mar 2016 13:25:13 +0100 Received: (qmail 3783 invoked by uid 1000); 19 Mar 2016 12:27:59 -0000 Date: Sat, 19 Mar 2016 12:27:59 +0000 To: Dmitry Gutov Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20160319122759.GA2644@acm.fritz.box> References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> User-Agent: Mutt/1.5.24 (2015-08-30) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry. On Fri, Mar 18, 2016 at 02:49:34AM +0200, Dmitry Gutov wrote: > On 03/11/2016 05:15 PM, Alan Mackenzie wrote: > This patch should make ppss-0 and ppss-1 match: OK, no bad thing! But seeing that the function is a new function (its specification has changed), it will need new test cases, fresh new attempts to break it. > diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el > index e20a210..c1b9d84 100644 > --- a/lisp/emacs-lisp/syntax.el > +++ b/lisp/emacs-lisp/syntax.el > @@ -371,6 +371,11 @@ syntax-ppss-max-span > We try to make sure that cache entries are at least this far apart > from each other, to avoid keeping too much useless info.") > +(defvar syntax-ppss-dont-widen nil > + "If non-nil, `syntax-ppss' will work on the non-widened buffer. > +The code that uses this should create local bindings for > +`syntax-ppss-cache' and `syntax-ppss-last' too.") > + I'm against this bit. If syntax-ppss-dont-widen is non-nil, the buffer is narrowed, and the local cache variables are correctly bound and filled, then something at a low level is going to widen the buffer (and call back_comment) without knowing to restore the global bindings for those cache variables. This could easily give the wrong result and corrupt the locally bound cache. I think the only sensible functionality for syntax-ppss is to be equivalent to (parse-partial-sexp 1 pos). Then everybody knows where they stand. Those pieces of code which actually need a ppss cache with origin other than 1 could then use a more appropriate specialized function whose cache wouldn't get mixed up with syntax-ppss's. (It could share a lot of code with syntax-ppss). > (defvar syntax-begin-function nil > "Function to move back outside of any comment/string/paren. > This function should move the cursor back to some syntactically safe > @@ -423,12 +428,21 @@ syntax-ppss > in the returned list (counting from 0) cannot be relied upon. > Point is at POS when this function returns. > +IF `syntax-ppss-dont-widen' is nil, the buffer is temporarily > +widened. > + > It is necessary to call `syntax-ppss-flush-cache' explicitly if > this function is called while `before-change-functions' is > temporarily let-bound, or if the buffer is modified without > running the hook." > ;; Default values. > (unless pos (setq pos (point))) > + (save-restriction > + (unless syntax-ppss-dont-widen > + (widen)) > + (syntax-pps--at pos))) > + > +(defun syntax-ppss--at (pos) > (syntax-propertize pos) > ;; > (let ((old-ppss (cdr syntax-ppss-last)) -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Sat Mar 19 14:47:35 2016 Received: (at 22983) by debbugs.gnu.org; 19 Mar 2016 18:47:35 +0000 Received: from localhost ([127.0.0.1]:53919 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ahLuR-0004G0-92 for submit@debbugs.gnu.org; Sat, 19 Mar 2016 14:47:35 -0400 Received: from mail-wm0-f54.google.com ([74.125.82.54]:38857) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ahLuP-0004Fm-Bc for 22983@debbugs.gnu.org; Sat, 19 Mar 2016 14:47:33 -0400 Received: by mail-wm0-f54.google.com with SMTP id l68so76927414wml.1 for <22983@debbugs.gnu.org>; Sat, 19 Mar 2016 11:47:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=+gcWRZv4SrgWWcZL3TDtjtdajK6/bBhjJF8Y+gxHRz4=; b=JKHo6F0wKZOMd0QPJx7+EOXx0GrvNzbYrxXp2CC5pLXNvlCyNtTK4qqnHfuURcQadX DEzq56RMbEK6h2iEyv88X2X8vglCFCcGaHi++vv5aVrzff2ZhsL4rYLkMk366kweh4P9 9oOfjWGKEH3QQOpvQxI9bUBlzkV2kwQd/+2cuubBdMHxjs0KpFLgFnAQ3RLjL68aRnul HWSEOO396blYbVPq2FHL6Hktz/RWLSTgXgKa3Gt0R0U9Ew/af2tJY9DDYPpbHY9UB2oS vMHL9Tu7dKB+7smTUMGyNQgZCwKbUl6JS/T7IlAeTGetrFepOfOY0OeuAKVQfBgoYj6i 4XmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:cc:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=+gcWRZv4SrgWWcZL3TDtjtdajK6/bBhjJF8Y+gxHRz4=; b=KomnbHDy8dvI2nu3adCcYakDrbZGkAhiRHg5cRba5Satq+h47eyhAdYgmj+BSH7iGe aY6mogy7gI4dGKhRxgEnHeSYsHrmyXqgwufVVLYum7n6Bclk1js6KLzVlVdAMTExRs4D 1gyHZEQGm/I9WY1Dj9Dh/oQvyDHXAQlaKBQkQfVZmM0SD1aKmbnH09xIduJg+KcKK+q1 9t5S8viTfmGt26ShIpHkIg42T12aJBvtX0pOMVxdOxwuqjOZ1Y5UB/lJZrjbanmkmfOO YwRh8MtgfAEpVr11stdjN9FkDe9HOwMl42aM4ePJ7j9S7kgdWcV2Hs2NVI+ka3f7n7rc jI4Q== X-Gm-Message-State: AD7BkJL02045QtNpYuY4TCt4suKaOJFro407LKPNRR7KNL1y8SN9KycQ3aGIgHuG51kArw== X-Received: by 10.194.171.66 with SMTP id as2mr21803604wjc.110.1458413247507; Sat, 19 Mar 2016 11:47:27 -0700 (PDT) Received: from [192.168.1.2] ([185.105.175.24]) by smtp.googlemail.com with ESMTPSA id c71sm4720399wmd.4.2016.03.19.11.47.25 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 19 Mar 2016 11:47:26 -0700 (PDT) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> From: Dmitry Gutov Message-ID: <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> Date: Sat, 19 Mar 2016 20:47:24 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <20160319122759.GA2644@acm.fritz.box> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.5 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 03/19/2016 02:27 PM, Alan Mackenzie wrote: > OK, no bad thing! Good. > But seeing that the function is a new function (its specification has > changed), it will need new test cases, fresh new attempts to break it. Sure, please go ahead. It needed new test cases even before this miraculous transformation. >> +(defvar syntax-ppss-dont-widen nil >> + "If non-nil, `syntax-ppss' will work on the non-widened buffer. >> +The code that uses this should create local bindings for >> +`syntax-ppss-cache' and `syntax-ppss-last' too.") >> + > > I'm against this bit. I'm not married to it, but at least it would provide a backward compatibility escape hatch for a while. If a new way of handling mixed modes is added and turns out to be satisfactory, we can remove this variable later. > If syntax-ppss-dont-widen is non-nil, the buffer > is narrowed, and the local cache variables are correctly bound and > filled, then something at a low level is going to widen the buffer (and > call back_comment) without knowing to restore the global bindings for > those cache variables. When and why would that happen? I do not recall that happening before. Since the "low level" is a bounded set, we should be able to make sure that the primitives do not, in fact, widen before calling syntax-ppss. I suppose some could widen afterward. > This could easily give the wrong result and > corrupt the locally bound cache. Even so, that would only affect the local cache, and as such, only the subregions, in the case of mixed-mode usage. In the general case, it would only affect the consumers of syntax-ppss that bound syntax-ppss-dont-widen, as long as they bound the cache variables as well, which we tell them to. That lowers the damage area considerably. > I think the only sensible functionality for syntax-ppss is to be > equivalent to (parse-partial-sexp 1 pos). Then everybody knows where > they stand. Those pieces of code which actually need a ppss cache with > origin other than 1 could then use a more appropriate specialized > function whose cache wouldn't get mixed up with syntax-ppss's. (It > could share a lot of code with syntax-ppss). They already use syntax-ppss. I imagine Emacs's backward compatibility policy has something to say about that. From debbugs-submit-bounces@debbugs.gnu.org Sat Mar 19 19:00:53 2016 Received: (at 22983) by debbugs.gnu.org; 19 Mar 2016 23:00:53 +0000 Received: from localhost ([127.0.0.1]:54000 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ahPrZ-0006Wi-9j for submit@debbugs.gnu.org; Sat, 19 Mar 2016 19:00:53 -0400 Received: from mail-wm0-f49.google.com ([74.125.82.49]:33496) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ahPrY-0006WW-JX for 22983@debbugs.gnu.org; Sat, 19 Mar 2016 19:00:52 -0400 Received: by mail-wm0-f49.google.com with SMTP id l68so111202271wml.0 for <22983@debbugs.gnu.org>; Sat, 19 Mar 2016 16:00:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=tyr18GbRLwJ/y1a8oyKCd4fFZq/2AFN2LXLRa19nXdc=; b=zz2mxEcgNEP5DmJ672ktnqdkPm43yheq2ehLqfhWbHG7fuxgKdD2UFft+jN5cVFC9o sSUlGwuK+GismsnCy+AYRcsYe9aILD6natRJSUe16/NtZfFGQIdlvqG6jZpYCApIWy6v FvSh9F6nISruyJTAa2JHlmoI3N48UArR6LWqJ6z+4DKofNcCeuzl6fnJwbS6ELhFzhfA ln5XwjarkM7mTp7+3WFutbfKa+1eWAhXSUYK6GH/evBmJFtR5hqXoMnuN+j37sQ9vuEC CxEC0j5fVvw1WKDCoOqEPkj4Z6RVamEl1BbpwlJZZL5GArBOzmEnF3S5OYjLpas0mLYn dNdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=tyr18GbRLwJ/y1a8oyKCd4fFZq/2AFN2LXLRa19nXdc=; b=TzJH8UqZuznOV7ovkQpUS/dGy5Ua6RcO7e59PNb0x97kSuuZ8UjefDmYSKv1DplZAW e6qTIjbyZjhvI/jS1x7IN/s1YazCjUo/psnNyuXzC4rRTNpncwx86cLkKauWPImx/q/A JnhJ+XiB3FUu0VEoPq1bGJE9QG1Gf8g/Rqce5XwsCOIutg+AFnGqgseVxf931+FOKXA6 Wo8HsGxBsu4f/+UU/zhRXij2zFvcqgZCoyIIsU/28uzGv4tkRCpLCkm3PHXaEno+UFg2 6iqBzYqjYC2qOFbIsQ2NMiH2YpsQlSpXZ8Dyt8LiJzlnTHSeQfjexAGDLIXIGD5fHuvW tJFw== X-Gm-Message-State: AD7BkJKAmopf0aW0l7erc7y2JKW93XbIQwXINY7tlZpKJwkZSzeRS6JePGjNRo1q3qQ8cQ== X-Received: by 10.28.97.10 with SMTP id v10mr1344707wmb.62.1458428446820; Sat, 19 Mar 2016 16:00:46 -0700 (PDT) Received: from localhost ([143.176.214.220]) by smtp.gmail.com with ESMTPSA id ka4sm18320239wjc.47.2016.03.19.16.00.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 19 Mar 2016 16:00:45 -0700 (PDT) From: Vitalie Spinu To: Dmitry Gutov Subject: Re: bug#22983: syntax-ppss returns wrong result. References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> Date: Sun, 20 Mar 2016 00:00:45 +0100 In-Reply-To: <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> (Dmitry Gutov's message of "Fri, 18 Mar 2016 02:49:34 +0200") Message-ID: <87zitucbtu.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.0.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 22983 Cc: Alan Mackenzie , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) Thanks for this. This is a step in right direction IMHO. One side note. `parsep-ppss` has a condition-case for args-out-of-range which could be easily optimized out. You already know that you are calling parse-partial-sexp with out of range arguments if narrowing is in place. The current error check obfuscates the logic and makes debugging harder. Would it be possible for you to have a look once you are on it? Not a big deal though. Thanks, Vitalie >> On Fri, Mar 18 2016 02:49, Dmitry Gutov wrote: > On 03/11/2016 05:15 PM, Alan Mackenzie wrote: > This patch should make ppss-0 and ppss-1 match: > diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el > index e20a210..c1b9d84 100644 > --- a/lisp/emacs-lisp/syntax.el > +++ b/lisp/emacs-lisp/syntax.el > @@ -371,6 +371,11 @@ syntax-ppss-max-span > We try to make sure that cache entries are at least this far apart > from each other, to avoid keeping too much useless info.") > +(defvar syntax-ppss-dont-widen nil > + "If non-nil, `syntax-ppss' will work on the non-widened buffer. > +The code that uses this should create local bindings for > +`syntax-ppss-cache' and `syntax-ppss-last' too.") > + > (defvar syntax-begin-function nil > "Function to move back outside of any comment/string/paren. > This function should move the cursor back to some syntactically safe > @@ -423,12 +428,21 @@ syntax-ppss > in the returned list (counting from 0) cannot be relied upon. > Point is at POS when this function returns. > +IF `syntax-ppss-dont-widen' is nil, the buffer is temporarily > +widened. > + > It is necessary to call `syntax-ppss-flush-cache' explicitly if > this function is called while `before-change-functions' is > temporarily let-bound, or if the buffer is modified without > running the hook." > ;; Default values. > (unless pos (setq pos (point))) > + (save-restriction > + (unless syntax-ppss-dont-widen > + (widen)) > + (syntax-pps--at pos))) > + > +(defun syntax-ppss--at (pos) > (syntax-propertize pos) > ;; > (let ((old-ppss (cdr syntax-ppss-last)) From debbugs-submit-bounces@debbugs.gnu.org Sat Mar 19 19:16:24 2016 Received: (at 22983) by debbugs.gnu.org; 19 Mar 2016 23:16:24 +0000 Received: from localhost ([127.0.0.1]:54004 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ahQ6a-0006rq-MJ for submit@debbugs.gnu.org; Sat, 19 Mar 2016 19:16:24 -0400 Received: from mail-wm0-f54.google.com ([74.125.82.54]:37871) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ahQ6Z-0006rf-Hb for 22983@debbugs.gnu.org; Sat, 19 Mar 2016 19:16:24 -0400 Received: by mail-wm0-f54.google.com with SMTP id p65so80948014wmp.0 for <22983@debbugs.gnu.org>; Sat, 19 Mar 2016 16:16:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=UOlZZP49qPSa37uBEmpPWH1uVjOB6A24H292ev2qXbM=; b=SXuhEpQsc5OeU9w2VgCUP9j5wBSC3pV6N1cyPVWtGTxU6INommCjVhez6TG1ABS/q4 CERmsUgji1sQd3vZmPygMDoxkkmEOeNSOwdRRumHUyqFeJfX57KV8WFeYSM6G/wuQ7VF tm3W8s2uX/S4Wc2b9N/Im+ujQ8ZjLDZlIsGvyFrT4zAIoZ2L4J6Gw/ABbwu6fghWbSEV MoEa+X1bPUBlplFLtMHGtHlnMIfk7lxqVDeoMDAtmoy9LnSmRAZIkMzAmp/rGqB0a4WW n4MCh/23jQfSlgeRgDAk0CwtCuxILTmIuE46DExx9izYW/kvbsm33wEzFjGd/KNfZea4 u40w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=UOlZZP49qPSa37uBEmpPWH1uVjOB6A24H292ev2qXbM=; b=K785F2BTzabBMjElIUQEEbz+h/joevcHj696SlsW978CM6GoolAcHM+LkO2qHaIJ2M dYuVAJGmuCALJQx+XIo5ry2ktW6XYL1hSlW8cgeKFmus5Pp+Fs/ojyDNt1QAKKJuXEqc bILD/rK5m1UzgBBqylXl2XYkQHrkxcqkuracwdbUNXLsV1IVUf3RWiykvSsjVGQjLVGR aEyRCZnsz3NAGZo0fOYjvElO5e4m/pVKI3ATiPYmHzdrRPxEa8Z/lZqDI35uySMfZuOG ra5IAq/elXhdGluL7H4Z6mB542UFllkt2KBGG4OecCpfuoPVN87sDr9eBtHSnuba0jj3 cNlQ== X-Gm-Message-State: AD7BkJJ0YfBW0smMY4WsUAVOjLIyCQsigXwgtZ4d8KLo5PhuIYXb5MOW5pnMVauCkD6Sow== X-Received: by 10.28.211.1 with SMTP id k1mr6386260wmg.93.1458429378034; Sat, 19 Mar 2016 16:16:18 -0700 (PDT) Received: from localhost ([143.176.214.220]) by smtp.gmail.com with ESMTPSA id p189sm5519737wmb.7.2016.03.19.16.16.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 19 Mar 2016 16:16:17 -0700 (PDT) From: Vitalie Spinu To: Alan Mackenzie Subject: Re: bug#22983: syntax-ppss returns wrong result. References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> Date: Sun, 20 Mar 2016 00:16:16 +0100 In-Reply-To: <20160319122759.GA2644@acm.fritz.box> (Alan Mackenzie's message of "Sat, 19 Mar 2016 12:27:59 +0000") Message-ID: <87shzmcb3z.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.0.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org, Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) >> On Sat, Mar 19 2016 12:27, Alan Mackenzie wrote: > I think the only sensible functionality for syntax-ppss is to be > equivalent to (parse-partial-sexp 1 pos). Then everybody knows where > they stand. This would not work for multi modes. Till there is a feasible way to advice parse-partial-sexp there will be no way to ensure the above contract is satisfied in multi-modes. Vitalie From debbugs-submit-bounces@debbugs.gnu.org Sat Mar 19 19:20:22 2016 Received: (at 22983) by debbugs.gnu.org; 19 Mar 2016 23:20:22 +0000 Received: from localhost ([127.0.0.1]:54008 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ahQAQ-0006xK-5M for submit@debbugs.gnu.org; Sat, 19 Mar 2016 19:20:22 -0400 Received: from mail-wm0-f48.google.com ([74.125.82.48]:38431) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ahQAO-0006x5-SC for 22983@debbugs.gnu.org; Sat, 19 Mar 2016 19:20:21 -0400 Received: by mail-wm0-f48.google.com with SMTP id l68so80959008wml.1 for <22983@debbugs.gnu.org>; Sat, 19 Mar 2016 16:20:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=FpDLQm7PBW+EuFFIbgcREsig3n7Iw/iK3Pm2qcmg6Pk=; b=S9BdT79nVWwSLI2+a/N2xNAlHrjAlIY1s0Si/1bO1Rqid0YV3VkqvzebBSjW0V668T KttbK7YM56cyAdHbYXdgJOSv9smiDz6gGbGq4PI6EgkaVcHLxkI6YI/lfQeGbSQ5OHM3 gblXq0R+9wvrExBnWv221Yb8RMONCxXRTEZYY9LY2DGObOwGYcXrylzyqu1aIL3eStEl i9Rqzxk37KXtBxIlPJBGMREh+Emstv9zz/E9SGsNjmHRVceINB74LaBkNpFz5V/FNxHG +q9/ojl6yOEOd0krrtIqmWEsfnzO8DUtmKetjHJ+bHueGJzIUywgBBntaKgVhfO+F3W/ iu+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:cc:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=FpDLQm7PBW+EuFFIbgcREsig3n7Iw/iK3Pm2qcmg6Pk=; b=LNGK+anQcNBWpk1322IAoC99qXkXyahfbJel9NW0D10ndqhRZs2Ed4FacG3XCqIX04 3iOzQDUbBd058wxmtdI03SHbKnAqDmH/k0PxCTxDHWG7fHPUKHPo0cNsYBHE3WOee7y9 sicgg5/hkDjCvaMRGVC7CiMrDBARyz65r79ZbtwTBzLNpi6+UdKtmvmBa8MjfiEWzaYC 3phtM3REh9ATtHhoG3YuFa2ecqE8bN6gM7s2quAl9FJOE06kYVRIVPnX2WsdY6s/G6bn rFN7RzewrgJeV60kL34ZM/ykuiY8GkXzTrsQbpNqEqL4S+gG8pJ27Wn+0RVa+wwfVDXG zIVA== X-Gm-Message-State: AD7BkJL8meKDaaPQFCoyEoSKo9BnDVD8RDXPR6Qbz4i/5dKZAR6PlpgZWAJj+3U3Bto9Ow== X-Received: by 10.28.93.79 with SMTP id r76mr6371349wmb.32.1458429615341; Sat, 19 Mar 2016 16:20:15 -0700 (PDT) Received: from [192.168.1.2] ([185.105.175.24]) by smtp.googlemail.com with ESMTPSA id ll9sm18377265wjc.29.2016.03.19.16.20.13 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 19 Mar 2016 16:20:14 -0700 (PDT) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: Vitalie Spinu References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <87zitucbtu.fsf@gmail.com> From: Dmitry Gutov Message-ID: Date: Sun, 20 Mar 2016 01:20:13 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <87zitucbtu.fsf@gmail.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.5 (/) X-Debbugs-Envelope-To: 22983 Cc: Alan Mackenzie , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 03/20/2016 01:00 AM, Vitalie Spinu wrote: > > Thanks for this. This is a step in right direction IMHO. > > One side note. `parsep-ppss` has a condition-case for args-out-of-range which > could be easily optimized out. You already know that you are calling > parse-partial-sexp with out of range arguments if narrowing is in place. That seems like it might make the code more complex: there are several parse-partial-sexp calls inside condition-case (for different situations with the existing cache), and we may have to add a comparison near each of them. > The > current error check obfuscates the logic and makes debugging harder. Would it be > possible for you to have a look once you are on it? Not a big deal though. I think you can still follow the execution flow with edebug, can't you? If you're debugging a problem with args-out-of-range, another option is to replace `condition-case' with `condition-case-unless-debug' and re-evaluate the definition (but restore it when you're done, otherwise the args-out-of-range handler won't fire, I think). From debbugs-submit-bounces@debbugs.gnu.org Sat Mar 26 20:52:34 2016 Received: (at 22983) by debbugs.gnu.org; 27 Mar 2016 00:52:34 +0000 Received: from localhost ([127.0.0.1]:39037 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ajywU-0006Jg-7P for submit@debbugs.gnu.org; Sat, 26 Mar 2016 20:52:34 -0400 Received: from mail-pf0-f169.google.com ([209.85.192.169]:34686) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ajywQ-0006JC-BD for 22983@debbugs.gnu.org; Sat, 26 Mar 2016 20:52:30 -0400 Received: by mail-pf0-f169.google.com with SMTP id x3so109291383pfb.1 for <22983@debbugs.gnu.org>; Sat, 26 Mar 2016 17:52:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:in-reply-to:date:message-id:references :user-agent:mime-version; bh=1p+LMOqtPsa03bDz5CFTglR2csx6A3bAeDV1zsMS3XM=; b=wO3jNcFhiMY3yoOtTxgYYv18hG6cIE92QUkO13kEykm0Oi37MnGbNk3lL8/CwfnqoL TrEG2V5mKOiA+O6Pqi33WpY9YAynmhhSXMtET58RerjFqnIlB0cVDvZU5+HLyKDnVrG8 PwnTSqQp87eNAkbhV2aFGGeu0W/H/MhjiMcnyidxqgFqUoLWMUHXU60PBrXYafALt52Z 7yohvRpDDygHwksWPZR9j60bfUaarBJnQHvUpK+ZtWJQ4X9oWy+a96pWFakwzpZMipg/ WH7Xt+7dSaHHQwS7QUb1Y8ATHyro+nfSHNmC7VFVssWQdbeFT6o8mH67SDdTFB03KAsF /fEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:in-reply-to:date:message-id :references:user-agent:mime-version; bh=1p+LMOqtPsa03bDz5CFTglR2csx6A3bAeDV1zsMS3XM=; b=Ryj+ODDQtt80JZrZqweTtxqcHxKR7bjfFxZaonSTugfwszLIpkJ//vQhxX/SksLkx5 Rr9aOKmm+ORcVvnYfCe8La/JgfSlM2ywpje5l/WWbmdnNM0JypxwEMuIMLHRUuTu0iKS BCflQ2GXwtMsCH4OWKgttrg/2WVG0d7bIgowvFwl9CL1FSEsRqklUntiw+tow2Xf5aK/ fkaNoYGLQncE/u5uFsySsh+Mf13waPC98tyJlFPazxLxIAQxUPHXr7aWx0a4R+QjoYCi kK3GW+NBntr9CMyJ0kzB1v6R+2B0G3PLJc0SdYNsWXhQXjX5bRtF8m3MRYqHIZbzjIc6 seRg== X-Gm-Message-State: AD7BkJLavr+XP/OPVhqZfkRtDJmJlrAKQxsTtuwmrZtEew8LeYVLUIbYxJ+U9N08V01q9Q== X-Received: by 10.98.75.10 with SMTP id y10mr31916005pfa.32.1459039944924; Sat, 26 Mar 2016 17:52:24 -0700 (PDT) Received: from Hermes.local (76-234-68-79.lightspeed.frokca.sbcglobal.net. [76.234.68.79]) by smtp.gmail.com with ESMTPSA id s197sm25530749pfs.62.2016.03.26.17.52.23 (version=TLS1 cipher=AES128-SHA bits=128/128); Sat, 26 Mar 2016 17:52:23 -0700 (PDT) From: John Wiegley X-Google-Original-From: "John Wiegley" Received: by Hermes.local (Postfix, from userid 501) id D67C84FB513F; Sat, 26 Mar 2016 17:52:22 -0700 (PDT) To: Dmitry Gutov Subject: Re: bug#22983: syntax-ppss returns wrong result. In-Reply-To: <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> (Dmitry Gutov's message of "Sat, 19 Mar 2016 20:47:24 +0200") Date: Sat, 26 Mar 2016 17:51:57 -0700 Message-ID: References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> User-Agent: Gnus/5.130014 (Ma Gnus v0.14) Emacs/25.0.92 (darwin) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 22983 Cc: Alan Mackenzie , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable >>>>> Dmitry Gutov writes: >> I think the only sensible functionality for syntax-ppss is to be equival= ent >> to (parse-partial-sexp 1 pos). Then everybody knows where they stand. Th= ose >> pieces of code which actually need a ppss cache with origin other than 1 >> could then use a more appropriate specialized function whose cache would= n't >> get mixed up with syntax-ppss's. (It could share a lot of code with >> syntax-ppss). > They already use syntax-ppss. I imagine Emacs's backward compatibility > policy has something to say about that. There are times when our backward compatibility policy must bend, and even break. Specifically, we have a few existing cases where incomplete code has or will be shipped in a release. The argument for doing so has often been, "So we c= an see what users think." But if we *also* say that once it is released and people start using, we can't change it, then it's a Catch-22. syntax-ppss needs more work, that seems to be fairly clear based on the vol= ume of discussion around this feature, and bugs like this one. Therefore, since= it is not solid yet I'm not willing to let existing dependencies prevent us fr= om fixing its flaws. When a feature becomes solid and true, like lexical-binding, that's when I become incredibly reticent to make any changes whatsoever -- without the convergence of all the planets and the moons. =2D-=20 John Wiegley GPG fingerprint =3D 4710 CF98 AF9B 327B B80F http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQGcBAEBCgAGBQJW9y6tAAoJEMFE2PTxn+Yw/aML/3xzCVuHnQE+Yx38AQWiXQpg u8PTW7XGk3XHW1sFrUZk//VKtLzKAwXvvWQE1Z5pdGRCzCtgpb8f+bZ1LOAt3o+j KxG4f9uWlqRdDlBbq7O1+XjGAPw1VtncJ4il205T4x9a0KczRn+FEZRMVRJBuNtW gd+2UD0w1WlrcAudsMHNin/1kj5a5SHBCBNzV8vTJpgdNg6DA/N12NExKUayBY4S eYk4A5xBZAsuEpdLZeoiTsD7BQBN3BX+U0jvGBPSEWiNe6+IXcdjixXXoeLfn4D+ R1l2gXm2Tig49ilsO572cWNoK/S4mEfRi3TLCbihEfS41/SDuTBUDkwV87Fkl4xs Y2IK3gDD4U9ypj6CP4kSx3UuABrlYEJbzPx+AcO+ARd2mBzAUY2IA2fMDIg91n4u dHsN89IQa/H01dRHL1fXBNq6OC9VSD4vU/5Kx+n5cm6Y+kzv0hIXqbavja0/UNP1 s2pAEkg0N9qsdCokEDGUKK9U85JPUIzE2x2xMcCZqg== =8MPR -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Sat Mar 26 21:14:23 2016 Received: (at 22983) by debbugs.gnu.org; 27 Mar 2016 01:14:23 +0000 Received: from localhost ([127.0.0.1]:39042 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ajzHb-0006pg-54 for submit@debbugs.gnu.org; Sat, 26 Mar 2016 21:14:23 -0400 Received: from mail-wm0-f53.google.com ([74.125.82.53]:37454) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ajzHa-0006pS-5z for 22983@debbugs.gnu.org; Sat, 26 Mar 2016 21:14:22 -0400 Received: by mail-wm0-f53.google.com with SMTP id p65so60472508wmp.0 for <22983@debbugs.gnu.org>; Sat, 26 Mar 2016 18:14:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=tkCgT1Cs/13G4LHFokkSk+hULG91PuMNQhqxPriNTeE=; b=BOKzcT6fi/afAcIvwrANOmCPzKDMuotNKIR8SJtdWiKn6iBqwIVNIXAfH/K9d8jBHt 28J2RXZDaFKMUQZoAxslxDRhsehppK03Cfqy0hXPRK/GT9bSQdocAMtqECRETnu9Nffm mAEBWdJAgp3x2/bfWpnvWlXlPv4v7c+SJaqjn1EmuMCXvMJ2IG2HrRYv8Y8IQFPAEX0S 0kVW8kBY0rerQ952DGXwtjcIrEPbcZEmymGF9FTfamNAKbdz3qtepCCxpkhh76mUpzHp vElRgCeJXctcFb2PYhLGMZCGbD+cPqaZMEH8XhHUhg4JDOfKOoX2qHlryYCRKKoM+zie 7Nwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:cc:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=tkCgT1Cs/13G4LHFokkSk+hULG91PuMNQhqxPriNTeE=; b=DIwCXaovivCRZ/I53TAwpXio3QWbVOg/ElHL0d10NFtA1t/hQxg83zQ00IgwzMhQdg DqglIpuorm357NqaXJfdkVNJ3gJRlh77auS0vc+cJKQtjKioDDtHDIvNdbXrD4Th2J0e 7z9bjGieX4lyp1zekOSWnO1SBWrthxCEKAhBsBIUgUKTfn0n7UXjkBVdJct61GjZL5pC sDH9sOw7TDuHzjJGQ/q6UNH3G86UKd6Prhcc5bhcg4qemUUIvEtKgxXfZ3OP1xsrG6Rm 0Vuu8dxKL/2sWDhUhsLIfhy7oYTKadNm0JUb9o4dgqA18OGTcwEBSgPifkeKckWaaKrW ZJhA== X-Gm-Message-State: AD7BkJJlYrJ7KtVRMT3hszQMnlIp8kyzbrEvIl+Sl2oOg5k9OSYO7Xs0ZT7e55pNhcp38A== X-Received: by 10.28.214.11 with SMTP id n11mr3565651wmg.31.1459041256685; Sat, 26 Mar 2016 18:14:16 -0700 (PDT) Received: from [192.168.1.2] ([185.105.175.24]) by smtp.googlemail.com with ESMTPSA id y62sm3640968wmg.12.2016.03.26.18.14.15 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 26 Mar 2016 18:14:15 -0700 (PDT) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: John Wiegley References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> From: Dmitry Gutov Message-ID: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> Date: Sun, 27 Mar 2016 04:14:14 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.5 (/) X-Debbugs-Envelope-To: 22983 Cc: Alan Mackenzie , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 03/27/2016 02:51 AM, John Wiegley wrote: > syntax-ppss needs more work, that seems to be fairly clear based on the volume > of discussion around this feature, and bugs like this one. Bugs, plural? Alan has filed just one so far, and I've posted the trivial patch. > Therefore, since it > is not solid yet I'm not willing to let existing dependencies prevent us from > fixing its flaws. The aforementioned patch both fixes the bug and allows syntax-ppss to continue to be used in the fashion I've mentioned previously. The question that's holding it, as far as I'm concerned, if whether the "hard narrowing" discussion reaches a satisfying conclusion. If it does, we won't really need syntax-ppss-dont-widen. > When a feature becomes solid and true, like lexical-binding, that's when I > become incredibly reticent to make any changes whatsoever -- without the > convergence of all the planets and the moons. I've never said anything about avoiding making changes to it. But when we do that, we usually try to accommodate the existing uses (the importance of which depends on how many uses there are out there). From debbugs-submit-bounces@debbugs.gnu.org Sun Apr 03 18:58:56 2016 Received: (at 22983) by debbugs.gnu.org; 3 Apr 2016 22:58:56 +0000 Received: from localhost ([127.0.0.1]:50401 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1amqyu-0004Xp-9q for submit@debbugs.gnu.org; Sun, 03 Apr 2016 18:58:56 -0400 Received: from mail-oi0-f45.google.com ([209.85.218.45]:33965) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1amqys-0004XW-Uc for 22983@debbugs.gnu.org; Sun, 03 Apr 2016 18:58:55 -0400 Received: by mail-oi0-f45.google.com with SMTP id s79so46238218oie.1 for <22983@debbugs.gnu.org>; Sun, 03 Apr 2016 15:58:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:in-reply-to:date:message-id:references :user-agent:mime-version; bh=qO+mBwwEV9In7Jq8zllkr10Q9wupU53pVGAi4Kn+Ogc=; b=urNLOfUFZzqmfCWb8ufq7ijGcvD4iJeFzjob+Cb+jVHdYMQnSWB0yuCTb8bl91fJ1Y e3Lgvk5mZXAHG1frgFRGC7vjoJ+Fj6DTzb9c62GoiyI1OVZYJhJIpQzbH8mOnJsz44E1 5Y8EMjZU20jc/XdlR5Fx6maXQp9cbbokSJEjT0PsyPQuL0sytLRFPP8Jlqkdq6J9ZJGQ YFrX0GklNRv+aPPw6Adg5iy6mGtMQrmb9KNp/tYqFFLgJ+yov4/kEF+q1S6ahzkekDUe VN1ijP0PiaFQz4UimRzVDNVtsd9icD5bEoeS8uQIi33P25mO9oDxsssNmWgrj0tbVged Ih/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:in-reply-to:date:message-id :references:user-agent:mime-version; bh=qO+mBwwEV9In7Jq8zllkr10Q9wupU53pVGAi4Kn+Ogc=; b=iXk1Gvjlfru18T4LTKWiOFgJe7VrUXZxJENiApcKB0jMTp8PIZ3nHjxOYgT4uN2nwx b5YZTMwImVLcOcHnoOcOlo7K1FgVZtX6B62mtiJbZPwRCdvlowGgSXjqGJPGSWb8dRk+ NqqR6Op6wn2Mxdh42eQcbNZjFzndh0vN01uha1jwM0uxfjvk9eYM1H5m5rkBJn3CVEQn MPSICOm42dVW8sjTW/DAkjD6GWxbhQmgM1/Jd1bzcKMsDU+937aqUW1Cm6YF4hU5thEP zdY5wOlVXMTY/HidXGo/+eMke57Se9E3+LaGSlfj6ysgZwvDu5yq327bCKgNdP8RzudP y4gw== X-Gm-Message-State: AD7BkJLabPiQ5NSusY5vHESSYfqK/dMBpLhnK4D7jl0Aehn+WrM56uJv2Hz+wbjFKBy4SQ== X-Received: by 10.157.32.21 with SMTP id n21mr8457591ota.69.1459724329328; Sun, 03 Apr 2016 15:58:49 -0700 (PDT) Received: from Vulcan.local (76-234-68-79.lightspeed.frokca.sbcglobal.net. [76.234.68.79]) by smtp.gmail.com with ESMTPSA id y20sm7640520otd.32.2016.04.03.15.58.47 (version=TLS1 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 15:58:48 -0700 (PDT) From: John Wiegley X-Google-Original-From: "John Wiegley" Received: by Vulcan.local (Postfix, from userid 501) id 0050613DAE178; Sun, 3 Apr 2016 15:58:47 -0700 (PDT) To: Drew Adams Subject: Re: bug#22983: syntax-ppss returns wrong result. In-Reply-To: (Drew Adams's message of "Sun, 13 Mar 2016 18:04:17 -0700 (PDT)") Date: Sun, 03 Apr 2016 15:55:56 -0700 Message-ID: References: <20160311151512.GD2888@acm.fritz.box> <20160311212410.GG2888@acm.fritz.box> <73903215-f94b-e194-7bfe-0d6350c95769@yandex.ru> <20160311221540.GH2888@acm.fritz.box> <2c301ec9-041d-9172-d628-479062314b23@yandex.ru> <20160313185755.GG1871@acm.fritz.box> <90fbc488-ebb6-2d70-aecd-4f6ff39be1d2@yandex.ru> User-Agent: Gnus/5.130014 (Ma Gnus v0.14) Emacs/25.1.50 (darwin) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org, Alan Mackenzie , Stefan Monnier , Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) >>>>> Drew Adams writes: >> Introducing a new function, using a different mechanism shouldn't be too >> hard though, if we reuse the existing binding. > Please don't. Please don't even think about it. > And if you really think you have something to say about it, then please > bring it up in emacs-devel, not in a bug thread that is not especially > related to it. +1! -- John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 From debbugs-submit-bounces@debbugs.gnu.org Sun Apr 03 18:58:56 2016 Received: (at 22983) by debbugs.gnu.org; 3 Apr 2016 22:58:56 +0000 Received: from localhost ([127.0.0.1]:50403 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1amqyu-0004Xr-G9 for submit@debbugs.gnu.org; Sun, 03 Apr 2016 18:58:56 -0400 Received: from mail-oi0-f43.google.com ([209.85.218.43]:33971) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1amqyt-0004XX-BV for 22983@debbugs.gnu.org; Sun, 03 Apr 2016 18:58:55 -0400 Received: by mail-oi0-f43.google.com with SMTP id s79so46238372oie.1 for <22983@debbugs.gnu.org>; Sun, 03 Apr 2016 15:58:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:in-reply-to:date:message-id:references :user-agent:mime-version; bh=65HkGyGdcytjr4z9aTibd0e7SwZ+itTGtYuIwyOszsc=; b=bCG+hnaQv+QrfvZt4ntThoTrIgQ1B5bwc3H08T+uml0kMuA7Y0VW/gzUkr6UD3vXcF cK+5EHs1Gm6cUEJ57H6G40zFzh7Emlnc5Tf2NjrOXQ88Loy5ixZDwhCqnAddZeUzGfXQ OkU+TQgasyUv9eOd5Zxh1gkSMdAHKj2hSff1yvBe63vZn8WISPT7ycwl3Ydf1OP38RDV 0QrWimXUWdwlq5CXKWV3UavyvkW+6ysDKVTOjGK6ZdvKgu2cC6NlD5hcQaho15RncQ4g SUEVSE26mwsK6HQ8+wODOLn9+9ZZ3pgiZkVRdVGZE5/GDsgMIfsB1tP6ihED2vTCFR9w BDGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:in-reply-to:date:message-id :references:user-agent:mime-version; bh=65HkGyGdcytjr4z9aTibd0e7SwZ+itTGtYuIwyOszsc=; b=JOOrmaPQAmk2TrgF17OsEpFELW4uINXq1e6IrNCpVP0O1spRWbDjQM/Htn3L2XYFrr nQ3++Rsxk4cJmAiFpMYYYyFpA44o8j7icM50m0Mz0UeVzCTFVnOU4+OxBZukfXf+Bjhy BUKdEMKtMgh60UB1Q/rjHxZhZpeQtmkkHvhGxydv01M/7LN6AVkcXgqReCnQcRDACI7d m1VzatgZhHyIfmOPva6cENYHMi7IIo5S+c68zPvR6oAjw7q51OwODIb9aglCMHffFXW/ O5P5TdwhN/uI0yUYG37rOHjAJXN33DYoZZUPGFqIQ+F8KNJOLosN4ZDgFTDJDreAiHJw xZ7A== X-Gm-Message-State: AD7BkJIeu5PVgckefj/HlDX6GQFvknKQ8nhZR4CLn0fUdG0eKsA9r0MllC5R3hj+EUkDng== X-Received: by 10.157.39.110 with SMTP id r101mr5493043ota.49.1459724329951; Sun, 03 Apr 2016 15:58:49 -0700 (PDT) Received: from Vulcan.local (76-234-68-79.lightspeed.frokca.sbcglobal.net. [76.234.68.79]) by smtp.gmail.com with ESMTPSA id v102sm3185838ota.1.2016.04.03.15.58.48 (version=TLS1 cipher=AES128-SHA bits=128/128); Sun, 03 Apr 2016 15:58:48 -0700 (PDT) From: John Wiegley X-Google-Original-From: "John Wiegley" Received: by Vulcan.local (Postfix, from userid 501) id 8AA4013DAE17B; Sun, 3 Apr 2016 15:58:47 -0700 (PDT) To: Dmitry Gutov Subject: Re: bug#22983: syntax-ppss returns wrong result. In-Reply-To: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> (Dmitry Gutov's message of "Sun, 27 Mar 2016 04:14:14 +0300") Date: Sun, 03 Apr 2016 15:58:43 -0700 Message-ID: References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> User-Agent: Gnus/5.130014 (Ma Gnus v0.14) Emacs/25.1.50 (darwin) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 22983 Cc: Alan Mackenzie , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable >>>>> Dmitry Gutov writes: > The aforementioned patch both fixes the bug and allows syntax-ppss to > continue to be used in the fashion I've mentioned previously. > The question that's holding it, as far as I'm concerned, if whether the > "hard narrowing" discussion reaches a satisfying conclusion. If it does, = we > won't really need syntax-ppss-dont-widen. Have things reached a satisfactory conclusion now? It was hard for me to t= ell by the end of this thread. > I've never said anything about avoiding making changes to it. But when we= do > that, we usually try to accommodate the existing uses (the importance of > which depends on how many uses there are out there). Sure, though it's experimental nature does get taken into account. If a thi= ng is wrong, I'm not interested in accommodating existing workarounds to its wrongness. =2D-=20 John Wiegley GPG fingerprint =3D 4710 CF98 AF9B 327B B80F http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQGcBAEBCgAGBQJXAaAjAAoJEMFE2PTxn+YwAeYMAKAejmXQDkA35txd/LDKWAzj bfqdtNbpVV1skKgCjh6k2+Byi7fWNqt7/l+o5R2Mhqf20Nsf9r1iO3/blm6D6E3+ 6pmkZjqY4UCqZkTGjlfVcWVypti2FixWI6inVKy/qju76oyK7hM6OAzjS5hdIzr6 0tCocONtN3h77gcieurowT+seqR4XwkLAxLG2oSfyOhBP3zJYlhIXJrg2uEEJ+JZ ajPU7oArssZmN9hOj4edl/gMsD6dm9IYXN1Jjh6cPT96bCx2lIiFsBwfHzIQ67kc 2CoxprmY73R7lrXz48eaN4zLzTq3a+6ENwYGXV9Yp2nI7dXgN+OANymmQBBK5YcM QoPV8s75xaGAmTK/t+GC9uwH+KVAGloPvt830rueAGP4PQe0LepRb3pptJSPvAFI eKCBQ+1SY5X2X5tf+obLqBVOZpIlvJIYo91zkxXvqTL3vd5/5YorOowRk5iCkcSF BBXipZlS3dybU02VdYke1EAVLY6O4O4SMEp9tkyT5Q== =BTJK -----END PGP SIGNATURE----- --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Sun Apr 03 19:16:00 2016 Received: (at 22983) by debbugs.gnu.org; 3 Apr 2016 23:16:00 +0000 Received: from localhost ([127.0.0.1]:50412 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1amrFQ-0004xH-7r for submit@debbugs.gnu.org; Sun, 03 Apr 2016 19:16:00 -0400 Received: from mail-lf0-f46.google.com ([209.85.215.46]:34101) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1amrFO-0004x4-8H for 22983@debbugs.gnu.org; Sun, 03 Apr 2016 19:15:58 -0400 Received: by mail-lf0-f46.google.com with SMTP id c62so144742131lfc.1 for <22983@debbugs.gnu.org>; Sun, 03 Apr 2016 16:15:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=foik9aMwRXIyHRvmUHMLXC2otgwo+XTcHz0xmChqv7M=; b=fHZZrpkF4s0KS7R3+4MQegv6QTk1QKqvNKds1wLXau58XVEgIyBqHZM8OeoRSA5eUW Qtm/yxMWPB2eEzfjLJyo6eyWKU9ayt8ntQh+vgSwDSF1hLKxYOlYTMHeaaJa1AVPP43c D/2kLJywcCKK74AnPdMOm9UOIOjpth289DLKvvK5AvfDJR/PxnhK70Xzk5pwjKecMztj +Wep0Q7+98+LWiVV2tQVxGPsNxYlJ4oxwJ8vwT4wnFf5KOn4IHlYAPl/i56uRYt3k+vx rDUCgZneMCBvM2xvWxup4NyuTZoHNKoEXqP/oRHU1gULB+hExD33urDDbgZhbsPZxsQ0 b84w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:cc:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=foik9aMwRXIyHRvmUHMLXC2otgwo+XTcHz0xmChqv7M=; b=ApUwva8osiSB/kf4cU46cIbrXlgHdiSKD6MzLUjWkIPlx77rSWPwvlbI00evt5FnLj tcSyaJ1AOxJOcFMaf/9SUrTu286Ak53jf5BGJCuQI10Ou2IN3gQScnoJFVbBQzhLzYri PYTZpyONc3gaRD/xymyM6auUkhtRdBwhOl38ABwSJ1/fYh6WytpkYEYmiLeIaRCEGOhr LEBoS60+Ppm/H9WvMoqaJVZ2cgAaj9GoMYV42G1VS6HsrWPN2mE9ZPvq2/ppBjTKlKqz w9kMZUnGzmWogmu+lxRbOiBXS1a+UqnT2wVAzOpOJ845U7M8Nc/Jsjj1Zq+plgoooxfO hjLA== X-Gm-Message-State: AD7BkJIIXlFUyu+CK/0FJgQYjvLGkquAytf1Xl9SSCwovHeOVRaXMyDQX8du+9IJtMHDvg== X-Received: by 10.194.111.199 with SMTP id ik7mr15637923wjb.150.1459725352427; Sun, 03 Apr 2016 16:15:52 -0700 (PDT) Received: from [192.168.1.2] ([185.105.175.24]) by smtp.googlemail.com with ESMTPSA id 198sm10875404wml.22.2016.04.03.16.15.51 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 03 Apr 2016 16:15:51 -0700 (PDT) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: John Wiegley References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> From: Dmitry Gutov Message-ID: Date: Mon, 4 Apr 2016 02:15:50 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.5 (/) X-Debbugs-Envelope-To: 22983 Cc: Alan Mackenzie , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.5 (/) On 04/04/2016 01:58 AM, John Wiegley wrote: > Have things reached a satisfactory conclusion now? It was hard for me to tell > by the end of this thread. It's a separate discussion, see http://lists.gnu.org/archive/html/emacs-devel/2016-03/msg01576.html > Sure, though it's experimental nature does get taken into account. If a thing > is wrong, I'm not interested in accommodating existing workarounds to its > wrongness. What experimental nature? From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 28 14:44:43 2017 Received: (at control) by debbugs.gnu.org; 28 Feb 2017 19:44:43 +0000 Received: from localhost ([127.0.0.1]:60572 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cinhT-000176-Dw for submit@debbugs.gnu.org; Tue, 28 Feb 2017 14:44:43 -0500 Received: from ocolin.muc.de ([193.149.48.4]:51734 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1cinhS-00016y-2Q for control@debbugs.gnu.org; Tue, 28 Feb 2017 14:44:42 -0500 Received: (qmail 4004 invoked by uid 3782); 28 Feb 2017 19:44:40 -0000 Received: from acm.muc.de (p548C682E.dip0.t-ipconnect.de [84.140.104.46]) by colin.muc.de (tmda-ofmipd) with ESMTP; Tue, 28 Feb 2017 20:44:40 +0100 Received: (qmail 4456 invoked by uid 1000); 28 Feb 2017 19:44:15 -0000 Date: Tue, 28 Feb 2017 19:44:15 +0000 To: control@debbugs.gnu.org Subject: control message for bug 24655 Message-ID: <20170228194415.GB2248@acm> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) block 24655 by 22983 From debbugs-submit-bounces@debbugs.gnu.org Sat Sep 02 09:13:24 2017 Received: (at 22983) by debbugs.gnu.org; 2 Sep 2017 13:13:24 +0000 Received: from localhost ([127.0.0.1]:41853 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1do8Em-0002U0-Ee for submit@debbugs.gnu.org; Sat, 02 Sep 2017 09:13:24 -0400 Received: from eggs.gnu.org ([208.118.235.92]:40998) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1do8Ek-0002Tm-PM for 22983@debbugs.gnu.org; Sat, 02 Sep 2017 09:13:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1do8Ea-0008UQ-RH for 22983@debbugs.gnu.org; Sat, 02 Sep 2017 09:13:17 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=BAYES_40,RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:49101) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1do8EP-0008El-Jn; Sat, 02 Sep 2017 09:13:01 -0400 Received: from 84.94.185.246.cable.012.net.il ([84.94.185.246]:2134 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1do8EO-00077q-Px; Sat, 02 Sep 2017 09:13:01 -0400 Date: Sat, 02 Sep 2017 16:12:48 +0300 Message-Id: <83h8wlz1kf.fsf@gnu.org> From: Eli Zaretskii To: Dmitry Gutov In-reply-to: (message from Dmitry Gutov on Mon, 4 Apr 2016 02:15:50 +0300) Subject: Re: bug#22983: syntax-ppss returns wrong result. References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 22983 Cc: jwiegley@gmail.com, 22983@debbugs.gnu.org, acm@muc.de X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) unblock 24655 by 22983 thanks > From: Dmitry Gutov > Date: Mon, 4 Apr 2016 02:15:50 +0300 > Cc: Alan Mackenzie , 22983@debbugs.gnu.org > > On 04/04/2016 01:58 AM, John Wiegley wrote: > > > Have things reached a satisfactory conclusion now? It was hard for me to tell > > by the end of this thread. > > It's a separate discussion, see > http://lists.gnu.org/archive/html/emacs-devel/2016-03/msg01576.html > > > Sure, though it's experimental nature does get taken into account. If a thing > > is wrong, I'm not interested in accommodating existing workarounds to its > > wrongness. > > What experimental nature? It doesn't sound like this discussion is leading anywhere, and since almost 1.5 years has passed with no comments, I guess this bug doesn't need to block the release of Emacs 26.1, at least. Thanks. From debbugs-submit-bounces@debbugs.gnu.org Sat Sep 02 13:44:15 2017 Received: (at 22983) by debbugs.gnu.org; 2 Sep 2017 17:44:15 +0000 Received: from localhost ([127.0.0.1]:43776 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1doCSt-0003jq-JD for submit@debbugs.gnu.org; Sat, 02 Sep 2017 13:44:15 -0400 Received: from ocolin.muc.de ([193.149.48.4]:47848 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1doCSr-0003jf-2r for 22983@debbugs.gnu.org; Sat, 02 Sep 2017 13:44:13 -0400 Received: (qmail 4836 invoked by uid 3782); 2 Sep 2017 17:44:11 -0000 Received: from acm.muc.de (p548C6611.dip0.t-ipconnect.de [84.140.102.17]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sat, 02 Sep 2017 19:44:10 +0200 Received: (qmail 6721 invoked by uid 1000); 2 Sep 2017 17:40:27 -0000 Date: Sat, 2 Sep 2017 17:40:27 +0000 To: Eli Zaretskii Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170902174027.GB4267@ACM> References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <83h8wlz1kf.fsf@gnu.org> User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: jwiegley@gmail.com, 22983@debbugs.gnu.org, Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Eli. On Sat, Sep 02, 2017 at 16:12:48 +0300, Eli Zaretskii wrote: > unblock 24655 by 22983 > thanks > > From: Dmitry Gutov > > Date: Mon, 4 Apr 2016 02:15:50 +0300 > > Cc: Alan Mackenzie , 22983@debbugs.gnu.org > > On 04/04/2016 01:58 AM, John Wiegley wrote: > > > Have things reached a satisfactory conclusion now? It was hard for me to tell > > > by the end of this thread. > > It's a separate discussion, see > > http://lists.gnu.org/archive/html/emacs-devel/2016-03/msg01576.html > > > Sure, though it's experimental nature does get taken into account. If a thing > > > is wrong, I'm not interested in accommodating existing workarounds to its > > > wrongness. > > What experimental nature? > It doesn't sound like this discussion is leading anywhere, and since > almost 1.5 years has passed with no comments, I guess this bug doesn't > need to block the release of Emacs 26.1, at least. I'm not happy about this. 22983 is a serious design flaw, which has had deleterious effects deep within Emacs. One recorded example, resulting in an infinite loop, is: ######################################################################### From: Philipp Stephani To: emacs-devel@gnu.org Subject: [PATCH] Protect against an infloop in python-mode Date: Tue, 28 Feb 2017 22:31:49 +0100 There appears to be an edge case caused by using `syntax-ppss' in a narrowed buffer during JIT lock inside of Python triple-quote strings. Unfortunately it is impossible to reproduce without manually destroying the syntactic information in the Python buffer, but it has been observed in practice. In that case it can happen that the syntax caches get sufficiently out of whack so that there appear to be overlapping strings in the buffer. As Python has no nested strings, this situation is impossible and leads to an infloop in `python-nav-end-of-statement'. Protect against this by checking whether the search for the end of the current string makes progress. ######################################################################### In this case, Philipp had to apply a workaround. Seeing as how Stefan is not prepared to take responsibility for his own bugs, I suggest that I fix it, something I really don't want to spend time on. Before I do start spending time on it, I would like some assurance that my fix will not be blocked or reverted (both have happened to other things in the core I've worked on), and that I will have a reasonable amount of time to get the job done (a few weeks) before any freeze for Emacs 25.3 or 26 comes into force. > Thanks. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Sat Sep 02 13:54:31 2017 Received: (at 22983) by debbugs.gnu.org; 2 Sep 2017 17:54:31 +0000 Received: from localhost ([127.0.0.1]:43794 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1doCco-00042z-Rx for submit@debbugs.gnu.org; Sat, 02 Sep 2017 13:54:31 -0400 Received: from eggs.gnu.org ([208.118.235.92]:48270) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1doCcn-00042m-12 for 22983@debbugs.gnu.org; Sat, 02 Sep 2017 13:54:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1doCcd-0006nU-6h for 22983@debbugs.gnu.org; Sat, 02 Sep 2017 13:54:23 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:54160) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1doCcd-0006nM-39; Sat, 02 Sep 2017 13:54:19 -0400 Received: from 84.94.185.246.cable.012.net.il ([84.94.185.246]:2644 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1doCca-0000yf-C0; Sat, 02 Sep 2017 13:54:18 -0400 Date: Sat, 02 Sep 2017 20:53:39 +0300 Message-Id: <83o9qtx9zw.fsf@gnu.org> From: Eli Zaretskii To: Alan Mackenzie In-reply-to: <20170902174027.GB4267@ACM> (message from Alan Mackenzie on Sat, 2 Sep 2017 17:40:27 +0000) Subject: Re: bug#22983: syntax-ppss returns wrong result. References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 22983 Cc: jwiegley@gmail.com, 22983@debbugs.gnu.org, dgutov@yandex.ru X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) > Date: Sat, 2 Sep 2017 17:40:27 +0000 > Cc: Dmitry Gutov , jwiegley@gmail.com, 22983@debbugs.gnu.org > From: Alan Mackenzie > > > It doesn't sound like this discussion is leading anywhere, and since > > almost 1.5 years has passed with no comments, I guess this bug doesn't > > need to block the release of Emacs 26.1, at least. > > I'm not happy about this. 22983 is a serious design flaw, which has had > deleterious effects deep within Emacs. I didn't close the bug, mind you. I just removed it from the list of those blocking the impending release. You, or anyone else, are free to work on fixing it and/or discuss the various approaches to dealing with this issue. > Before I do start spending time on it, I would like some assurance > that my fix will not be blocked or reverted (both have happened to > other things in the core I've worked on) I doubt that anyone could give you such a promise without seeing the proposed changes. Especially since this and related issues, and solutions proposed for them, already have some history of being controversial. > and that I will have a reasonable amount of time to get the job done > (a few weeks) before any freeze for Emacs 25.3 or 26 comes into > force. That I can promise you. Feature freeze doesn't affect bugfixes, and Emacs 26.1 is not going to be released tomorrow or the next week. From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 04 06:25:08 2017 Received: (at 22983) by debbugs.gnu.org; 4 Sep 2017 10:25:09 +0000 Received: from localhost ([127.0.0.1]:47754 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dooZ2-0002uC-J8 for submit@debbugs.gnu.org; Mon, 04 Sep 2017 06:25:08 -0400 Received: from mail-wm0-f52.google.com ([74.125.82.52]:35939) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dooYy-0002sv-CD for 22983@debbugs.gnu.org; Mon, 04 Sep 2017 06:25:07 -0400 Received: by mail-wm0-f52.google.com with SMTP id i145so2182882wmf.1 for <22983@debbugs.gnu.org>; Mon, 04 Sep 2017 03:25:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:in-reply-to:date:message-id:references :user-agent:mime-version; bh=cE/qsduzGcdRK7/nmpRgAAiYKxyv9Z5md0HbZvWlb6o=; b=nW+mBjF//9JIaI+lSAJ0XmNrjZS3pHda6Ag3a6wqJeNqDSkJpx59xq2outp2GKKYZv PX/9kLltW0qDVT8/kGfissfYZ0s/+3/iKaPTpSh86jgUR6PGnTE3514dURXIINdWNqJN lA+0r7jjrek5sgZBuODIsl7dCQTfJU9F1bMX1zju0KI9bz1bwLLROj7ztFKL/qvSMD+h k6Zd3iF6X+365tpM6QiQbrn3KAnP7TB7VXKXmlBIe+qmZgVhP0DvzwaAtRTi2xJM5SBV BoCPkjvQMY42CzJQrWmkoCbm5akY/XW+m09XQCdsbNT1toB3tT5c/YczLXg9CbWueXvz I8Sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:in-reply-to:date:message-id :references:user-agent:mime-version; bh=cE/qsduzGcdRK7/nmpRgAAiYKxyv9Z5md0HbZvWlb6o=; b=TOxj1axCB5fceeL5xUgm2gIXDmwY7BEiA6G2IGXHOdO5OZK+0Edn0Kyq0bI30Xe19Z h26vZzOxjZUh2QjhMHGIoB7QCmyXrLfdl2pTeNFNYRcBnm+u+2EWNWNdk6h157xogsaA ZVSh6Zdb3VoWCVfXx6s5HSSVqPsWdeMbI1gMJ/3Wrf1KOF+5cJE28WnfJ3Uj2EM9dmjV cvF/41HCiNwF1CZu1n8oZ8GOH/zf5GiO2X+UCTF+DH4HuIyJNxypXi1shw75As3M5YrS jekGS3WW5tyjKjzmSjK7WT7wR+KoPQto+6k8/QKXE+TfXc/N9TY+sSLu8PkWErcD9vU9 /hDA== X-Gm-Message-State: AHPjjUiBT9sFldDD+k+TgABrvsGhle46MNHShiXsBgVYmAp8BhU5+/hu c6lNKCsNzzTzLvixNgI= X-Google-Smtp-Source: ADKCNb5Sd2NVZp3kTKVGxn01mJhscouSPUUbtGAVQREt2fquZeg1Rh01wCZxusdMaOqC5OK55m1Nwg== X-Received: by 10.28.229.206 with SMTP id c197mr3335333wmh.193.1504520698196; Mon, 04 Sep 2017 03:24:58 -0700 (PDT) Received: from Hermes.local (client-7-191.visitor-network.oxuni.org.uk. [192.76.7.191]) by smtp.gmail.com with ESMTPSA id q202sm165782wme.42.2017.09.04.03.24.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Sep 2017 03:24:55 -0700 (PDT) From: John Wiegley X-Google-Original-From: "John Wiegley" Received: by Hermes.local (Postfix, from userid 501) id 24A912EE7ADF; Sun, 3 Sep 2017 21:44:46 +0100 (BST) To: Alan Mackenzie Subject: Re: bug#22983: syntax-ppss returns wrong result. In-Reply-To: <20170902174027.GB4267@ACM> (Alan Mackenzie's message of "Sat, 2 Sep 2017 17:40:27 +0000") Date: Sun, 03 Sep 2017 21:44:44 +0100 Message-ID: References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> User-Agent: Gnus/5.130016 (Ma Gnus v0.16) Emacs/25.2.50 (darwin) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org, Eli Zaretskii , Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) >>>>> Alan Mackenzie writes: > Seeing as how Stefan is not prepared to take responsibility for his own bugs Let's not use language like this if avoidable, please. I'm certain Stefan would do so, he just may not see this issue the same way you do (which is what I recall from the extensive discussions on syntax-ppss). To characterize it as a fault is only discouraging or frustrating; it doesn't help Emacs. Thanks, -- John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 04 19:34:27 2017 Received: (at 22983) by debbugs.gnu.org; 4 Sep 2017 23:34:27 +0000 Received: from localhost ([127.0.0.1]:49621 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dp0st-00009N-B0 for submit@debbugs.gnu.org; Mon, 04 Sep 2017 19:34:27 -0400 Received: from mail-lf0-f67.google.com ([209.85.215.67]:38096) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dp0sq-00009A-P3 for 22983@debbugs.gnu.org; Mon, 04 Sep 2017 19:34:25 -0400 Received: by mail-lf0-f67.google.com with SMTP id m199so899087lfe.5 for <22983@debbugs.gnu.org>; Mon, 04 Sep 2017 16:34:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=3GYGTxqCj/J04CsDSwJkyJb+nFwyTStANzSR/7f/GQA=; b=jO0dzZcm8WA3hLwRGmspH2guMItaZwNKeHRTQU2TDW8Eiao6c5jL9jVuDNJwTqFced 1Q/CFyScwRMre17kM1cgpH+l0f/WlEmdaBYSHy7k89a9RNF9hgbh0lVe0lv6vKWzOGAd PFz0cb6rVFVe1oqGl4X8Ol6Bw4hDw6RFD/zgXxdEBsGB1uHwwFKCXHkDG9HXCmc1pXUu pP+WxJEEwePMWywzPMbGlOrQX+mqHBU/D7csb+LxuSL7SDc8uzhExtYDJzuvg1hzbLCx Dsc+sqPb1UBiudFIMzWY2kU9nE0uCGa6ozOfn7KIq90Ujtgc/kY+DhG4cXm8cV7XmiS2 NZug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=3GYGTxqCj/J04CsDSwJkyJb+nFwyTStANzSR/7f/GQA=; b=CdGTCR2XYwTVcOvQV6TPTGKsP0CySUL62rR1rRVUvV0oTauYDbVWgKF6hlCekmSFTE 55QDByTQSMUPsY/vw4hmhDSmJZ8zlNuZGCsWC08Qg29XjkobO3GTnhwwauXJH7fPxKpg OLsmxxGVcs4uL1sTQfCloTQi0Bv0vEiY/lnwSldIVBok1wWdq7I3qYmgOQwYrwdXvr9Y TzxxAIfahabcNy46Qb66OBPCxN6JYbEreELDqi48JHOppJtFIA2Lm6vuFZLY27fMh9A3 gIVHuEinAWaB2Q3CWlYD84KAGbH8/yl6FUrmgZaAvkztKK1gk3NLCd8EQQpTTRz8XKAh 0Z1g== X-Gm-Message-State: AHPjjUjYisBK0Uk1AkUiF/kN5kqJ17cZ3vAtZsc7bqfVgL8r+Kv9MqKQ /pSY1Au3RX3o2g== X-Google-Smtp-Source: ADKCNb5NmCNxQUJacxwn4rPRwEaeCyDO/bu0akbdSjzhb/ip1sff3B6nNW2qgFH91+SSs5TN5lswaA== X-Received: by 10.46.68.65 with SMTP id r62mr713411lja.136.1504568058808; Mon, 04 Sep 2017 16:34:18 -0700 (PDT) Received: from [192.168.1.174] ([178.252.127.239]) by smtp.googlemail.com with ESMTPSA id 9sm1552989ljc.68.2017.09.04.16.34.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Sep 2017 16:34:17 -0700 (PDT) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie , Eli Zaretskii References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> From: Dmitry Gutov Message-ID: Date: Tue, 5 Sep 2017 02:34:15 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: <20170902174027.GB4267@ACM> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/2/17 8:40 PM, Alan Mackenzie wrote: > I'm not happy about this. 22983 is a serious design flaw, which has had > deleterious effects deep within Emacs. I'm sure we want to fix design flaws. As long as there is a solid plan that does not swap one flaw for another. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.0 URIBL_BLOCKED ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [URIs: gnu.org] 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.67 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.67 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (raaahh[at]gmail.com) 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.67 listed in dnsbl.sorbs.net] 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: 22983 Cc: jwiegley@gmail.com, Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/2/17 8:40 PM, Alan Mackenzie wrote: > I'm not happy about this. 22983 is a serious design flaw, which has had > deleterious effects deep within Emacs. I'm sure we want to fix design flaws. As long as there is a solid plan that does not swap one flaw for another. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.0 URIBL_BLOCKED ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [URIs: gnu.org] 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.67 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.67 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.67 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders On 9/2/17 8:40 PM, Alan Mackenzie wrote: > I'm not happy about this. 22983 is a serious design flaw, which has had > deleterious effects deep within Emacs. I'm sure we want to fix design flaws. As long as there is a solid plan that does not swap one flaw for another. > One recorded example, resulting > in an infinite loop, is: > > ######################################################################### > From: Philipp Stephani > To: emacs-devel@gnu.org > Subject: [PATCH] Protect against an infloop in python-mode > Date: Tue, 28 Feb 2017 22:31:49 +0100 > > There appears to be an edge case caused by using `syntax-ppss' in a > narrowed buffer during JIT lock inside of Python triple-quote strings. > Unfortunately it is impossible to reproduce without manually > destroying the syntactic information in the Python buffer, but it has > been observed in practice. In that case it can happen that the syntax > caches get sufficiently out of whack so that there appear to be > overlapping strings in the buffer. As Python has no nested strings, > this situation is impossible and leads to an infloop in > `python-nav-end-of-statement'. Protect against this by checking > whether the search for the end of the current string makes progress. > ######################################################################### > > In this case, Philipp had to apply a workaround. The problem manifested during jit-lock. Do we understand why the (widen) call inside font-lock-default-fontify-region didn't help? From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 05 02:42:08 2017 Received: (at submit) by debbugs.gnu.org; 5 Sep 2017 06:42:08 +0000 Received: from localhost ([127.0.0.1]:50046 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dp7Yl-0001uf-GC for submit@debbugs.gnu.org; Tue, 05 Sep 2017 02:42:08 -0400 Received: from eggs.gnu.org ([208.118.235.92]:42710) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dp7Yj-0001uC-Pw for submit@debbugs.gnu.org; Tue, 05 Sep 2017 02:42:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dp7YZ-0005KO-I0 for submit@debbugs.gnu.org; Tue, 05 Sep 2017 02:42:00 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:34846) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dp7YZ-0005KE-FL for submit@debbugs.gnu.org; Tue, 05 Sep 2017 02:41:55 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33623) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dp7YU-0008FF-D5 for bug-gnu-emacs@gnu.org; Tue, 05 Sep 2017 02:41:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dp7YP-0005Aw-F8 for bug-gnu-emacs@gnu.org; Tue, 05 Sep 2017 02:41:50 -0400 Received: from mout.kundenserver.de ([217.72.192.73]:51928) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dp7YP-00059t-3U for bug-gnu-emacs@gnu.org; Tue, 05 Sep 2017 02:41:45 -0400 Received: from [192.168.178.35] ([77.12.49.67]) by mrelayeu.kundenserver.de (mreue104 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MVM1m-1dySIS0FLi-00Yjid for ; Tue, 05 Sep 2017 08:41:42 +0200 Subject: Re: bug#22983: syntax-ppss returns wrong result. To: bug-gnu-emacs@gnu.org References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> From: =?UTF-8?Q?Andreas_R=c3=b6hler?= Message-ID: Date: Tue, 5 Sep 2017 08:57:54 +0200 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/alternative; boundary="------------291CB52B0B246E4EE4F6E59A" Content-Language: en-US X-Provags-ID: V03:K0:2AE15cp5rYOCh6MHbtdyXPAQUZcmDNnfEgzp+Z8XMyQeESit7Op wWW8OGhJsZv8BGd89yqRN6JT3+yQJIlKP46ty9L0kpwHW2XuOnbsujg3qGmaD/ZoEzV31WG vqUspHfZ5b389BKAR84TIKDepr5j9nSnscixfhQXwoRAdIyZfsTh2oKFW38WBXF956rNfYe Y3Qsq+pxwTYDUeKzKK/pQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:DZUS9sHgjpw=:Vj6YqZHvG5RoWg87F6ftEu t6bpIh7V1IbEPTzoCFha0WbAIBH9PSDz5gyi55CJaU10bOsBwa8L+9KJsBMYTJffDvsgwZJdU BL4m0eP0qnmZ54dvBuQa3h1Xnd8XmdVAstuczSt/nshIaovY5C8k7tCZl0FE1iGrRPGrqYvax 4Q0Pp8gYFlCu9isPgoJqpjNN14N4l+eo8hjMcMq6LPq3MciUfU7gml8/aNqvYZxHiDTT/wQtm WDevDf/fM2ow3Y5wBLEq7KZdxY0DabS2Xy+V/xyoMHyfHQJsder3Zxs/qSnE6duVIR20ZZIV4 ISpEix1e1bQeReXfjbrJA0ScSt1VnE87krWgJ3KRyKJi0GBviuY+cq/276cFzatgcUMB2LwJE cSyf7pJbmYvT27C8rWNXi/S1+2tcDFovOQ1Rv6TBXcsutjRgTK1BtcBVxE5vAx2FhKVWzLlNl VzHzA7UmLtxp5zIqbSrnFnhUEFnsuKGC5jP7iK7oiUoG/YGkgrjHvs18JzU3Xp1SmVnUFrrrk jpPaANTwn46h46wUA84mNgw7OklKRg3PCDsgIFZGYUAid4bNoIg5oTO1CFuvAZfgRENqWVubs U1Plz6hu/XcUgxHYc8ZDpP5JSaRkcfci6w16K8/G5nJDhToHbfiikTsZpHg0I0D1eZKWIh5kz aCTqGQtqiqomPpBtqllGjzSV+VnMdIYXOCxV3kFvcYIcby4dEjir7qe8VQKnj+KuTAiv1j1tt lpzM8Xa6z3OQlLVM8gaCfzp5N5+0FDiByavQ5tEjnx5bkgxl3UXspHE3Nyk= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) This is a multi-part message in MIME format. --------------291CB52B0B246E4EE4F6E59A Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 05.09.2017 01:34, Dmitry Gutov wrote: > On 9/2/17 8:40 PM, Alan Mackenzie wrote: >> I'm not happy about this. 22983 is a serious design flaw, which has had >> deleterious effects deep within Emacs. > > I'm sure we want to fix design flaws. As long as there is a solid plan > that does not swap one flaw for another. > >> One recorded example, resulting >> in an infinite loop, is: >> >> ######################################################################### >> >> From: Philipp Stephani >> To: emacs-devel@gnu.org >> Subject: [PATCH] Protect against an infloop in python-mode >> Date: Tue, 28 Feb 2017 22:31:49 +0100 >> >> There appears to be an edge case caused by using `syntax-ppss' in a >> narrowed buffer during JIT lock inside of Python triple-quote strings. >> Unfortunately it is impossible to reproduce without manually >> destroying the syntactic information in the Python buffer, but it has >> been observed in practice. In that case it can happen that the syntax >> caches get sufficiently out of whack so that there appear to be >> overlapping strings in the buffer. As Python has no nested strings, >> this situation is impossible and leads to an infloop in >> `python-nav-end-of-statement'. Protect against this by checking >> whether the search for the end of the current string makes progress. >> ######################################################################### >> >> >> In this case, Philipp had to apply a workaround. > > The problem manifested during jit-lock. Do we understand why the > (widen) call inside font-lock-default-fontify-region didn't help? > > > IIRC its about dissolving circular dependencies notably between syntax-propertize-function and syntax-ppss. --------------291CB52B0B246E4EE4F6E59A Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit



On 05.09.2017 01:34, Dmitry Gutov wrote:
On 9/2/17 8:40 PM, Alan Mackenzie wrote:
I'm not happy about this.  22983 is a serious design flaw, which has had
deleterious effects deep within Emacs.

I'm sure we want to fix design flaws. As long as there is a solid plan that does not swap one flaw for another.

One recorded example, resulting
in an infinite loop, is:

#########################################################################
From: Philipp Stephani <p.stephani2@gmail.com>
To: emacs-devel@gnu.org
Subject: [PATCH] Protect against an infloop in python-mode
Date: Tue, 28 Feb 2017 22:31:49 +0100

There appears to be an edge case caused by using `syntax-ppss' in a
narrowed buffer during JIT lock inside of Python triple-quote strings.
Unfortunately it is impossible to reproduce without manually
destroying the syntactic information in the Python buffer, but it has
been observed in practice.  In that case it can happen that the syntax
caches get sufficiently out of whack so that there appear to be
overlapping strings in the buffer.  As Python has no nested strings,
this situation is impossible and leads to an infloop in
`python-nav-end-of-statement'.  Protect against this by checking
whether the search for the end of the current string makes progress.
#########################################################################

In this case, Philipp had to apply a workaround.

The problem manifested during jit-lock. Do we understand why the (widen) call inside font-lock-default-fontify-region didn't help?





IIRC its about dissolving circular dependencies notably between syntax-propertize-function and syntax-ppss.
--------------291CB52B0B246E4EE4F6E59A-- From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 05 08:29:04 2017 Received: (at 22983) by debbugs.gnu.org; 5 Sep 2017 12:29:04 +0000 Received: from localhost ([127.0.0.1]:50492 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dpCyW-0005JX-7S for submit@debbugs.gnu.org; Tue, 05 Sep 2017 08:29:04 -0400 Received: from mail-wr0-f180.google.com ([209.85.128.180]:33913) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dpCyV-0005J2-ET for 22983@debbugs.gnu.org; Tue, 05 Sep 2017 08:29:03 -0400 Received: by mail-wr0-f180.google.com with SMTP id a47so6684094wra.1 for <22983@debbugs.gnu.org>; Tue, 05 Sep 2017 05:29:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:in-reply-to:date:message-id:references :user-agent:mime-version; bh=8TlwJUyiZfupRhWR6YlheLtylexpdKGicubOOmKi6Pk=; b=rvNYpdZzn9flqYmiBDllF/D5b2zDGvf45uWeZvmksEARcBAr8qlnQEWsVaFWMzjUtf /RCAhdq1SkmVK3Y2ZE/QVT7S2BT8GkN48Pife0S3DiHkeR4oobdhbsRbRF6R6dMuV3u6 ywOqXBr87dilPmIvH4GQs7RzZN5ZcTx6jUsLbbaQ7DCJ0Wp79DpP3+I52FSBueYLNONf EVmO5BdkwfNbuz9sxak1w19LhTc9jTBM14IhyqPFo6bh1R14wWP9B4zvbvJ79nxMxzd2 oM+NlA4vBlQU0gj6/YlSAi7sBBY5BOZ6hd3I6Cn7kwWqjnvTvDed6o925uI2mbvI4Kie Z/wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:in-reply-to:date:message-id :references:user-agent:mime-version; bh=8TlwJUyiZfupRhWR6YlheLtylexpdKGicubOOmKi6Pk=; b=FpZfAN0InYYrmb75iNHf9y8jp4qDzrc9jDgx4L+/6LonFcvfChvZnu9mDm1QXJ8tIv DGB5aKVKJPbFl5Zr+IK39Pss8qbZCxrLedC3bQyclsM5W+DjZmjcZ16kcPLYGdhj2s2I 2MjvPAEEgE+ZJ3xvJAN0sT7BNgGXbA7HLxa0jcMjgDhc8dUu2YW4xVaELl1tDdkAu15x N61xfw5GwLkPt2oCKNxeiS1/+Y3xPH1fn2KLW8u3kpeVOiWqHr7GKx+gFGIWnA+T7J1Q BmTGray4b50k/ovYy2Ytxh27o4/2FuDuFIg3+RvDfog61yWajmtU5hicrIlD18gq/KiV 2KQg== X-Gm-Message-State: AHPjjUjSnA7DMHzKDhCWDRxnZ065NbRchRASwmYpMLmhFR9g5S7Gn/N1 P9ujjoRYK0Vo9OtUy60= X-Google-Smtp-Source: ADKCNb7jJwJQV0kG1JzONA1lRyQSnZl1Du5eP9UUgFjV5cOeyFEcMPmU+L7WZJXO5aS4slJTvKUIww== X-Received: by 10.223.193.71 with SMTP id w7mr2159841wre.158.1504614537110; Tue, 05 Sep 2017 05:28:57 -0700 (PDT) Received: from Hermes.local (client-7-191.visitor-network.oxuni.org.uk. [192.76.7.191]) by smtp.gmail.com with ESMTPSA id g132sm499500wmd.5.2017.09.05.05.28.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Sep 2017 05:28:56 -0700 (PDT) From: John Wiegley X-Google-Original-From: "John Wiegley" Received: by Hermes.local (Postfix, from userid 501) id 69E872EFA7BB; Tue, 5 Sep 2017 13:28:53 +0100 (BST) To: Dmitry Gutov Subject: Re: bug#22983: syntax-ppss returns wrong result. In-Reply-To: (Dmitry Gutov's message of "Tue, 5 Sep 2017 02:34:15 +0300") Date: Tue, 05 Sep 2017 13:28:52 +0100 Message-ID: References: <20160311151512.GD2888@acm.fritz.box> <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> User-Agent: Gnus/5.130016 (Ma Gnus v0.16) Emacs/25.2.50 (darwin) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 22983 Cc: Alan Mackenzie , Eli Zaretskii , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) >>>>> Dmitry Gutov writes: > I'm sure we want to fix design flaws. As long as there is a solid plan that > does not swap one flaw for another. Can we have a summary of the current proposal(s) on the table? It would help to clarify, rather than navigating past discussions. Alan has told me that this issue is affecting people and has been outstanding for some time; I'd like to get a better idea of its seriousness/scope, and what effect the available solutions would have (as Dmitry says, we don't want to replace one flaw with another). -- John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 07 14:00:53 2017 Received: (at 22983) by debbugs.gnu.org; 7 Sep 2017 18:00:53 +0000 Received: from localhost ([127.0.0.1]:54627 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dq16i-0007hN-Jf for submit@debbugs.gnu.org; Thu, 07 Sep 2017 14:00:52 -0400 Received: from ocolin.muc.de ([193.149.48.4]:17798 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1dq16g-0007hE-JE for 22983@debbugs.gnu.org; Thu, 07 Sep 2017 14:00:51 -0400 Received: (qmail 82880 invoked by uid 3782); 7 Sep 2017 18:00:49 -0000 Received: from acm.muc.de (p548C7C68.dip0.t-ipconnect.de [84.140.124.104]) by colin.muc.de (tmda-ofmipd) with ESMTP; Thu, 07 Sep 2017 20:00:48 +0200 Received: (qmail 4807 invoked by uid 1000); 7 Sep 2017 17:56:14 -0000 Date: Thu, 7 Sep 2017 17:56:14 +0000 To: Dmitry Gutov Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170907175614.GB4488@ACM> References: <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: jwiegley@gmail.com, Eli Zaretskii , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry. On Tue, Sep 05, 2017 at 02:34:15 +0300, Dmitry Gutov wrote: > On 9/2/17 8:40 PM, Alan Mackenzie wrote: > > I'm not happy about this. 22983 is a serious design flaw, which has had > > deleterious effects deep within Emacs. > I'm sure we want to fix design flaws. As long as there is a solid plan > that does not swap one flaw for another. Plan or not, it should be fixed. > > One recorded example, resulting > > in an infinite loop, is: > > > > ######################################################################### > > From: Philipp Stephani > > To: emacs-devel@gnu.org > > Subject: [PATCH] Protect against an infloop in python-mode > > Date: Tue, 28 Feb 2017 22:31:49 +0100 > > > > There appears to be an edge case caused by using `syntax-ppss' in a > > narrowed buffer during JIT lock inside of Python triple-quote strings. > > Unfortunately it is impossible to reproduce without manually > > destroying the syntactic information in the Python buffer, but it has > > been observed in practice. In that case it can happen that the syntax > > caches get sufficiently out of whack so that there appear to be > > overlapping strings in the buffer. As Python has no nested strings, > > this situation is impossible and leads to an infloop in > > `python-nav-end-of-statement'. Protect against this by checking > > whether the search for the end of the current string makes progress. > > ######################################################################### > > > > In this case, Philipp had to apply a workaround. > The problem manifested during jit-lock. Do we understand why the (widen) > call inside font-lock-default-fontify-region didn't help? I don't, not in detail, no. Philipp might know. But if syntax-ppss was used whilst the buffer was narrowed, it likely corrupted its cache, and that corruption remained after widening the buffer. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 07 16:36:48 2017 Received: (at 22983) by debbugs.gnu.org; 7 Sep 2017 20:36:48 +0000 Received: from localhost ([127.0.0.1]:54754 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dq3Xc-0006gW-9h for submit@debbugs.gnu.org; Thu, 07 Sep 2017 16:36:48 -0400 Received: from mail-lf0-f53.google.com ([209.85.215.53]:35298) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dq3Xa-0006gH-D4 for 22983@debbugs.gnu.org; Thu, 07 Sep 2017 16:36:46 -0400 Received: by mail-lf0-f53.google.com with SMTP id d17so1607147lfe.2 for <22983@debbugs.gnu.org>; Thu, 07 Sep 2017 13:36:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=QrD7fR8YMBos5xSq5Rq37AU0TxpY45Eu3gl1/Jn3j6Y=; b=VJIEUQEiZIU5QZBOfidC1k6XIuAN1mtALwBTxe6cOgt05vRbZLtWZB+b+mOSDrR2gP +BlD+X7FT6zp21iVebhjamzBTgfTNucFOhtBceAXe0FizJc8KZYOwRVHlgXdC2PX1U5s Mn2/q/4pyvSF18o7XKiBdnqSqrk6CzXVEshphdMzwRaAbvZ5lJuNJwd4CaVWa5wLjNng yxe/4LQGfeQw7GhI+KBuYVuu5NR947URZ74VwPkSBsQqCvEub6Z63H5a30o01Nwp+KnB oAtwNDaXwCIOoINhtzBGlIuzDJ1G5L1q5TbKbiuLt73c6POfmNAOv2OR3wI7YrbsEC/W MeDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=QrD7fR8YMBos5xSq5Rq37AU0TxpY45Eu3gl1/Jn3j6Y=; b=KmjvDAYSLnuGjcKvHbMCmFuNT2WtD9FRqJB4uik9WGL9AorN+Yr0fibTXqxvpVQ2Ph adBtq82UCDC2KeFEr4CoA+i3KnYaVBBWqX2TvrbMIAlsh7PQBcC+IPJbOSucaIvyPgEq lEB5uWtPZNlIzQdQYgI1HFnOgCZUGjqK4lNI8x3tDwjvvcqZb5imccxG/bDNQpop/ZnY +vh0grigJoZL1HmaigOhBDU9ft7mEhKh6KiC0GaBrZGmpaOQ/W+F/URlSJZZeYQQ0Smt G4G9Hm5/G9ESI0rJOhnk15A00pgYVW8+5Cr7xSXQuI6ySWc4bjMMpSb2v/AddrhOmxnZ v3RA== X-Gm-Message-State: AHPjjUijXQkofAdpdXwBePlO31mgW/zkiHUiX5Alql8fYR7JKrY/LbqR ZKO+//OWwWukBg== X-Google-Smtp-Source: AOwi7QBs3AxeC+8JZaBXHrDlLGNrHP+QazJroyNCrDVaWGLBZkJ20lceiRZ53EktyzEaVD0F7pfqKg== X-Received: by 10.25.23.95 with SMTP id n92mr160187lfi.95.1504816600250; Thu, 07 Sep 2017 13:36:40 -0700 (PDT) Received: from [192.168.1.174] ([178.252.127.239]) by smtp.googlemail.com with ESMTPSA id b79sm31897lfe.45.2017.09.07.13.36.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Sep 2017 13:36:38 -0700 (PDT) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie References: <44b4fa9e-ec8e-98a4-d8ad-e799fffa7959@yandex.ru> <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907175614.GB4488@ACM> From: Dmitry Gutov Message-ID: <193f34e5-cf9e-f6b3-40cd-ccaea0ff6292@yandex.ru> Date: Thu, 7 Sep 2017 23:36:37 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: <20170907175614.GB4488@ACM> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/7/17 8:56 PM, Alan Mackenzie wrote: >> The problem manifested during jit-lock. Do we understand why the (widen) >> call inside font-lock-default-fontify-region didn't help? > > I don't, not in detail, no. Philipp might know. But if syntax-ppss was > used whilst the buffer was narrowed, it likely corrupted its cache, and > that corruption remained after widening the buffer. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.53 listed in dnsbl.sorbs.net] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.53 listed in list.dnswl.org] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.53 listed in wl.mailspike.net] 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: 22983 Cc: jwiegley@gmail.com, Eli Zaretskii , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/7/17 8:56 PM, Alan Mackenzie wrote: >> The problem manifested during jit-lock. Do we understand why the (widen) >> call inside font-lock-default-fontify-region didn't help? > > I don't, not in detail, no. Philipp might know. But if syntax-ppss was > used whilst the buffer was narrowed, it likely corrupted its cache, and > that corruption remained after widening the buffer. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.53 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.53 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.53 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders On 9/7/17 8:56 PM, Alan Mackenzie wrote: >> The problem manifested during jit-lock. Do we understand why the (widen) >> call inside font-lock-default-fontify-region didn't help? > > I don't, not in detail, no. Philipp might know. But if syntax-ppss was > used whilst the buffer was narrowed, it likely corrupted its cache, and > that corruption remained after widening the buffer. Details matter. From debbugs-submit-bounces@debbugs.gnu.org Thu Sep 07 16:49:42 2017 Received: (at 22983) by debbugs.gnu.org; 7 Sep 2017 20:49:42 +0000 Received: from localhost ([127.0.0.1]:54770 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dq3k6-0006ya-Ey for submit@debbugs.gnu.org; Thu, 07 Sep 2017 16:49:42 -0400 Received: from ocolin.muc.de ([193.149.48.4]:29282 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1dq3k2-0006yQ-PK for 22983@debbugs.gnu.org; Thu, 07 Sep 2017 16:49:40 -0400 Received: (qmail 24937 invoked by uid 3782); 7 Sep 2017 20:49:37 -0000 Received: from acm.muc.de (p548C7C68.dip0.t-ipconnect.de [84.140.124.104]) by colin.muc.de (tmda-ofmipd) with ESMTP; Thu, 07 Sep 2017 22:49:36 +0200 Received: (qmail 5613 invoked by uid 1000); 7 Sep 2017 20:45:02 -0000 Date: Thu, 7 Sep 2017 20:45:02 +0000 To: John Wiegley Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170907204502.GC4488@ACM> References: <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org, Eli Zaretskii , Philipp Stephani , Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, John. On Tue, Sep 05, 2017 at 13:28:52 +0100, John Wiegley wrote: > >>>>> Dmitry Gutov writes: > > I'm sure we want to fix design flaws. As long as there is a solid plan that > > does not swap one flaw for another. > Can we have a summary of the current proposal(s) on the table? It would help > to clarify, rather than navigating past discussions. Alan has told me that > this issue is affecting people and has been outstanding for some time; I'd > like to get a better idea of its seriousness/scope, and what effect the > available solutions would have (as Dmitry says, we don't want to replace one > flaw with another). First, I think it's worthwhile emphasising what the function purports to do: syntax-ppss is a compiled Lisp function in `syntax.el'. (syntax-ppss &optional POS) Parse-Partial-Sexp State at POS, defaulting to point. The returned value is the same as that of `parse-partial-sexp' run from `point-min' to POS except that values at positions 2 and 6 in the returned list (counting from 0) cannot be relied upon. Point is at POS when this function returns. The solution I propose is to introduce a second cache into syntax-ppss, and this cache would be used whenever (not (eq (point-min) 1)). Whenever point-min changes, and isn't 1, this second cached would be calculated again from scratch. This proposal has these advantages: (i) It would make the function deliver what its unchanged doc string says. This is important, given that syntax-ppss has been very widely used within Emacs, and likely by external packages too; these will typically have assumed the advertised behaviour of the function, without having tested it in narrowed buffers. (i) In the case which currently works, namely a non-narrowed buffer, there would be only a minute slow-down (basically, there would be extra code to check point-min and select the cache to use). (ii) The cache for use in a narrowed buffer might well be sufficiently fast in normal use. If it is not, it could be enhanced readily. I think Dmitry also proposed a method of solution some months ago, though I don't remember in detail what it was. Dmitry, do you still think your solution would work? If so, please elaborate on it. > -- > John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F > http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 08 11:48:47 2017 Received: (at submit) by debbugs.gnu.org; 8 Sep 2017 15:48:47 +0000 Received: from localhost ([127.0.0.1]:56168 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dqLWQ-0005YS-U5 for submit@debbugs.gnu.org; Fri, 08 Sep 2017 11:48:47 -0400 Received: from eggs.gnu.org ([208.118.235.92]:59852) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dqLWK-0005Y5-1Y for submit@debbugs.gnu.org; Fri, 08 Sep 2017 11:48:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dqLWD-00085P-BY for submit@debbugs.gnu.org; Fri, 08 Sep 2017 11:48:34 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:45694) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dqLWD-00085G-7b for submit@debbugs.gnu.org; Fri, 08 Sep 2017 11:48:33 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50811) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dqLWB-00036Y-Eu for bug-gnu-emacs@gnu.org; Fri, 08 Sep 2017 11:48:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dqLW7-000828-Ga for bug-gnu-emacs@gnu.org; Fri, 08 Sep 2017 11:48:31 -0400 Received: from mout.kundenserver.de ([212.227.126.131]:61976) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dqLW7-000816-4y; Fri, 08 Sep 2017 11:48:27 -0400 Received: from [192.168.178.35] ([77.12.83.176]) by mrelayeu.kundenserver.de (mreue004 [212.227.15.167]) with ESMTPSA (Nemesis) id 0LwEHK-1dOAdG0KuU-0183XU; Fri, 08 Sep 2017 17:48:20 +0200 Subject: Re: bug#22983: syntax-ppss returns wrong result. To: bug-gnu-emacs@gnu.org References: <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> From: =?UTF-8?Q?Andreas_R=c3=b6hler?= Message-ID: Date: Fri, 8 Sep 2017 18:04:37 +0200 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: <20170907204502.GC4488@ACM> Content-Type: multipart/alternative; boundary="------------AEAAB077A7F25D0F7080D27A" Content-Language: en-US X-Provags-ID: V03:K0:ThBgHvYZFd+BKg+YdTMOa/ekM8HuM2W8G8+lnRGFuquRZ5S1E/S kGOmBssS6CfbuYJpkqm6829ebuCoY5yq4d0G81s5dbL6i8aoqzDXVcx9S89sDI0nir+wAg4 R4tVMIv3/PAXbhobSQCBeEEBmMd6cpMK/VgMSJeXhyewwLdcJ3l6nO6/6CZCp8lK2FD9SNk Lfn3nvza49XQLWiuOPpZw== X-UI-Out-Filterresults: notjunk:1;V01:K0:DEPO6jU5its=:oz36LRMFssTA/JaQQVmnmn 7vDMDlkmsUGR093S1z1s20nVY4g5suIpwWF+/hg7tLyvthuo1czRXjk5ZfQu/GFgykNxCm2Px bRSIK1BbHEsbYyqIgwOXILnsNaLZGqu0XxoeoaDKOgvUdY4uG2IgeOrBSc3U+nLRDIecWShLh hm8D4u3XkKAUCSvJQFRHi9QxXCWLmfLWy+9VjkQoWDsnt1Rvn9aNJvBnTKj5ryyd8STm99nLu rAaYp2aqF1k1exPV2MyM/vLPDuTcu9W5/pBq44wwa1GlffGih2jpw9tJvQs1Pge8RbP5w8Q72 PpVGjdKLVDfzimHLcjDVjWlcBgoJifz1nap3GOFZMa7Fzz1TkQhHUJz3u++yayNcu1gGekmqU VfuYHFRGhmWkph+V7Ub3Sng9afKPJWoDMTc9c+8tCsqxnCYKTBHtQz5szFZK+zF/8bExC5ZTM 3y4QaJ7dDV5u6nsH0LrIDUmYn3wUp+Apv/K03r1mDSc7snd7vXrBInnzLmzXyGPHKh0Icf67F w/rlklx2BAKR3/Yac8O798paGZKsUkVSPSUf6yOW1PcUK3AMnT8NKAAIp18ZMd0nQhbMPCFuR ZnqlOyHBOZmSgH8IDUciA0Hm5nhQMlxCgHW+K1i9LGqxAmzKBxCOQfGGcyvO7mz8QYMnGorlo egnSlzfG+8aCsqNN2JkWkurxjLgbqjAW/4QQfAfXKQGiJOpPYKvASk5eKJJBbgPc7flWv7C/0 tLVPuy1q87tNpHeK6P/UGjyqjbuy7+KgbRYPHeit7KERJaOLXyVXxbR+rMs= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: submit Cc: Alan Mackenzie , John Wiegley X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) This is a multi-part message in MIME format. --------------AEAAB077A7F25D0F7080D27A Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 07.09.2017 22:45, Alan Mackenzie wrote: > Hello, John. > > On Tue, Sep 05, 2017 at 13:28:52 +0100, John Wiegley wrote: >>>>>>> Dmitry Gutov writes: >>> I'm sure we want to fix design flaws. As long as there is a solid plan that >>> does not swap one flaw for another. >> Can we have a summary of the current proposal(s) on the table? It would help >> to clarify, rather than navigating past discussions. Alan has told me that >> this issue is affecting people and has been outstanding for some time; I'd >> like to get a better idea of its seriousness/scope, and what effect the >> available solutions would have (as Dmitry says, we don't want to replace one >> flaw with another). > First, I think it's worthwhile emphasising what the function purports to > do: > > syntax-ppss is a compiled Lisp function in `syntax.el'. > > (syntax-ppss &optional POS) > > Parse-Partial-Sexp State at POS, defaulting to point. > The returned value is the same as that of `parse-partial-sexp' > run from `point-min' to POS except that values at positions 2 and 6 > in the returned list (counting from 0) cannot be relied upon. > Point is at POS when this function returns. > > The solution I propose is to introduce a second cache into syntax-ppss, > and this cache would be used whenever (not (eq (point-min) 1)). > Whenever point-min changes, and isn't 1, this second cached would be > calculated again from scratch. > > This proposal has these advantages: > > (i) It would make the function deliver what its unchanged doc string > says. This is important, given that syntax-ppss has been very widely > used within Emacs, and likely by external packages too; these will > typically have assumed the advertised behaviour of the function, without > having tested it in narrowed buffers. > > (i) In the case which currently works, namely a non-narrowed buffer, > there would be only a minute slow-down (basically, there would be extra > code to check point-min and select the cache to use). > > (ii) The cache for use in a narrowed buffer might well be sufficiently > fast in normal use. If it is not, it could be enhanced readily. > > I think Dmitry also proposed a method of solution some months ago, > though I don't remember in detail what it was. Dmitry, do you still > think your solution would work? If so, please elaborate on it. > >> -- >> John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F >> http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 Hi Alan and all, assume a complex matter behind, a bunch of bugs resp. design issues, not a single one. Fixing this would affect syntax-propertize, parse-partial-sexp, syntax-ppss and font-lock stuff at once. http://lists.gnu.org/archive/html/emacs-devel/2016-03/msg01576.html points at some spot. There should be more. As a first step listing referential tests including benchmarks should be helpful. --------------AEAAB077A7F25D0F7080D27A Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit



On 07.09.2017 22:45, Alan Mackenzie wrote:
Hello, John.

On Tue, Sep 05, 2017 at 13:28:52 +0100, John Wiegley wrote:
Dmitry Gutov <dgutov@yandex.ru> writes:

      
I'm sure we want to fix design flaws. As long as there is a solid plan that
does not swap one flaw for another.

      
Can we have a summary of the current proposal(s) on the table? It would help
to clarify, rather than navigating past discussions. Alan has told me that
this issue is affecting people and has been outstanding for some time; I'd
like to get a better idea of its seriousness/scope, and what effect the
available solutions would have (as Dmitry says, we don't want to replace one
flaw with another).
First, I think it's worthwhile emphasising what the function purports to
do:

    syntax-ppss is a compiled Lisp function in `syntax.el'.

    (syntax-ppss &optional POS)

    Parse-Partial-Sexp State at POS, defaulting to point.
    The returned value is the same as that of `parse-partial-sexp'
    run from `point-min' to POS except that values at positions 2 and 6
    in the returned list (counting from 0) cannot be relied upon.
    Point is at POS when this function returns.

The solution I propose is to introduce a second cache into syntax-ppss,
and this cache would be used whenever (not (eq (point-min) 1)).
Whenever point-min changes, and isn't 1, this second cached would be
calculated again from scratch.

This proposal has these advantages:

(i) It would make the function deliver what its unchanged doc string
says.  This is important, given that syntax-ppss has been very widely
used within Emacs, and likely by external packages too; these will
typically have assumed the advertised behaviour of the function, without
having tested it in narrowed buffers.

(i) In the case which currently works, namely a non-narrowed buffer,
there would be only a minute slow-down (basically, there would be extra
code to check point-min and select the cache to use).

(ii) The cache for use in a narrowed buffer might well be sufficiently
fast in normal use.  If it is not, it could be enhanced readily.

I think Dmitry also proposed a method of solution some months ago,
though I don't remember in detail what it was.  Dmitry, do you still
think your solution would work?  If so, please elaborate on it.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2

    

Hi Alan and all,

assume a complex matter behind, a bunch of bugs resp. design issues, not a single one.
Fixing this would affect syntax-propertize, parse-partial-sexp, syntax-ppss and font-lock stuff at once.

http://lists.gnu.org/archive/html/emacs-devel/2016-03/msg01576.html
points at some spot. There should be more.

As a first step listing referential tests including benchmarks should be helpful.



--------------AEAAB077A7F25D0F7080D27A-- From debbugs-submit-bounces@debbugs.gnu.org Sat Sep 09 05:44:19 2017 Received: (at 22983) by debbugs.gnu.org; 9 Sep 2017 09:44:19 +0000 Received: from localhost ([127.0.0.1]:56864 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dqcJH-0006Uv-Gc for submit@debbugs.gnu.org; Sat, 09 Sep 2017 05:44:19 -0400 Received: from mail-lf0-f47.google.com ([209.85.215.47]:38356) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dqcJF-0006Uj-HY for 22983@debbugs.gnu.org; Sat, 09 Sep 2017 05:44:18 -0400 Received: by mail-lf0-f47.google.com with SMTP id q132so9773043lfe.5 for <22983@debbugs.gnu.org>; Sat, 09 Sep 2017 02:44:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=arN5LHxeH7xz0J03mqmrQxhwkZU7cPZaExLMa3gfX/8=; b=vhuIOP62kgMnTf2rVULRmm5G0lYGm5hnHDL7mi9IDQZRP8KccZKwqoUZR+YmwOmyXR kMGuv7yOVwQ/NLgWPyTP7+9Gw5M5JaYUlM0R4MYmclSM6VQgRqZZhdvHvoyu5LGCImG9 a00Wq3x68NWhza0VVEOw0NWewWEWKglqp1mvCJo1NkwbFhUGHOr3BYk6NdYXNKktsE+6 2SDOaXeDUlATur3ON1h499kkrXQHXBLRqucN9ufgY7fgMPH7ge8++lfVTgX3BjZKaRCB YBPDp46bYyCrbCkiqvJp6mdTRtLYxUXlmbFo9WoE+hoFJlGswJRCOc/6ZnK63locnYVA YmJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=arN5LHxeH7xz0J03mqmrQxhwkZU7cPZaExLMa3gfX/8=; b=uButH6rKTkTe4baEfsUMidCfKfD0NtTTDxhcwaOZ7GWxazdJmlCyeQJfJ5QsYqMmO/ 6t5llM7dGAkDmLSIu52Zin2hkfEf0Ma2ld3gRC/llVC31InwuriSwYVs43R9PITfcsvX cgng1HmOcVruM0B03Yxp+QbQ/Ww4bDSe8He0jtW7aclnvFRXvzB+sf+hCPxYfBB0occS P7AzgpUzYcDl4+XKu08w+sw+lfcVvSjZGugbF9IsVTEmPCT90TuXJK59qZa8e6P8ou/y SRVeB6clOdtCKay2IaXwRF9ZlASF75ViQEwglQ8yv+xuJRUBTA4JJEvrD1eihwebttDw oWCg== X-Gm-Message-State: AHPjjUjmOBLyUD2pSloYkYrleUYFgJ73qlQlFQWZzJqtuDkm5+ol/zl7 PjN2nWEmfbuoFw== X-Google-Smtp-Source: AOwi7QDGduZTyxQIF0/uGjTNtrture/xv8RO2pTgkJSU3ESQJluRJZSPhkE7HCPQsjqVf7ezqC3AZQ== X-Received: by 10.46.25.198 with SMTP id 67mr2405225ljz.67.1504950251284; Sat, 09 Sep 2017 02:44:11 -0700 (PDT) Received: from [192.168.1.174] ([178.252.127.239]) by smtp.googlemail.com with ESMTPSA id 26sm649295lfx.50.2017.09.09.02.44.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 09 Sep 2017 02:44:09 -0700 (PDT) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie , John Wiegley References: <20160319122759.GA2644@acm.fritz.box> <9f36a39b-ea9f-2f61-5400-68de18526ab1@yandex.ru> <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> From: Dmitry Gutov Message-ID: <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> Date: Sat, 9 Sep 2017 12:44:02 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: <20170907204502.GC4488@ACM> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Hi Alan, On 9/7/17 11:45 PM, Alan Mackenzie wrote: > The solution I propose is to introduce a second cache into syntax-ppss, > and this cache would be used whenever (not (eq (point-min) 1)). > Whenever point-min changes, and isn't 1, this second cached would be > calculated again from scratch. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.47 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.47 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.47 listed in wl.mailspike.net] 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org, Philipp Stephani X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Hi Alan, On 9/7/17 11:45 PM, Alan Mackenzie wrote: > The solution I propose is to introduce a second cache into syntax-ppss, > and this cache would be used whenever (not (eq (point-min) 1)). > Whenever point-min changes, and isn't 1, this second cached would be > calculated again from scratch. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.47 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.47 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.47 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (raaahh[at]gmail.com) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders Hi Alan, On 9/7/17 11:45 PM, Alan Mackenzie wrote: > The solution I propose is to introduce a second cache into syntax-ppss, > and this cache would be used whenever (not (eq (point-min) 1)). > Whenever point-min changes, and isn't 1, this second cached would be > calculated again from scratch. Thanks for writing this up. I think it's a good step, and since it follow the current wording of the docstring, it should be highly compatible with the existing code. > This proposal has these advantages: > > (i) It would make the function deliver what its unchanged doc string > says. This is important, given that syntax-ppss has been very widely > used within Emacs, and likely by external packages too; these will > typically have assumed the advertised behaviour of the function, without > having tested it in narrowed buffers. It will also continue to function as expected in mmm-mode, AFAICT, without the need for an "escape hatch" we discussed before. > (i) In the case which currently works, namely a non-narrowed buffer, > there would be only a minute slow-down (basically, there would be extra > code to check point-min and select the cache to use). > > (ii) The cache for use in a narrowed buffer might well be sufficiently > fast in normal use. If it is not, it could be enhanced readily. And since the API doesn't change, and the observable behavior doesn't either (in the vast majority of cases; probably all except the broken ones), we can refine this solution easily, or even swap it for something else, with little cost. > I think Dmitry also proposed a method of solution some months ago, > though I don't remember in detail what it was. Dmitry, do you still > think your solution would work? If so, please elaborate on it. There is a simple patch at https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22983#47, but I after some consideration, I now prefer your proposed approach. We've also had some grander ideas about enhancing things further, but those can be added later, after we finally decide. I do want to know what Stefan thinks of this subject now, though. Caveats: - This solves the dependency on point-min, but does nothing about the dependency on the current syntax-table (which can change). I'm not necessarily suggesting we try to solve that now, though. - Before this change is pushed to master, or shortly after, I'd like to know that it actually fixed the problem Philipp experienced with python-mode, so we can revert 4fbd330. If it was caused by e.g. syntax-table changing, we've not improved much. All the best, Dmitry. From debbugs-submit-bounces@debbugs.gnu.org Sat Sep 09 06:25:29 2017 Received: (at 22983) by debbugs.gnu.org; 9 Sep 2017 10:25:29 +0000 Received: from localhost ([127.0.0.1]:56889 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dqcx6-0007XB-Ty for submit@debbugs.gnu.org; Sat, 09 Sep 2017 06:25:29 -0400 Received: from ocolin.muc.de ([193.149.48.4]:33101 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1dqcx4-0007X2-RD for 22983@debbugs.gnu.org; Sat, 09 Sep 2017 06:25:27 -0400 Received: (qmail 1650 invoked by uid 3782); 9 Sep 2017 10:25:21 -0000 Received: from acm.muc.de (p548C7C7C.dip0.t-ipconnect.de [84.140.124.124]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sat, 09 Sep 2017 12:25:20 +0200 Received: (qmail 6670 invoked by uid 1000); 9 Sep 2017 10:20:27 -0000 Date: Sat, 9 Sep 2017 10:20:27 +0000 To: Dmitry Gutov Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170909102027.GB5194@ACM> References: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry. On Sat, Sep 09, 2017 at 12:44:02 +0300, Dmitry Gutov wrote: > Hi Alan, > On 9/7/17 11:45 PM, Alan Mackenzie wrote: > > The solution I propose is to introduce a second cache into syntax-ppss, > > and this cache would be used whenever (not (eq (point-min) 1)). > > Whenever point-min changes, and isn't 1, this second cached would be > > calculated again from scratch. > Thanks for writing this up. I think it's a good step, and since it > follow the current wording of the docstring, it should be highly > compatible with the existing code. Thanks. > > This proposal has these advantages: > > (i) It would make the function deliver what its unchanged doc string > > says. This is important, given that syntax-ppss has been very widely > > used within Emacs, and likely by external packages too; these will > > typically have assumed the advertised behaviour of the function, without > > having tested it in narrowed buffers. > It will also continue to function as expected in mmm-mode, AFAICT, > without the need for an "escape hatch" we discussed before. > > (i) In the case which currently works, namely a non-narrowed buffer, > > there would be only a minute slow-down (basically, there would be extra > > code to check point-min and select the cache to use). > > (ii) The cache for use in a narrowed buffer might well be sufficiently > > fast in normal use. If it is not, it could be enhanced readily. > And since the API doesn't change, and the observable behavior doesn't > either (in the vast majority of cases; probably all except the broken > ones), we can refine this solution easily, or even swap it for something > else, with little cost. Yes. I now have a provisional implementation of this new strategy, which works on the test case for xdisp.c with which I opened the bug. It seems to be working, generally. I need to test it more thoroughly. In the implementation, I have left the function `syntax-ppss' untouched except for adding a function call to set up the cache right at the start. I have refactored syntax-ppss-flush-cache, extracting a function which is called directly from the cache-selecting code. Other than that, there is one new function (which switches the current cache in use) and a few new variables to keep track of the caches. > > I think Dmitry also proposed a method of solution some months ago, > > though I don't remember in detail what it was. Dmitry, do you still > > think your solution would work? If so, please elaborate on it. > There is a simple patch at > https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22983#47, but I after some > consideration, I now prefer your proposed approach. We've also had some > grander ideas about enhancing things further, but those can be added > later, after we finally decide. Yes, I agree. > I do want to know what Stefan thinks of this subject now, though. Yes. > Caveats: > - This solves the dependency on point-min, but does nothing about the > dependency on the current syntax-table (which can change). I'm not > necessarily suggesting we try to solve that now, though. I had some ideas on this back in the spring (about having "indirect variables") which could be used quickly to "swap out" the current syntax-table text properties, and (more importantly) quickly swap them back in. But that's for another day. > - Before this change is pushed to master, or shortly after, I'd like to > know that it actually fixed the problem Philipp experienced with > python-mode, so we can revert 4fbd330. If it was caused by e.g. > syntax-table changing, we've not improved much. I am naturally interested in this, too. If my patch doesn't fix this bug, at least it will have removed a layer of fog inhibiting its investigation. > All the best, > Dmitry. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Sat Sep 09 08:18:22 2017 Received: (at 22983) by debbugs.gnu.org; 9 Sep 2017 12:18:22 +0000 Received: from localhost ([127.0.0.1]:56943 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dqeiM-0003Wo-Jy for submit@debbugs.gnu.org; Sat, 09 Sep 2017 08:18:22 -0400 Received: from mail-lf0-f47.google.com ([209.85.215.47]:35613) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dqeiL-0003Wb-9G for 22983@debbugs.gnu.org; Sat, 09 Sep 2017 08:18:21 -0400 Received: by mail-lf0-f47.google.com with SMTP id d17so10205566lfe.2 for <22983@debbugs.gnu.org>; Sat, 09 Sep 2017 05:18:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=aSv8QJb8ELIjdwJ2Oz1oNhhQ13kpNbIeIT3cyGkU2MQ=; b=eYSVcD5cKFiiCtlCEF5GBqp1xlqhTrbJBJ5vUvro8DSguN7XfSt6l88C58IzMlZ6Cq R5eVsQxF1x109x2cktfKB0S1GPpr01Raci0chBpavIouYQSxhB5eN1krTxK3JL2gzrpE Bj+uYhWKvHpLsH5HdqsNNEnfl3VtUMAuMef6owdTaroGV1DSJoclkcq4MBcvzDkRudpK r35BvgRNdJfgSGxbFmfhjqitVuJZ6vckQlGYJiRzfASnYAioibhb8UXBaNQT4xe5L378 tXNe4rtI7H+D0gumHniXdG5mLcQmhdHVC1Z4q9ZVd2QjG7oWfcpkda0An5Ile5HvzMm2 YL4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=aSv8QJb8ELIjdwJ2Oz1oNhhQ13kpNbIeIT3cyGkU2MQ=; b=gVCuFVK3oLwKlC3UHbcbiX9DcZIWKY3znN+bHpWJb/F0TvXXJVoQrQdQnFGIpzY+AX bs3I8TWuWpX/GfztBa0VzGOvYY1CgPfw7DogZKUGx3nhhEf7kuLuc1m7HtiLy3E+EXKi MQE5yxmnISBlqRZXensdXx/fviH1lDZ06J+1PBhgrcce1bhAHW7ibpoYeuC+aq3ZjwzY DyhVctdKU8Fbh3ZLUUwUHEerchwxIERSGIltTXWMlRK/WABQ+6sh1tV9dDemOgMIYa3N L8vAyuy4wnAbhApUtS/JSA+e5FAP/H7XnOWUdKh1nWuxcSLd+k61HEbMMZ/Z2IWWNDmD P0YA== X-Gm-Message-State: AHPjjUjjvnfmaA2Vjs8JldVfm1xgVXclh4Al2IyuNavd9e3p21+e400g mNqTSgyJ0HxpeHvgUUA= X-Google-Smtp-Source: AOwi7QDowNuc1wChuQ7wiVETaQZr1FvLeU2AUkfZ7UrC7kmvs96e1V+quDCL/ivUOIhlKE91g9SPwg== X-Received: by 10.46.68.66 with SMTP id r63mr2200083lja.145.1504959494745; Sat, 09 Sep 2017 05:18:14 -0700 (PDT) Received: from [192.168.1.174] ([178.252.127.239]) by smtp.googlemail.com with ESMTPSA id g21sm783773lje.52.2017.09.09.05.18.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 09 Sep 2017 05:18:13 -0700 (PDT) Subject: Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie References: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170909102027.GB5194@ACM> From: Dmitry Gutov Message-ID: Date: Sat, 9 Sep 2017 15:18:11 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: <20170909102027.GB5194@ACM> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/9/17 1:20 PM, Alan Mackenzie wrote: > In the implementation, I have left the function `syntax-ppss' untouched > except for adding a function call to set up the cache right at the > start. I have refactored syntax-ppss-flush-cache, extracting a function > which is called directly from the cache-selecting code. Other than > that, there is one new function (which switches the current cache in > use) and a few new variables to keep track of the caches. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.47 listed in list.dnswl.org] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.47 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.47 listed in wl.mailspike.net] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (raaahh[at]gmail.com) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/9/17 1:20 PM, Alan Mackenzie wrote: > In the implementation, I have left the function `syntax-ppss' untouched > except for adding a function call to set up the cache right at the > start. I have refactored syntax-ppss-flush-cache, extracting a function > which is called directly from the cache-selecting code. Other than > that, there is one new function (which switches the current cache in > use) and a few new variables to keep track of the caches. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.47 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.47 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.47 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders On 9/9/17 1:20 PM, Alan Mackenzie wrote: > In the implementation, I have left the function `syntax-ppss' untouched > except for adding a function call to set up the cache right at the > start. I have refactored syntax-ppss-flush-cache, extracting a function > which is called directly from the cache-selecting code. Other than > that, there is one new function (which switches the current cache in > use) and a few new variables to keep track of the caches. Not sure I understand. If you call (syntax-ppss) with significantly different narrowings without flushing the cache (e.g. without modifying the buffer), sounds like it'll have to return the same results under the described implementation. If so, it doesn't sound strict enough. >> Caveats: > >> - This solves the dependency on point-min, but does nothing about the >> dependency on the current syntax-table (which can change). I'm not >> necessarily suggesting we try to solve that now, though. > > I had some ideas on this back in the spring (about having "indirect > variables") which could be used quickly to "swap out" the current > syntax-table text properties, and (more importantly) quickly swap them > back in. But that's for another day. I admit I'm not sure what all this implies. >> - Before this change is pushed to master, or shortly after, I'd like to >> know that it actually fixed the problem Philipp experienced with >> python-mode, so we can revert 4fbd330. If it was caused by e.g. >> syntax-table changing, we've not improved much. > > I am naturally interested in this, too. If my patch doesn't fix this > bug, at least it will have removed a layer of fog inhibiting its > investigation. Let's hope so. From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 10 07:41:30 2017 Received: (at 22983) by debbugs.gnu.org; 10 Sep 2017 11:41:30 +0000 Received: from localhost ([127.0.0.1]:58494 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dr0cE-0004pt-FJ for submit@debbugs.gnu.org; Sun, 10 Sep 2017 07:41:30 -0400 Received: from ocolin.muc.de ([193.149.48.4]:23792 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1dr0cC-0004pk-TW for 22983@debbugs.gnu.org; Sun, 10 Sep 2017 07:41:29 -0400 Received: (qmail 80459 invoked by uid 3782); 10 Sep 2017 11:41:27 -0000 Received: from acm.muc.de (p548C6F29.dip0.t-ipconnect.de [84.140.111.41]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sun, 10 Sep 2017 13:41:26 +0200 Received: (qmail 5566 invoked by uid 1000); 10 Sep 2017 11:36:26 -0000 Date: Sun, 10 Sep 2017 11:36:26 +0000 To: Dmitry Gutov , Philipp Stephani Subject: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170910113626.GB3588@ACM> References: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry and Philipp. On Sat, Sep 09, 2017 at 12:44:02 +0300, Dmitry Gutov wrote: > Hi Alan, > On 9/7/17 11:45 PM, Alan Mackenzie wrote: > > The solution I propose is to introduce a second cache into syntax-ppss, > > and this cache would be used whenever (not (eq (point-min) 1)). > > Whenever point-min changes, and isn't 1, this second cached would be > > calculated again from scratch. Here is a patch implementing this. Comments about it would be welcome. [ .... ] > And since the API doesn't change, and the observable behavior doesn't > either (in the vast majority of cases; probably all except the broken > ones), we can refine this solution easily, or even swap it for something > else, with little cost. [ .... ] > Caveats: > - This solves the dependency on point-min, but does nothing about the > dependency on the current syntax-table (which can change). I'm not > necessarily suggesting we try to solve that now, though. > - Before this change is pushed to master, or shortly after, I'd like to > know that it actually fixed the problem Philipp experienced with > python-mode, so we can revert 4fbd330. If it was caused by e.g. > syntax-table changing, we've not improved much. Philipp, any chance of you trying out python mode with this patch but without 4fbd330? diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el index d1d5176944..952ea8bb83 100644 --- a/lisp/emacs-lisp/syntax.el +++ b/lisp/emacs-lisp/syntax.el @@ -386,11 +386,103 @@ syntax-ppss-cache (defvar-local syntax-ppss-last nil "Cache of (LAST-POS . LAST-PPSS).") -(defalias 'syntax-ppss-after-change-function 'syntax-ppss-flush-cache) -(defun syntax-ppss-flush-cache (beg &rest ignored) - "Flush the cache of `syntax-ppss' starting at position BEG." - ;; Set syntax-propertize to refontify anything past beg. - (setq syntax-propertize--done (min beg syntax-propertize--done)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Several caches. +;; +;; Because `syntax-ppss' is equivalent to (parse-partial-sexp +;; (POINT-MIN) x), we need either to empty the cache when we narrow +;; the buffer, which is suboptimal, or we need to use several caches. +;; +;; The implementation which follows uses three caches, the current one +;; (in `syntax-ppss-cache' and `syntax-ppss-last') and two inactive +;; ones (in `syntax-ppss-{cache,last}-{wide,narrow}'), which store the +;; former state of the active cache as it was used in widened and +;; narrowed buffers respectively. There are also the variables +;; `syntax-ppss-max-valid-{wide,narrow}' which hold the maximum +;; position where the caches are valid, due to buffer changes. +;; +;; At the first call to `syntax-ppss' after a widening or narrowing of +;; the buffer, the pertinent inactive cache is swapped into the +;; current cache by calling `syntax-ppss-set-cache'. Note that there +;; is currently just one inactive cache for narrowed buffers, so only +;; one inactive narrowed cache can be stored at a time. +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defvar-local syntax-ppss-cache-wide nil + "Holds the value of `syntax-ppss-cache' for a widened buffer.") +(defvar-local syntax-ppss-last-wide nil + "Holds the value of `syntax-ppss-last' for a widened buffer.") +(defvar-local syntax-ppss-max-valid-wide most-positive-fixnum + "The buffer position after which `syntax-ppss-cache-wide' is invalid.") + +(defvar-local syntax-ppss-cache-narrow nil + "Holds the value of `syntax-ppss-cache' for a narrowed buffer.") +(defvar-local syntax-ppss-last-narrow nil + "Holds the value of `syntax-ppss-last' for a narrowed buffer.") +(defvar-local syntax-ppss-max-valid-narrow most-positive-fixnum + "The buffer position after which `syntax-ppss-cache-narrow' is invalid.") + +(defvar-local syntax-ppss-narrow-point-min 1 + "Value of `point-min' for which the stored \"narrow\" cache is valid.") + +(defvar-local syntax-ppss-supremum most-positive-fixnum + "Lowest change position since previous restriction change.") + +(defvar-local syntax-ppss-cache-point-min 1 + "Value of `point-min' for which the current cache is valid.") + +(defun syntax-ppss-set-cache () + "Swap in and out the cache pertinent to the new point-min." + (unless (eq (point-min) syntax-ppss-cache-point-min) + ;; Update the stored `...max-valid' values. + (setq syntax-ppss-max-valid-wide + (if (eq syntax-ppss-cache-point-min 1) + (or (caar syntax-ppss-cache) + 1) + (min syntax-ppss-max-valid-wide syntax-ppss-supremum))) + (setq syntax-ppss-max-valid-narrow + (if (eq syntax-ppss-cache-point-min syntax-ppss-narrow-point-min) + (or (caar syntax-ppss-cache) + syntax-ppss-cache-point-min) + (min syntax-ppss-max-valid-narrow syntax-ppss-supremum))) + (setq syntax-ppss-supremum most-positive-fixnum) + + ;; Store away the current values of the cache. + (cond + ((eq syntax-ppss-cache-point-min 1) + (setq syntax-ppss-cache-wide syntax-ppss-cache + syntax-ppss-last-wide syntax-ppss-last)) + ((eq syntax-ppss-cache-point-min syntax-ppss-narrow-point-min) + (setq syntax-ppss-cache-narrow syntax-ppss-cache + syntax-ppss-last-narrow syntax-ppss-last)) + (syntax-ppss-cache + (setq syntax-ppss-narrow-point-min syntax-ppss-cache-point-min + syntax-ppss-cache-narrow syntax-ppss-cache + syntax-ppss-last-narrow syntax-ppss-last)) + (t nil)) + + ;; Restore/initialize the cache for the new point-min. + (cond + ((eq (point-min) 1) + (setq syntax-ppss-cache syntax-ppss-cache-wide + syntax-ppss-last syntax-ppss-last-wide) + (save-restriction + (widen) + (syntax-ppss-invalidate-cache syntax-ppss-max-valid-wide))) + ((eq (point-min) syntax-ppss-narrow-point-min) + (setq syntax-ppss-cache syntax-ppss-cache-narrow + syntax-ppss-last syntax-ppss-last-narrow) + (save-restriction + (widen) + (syntax-ppss-invalidate-cache syntax-ppss-max-valid-narrow))) + (t + (setq syntax-ppss-cache nil + syntax-ppss-last nil))) + (setq syntax-ppss-cache-point-min (point-min)))) + +(defun syntax-ppss-invalidate-cache (beg &rest ignored) + "Invalidate the cache of `syntax-ppss' starting at position BEG." ;; Flush invalid cache entries. (while (and syntax-ppss-cache (> (caar syntax-ppss-cache) beg)) (setq syntax-ppss-cache (cdr syntax-ppss-cache))) @@ -411,6 +503,16 @@ syntax-ppss-flush-cache ;; (remove-hook 'before-change-functions 'syntax-ppss-flush-cache t)) ) +;; Retain the following two for compatibility reasons. +(defalias 'syntax-ppss-after-change-function 'syntax-ppss-flush-cache) +(defun syntax-ppss-flush-cache (beg &rest ignored) + "Flush the `syntax-ppss' caches and set `syntax-propertize--done'." + (setq syntax-ppss-supremum (min beg syntax-ppss-supremum)) + ;; Ensure the appropriate cache is active. + (syntax-ppss-set-cache) + (setq syntax-propertize--done (min beg syntax-propertize--done)) + (syntax-ppss-invalidate-cache beg ignored)) + (defvar syntax-ppss-stats [(0 . 0.0) (0 . 0.0) (0 . 0.0) (0 . 0.0) (0 . 0.0) (1 . 2500.0)]) (defun syntax-ppss-stats () @@ -434,6 +536,8 @@ syntax-ppss this function is called while `before-change-functions' is temporarily let-bound, or if the buffer is modified without running the hook." + ;; Ensure the appropriate cache is active. + (syntax-ppss-set-cache) ;; Default values. (unless pos (setq pos (point))) (syntax-propertize pos) > All the best, > Dmitry. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 10 07:47:41 2017 Received: (at 22983) by debbugs.gnu.org; 10 Sep 2017 11:47:41 +0000 Received: from localhost ([127.0.0.1]:58500 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dr0iC-0004yn-9p for submit@debbugs.gnu.org; Sun, 10 Sep 2017 07:47:41 -0400 Received: from ocolin.muc.de ([193.149.48.4]:23500 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1dr0i9-0004yd-Tb for 22983@debbugs.gnu.org; Sun, 10 Sep 2017 07:47:38 -0400 Received: (qmail 81620 invoked by uid 3782); 10 Sep 2017 11:47:34 -0000 Received: from acm.muc.de (p548C6F29.dip0.t-ipconnect.de [84.140.111.41]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sun, 10 Sep 2017 13:47:34 +0200 Received: (qmail 5594 invoked by uid 1000); 10 Sep 2017 11:42:34 -0000 Date: Sun, 10 Sep 2017 11:42:34 +0000 To: Dmitry Gutov Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170910114234.GC3588@ACM> References: <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170909102027.GB5194@ACM> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry. On Sat, Sep 09, 2017 at 15:18:11 +0300, Dmitry Gutov wrote: > On 9/9/17 1:20 PM, Alan Mackenzie wrote: > > In the implementation, I have left the function `syntax-ppss' untouched > > except for adding a function call to set up the cache right at the > > start. I have refactored syntax-ppss-flush-cache, extracting a function > > which is called directly from the cache-selecting code. Other than > > that, there is one new function (which switches the current cache in > > use) and a few new variables to keep track of the caches. > Not sure I understand. If you call (syntax-ppss) with significantly > different narrowings without flushing the cache (e.g. without modifying > the buffer), sounds like it'll have to return the same results under the > described implementation. > If so, it doesn't sound strict enough. On changing from one narrowing to another narrowing (more precisely, when point-min is changed, neither value being 1), the cache is flushed, even though the buffer has not been modified. Anyhow, I've posted a patch elsewhere on this thread. Comments on it would be welcome. [ .... ] -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 10 14:31:34 2017 Received: (at submit) by debbugs.gnu.org; 10 Sep 2017 18:31:34 +0000 Received: from localhost ([127.0.0.1]:59636 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dr712-0006B7-Mn for submit@debbugs.gnu.org; Sun, 10 Sep 2017 14:31:34 -0400 Received: from eggs.gnu.org ([208.118.235.92]:50714) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dr710-0006Ar-LL for submit@debbugs.gnu.org; Sun, 10 Sep 2017 14:31:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dr70u-0004mS-DQ for submit@debbugs.gnu.org; Sun, 10 Sep 2017 14:31:25 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:58813) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dr70u-0004mO-9N for submit@debbugs.gnu.org; Sun, 10 Sep 2017 14:31:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41685) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dr70s-0006L8-Sj for bug-gnu-emacs@gnu.org; Sun, 10 Sep 2017 14:31:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dr70p-0004lO-PR for bug-gnu-emacs@gnu.org; Sun, 10 Sep 2017 14:31:22 -0400 Received: from ocolin.muc.de ([193.149.48.4]:19956 helo=mail.muc.de) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1dr70p-0004jy-E3 for bug-gnu-emacs@gnu.org; Sun, 10 Sep 2017 14:31:19 -0400 Received: (qmail 5837 invoked by uid 3782); 10 Sep 2017 18:31:14 -0000 Received: from acm.muc.de (p548C6F29.dip0.t-ipconnect.de [84.140.111.41]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sun, 10 Sep 2017 20:31:13 +0200 Received: (qmail 12818 invoked by uid 1000); 10 Sep 2017 18:26:13 -0000 Date: Sun, 10 Sep 2017 18:26:13 +0000 To: Andreas =?iso-8859-1?Q?R=F6hler?= Subject: Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170910182613.GD3588@ACM> References: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-detected-operating-system: by eggs.gnu.org: FreeBSD 9.x [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -4.4 (----) X-Debbugs-Envelope-To: submit Cc: bug-gnu-emacs@gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -4.4 (----) Hello, Andreas. On Fri, Sep 08, 2017 at 18:04:37 +0200, Andreas Röhler wrote: > On 07.09.2017 22:45, Alan Mackenzie wrote: > > The solution I propose is to introduce a second cache into syntax-ppss, > > and this cache would be used whenever (not (eq (point-min) 1)). > > Whenever point-min changes, and isn't 1, this second cached would be > > calculated again from scratch. > > This proposal has these advantages: > > (i) It would make the function deliver what its unchanged doc string > > says. This is important, given that syntax-ppss has been very widely > > used within Emacs, and likely by external packages too; these will > > typically have assumed the advertised behaviour of the function, without > > having tested it in narrowed buffers. > > (i) In the case which currently works, namely a non-narrowed buffer, > > there would be only a minute slow-down (basically, there would be extra > > code to check point-min and select the cache to use). > > (ii) The cache for use in a narrowed buffer might well be sufficiently > > fast in normal use. If it is not, it could be enhanced readily. > Hi Alan and all, > assume a complex matter behind, a bunch of bugs resp. design issues, not > a single one. I don't think this bug is _that_ complex, and even if it has associated bugs, I think we can fix it on its own. > Fixing this would affect syntax-propertize, parse-partial-sexp, > syntax-ppss and font-lock stuff at once. I'll give you one out of four. ;-) syntax-ppss will definitely be affected, parse-partial-sexp definitely not, and the other two possibly in corner cases, but hopefully not. > http://lists.gnu.org/archive/html/emacs-devel/2016-03/msg01576.html > points at some spot. There should be more. I think, at least I hope, that is an orthoganol issue. > As a first step listing referential tests including benchmarks should be > helpful. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 10 18:53:57 2017 Received: (at 22983) by debbugs.gnu.org; 10 Sep 2017 22:53:57 +0000 Received: from localhost ([127.0.0.1]:59933 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drB6z-00044C-EY for submit@debbugs.gnu.org; Sun, 10 Sep 2017 18:53:57 -0400 Received: from pruche.dit.umontreal.ca ([132.204.246.22]:49542) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drB6x-000444-L2 for 22983@debbugs.gnu.org; Sun, 10 Sep 2017 18:53:56 -0400 Received: from ceviche.home (lechon.iro.umontreal.ca [132.204.27.242]) by pruche.dit.umontreal.ca (8.14.7/8.14.1) with ESMTP id v8AMrre9010349; Sun, 10 Sep 2017 18:53:54 -0400 Received: by ceviche.home (Postfix, from userid 20848) id A6873661FA; Sun, 10 Sep 2017 18:53:53 -0400 (EDT) From: Stefan Monnier To: Alan Mackenzie Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: References: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> Date: Sun, 10 Sep 2017 18:53:53 -0400 In-Reply-To: <20170910113626.GB3588@ACM> (Alan Mackenzie's message of "Sun, 10 Sep 2017 11:36:26 +0000") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-NAI-Spam-Flag: NO X-NAI-Spam-Threshold: 5 X-NAI-Spam-Score: 0 X-NAI-Spam-Rules: 2 Rules triggered EDT_SA_DN_PASS=0, RV6112=0 X-NAI-Spam-Version: 2.3.0.9418 : core <6112> : inlines <6061> : streams <1762466> : uri <2498304> X-Spam-Score: -4.1 (----) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org, Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -4.1 (----) > +;; Several caches. > +;; Because `syntax-ppss' is equivalent to (parse-partial-sexp > +;; (POINT-MIN) x), we need either to empty the cache when we narrow > +;; the buffer, which is suboptimal, or we need to use several caches. I think that (parse-partial-sexp 1 x) is more often what the caller wants than (parse-partial-sexp (point-min) x), but if you're happy with the behavior described by the docstring, then that's fine. > +;; The implementation which follows uses three caches, the current one > +;; (in `syntax-ppss-cache' and `syntax-ppss-last') and two inactive > +;; ones (in `syntax-ppss-{cache,last}-{wide,narrow}'), which store the > +;; former state of the active cache as it was used in widened and > +;; narrowed buffers respectively. Earlier in the thread, I suggested to use a single cache indexed by the position of point-min (or by the position and point-min and by the current syntax-table, so as to also handle changes in the syntax-table), i.e. a list of (POINT-MIN-POS . CACHE-DATA) or ((POINT-MIN-POS . SYNTAX-TABLE) . CACHE-DATA). I think it would lead to less code duplication than your patch which only handles 2 different POINT-MIN-POS (and one of the two has to be equal to 1), but existing code trumps hypothetical designs. So, I have no objections to the patch. But I think (parse-partial-sexp (point-min) x) is a design bug in syntax-ppss which we will need to fix sooner or later, which is why I never bothered to implement something like your patch, which only makes the code do what its doc says rather than what the caller needs. Stefan From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 10 19:37:03 2017 Received: (at 22983) by debbugs.gnu.org; 10 Sep 2017 23:37:03 +0000 Received: from localhost ([127.0.0.1]:59974 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drBmh-00055h-Gm for submit@debbugs.gnu.org; Sun, 10 Sep 2017 19:37:03 -0400 Received: from mail-lf0-f48.google.com ([209.85.215.48]:37145) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drBmg-000557-45 for 22983@debbugs.gnu.org; Sun, 10 Sep 2017 19:37:02 -0400 Received: by mail-lf0-f48.google.com with SMTP id 80so14660591lfy.4 for <22983@debbugs.gnu.org>; Sun, 10 Sep 2017 16:37:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=zW8zqM4J3SOi5YarornyCQBYieyRaXCOc8QitX9Nj0I=; b=s18mmCKh/HY4EJFOyi3qJfH4oT7moYt0pM9DuxMXsH5bcR9FBE5P/SoyXWnFy0MyMA C1y3i/P/wyBrWyOvBdb5j7bPLjrdxH8tYgzHJoTsAKRzA0Fa/RSETzIHV3hqfbrvXtOA 2f67BKaxepyNk2ukJb+bX0qkt30EfS5Af9klCcXkU4T+mTi1t/FEFTUUyC0+7010vIkv iBgR4tyoVnvP6p5Dkir7y5OIfppynkMrSc7wcCj6/bDUs5Et84O6Fd2XKcJLxMBNlmSN otNOyJV83n1sB2vTVwUja1J+RJTQMefTfGo7qg313WAk0HnAo4rVvFP2L7lYuaWiw+/E oRZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=zW8zqM4J3SOi5YarornyCQBYieyRaXCOc8QitX9Nj0I=; b=svPnOlza8R0bNRQtH9uOopOQh/xGInLcnGNAgU+zJUVAgPvoDswTBCrBosDWLMcPdf dKpWPwbuPaiUgW8P0yHxDtE2VyuCQea6Oj7PEnbjxq+6VsalKCr8q1G/6AkPUQIITeqe SH+1LteoOXM2GTGmj72e32rDXSoymjlEUtLWzHXfv6D/Ld+cTxFcBGKHhJnyipbG6Tya uYGmPxjuGKEFf+bA4XtAVASvvAM7Hq1P3spARCpDVy1wp4g/MoawFFIeLF96KNPolMA0 nmNO6ZPhW5Znn5cykXBUPhzcUh4x7uKVS5q+vz29KtIvMKQoU9t/vFfxHFfgqIui7LSf oYng== X-Gm-Message-State: AHPjjUiBpVrR9WPrtumUtU3JCW2Q4mNlXt+DkFUCbrZL3mTq7k/S4MSV ST9LnanCeldnFxfK/jw= X-Google-Smtp-Source: ADKCNb5f3D6yEMZRa4hFOyR5v0MvdZIF7zc1PseWTIWmKxD/6lKaX9Rami863XWhCbmyRyHEpFYIbw== X-Received: by 10.46.85.145 with SMTP id g17mr4151542lje.46.1505086615840; Sun, 10 Sep 2017 16:36:55 -0700 (PDT) Received: from [192.168.1.174] ([178.252.127.239]) by smtp.googlemail.com with ESMTPSA id d82sm21616lfl.32.2017.09.10.16.36.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 10 Sep 2017 16:36:54 -0700 (PDT) Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. To: Stefan Monnier , Alan Mackenzie References: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> From: Dmitry Gutov Message-ID: Date: Mon, 11 Sep 2017 02:36:53 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/11/17 1:53 AM, Stefan Monnier wrote: > I think that (parse-partial-sexp 1 x) is more often what the caller > wants than (parse-partial-sexp (point-min) x), but if you're happy with > the behavior described by the docstring, then that's fine. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.48 listed in list.dnswl.org] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.48 listed in wl.mailspike.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.48 listed in dnsbl.sorbs.net] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/11/17 1:53 AM, Stefan Monnier wrote: > I think that (parse-partial-sexp 1 x) is more often what the caller > wants than (parse-partial-sexp (point-min) x), but if you're happy with > the behavior described by the docstring, then that's fine. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.48 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.48 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.48 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders On 9/11/17 1:53 AM, Stefan Monnier wrote: > I think that (parse-partial-sexp 1 x) is more often what the caller > wants than (parse-partial-sexp (point-min) x), but if you're happy with > the behavior described by the docstring, then that's fine. And yet, I struggle to find such callers. But those that do, can (save-restriction (widen) (syntax-ppss)) anyway. >> +;; The implementation which follows uses three caches, the current one >> +;; (in `syntax-ppss-cache' and `syntax-ppss-last') and two inactive >> +;; ones (in `syntax-ppss-{cache,last}-{wide,narrow}'), which store the >> +;; former state of the active cache as it was used in widened and >> +;; narrowed buffers respectively. > > Earlier in the thread, I suggested to use a single cache indexed by the > position of point-min That would lead to clobbering the global cache when we use syntax-ppss for some local parsing. E.g. if ruby-syntax-propertize-percent-literal didn't bind parse-sexp-lookup-properties to nil, it might clobber the cache unnecessarily. I don't have the data on whether this would be a frequent problem, though. > i.e. a list of (POINT-MIN-POS . CACHE-DATA) or > ((POINT-MIN-POS . SYNTAX-TABLE) . CACHE-DATA). I think it would lead to > less code duplication than your patch which only handles 2 different > POINT-MIN-POS (and one of the two has to be equal to 1), but existing > code trumps hypothetical designs. I also think there's a way to implement this behavior with less code and new variables, albeit with extra indirection. > So, I have no objections to the patch. But I think (parse-partial-sexp > (point-min) x) is a design bug in syntax-ppss which we will need to fix > sooner or later, which is why I never bothered to implement something > like your patch, which only makes the code do what its doc says rather > than what the caller needs. I'm considering the idea now that syntax-ppss should stay a caching wrapper around parse-partial-sexp, and the responsibility to widen should always be the caller's. This way, it can be used for different purposes that we've discussed before many times. From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 10 20:11:33 2017 Received: (at 22983) by debbugs.gnu.org; 11 Sep 2017 00:11:33 +0000 Received: from localhost ([127.0.0.1]:59992 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drCK5-0005qx-Jv for submit@debbugs.gnu.org; Sun, 10 Sep 2017 20:11:33 -0400 Received: from mail-lf0-f46.google.com ([209.85.215.46]:38024) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drCK3-0005qk-JB for 22983@debbugs.gnu.org; Sun, 10 Sep 2017 20:11:31 -0400 Received: by mail-lf0-f46.google.com with SMTP id q132so14689845lfe.5 for <22983@debbugs.gnu.org>; Sun, 10 Sep 2017 17:11:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=z1fHovxFSILz2ChmZAkPcdHQhzXuvE6UOWs+IIA6hVU=; b=qYBiLIhZ1Ii0b7c688xtPshBK0/zLAZSn7RZGzhVgTc56eLpvchRlByNaxCb/ImV2K ywNnuc+/H6Ckm4IiaUgxsQPY+zcT9vi1lwi6XdvAO4EuOH5Gzcp2j8cpqf3+zILyd7Cl r22lXeqYsSbWRF3xuZq3piAtY+g6sxU67NNHIuWPMfBdG1Blh54k5Rw3Jni9tlp621Sn lz8Q9eEJ3+LNBIgEwVnT8c2w1I2IokhMFRUh0zhIO6/1xG/hVT97zCT48E+CxXRfRV53 ZoRTIeMnkR71vK57eHuKn+VU1ewahfPX8FOoRLAhphAHd+zfY4kiXM5JucTkDf/xMXh1 TjnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=z1fHovxFSILz2ChmZAkPcdHQhzXuvE6UOWs+IIA6hVU=; b=dUu/Qv9uIbrviI0SYn1wOmaqyM8SNCmMCWgZ6dS7v38D8xeGPwTQWojx5hUBzM24U/ X+d72EES/iySa0YAzkc2m0/2YIwaB6QUGmqB43p16V5AnHKbWbVIUea8UHNyIm7bsSGE a1ekBp71VSQH1LdsRR9nTlSwpRBwE/zxiH65kD4UXZkeR9t5kDvSsH6Lect3ymyS7paf C2+VFTpAw5KMkeiFNPVj/vuK8vt3lzKqsKL9FJUpG3uyjRObph7oiPtUZ1zf6BsVUvNy u6DpB5/Xiu3FPy2pg0WGwTtYqhdfjyCMhIxWIO697DHcuKMvfZ2ZZqkBUXuOoMaS4JZ+ Qbww== X-Gm-Message-State: AHPjjUgh4cf0XuqHBkhUAhFPkXx0tGbWfuOFxZ5h/9J97OoTF/1qHzxF wxid4ePcY5Jeu0p7smI= X-Google-Smtp-Source: ADKCNb7i9O9RZHvY5vkGtybok9J4JMa2IWGOb5IY+BDt6Sr+wWFSvL6/fUJcBI5a/S0pUPlApQ+7iA== X-Received: by 10.46.32.196 with SMTP id g65mr3106675lji.62.1505088685506; Sun, 10 Sep 2017 17:11:25 -0700 (PDT) Received: from [192.168.1.174] ([178.252.127.239]) by smtp.googlemail.com with ESMTPSA id b4sm138505lfg.90.2017.09.10.17.11.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 10 Sep 2017 17:11:24 -0700 (PDT) Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie , Philipp Stephani References: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> From: Dmitry Gutov Message-ID: Date: Mon, 11 Sep 2017 03:11:22 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: <20170910113626.GB3588@ACM> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/10/17 2:36 PM, Alan Mackenzie wrote: >>> The solution I propose is to introduce a second cache into syntax-ppss, >>> and this cache would be used whenever (not (eq (point-min) 1)). >>> Whenever point-min changes, and isn't 1, this second cached would be >>> calculated again from scratch. > > Here is a patch implementing this. Comments about it would be welcome. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.46 listed in dnsbl.sorbs.net] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.46 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.46 listed in list.dnswl.org] 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/10/17 2:36 PM, Alan Mackenzie wrote: >>> The solution I propose is to introduce a second cache into syntax-ppss, >>> and this cache would be used whenever (not (eq (point-min) 1)). >>> Whenever point-min changes, and isn't 1, this second cached would be >>> calculated again from scratch. > > Here is a patch implementing this. Comments about it would be welcome. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.46 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.46 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.46 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (raaahh[at]gmail.com) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders On 9/10/17 2:36 PM, Alan Mackenzie wrote: >>> The solution I propose is to introduce a second cache into syntax-ppss, >>> and this cache would be used whenever (not (eq (point-min) 1)). >>> Whenever point-min changes, and isn't 1, this second cached would be >>> calculated again from scratch. > > Here is a patch implementing this. Comments about it would be welcome. Thank you. It seems to hold up to the main test scenario I had in mind, so I don't have any complaints behavior-wise. It looks pretty big, though. With lots of new global variables. Before, we had syntax-ppss-cache and syntax-ppss-last. The patch adds 8 new ones. I propose two avenues for simplification: 1) Use a cons structure for the (PPSS-CACHE . PPSS-LAST) structure. We will have three global variables total: syntax-ppss-data-wide, syntax-ppss-data-narrow, syntax-ppss-data-narrow-point-min. syntax-ppss would bind a local variable syntax-ppss-data to one of the first two depending on the value of the third (and then modify its car and cdr during the course of execution). 2) Some extra vars serve to delay the actual clearing of the unused cache until it's used again. It's a valid idea, but what if we try without it at first? So syntax-ppss-flush-cache would always clear both caches eagerly. The advantages: - Less code, easier to reason about. - Any package than advises syntax-ppss will have to juggle fewer global variables. So Vatalie's polymode will have an easier time of it. It could even reuse some of the cache-while-narrowed logic by substituting the values of syntax-ppss-data-narrow and syntax-ppss-data-narrow-point-min as appropriate. The obvious downside is, of course, extra indirection, which translates to extra overhead. We don't know how significant it will be, though. Would you like to see the code? From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 11 07:10:54 2017 Received: (at 22983) by debbugs.gnu.org; 11 Sep 2017 11:10:54 +0000 Received: from localhost ([127.0.0.1]:60585 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drMc9-0006Tt-Sn for submit@debbugs.gnu.org; Mon, 11 Sep 2017 07:10:54 -0400 Received: from pruche.dit.umontreal.ca ([132.204.246.22]:56173) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drMc8-0006Tl-BC for 22983@debbugs.gnu.org; Mon, 11 Sep 2017 07:10:53 -0400 Received: from ceviche.home (lechon.iro.umontreal.ca [132.204.27.242]) by pruche.dit.umontreal.ca (8.14.7/8.14.1) with ESMTP id v8BBAoJd015958; Mon, 11 Sep 2017 07:10:51 -0400 Received: by ceviche.home (Postfix, from userid 20848) id 8D23E66257; Mon, 11 Sep 2017 07:10:50 -0400 (EDT) From: Stefan Monnier To: Dmitry Gutov Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: References: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> Date: Mon, 11 Sep 2017 07:10:50 -0400 In-Reply-To: (Dmitry Gutov's message of "Mon, 11 Sep 2017 02:36:53 +0300") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-NAI-Spam-Flag: NO X-NAI-Spam-Threshold: 5 X-NAI-Spam-Score: 0 X-NAI-Spam-Rules: 2 Rules triggered EDT_SA_DN_PASS=0, RV6112=0 X-NAI-Spam-Version: 2.3.0.9418 : core <6112> : inlines <6061> : streams <1762538> : uri <2498582> X-Spam-Score: -4.1 (----) X-Debbugs-Envelope-To: 22983 Cc: Alan Mackenzie , Philipp Stephani , 22983@debbugs.gnu.org, John Wiegley X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -4.1 (----) >> I think that (parse-partial-sexp 1 x) is more often what the caller >> wants than (parse-partial-sexp (point-min) x), but if you're happy with >> the behavior described by the docstring, then that's fine. > And yet, I struggle to find such callers. But those that do, can > (save-restriction (widen) (syntax-ppss)) anyway. Good point. >>> +;; The implementation which follows uses three caches, the current one >>> +;; (in `syntax-ppss-cache' and `syntax-ppss-last') and two inactive >>> +;; ones (in `syntax-ppss-{cache,last}-{wide,narrow}'), which store the >>> +;; former state of the active cache as it was used in widened and >>> +;; narrowed buffers respectively. >> Earlier in the thread, I suggested to use a single cache indexed by the >> position of point-min > That would lead to clobbering the global cache when we use syntax-ppss for > some local parsing. My suggestion is to have a list of N caches, instead of having exactly 2 caches. I can't see how that could lead to more clobbering. > I'm considering the idea now that syntax-ppss should stay a caching wrapper > around parse-partial-sexp, and the responsibility to widen should always be > the caller's. This way, it can be used for different purposes that we've > discussed before many times. It does have the advantage of circumventing the discussion of "up-to-where should we widen" ;-) Stefan From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 11 15:47:56 2017 Received: (at 22983) by debbugs.gnu.org; 11 Sep 2017 19:47:56 +0000 Received: from localhost ([127.0.0.1]:34045 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drUgW-000486-JX for submit@debbugs.gnu.org; Mon, 11 Sep 2017 15:47:56 -0400 Received: from ocolin.muc.de ([193.149.48.4]:23685 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1drUgU-00047r-Ea for 22983@debbugs.gnu.org; Mon, 11 Sep 2017 15:47:54 -0400 Received: (qmail 19711 invoked by uid 3782); 11 Sep 2017 19:47:51 -0000 Received: from acm.muc.de (p548C7BC7.dip0.t-ipconnect.de [84.140.123.199]) by colin.muc.de (tmda-ofmipd) with ESMTP; Mon, 11 Sep 2017 21:47:50 +0200 Received: (qmail 4910 invoked by uid 1000); 11 Sep 2017 19:42:38 -0000 Date: Mon, 11 Sep 2017 19:42:38 +0000 To: Stefan Monnier Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170911194238.GB3605@ACM> References: <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org, Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Stefan. On Sun, Sep 10, 2017 at 18:53:53 -0400, Stefan Monnier wrote: > > +;; Several caches. > > +;; Because `syntax-ppss' is equivalent to (parse-partial-sexp > > +;; (POINT-MIN) x), we need either to empty the cache when we narrow > > +;; the buffer, which is suboptimal, or we need to use several caches. > I think that (parse-partial-sexp 1 x) is more often what the caller > wants than (parse-partial-sexp (point-min) x), but if you're happy with > the behavior described by the docstring, then that's fine. I've never been happy with the specification, partly for that reason, but we are where we are, with lots of use of syntax-ppss, so I think it needs fixing according to that spec. > > +;; The implementation which follows uses three caches, the current one > > +;; (in `syntax-ppss-cache' and `syntax-ppss-last') and two inactive > > +;; ones (in `syntax-ppss-{cache,last}-{wide,narrow}'), which store the > > +;; former state of the active cache as it was used in widened and > > +;; narrowed buffers respectively. > Earlier in the thread, I suggested to use a single cache indexed by the > position of point-min (or by the position and point-min and by the > current syntax-table, so as to also handle changes in the syntax-table), > i.e. a list of (POINT-MIN-POS . CACHE-DATA) or > ((POINT-MIN-POS . SYNTAX-TABLE) . CACHE-DATA). I think it would lead to > less code duplication than your patch which only handles 2 different > POINT-MIN-POS (and one of the two has to be equal to 1), but existing > code trumps hypothetical designs. I deliberately kept the patch simple, avoiding even an alist with the point-min position as key. This would necessitate having an arbitrary maximum length of alist, and continual manipulation of this list. Not difficult, I agree, but do we need it? How often are there going to be nested or alternating narrowing with enough calls to syntax-ppss to cause the establishment of syntax-ppss-cache (as opposed to merely syntax-ppss-last, which my patch doesn't consider sufficient reason to store a new narrow-cache)? (These aren't rhetorical questions, by the way, but real ones. Which is the best way forward?) However, the patch was deliberately contructed to make the replacement of the two-cache cache by an arbitrary length alist simple. > So, I have no objections to the patch. But I think (parse-partial-sexp > (point-min) x) is a design bug in syntax-ppss which we will need to fix > sooner or later, which is why I never bothered to implement something > like your patch, which only makes the code do what its doc says rather > than what the caller needs. I couldn't agree more. However, syntax-ppss is established and there are callers that depend on its literal specification. Maybe a way forward would be to introduce a new function equivalent to (parse-partial-sexp 1 x) and deprecate syntax-ppss. However, a name would need to be found for this new function, not an easy task. ;-) (syntax-ppss is a very good name, but couldn't be reused.) > Stefan -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 11 16:17:20 2017 Received: (at 22983) by debbugs.gnu.org; 11 Sep 2017 20:17:20 +0000 Received: from localhost ([127.0.0.1]:34102 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drV8y-0004p3-9k for submit@debbugs.gnu.org; Mon, 11 Sep 2017 16:17:20 -0400 Received: from ocolin.muc.de ([193.149.48.4]:62007 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1drV8v-0004ot-Vs for 22983@debbugs.gnu.org; Mon, 11 Sep 2017 16:17:18 -0400 Received: (qmail 25234 invoked by uid 3782); 11 Sep 2017 20:17:16 -0000 Received: from acm.muc.de (p548C7BC7.dip0.t-ipconnect.de [84.140.123.199]) by colin.muc.de (tmda-ofmipd) with ESMTP; Mon, 11 Sep 2017 22:17:15 +0200 Received: (qmail 4983 invoked by uid 1000); 11 Sep 2017 20:12:04 -0000 Date: Mon, 11 Sep 2017 20:12:04 +0000 To: Dmitry Gutov Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170911201204.GC3605@ACM> References: <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry. On Mon, Sep 11, 2017 at 03:11:22 +0300, Dmitry Gutov wrote: > On 9/10/17 2:36 PM, Alan Mackenzie wrote: > >>> The solution I propose is to introduce a second cache into syntax-ppss, > >>> and this cache would be used whenever (not (eq (point-min) 1)). > >>> Whenever point-min changes, and isn't 1, this second cached would be > >>> calculated again from scratch. > > Here is a patch implementing this. Comments about it would be welcome. > Thank you. It seems to hold up to the main test scenario I had in mind, > so I don't have any complaints behavior-wise. Thanks. > It looks pretty big, though. With lots of new global variables. > Before, we had syntax-ppss-cache and syntax-ppss-last. The patch adds 8 > new ones. Yes. But each one has a very single purpose, and there are no loops in the new code, which makes it easier to be sure it is correct. > I propose two avenues for simplification: > 1) Use a cons structure for the (PPSS-CACHE . PPSS-LAST) structure. We > will have three global variables total: syntax-ppss-data-wide, > syntax-ppss-data-narrow, syntax-ppss-data-narrow-point-min. syntax-ppss > would bind a local variable syntax-ppss-data to one of the first two > depending on the value of the third (and then modify its car and cdr > during the course of execution). I'm in favour rather of setting syntax-ppss-{cache,last} to the appropriate stored cache. This will avoid needing to change the function syntax-ppss much. A disadvantage of using such a cons is in debugging. It is more difficult to understand a cons like this when it is printed out, than the two component lists (which are difficult enough themselves). > 2) Some extra vars serve to delay the actual clearing of the unused > cache until it's used again. It's a valid idea, but what if we try > without it at first? So syntax-ppss-flush-cache would always clear both > caches eagerly. When there's a lot of buffer changing going on, it is an overhead having to clear both (or several) caches continually. (I'm thinking about the possible extension to using an alist of caches, which could be quite long.) Also clearing both caches at the same time would be a bigger change to syntax-ppss-flush-cache than it's suffered so far. But I'm really not sure which way is better. > The advantages: > - Less code, easier to reason about. > - Any package than advises syntax-ppss will have to juggle fewer global > variables. I was intending that the new variables be purely internal, and that no external elisp would need to access them. I suppose I really ought to have put "--" in the middle of their names. > So Vatalie's polymode will have an easier time of it. It could even > reuse some of the cache-while-narrowed logic by substituting the > values of syntax-ppss-data-narrow and > syntax-ppss-data-narrow-point-min as appropriate. That sounds a little dangerous. > The obvious downside is, of course, extra indirection, which translates > to extra overhead. We don't know how significant it will be, though. I wouldn't be keen on seeing lots of (car compound-variable) and (cdr compound-variable) throughout the syntax-ppss function. I think it would make it significantly more difficult to understand. > Would you like to see the code? Yes, why not? But just to make my position clear, I'm not particularly fixed on my patch as submitted. It was optimised for simplicity and correctness rather than elegance, though I don't think it's too bad. I'm fairly open on whether we use your suggestions or Stefan's suggestion of having an alist of caches. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 11 16:20:05 2017 Received: (at 22983) by debbugs.gnu.org; 11 Sep 2017 20:20:05 +0000 Received: from localhost ([127.0.0.1]:34115 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drVBd-0004u4-1f for submit@debbugs.gnu.org; Mon, 11 Sep 2017 16:20:05 -0400 Received: from pruche.dit.umontreal.ca ([132.204.246.22]:58449) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drVBb-0004tw-Fb for 22983@debbugs.gnu.org; Mon, 11 Sep 2017 16:20:04 -0400 Received: from lechazo.home (lechon.iro.umontreal.ca [132.204.27.242]) by pruche.dit.umontreal.ca (8.14.7/8.14.1) with ESMTP id v8BKK2Ag004690; Mon, 11 Sep 2017 16:20:02 -0400 Received: by lechazo.home (Postfix, from userid 20848) id 7A8E060136; Mon, 11 Sep 2017 16:20:02 -0400 (EDT) From: Stefan Monnier To: Alan Mackenzie Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: References: <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> <20170911194238.GB3605@ACM> Date: Mon, 11 Sep 2017 16:20:02 -0400 In-Reply-To: <20170911194238.GB3605@ACM> (Alan Mackenzie's message of "Mon, 11 Sep 2017 19:42:38 +0000") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-NAI-Spam-Flag: NO X-NAI-Spam-Threshold: 5 X-NAI-Spam-Score: 0 X-NAI-Spam-Rules: 2 Rules triggered EDT_SA_DN_PASS=0, RV6113=0 X-NAI-Spam-Version: 2.3.0.9418 : core <6113> : inlines <6063> : streams <1762593> : uri <2498798> X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org, Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.3 (-) > difficult, I agree, but do we need it? How often are there going to be > nested or alternating narrowing with enough calls to syntax-ppss to > cause the establishment of syntax-ppss-cache (as opposed to merely > syntax-ppss-last, which my patch doesn't consider sufficient reason to > store a new narrow-cache)? (These aren't rhetorical questions, by the > way, but real ones. Which is the best way forward?) I agree that it probably doesn't make much difference in practice. > I couldn't agree more. However, syntax-ppss is established and there > are callers that depend on its literal specification. Maybe a way > forward would be to introduce a new function equivalent to > (parse-partial-sexp 1 x) and deprecate syntax-ppss. However, a name > would need to be found for this new function, not an easy task. ;-) > (syntax-ppss is a very good name, but couldn't be reused.) Let's go with your patch for now, and then see if Dmitry's impression that adding a call to `widen` before the call works even better. Stefan From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 11 20:11:26 2017 Received: (at 22983) by debbugs.gnu.org; 12 Sep 2017 00:11:26 +0000 Received: from localhost ([127.0.0.1]:34342 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drYnV-00043z-Sj for submit@debbugs.gnu.org; Mon, 11 Sep 2017 20:11:26 -0400 Received: from mail-lf0-f52.google.com ([209.85.215.52]:33160) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drYnU-00043l-CU for 22983@debbugs.gnu.org; Mon, 11 Sep 2017 20:11:24 -0400 Received: by mail-lf0-f52.google.com with SMTP id c80so22436223lfh.0 for <22983@debbugs.gnu.org>; Mon, 11 Sep 2017 17:11:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=3MxNiNQqzgfjFF1cy5I/wNFz6eRe3WtzUPRvhHqgqJ8=; b=Q38F4JMwcfagiLWLimsbNF168DRspu+SU0VfYdegLug6+Rz2XfVYQPruQQqj6YTLSZ hZpysey3/GRuBIuF1acZiooYg2A60Vtk6g46ZIb0HhpMoyItf6H6FcQAGFgfZmL7zAay 9SqJHHqOR5i1T4K568QColQocmLZveuFZqd53pOZ84TGs3lE+qEYc9kSImc85vC6qjFo te8I+vkAXk+Bb+GyMMQEGMgvqHT/R+plcykIBw6RQQVOykla2VAM3Sigwx6lx6xR6zc1 ilaY72/+JnR2do3slpEITTZaevpBS5e4B4Q6ZWmP0muPps4PhywJqtrgQ75icQWKxFaJ Tq8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=3MxNiNQqzgfjFF1cy5I/wNFz6eRe3WtzUPRvhHqgqJ8=; b=C9Q5d6yEHAHy2r9zqKyxP/UE+tgCRnuFsSSzULGA1jWiQifYsFWrsHKEAQs1aQkXjY cdYZKoIUkpU7gqMf+L/7KKL15ij0+utmt/ZOYvfWxUN3pwycY6yWd3I/Dj/tSyVt5vxP 0SQTni0KZeExkeap1uUAB70vFRyW5GxQlFdTR6qrtQ5v+7HykrMwGw870RiNXopTQr+j 2jT1NkKjbaCKDUzSzTI5WzyB9g99cSQocJw8JLW377vwkb5c/CtPVRIhT9oVUFgC4hek vpcU9wYkpBeVje5BQ0zTVeNLLWF5aMXeR4ZAhLyMC0J7bWIsUtIXD7cYwH8GEIdre7Bi MCBg== X-Gm-Message-State: AHPjjUhlhgIfMOorQdu8CDYPkk2COGLTsMQdafPlQGWoZ+CkW2Kfl1BY j4L66qJqOQLTcFAKRAY= X-Google-Smtp-Source: AOwi7QAnAQC7ZSi/lVqxXQpIAlje2g9nELQ81UdCBrpAEgJXHi4DBBQhe8YxBoIyD4moGk8+xPIbNA== X-Received: by 10.25.159.146 with SMTP id i140mr3763782lfe.253.1505175078253; Mon, 11 Sep 2017 17:11:18 -0700 (PDT) Received: from [192.168.1.174] ([178.252.127.239]) by smtp.googlemail.com with ESMTPSA id m12sm567851lje.21.2017.09.11.17.11.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Sep 2017 17:11:16 -0700 (PDT) Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. To: Stefan Monnier References: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> From: Dmitry Gutov Message-ID: <922d661a-3962-4284-1a24-23c614ccdf04@yandex.ru> Date: Tue, 12 Sep 2017 03:11:15 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/11/17 2:10 PM, Stefan Monnier wrote: > My suggestion is to have a list of N caches, instead of having exactly > 2 caches. I can't see how that could lead to more clobbering. Um, sorry I misunderstood. I interpreted that as only keeping one pair. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.52 listed in dnsbl.sorbs.net] 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.52 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.52 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (raaahh[at]gmail.com) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: 22983 Cc: Alan Mackenzie , Philipp Stephani , 22983@debbugs.gnu.org, John Wiegley X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/11/17 2:10 PM, Stefan Monnier wrote: > My suggestion is to have a list of N caches, instead of having exactly > 2 caches. I can't see how that could lead to more clobbering. Um, sorry I misunderstood. I interpreted that as only keeping one pair. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.52 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.52 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.52 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders On 9/11/17 2:10 PM, Stefan Monnier wrote: > My suggestion is to have a list of N caches, instead of having exactly > 2 caches. I can't see how that could lead to more clobbering. Um, sorry I misunderstood. I interpreted that as only keeping one pair. But here are some other issues: 1) If we maintain a cache for all narrowings that have ever been used in the buffer, we adopt the idea that all of them are "real" and e.g. correspond to chunks in different major modes in a multi-mode context. Switching to a different syntax table and parsing a segment of text like ruby-syntax-propertize-percent-literal does falls outside of this concept. But of course, we can index by syntax table as well... overall, things become much complex than when changing the narrowing bounds implies just throwing away that cache. 2) If there are a lot of elements inside the cache alist, we have to get rid of them from time to time. Not sure what the rules will be. Again, if they correspond to multi-mode chunks, we can at least be confident that the number of items in the alist will be finite. Not necessarily so if narrowing+spss is used for arbitrary purposes. 3) As the number of elements in the alist grows, flushing each value inside syntax-ppss-flush-cache eagerly will become slower and slower, I expect. And a lazy strategy of the kind proposed by Alan will become necessary. >> I'm considering the idea now that syntax-ppss should stay a caching wrapper >> around parse-partial-sexp, and the responsibility to widen should always be >> the caller's. This way, it can be used for different purposes that we've >> discussed before many times. > > It does have the advantage of circumventing the discussion of > "up-to-where should we widen" ;-) Indeed. :) From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 11 20:24:19 2017 Received: (at 22983) by debbugs.gnu.org; 12 Sep 2017 00:24:19 +0000 Received: from localhost ([127.0.0.1]:34351 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drYzz-0004OB-2U for submit@debbugs.gnu.org; Mon, 11 Sep 2017 20:24:19 -0400 Received: from mail-lf0-f54.google.com ([209.85.215.54]:33978) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drYzx-0004Nw-3B for 22983@debbugs.gnu.org; Mon, 11 Sep 2017 20:24:17 -0400 Received: by mail-lf0-f54.google.com with SMTP id l196so22449308lfl.1 for <22983@debbugs.gnu.org>; Mon, 11 Sep 2017 17:24:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=/h/GGMCKbT60I7d5zLUtVSkDPGXJPYXbY4F/+Z9sN2o=; b=gTrVVdZ1h3NyMBe00LbwrIOKnh+GbN2WeeZA++scrWtb3AyTLnP0s61i23pG77DeSs gWdUKy+0CHQ8WZ7kqzaXQHsDdUVJ4LnntQmEfsfzyJvO31cDywziEpAOg8G3gZ8ZDRHH rnjU9dGoGijmsfyNdnCxtKAUczzNt9dBUr+d9Fiv1Vc1Fc4dsW9yMWbJAhjr9Lywnoak nVLGZP0rOa33EdrfT4vXgMbcVc/suCmntGwf1uVpbKXvKaT9l2q/op09U5w+bsU9lqgV KLDipcud6fqX8ccBh/o4YhKpn/Te2+AZBXipJwDSjEK1Vc0vDqOugc5yBK0PtHkkdQYC 1y1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=/h/GGMCKbT60I7d5zLUtVSkDPGXJPYXbY4F/+Z9sN2o=; b=BhQFBNI2wMErL+9iMFmuBcU2/eEU48MfJdhDerHBHM5y81haVGYO7nAyiy/OaSCOE2 Zu487h0eB7JAe1f3LVvaSuVX6Ugpm5gs4V2mSavQojIzDsqZOt/R6OEjCasBieBiJiu2 Fvlu8bOgBWkavQtTOMfm4DqgU/cfId+2hXoFD9troiH62zNL/tKnD36HjCyGVUSUwVYD l+R0QL2y1D+zYC5Tx4SiA/uPOdj0luzUuYBjBU4rdzMcdzBzECkP2vMxuPjtjSYt9Ruz Vi/vgXayAvJ2pf/mlYoF3kA4L9pK3yT5B49UfN/imky6AscMi+52wqxxEKaitVnQPczD aOeg== X-Gm-Message-State: AHPjjUijWQ3hlR1MO2wSFpGBueUj/6cOhmkGaQaZgHj8LXxMb8FlLvIj qmLTWdgoUxRKFBX6NWk= X-Google-Smtp-Source: AOwi7QCf05z2QmcD6vqhK4v9e0+wbAtlT5Sjq8TppndBqYF+ZOKn2O8/C3i/gLJ7e+8R6KSDpUOlVQ== X-Received: by 10.46.0.39 with SMTP id 39mr1620735lja.13.1505175850880; Mon, 11 Sep 2017 17:24:10 -0700 (PDT) Received: from [192.168.1.174] ([178.252.127.239]) by smtp.googlemail.com with ESMTPSA id r80sm1447332lfi.68.2017.09.11.17.24.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Sep 2017 17:24:10 -0700 (PDT) Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie References: <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> <20170911201204.GC3605@ACM> From: Dmitry Gutov Message-ID: Date: Tue, 12 Sep 2017 03:24:08 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: <20170911201204.GC3605@ACM> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/11/17 11:12 PM, Alan Mackenzie wrote: >> Before, we had syntax-ppss-cache and syntax-ppss-last. The patch adds 8 >> new ones. > > Yes. But each one has a very single purpose, and there are no loops in > the new code, which makes it easier to be sure it is correct. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.54 listed in dnsbl.sorbs.net] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.54 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.54 listed in list.dnswl.org] 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/11/17 11:12 PM, Alan Mackenzie wrote: >> Before, we had syntax-ppss-cache and syntax-ppss-last. The patch adds 8 >> new ones. > > Yes. But each one has a very single purpose, and there are no loops in > the new code, which makes it easier to be sure it is correct. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.54 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.54 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.54 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (raaahh[at]gmail.com) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders On 9/11/17 11:12 PM, Alan Mackenzie wrote: >> Before, we had syntax-ppss-cache and syntax-ppss-last. The patch adds 8 >> new ones. > > Yes. But each one has a very single purpose, and there are no loops in > the new code, which makes it easier to be sure it is correct. On the one hand, yes, on the other hand, the more code you have (or the more vars you have to juggle), the harder it is to keep track. > I'm in favour rather of setting syntax-ppss-{cache,last} to the > appropriate stored cache. This will avoid needing to change the > function syntax-ppss much. My proposal will change syntax-ppss, yes. So, unfortunately, the patch will be more difficult to read. But not the resulting code, hopefully. But I think I see what you mean. The disadvantage is that we'll need code that will ferry those values back to the appropriate variables as well (which we see in your patch). We can discuss that option after. > A disadvantage of using such a cons is in debugging. It is more > difficult to understand a cons like this when it is printed out, than > the two component lists (which are difficult enough themselves). You win some, you lose some. We could use structs, if you like, but overall, the values are already complex, so consing won't make that much worse. > When there's a lot of buffer changing going on, it is an overhead having > to clear both (or several) caches continually. (I'm thinking about the > possible extension to using an alist of caches, which could be quite > long.) Both caches - yes, but shouldn't be too bad. The "alist of caches" approach would most likely require that laziness, but I'm not sure we really want to go there (see another email). > Also clearing both caches at the same time would be a bigger change to > syntax-ppss-flush-cache than it's suffered so far. True. >> - Any package than advises syntax-ppss will have to juggle fewer global >> variables. > > I was intending that the new variables be purely internal, and that no > external elisp would need to access them. I suppose I really ought to > have put "--" in the middle of their names. Yes, but if we can make life easier for some, why not? Sometimes third-party author can life with breakage between Emacs versions. >> So Vatalie's polymode will have an easier time of it. It could even >> reuse some of the cache-while-narrowed logic by substituting the >> values of syntax-ppss-data-narrow and >> syntax-ppss-data-narrow-point-min as appropriate. > > That sounds a little dangerous. Not much worse than what multi-mode packages already do, though. >> The obvious downside is, of course, extra indirection, which translates >> to extra overhead. We don't know how significant it will be, though. > > I wouldn't be keen on seeing lots of (car compound-variable) and (cdr > compound-variable) throughout the syntax-ppss function. I think it > would make it significantly more difficult to understand. Hopefully there will be only several such places. But again, we can use structs. >> Would you like to see the code? > > Yes, why not? Please give me until the end of the week. > But just to make my position clear, I'm not particularly fixed on my > patch as submitted. It was optimised for simplicity and correctness > rather than elegance, though I don't think it's too bad. I'm fairly > open on whether we use your suggestions or Stefan's suggestion of having > an alist of caches. Cool. From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 12 18:13:25 2017 Received: (at 22983) by debbugs.gnu.org; 12 Sep 2017 22:13:25 +0000 Received: from localhost ([127.0.0.1]:36542 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drtQr-0004he-GE for submit@debbugs.gnu.org; Tue, 12 Sep 2017 18:13:25 -0400 Received: from eggs.gnu.org ([208.118.235.92]:46389) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drtQp-0004hR-Os for 22983@debbugs.gnu.org; Tue, 12 Sep 2017 18:13:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1drtQj-0003Fk-JA for 22983@debbugs.gnu.org; Tue, 12 Sep 2017 18:13:18 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:51412) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drtQJ-0002v1-7P; Tue, 12 Sep 2017 18:12:51 -0400 Received: from rms by fencepost.gnu.org with local (Exim 4.82) (envelope-from ) id 1drtQI-0000V2-Ia; Tue, 12 Sep 2017 18:12:50 -0400 Content-Type: text/plain; charset=Utf-8 From: Richard Stallman To: Dmitry Gutov In-reply-to: <922d661a-3962-4284-1a24-23c614ccdf04@yandex.ru> (message from Dmitry Gutov on Tue, 12 Sep 2017 03:11:15 +0300) Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. References: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> <922d661a-3962-4284-1a24-23c614ccdf04@yandex.ru> Message-Id: Date: Tue, 12 Sep 2017 18:12:50 -0400 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 22983 Cc: 22983@debbugs.gnu.org, acm@muc.de, p.stephani2@gmail.com, monnier@IRO.UMontreal.CA, jwiegley@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: rms@gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) [[[ To any NSA and FBI agents reading my email: please consider ]]] [[[ whether defending the US Constitution against all enemies, ]]] [[[ foreign or domestic, requires you to follow Snowden's example. ]]] There is probably some optimal number of caches to remember. If the code can handle any number of caches, it can discard all but the last N, and then we could try adjusting N to get the best performance. I expect we don't want N to be more than 4. -- Dr Richard Stallman President, Free Software Foundation (gnu.org, fsf.org) Internet Hall-of-Famer (internethalloffame.org) Skype: No way! See stallman.org/skype.html. From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 17 06:36:16 2017 Received: (at 22983) by debbugs.gnu.org; 17 Sep 2017 10:36:16 +0000 Received: from localhost ([127.0.0.1]:44470 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dtWvw-0008MQ-Kt for submit@debbugs.gnu.org; Sun, 17 Sep 2017 06:36:16 -0400 Received: from ocolin.muc.de ([193.149.48.4]:26603 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1dtWvt-0008MH-Li for 22983@debbugs.gnu.org; Sun, 17 Sep 2017 06:36:14 -0400 Received: (qmail 11088 invoked by uid 3782); 17 Sep 2017 10:36:11 -0000 Received: from acm.muc.de (p548C6BCB.dip0.t-ipconnect.de [84.140.107.203]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sun, 17 Sep 2017 12:36:09 +0200 Received: (qmail 4542 invoked by uid 1000); 17 Sep 2017 10:29:56 -0000 Date: Sun, 17 Sep 2017 10:29:56 +0000 To: Dmitry Gutov Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170917102956.GA4519@ACM> References: <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> <20170911201204.GC3605@ACM> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry. On Tue, Sep 12, 2017 at 03:24:08 +0300, Dmitry Gutov wrote: > On 9/11/17 11:12 PM, Alan Mackenzie wrote: [ .... ] > > I wouldn't be keen on seeing lots of (car compound-variable) and (cdr > > compound-variable) throughout the syntax-ppss function. I think it > > would make it significantly more difficult to understand. > Hopefully there will be only several such places. But again, we can use > structs. I don't know anything about these things. But seeing as how syntax.el is preloaded, the definition of structs would need to be preloaded earlier. > >> Would you like to see the code? > > Yes, why not? > Please give me until the end of the week. The end of the week has arrived. Are you still intending to propose an alternative formulation of the new cache manipulation for syntax-ppss? > > But just to make my position clear, I'm not particularly fixed on my > > patch as submitted. It was optimised for simplicity and correctness > > rather than elegance, though I don't think it's too bad. I'm fairly > > open on whether we use your suggestions or Stefan's suggestion of having > > an alist of caches. > Cool. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 17 07:12:43 2017 Received: (at 22983) by debbugs.gnu.org; 17 Sep 2017 11:12:43 +0000 Received: from localhost ([127.0.0.1]:44491 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dtXVC-0000jb-RG for submit@debbugs.gnu.org; Sun, 17 Sep 2017 07:12:43 -0400 Received: from mail-oi0-f54.google.com ([209.85.218.54]:50333) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dtXVB-0000jO-PH for 22983@debbugs.gnu.org; Sun, 17 Sep 2017 07:12:42 -0400 Received: by mail-oi0-f54.google.com with SMTP id w65so3329744oia.7 for <22983@debbugs.gnu.org>; Sun, 17 Sep 2017 04:12:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=/H/ewLXAjG5TSzPqmfSbVN8eWa+8yl6RfOMHdq5BoF8=; b=KiyqISZk7jvIe1Av9RbdTW2N8RC6emGBZjFB0GIYnFCXk1/CRY/rFIxPw6ABf8iImw kEmRttY/Ql1WLHBr7GQSWZyZnpIh6chBcfPfXue7CSAfIYkpcgz40h1NSKETXc3vqA4O Ue97VOkqPRAyFqRI4JR3x6xNUgolc1SuQCZwZJgimMhgIkyDy2pd+v0UQhcfrNtEsiWd BAHY8OoZH9klSVpBqUtwIbilosR8cBYovscC4wVDCNKMkEoci+/Hg3zCxfwX6gVChDPx vUOq9wXnlQxVTD0kLPh4oiooC/j3/K1TJBXFvBrHpXFkGvHRoYGNhtvdRLtLrq33Klrp fa1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=/H/ewLXAjG5TSzPqmfSbVN8eWa+8yl6RfOMHdq5BoF8=; b=MIqcNvmqAgQlt09Xy4KCaB5eFauL0NBPzqhUJQiMZgif43cEDzIhhXREACLZ9CxdJh zppguXzajxCBFBZ+wFU5b/bydU5mDrVlqM53051l9kx+sHULGmwECY5yRtHrD9neQKhD jv+K1bFAftlbGtBaxOr27HvrybTUpaB9tH+zvaJ89YqMNZ0a4B0ooc0XGHEBQotmqHjB XxP0awZindpSBWBDKVsjNukMsKZZoIV8RpD6WhKiXo6nDzSIaGLamMsmQkU2SiPBoGwE Q7kIhTXsQYM+7ZRo9V9l5Zpk8vmTMmYceR/I5cn+K0tDtVXSc67VaW/JmxIZrqdGGt0k RB8Q== X-Gm-Message-State: AHPjjUjsGCN1bu/N+WlyfUaJJFC5bXq0qlrDyO862WmDCcj9VtbZfdJr yzyOK4zXJtAiM25iIGDw44iMOo1rCGgPcLJ3yqQ= X-Google-Smtp-Source: AOwi7QC2XNxj5hjo4fFUMV/1TXr9ZSswWezzSs5FBZvDC28nfhCSr0mRuCmlB+6/BTgXoLExB06kN58l2J2/OV/rYAs= X-Received: by 10.202.177.195 with SMTP id a186mr18537627oif.32.1505646755916; Sun, 17 Sep 2017 04:12:35 -0700 (PDT) MIME-Version: 1.0 References: <9fc66395-045c-1984-f530-033c2ff706f6@yandex.ru> <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> In-Reply-To: <20170910113626.GB3588@ACM> From: Philipp Stephani Date: Sun, 17 Sep 2017 11:12:25 +0000 Message-ID: Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie , Dmitry Gutov Content-Type: multipart/alternative; boundary="001a113cddce0b3166055960b4e1" X-Spam-Score: 0.7 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.7 (/) --001a113cddce0b3166055960b4e1 Content-Type: text/plain; charset="UTF-8" Alan Mackenzie schrieb am So., 10. Sep. 2017 um 13:42 Uhr: > > > - Before this change is pushed to master, or shortly after, I'd like to > > know that it actually fixed the problem Philipp experienced with > > python-mode, so we can revert 4fbd330. If it was caused by e.g. > > syntax-table changing, we've not improved much. > > Philipp, any chance of you trying out python mode with this patch but > without 4fbd330? Unfortunately the problem wasn't easily reproducible back then. The problem would occur from time to time, but I never found a way to trigger it reproducibly. Therefore the unit test I've added in the commit artificially generates the symptom. The root cause is still unknown; while syntax-ppss and narrowing might be a potential root cause (the fontification code uses both), it might also be something else. --001a113cddce0b3166055960b4e1 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


Alan M= ackenzie <acm@muc.de> schrieb am So= ., 10. Sep. 2017 um 13:42=C2=A0Uhr:

> - Before this change is pushed to master, or shortly after, I'd li= ke to
> know that it actually fixed the problem Philipp experienced with
> python-mode, so we can revert 4fbd330. If it was caused by e.g.
> syntax-table changing, we've not improved much.

Philipp, any chance of you trying out python mode with this patch but
without 4fbd330?

Unfortunately the problem = wasn't easily reproducible back then. The problem would occur from time= to time, but I never found a way to trigger it reproducibly. Therefore the= unit test I've added in the commit artificially generates the symptom.= The root cause is still unknown; while syntax-ppss and narrowing might be = a potential root cause (the fontification code uses both), it might also be= something else.=C2=A0
--001a113cddce0b3166055960b4e1-- From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 17 19:43:17 2017 Received: (at 22983) by debbugs.gnu.org; 17 Sep 2017 23:43:17 +0000 Received: from localhost ([127.0.0.1]:45382 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dtjDY-00055R-PJ for submit@debbugs.gnu.org; Sun, 17 Sep 2017 19:43:17 -0400 Received: from mail-lf0-f48.google.com ([209.85.215.48]:55917) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dtjDW-00055E-IS for 22983@debbugs.gnu.org; Sun, 17 Sep 2017 19:43:15 -0400 Received: by mail-lf0-f48.google.com with SMTP id u21so6368196lfk.12 for <22983@debbugs.gnu.org>; Sun, 17 Sep 2017 16:43:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language; bh=4QecjVMrYtqq4d6ON7nTSUGWnx8y95s0uzMwsjO2Fxo=; b=WNTOIU6KoOUx2iZDh3WY50yYH6WUl0Q908pJitrgadQl1ZjxHU7oqQFXFM2l25VfCG Pp5MxUFGw80tj4mzq708Mp2Wf83Z/SI5y+ud2s5ikLTGAmKuWk8WG3Y6q531jZuA+nRK fs+W2N/dk2T83FOTikIWBh51/PMzSnJwmvW//bN+EvptK2LzmJXqHEciEEPPX9o1ZDr6 3owxzhjFT5YWRBhXlJnU3F9gmmIRKi6/zVivrYEVyW4D5HCHvFxBgYZc5GEjeJ3s9Rl2 q66IwZzI4BGWKQ/RO2cIb370iDRlW0ROVP2t2tnSDXsKrF/9VOa51JpdS3jVs0v4qmLh 5YQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language; bh=4QecjVMrYtqq4d6ON7nTSUGWnx8y95s0uzMwsjO2Fxo=; b=q38ecO36RTWI91WBd/LVUZ86hfPRUagn9To5PGKO3wJvwdP1/b2YSXOgfYCRYT1tAZ yalz31qwojwhDYJM+dJKviETLggD8n/SWsb6I/3E4amAhS8SXwCDOoFvBuTNyUembedy jEAxcsWkbdCuduETGWzQzXLh0K1CR7q8uQwjiwPqxSknTSvE+ZQZfxn39dwqNRaNznUZ h+EhQB32rzZ+w9xo9A3WNnySjc7+l64PvSJImz1AiCZBNVU2TZ8BS38AsHN1BuRnAZQ6 ncjBAd+B0HVBk1m7TGjzct7BkqSMFEbv4Jd2D2DumSVAvf4tH+H3ilapZ3id/ymJ04jF fTyQ== X-Gm-Message-State: AHPjjUg2s1VjQuvyWvESo2BKq1qPFFMadgVqDTmyFa99VQR/Ddph0Gko C+6h1h/SlNeHGMhxtfk= X-Google-Smtp-Source: AOwi7QAX0juX29XMu9X2Yg9g24MqAaGW0zwXWX/o9yw4qXnWCe91bWmQDJ6/SmtqJuw0Gdu/aJfqUQ== X-Received: by 10.25.190.74 with SMTP id o71mr2765771lff.216.1505691788363; Sun, 17 Sep 2017 16:43:08 -0700 (PDT) Received: from [192.168.1.174] ([178.252.127.239]) by smtp.googlemail.com with ESMTPSA id x9sm437710ljd.88.2017.09.17.16.43.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 17 Sep 2017 16:43:06 -0700 (PDT) Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie References: <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> <20170911201204.GC3605@ACM> <20170917102956.GA4519@ACM> From: Dmitry Gutov Message-ID: Date: Mon, 18 Sep 2017 02:43:05 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: <20170917102956.GA4519@ACM> Content-Type: multipart/mixed; boundary="------------564E012E876E230B08938053" Content-Language: en-US X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Hi Alan, On 9/17/17 1:29 PM, Alan Mackenzie wrote: > I don't know anything about these things. But seeing as how syntax.el is > preloaded, the definition of structs would need to be preloaded earlier. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.48 listed in dnsbl.sorbs.net] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (raaahh[at]gmail.com) -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.48 listed in list.dnswl.org] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.48 listed in wl.mailspike.net] 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Hi Alan, On 9/17/17 1:29 PM, Alan Mackenzie wrote: > I don't know anything about these things. But seeing as how syntax.el is > preloaded, the definition of structs would need to be preloaded earlier. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.48 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.48 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.48 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders This is a multi-part message in MIME format. --------------564E012E876E230B08938053 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Hi Alan, On 9/17/17 1:29 PM, Alan Mackenzie wrote: > I don't know anything about these things. But seeing as how syntax.el is > preloaded, the definition of structs would need to be preloaded earlier. OK, let's do without that for now. The result doesn't look too bad to my eyes, at least. >>>> Would you like to see the code? > >>> Yes, why not? > >> Please give me until the end of the week. > > The end of the week has arrived. Are you still intending to propose an > alternative formulation of the new cache manipulation for syntax-ppss? Thanks for the reminder. The patch is attached. I've tested it minimally, any feedback is welcome. (It reads much better in Emacs with diff-auto-refine-mode). --------------564E012E876E230B08938053 Content-Type: text/x-patch; name="alt-ppss-fix.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="alt-ppss-fix.diff" diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el index d1d5176944..a77589f1b7 100644 --- a/lisp/emacs-lisp/syntax.el +++ b/lisp/emacs-lisp/syntax.el @@ -381,10 +381,26 @@ syntax-begin-function point (where the PPSS is equivalent to nil).") (make-obsolete-variable 'syntax-begin-function nil "25.1") -(defvar-local syntax-ppss-cache nil - "List of (POS . PPSS) pairs, in decreasing POS order.") -(defvar-local syntax-ppss-last nil - "Cache of (LAST-POS . LAST-PPSS).") +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Several caches. +;; +;; Because `syntax-ppss' is equivalent to (parse-partial-sexp +;; (POINT-MIN) x), we need either to empty the cache when we narrow +;; the buffer, which is suboptimal, or we need to use several caches. +;; We use two of them, one for widened buffer, and one for narrowing. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defvar-local syntax-ppss-wide nil + "Cons of two elements (CACHE . LAST). +Where CACHE is a list of (POS . PPSS) pairs, in decreasing POS order, +and LAST is a pair (LAST-POS . LAST-PPS) caching the last invocation. +These are valid when the buffer has no restriction.") + +(defvar-local syntax-ppss-narrow nil + "Same as `syntax-ppss-wide' but for a narrowed buffer.") + +(defvar-local syntax-ppss-narrow-start nil + "Start position of the narrowing for `syntax-ppss-narrow'.") (defalias 'syntax-ppss-after-change-function 'syntax-ppss-flush-cache) (defun syntax-ppss-flush-cache (beg &rest ignored) @@ -392,24 +408,29 @@ syntax-ppss-flush-cache ;; Set syntax-propertize to refontify anything past beg. (setq syntax-propertize--done (min beg syntax-propertize--done)) ;; Flush invalid cache entries. - (while (and syntax-ppss-cache (> (caar syntax-ppss-cache) beg)) - (setq syntax-ppss-cache (cdr syntax-ppss-cache))) - ;; Throw away `last' value if made invalid. - (when (< beg (or (car syntax-ppss-last) 0)) - ;; If syntax-begin-function jumped to BEG, then the old state at BEG can - ;; depend on the text after BEG (which is presumably changed). So if - ;; BEG=(car (nth 10 syntax-ppss-last)) don't reuse that data because the - ;; assumed nil state at BEG may not be valid any more. - (if (<= beg (or (syntax-ppss-toplevel-pos (cdr syntax-ppss-last)) - (nth 3 syntax-ppss-last) - 0)) - (setq syntax-ppss-last nil) - (setcar syntax-ppss-last nil))) - ;; Unregister if there's no cache left. Sadly this doesn't work - ;; because `before-change-functions' is temporarily bound to nil here. - ;; (unless syntax-ppss-cache - ;; (remove-hook 'before-change-functions 'syntax-ppss-flush-cache t)) - ) + (dolist (cell (list syntax-ppss-wide syntax-ppss-narrow)) + (pcase cell + (`(,cache . ,last) + (while (and cache (> (caar cache) beg)) + (setq cache (cdr cache))) + ;; Throw away `last' value if made invalid. + (when (< beg (or (car last) 0)) + ;; If syntax-begin-function jumped to BEG, then the old state at BEG can + ;; depend on the text after BEG (which is presumably changed). So if + ;; BEG=(car (nth 10 syntax-ppss-last)) don't reuse that data because the + ;; assumed nil state at BEG may not be valid any more. + (if (<= beg (or (syntax-ppss-toplevel-pos (cdr last)) + (nth 3 last) + 0)) + (setq last nil) + (setcar last nil))) + ;; Unregister if there's no cache left. Sadly this doesn't work + ;; because `before-change-functions' is temporarily bound to nil here. + ;; (unless cache + ;; (remove-hook 'before-change-functions 'syntax-ppss-flush-cache t)) + (setcar cell cache) + (setcdr cell last))) + )) (defvar syntax-ppss-stats [(0 . 0.0) (0 . 0.0) (0 . 0.0) (0 . 0.0) (0 . 0.0) (1 . 2500.0)]) @@ -423,6 +444,17 @@ syntax-ppss-stats (defvar-local syntax-ppss-table nil "Syntax-table to use during `syntax-ppss', if any.") +(defun syntax-ppss--data () + (if (eq (point-min) 1) + (progn + (unless syntax-ppss-wide + (setq syntax-ppss-wide (cons nil nil))) + syntax-ppss-wide) + (unless (eq syntax-ppss-narrow-start (point-min)) + (setq syntax-ppss-narrow-start (point-min)) + (setq syntax-ppss-narrow (cons nil nil))) + syntax-ppss-narrow)) + (defun syntax-ppss (&optional pos) "Parse-Partial-Sexp State at POS, defaulting to point. The returned value is the same as that of `parse-partial-sexp' @@ -439,10 +471,13 @@ syntax-ppss (syntax-propertize pos) ;; (with-syntax-table (or syntax-ppss-table (syntax-table)) - (let ((old-ppss (cdr syntax-ppss-last)) - (old-pos (car syntax-ppss-last)) - (ppss nil) - (pt-min (point-min))) + (let* ((cell (syntax-ppss--data)) + (ppss-cache (car cell)) + (ppss-last (cdr cell)) + (old-ppss (cdr ppss-last)) + (old-pos (car ppss-last)) + (ppss nil) + (pt-min (point-min))) (if (and old-pos (> old-pos pos)) (setq old-pos nil)) ;; Use the OLD-POS if usable and close. Don't update the `last' cache. (condition-case nil @@ -475,7 +510,7 @@ syntax-ppss ;; The OLD-* data can't be used. Consult the cache. (t (let ((cache-pred nil) - (cache syntax-ppss-cache) + (cache ppss-cache) (pt-min (point-min)) ;; I differentiate between PT-MIN and PT-BEST because ;; I feel like it might be important to ensure that the @@ -491,7 +526,7 @@ syntax-ppss (if cache (setq pt-min (caar cache) ppss (cdar cache))) ;; Setup the before-change function if necessary. - (unless (or syntax-ppss-cache syntax-ppss-last) + (unless (or ppss-cache ppss-last) (add-hook 'before-change-functions 'syntax-ppss-flush-cache t t)) @@ -541,7 +576,7 @@ syntax-ppss pt-min (setq pt-min (/ (+ pt-min pos) 2)) nil nil ppss)) (push (cons pt-min ppss) - (if cache-pred (cdr cache-pred) syntax-ppss-cache))) + (if cache-pred (cdr cache-pred) ppss-cache))) ;; Compute the actual return value. (setq ppss (parse-partial-sexp pt-min pos nil nil ppss)) @@ -562,13 +597,15 @@ syntax-ppss (if (> (- (caar cache-pred) pos) syntax-ppss-max-span) (push pair (cdr cache-pred)) (setcar cache-pred pair)) - (if (or (null syntax-ppss-cache) - (> (- (caar syntax-ppss-cache) pos) + (if (or (null ppss-cache) + (> (- (caar ppss-cache) pos) syntax-ppss-max-span)) - (push pair syntax-ppss-cache) - (setcar syntax-ppss-cache pair))))))))) + (push pair ppss-cache) + (setcar ppss-cache pair))))))))) - (setq syntax-ppss-last (cons pos ppss)) + (setq ppss-last (cons pos ppss)) + (setcar cell ppss-cache) + (setcdr cell ppss-last) ppss) (args-out-of-range ;; If the buffer is more narrowed than when we built the cache, @@ -582,7 +619,7 @@ syntax-ppss (defun syntax-ppss-debug () (let ((pt nil) (min-diffs nil)) - (dolist (x (append syntax-ppss-cache (list (cons (point-min) nil)))) + (dolist (x (append (car (syntax-ppss--data)) (list (cons (point-min) nil)))) (when pt (push (- pt (car x)) min-diffs)) (setq pt (car x))) min-diffs)) --------------564E012E876E230B08938053-- From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 18 15:15:14 2017 Received: (at 22983) by debbugs.gnu.org; 18 Sep 2017 19:15:14 +0000 Received: from localhost ([127.0.0.1]:46822 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1du1Vi-000717-5K for submit@debbugs.gnu.org; Mon, 18 Sep 2017 15:15:14 -0400 Received: from ocolin.muc.de ([193.149.48.4]:10183 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1du1Vg-00070x-Te for 22983@debbugs.gnu.org; Mon, 18 Sep 2017 15:15:13 -0400 Received: (qmail 50605 invoked by uid 3782); 18 Sep 2017 19:15:10 -0000 Received: from acm.muc.de (p548C6666.dip0.t-ipconnect.de [84.140.102.102]) by colin.muc.de (tmda-ofmipd) with ESMTP; Mon, 18 Sep 2017 21:15:09 +0200 Received: (qmail 4886 invoked by uid 1000); 18 Sep 2017 19:08:47 -0000 Date: Mon, 18 Sep 2017 19:08:47 +0000 To: Dmitry Gutov Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170918190847.GB4536@ACM> References: <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> <20170911201204.GC3605@ACM> <20170917102956.GA4519@ACM> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry On Mon, Sep 18, 2017 at 02:43:05 +0300, Dmitry Gutov wrote: > Hi Alan, > On 9/17/17 1:29 PM, Alan Mackenzie wrote: > > I don't know anything about these things. But seeing as how syntax.el is > > preloaded, the definition of structs would need to be preloaded earlier. > OK, let's do without that for now. The result doesn't look too bad to my > eyes, at least. > >>>> Would you like to see the code? > >>> Yes, why not? > >> Please give me until the end of the week. > > The end of the week has arrived. Are you still intending to propose an > > alternative formulation of the new cache manipulation for syntax-ppss? > Thanks for the reminder. The patch is attached. I've tested it > minimally, any feedback is welcome. Thanks for this. I'm impressed. Your syntax-ppss--data is far more elegant than my syntax-ppss-set-cache. The burden of carrying around the caches in cons cells is much less than I had feared. The amendments to syntax-ppss are also less than I had feared, amounting to little more than substituting "syntax-ppss-cache" with "ppss-cache" etc., and making a few bindings to support that. I notice you flush both caches eagerly, as you said you would. No harm in that. So, I'm willing to go with your version. I haven't tried actually running it, yet. But there's one small change I would ask you to consider making - that is, in the cache conses, to put ppss-last in the car and ppss-cache in the cdr. That way, while debugging, ppss-last will be easy to find (it's the first element of the list) and ppss-cache will also be easy to find (the second element onwards). > (It reads much better in Emacs with diff-auto-refine-mode). [ .... ] -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 18 20:02:19 2017 Received: (at 22983) by debbugs.gnu.org; 19 Sep 2017 00:02:19 +0000 Received: from localhost ([127.0.0.1]:46987 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1du5zV-0000c7-Ql for submit@debbugs.gnu.org; Mon, 18 Sep 2017 20:02:19 -0400 Received: from mail-lf0-f66.google.com ([209.85.215.66]:35883) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1du5zT-0000bt-TL for 22983@debbugs.gnu.org; Mon, 18 Sep 2017 20:02:16 -0400 Received: by mail-lf0-f66.google.com with SMTP id l196so1090262lfl.3 for <22983@debbugs.gnu.org>; Mon, 18 Sep 2017 17:02:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language; bh=IRczeVJZNXhtHvxrLfKKu8jrVywt5TCiRHTnNvDAb4Q=; b=ICNqoZhaDhJ5clRp5RLXlAiX/UwQnDQagyzDQVUC9pvKXX4NsoOWN+LvQc3mMrcFW9 bheuhpZq8XfXIgrBoRJBSoTHN8jI7nc9GKSqQiyQOKhq9qLLTrHfcrQ4IbV6d0xI62II n1fqcd9oza7ihTvsHA4P8YEZaQ9E0DAP/kp1VZtNuyjMrONyEyJS+RpSptzzNpWXPceP 8ycGyMu05rvTxYPQUcCq9gBTrlzIsBofliAfhoqeuTlaOo7VpzgFwKiCbZcHg5k6qyhg GoROi4+9edYkh4gVoa67xLkYV4iK+k8D/+3FrE0c5SNN+lzg+zcYmFi+VbpTN4mtTM/L Nr0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language; bh=IRczeVJZNXhtHvxrLfKKu8jrVywt5TCiRHTnNvDAb4Q=; b=VyqYbJlifLs/xgYyWzwU5gd+Sw9D60eprVeVhbN+8OIOCvAAIbnr0lKyOu1i4V3gPG 12NnZYoBZiY8H2VwuIcsaSYV0zYN9QpIlOi3P5H2nVzZOkLPFqCNnW4Ty0xIix52EG+h Is2mI9kHY9dWWEkeFb2FcbtoNCbn/hEjc9OfePqs6j8ukvMp/ayprxoV4Vi4MDIElTXE del3nD3xAf/m8c5yNQmIb/U47hiujHwjezwMwq9PEU+F3kd8foZSVuEc7Xy9KD+iXs0M sMCLq9aqTIYDknKzvdjA3avGTNHE1t5zDXAfTmWdq/txSwQ1DxEjObWNxX6UCORDojAz FGiA== X-Gm-Message-State: AHPjjUiRqcBVYX67MsjXNdHxgB9orzsFU7fTtxidBDpfyiIDGw+6A39B GxPTrAMYw/KOiyo6VBs= X-Google-Smtp-Source: AOwi7QAsmL+j/OHvFW1xvSo60xyXf6q3thYrtBLQDAxmzPA+l62YBljDKdiHRbweNrotp6fXpoGr3Q== X-Received: by 10.46.72.26 with SMTP id v26mr5236058lja.50.1505779329442; Mon, 18 Sep 2017 17:02:09 -0700 (PDT) Received: from [192.168.1.174] ([178.252.127.239]) by smtp.googlemail.com with ESMTPSA id i12sm2075628ljb.20.2017.09.18.17.02.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Sep 2017 17:02:07 -0700 (PDT) Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie References: <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> <20170911201204.GC3605@ACM> <20170917102956.GA4519@ACM> <20170918190847.GB4536@ACM> From: Dmitry Gutov Message-ID: Date: Tue, 19 Sep 2017 03:02:06 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: <20170918190847.GB4536@ACM> Content-Type: multipart/mixed; boundary="------------D733A2DAA3EA032FC5DD15BE" Content-Language: en-US X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/18/17 10:08 PM, Alan Mackenzie wrote: > Thanks for this. I'm impressed. Your syntax-ppss--data is far more > elegant than my syntax-ppss-set-cache. The burden of carrying around > the caches in cons cells is much less than I had feared. The amendments > to syntax-ppss are also less than I had feared, amounting to little more > than substituting "syntax-ppss-cache" with "ppss-cache" etc., and making > a few bindings to support that. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.66 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.66 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.66 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 2.2 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: On 9/18/17 10:08 PM, Alan Mackenzie wrote: > Thanks for this. I'm impressed. Your syntax-ppss--data is far more > elegant than my syntax-ppss-set-cache. The burden of carrying around > the caches in cons cells is much less than I had feared. The amendments > to syntax-ppss are also less than I had feared, amounting to little more > than substituting "syntax-ppss-cache" with "ppss-cache" etc., and making > a few bindings to support that. [...] Content analysis details: (2.2 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 1.5 RCVD_IN_SORBS_WEB RBL: SORBS: sender is an abusable web server [178.252.127.239 listed in dnsbl.sorbs.net] 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [209.85.215.66 listed in dnsbl.sorbs.net] -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.66 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.66 listed in list.dnswl.org] 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (dgutov[at]yandex.ru) 0.0 T_DKIM_INVALID DKIM-Signature header exists but is not valid 0.2 FREEMAIL_FORGED_FROMDOMAIN 2nd level domains in From and EnvelopeFrom freemail headers are different -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders This is a multi-part message in MIME format. --------------D733A2DAA3EA032FC5DD15BE Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 9/18/17 10:08 PM, Alan Mackenzie wrote: > Thanks for this. I'm impressed. Your syntax-ppss--data is far more > elegant than my syntax-ppss-set-cache. The burden of carrying around > the caches in cons cells is much less than I had feared. The amendments > to syntax-ppss are also less than I had feared, amounting to little more > than substituting "syntax-ppss-cache" with "ppss-cache" etc., and making > a few bindings to support that. Thanks! > I notice you flush both caches eagerly, as you said you would. No harm > in that. > > So, I'm willing to go with your version. I haven't tried actually > running it, yet. Please do. > But there's one small change I would ask you to consider making - that > is, in the cache conses, to put ppss-last in the car and ppss-cache in > the cdr. That way, while debugging, ppss-last will be easy to find > (it's the first element of the list) and ppss-cache will also be easy to > find (the second element onwards). Sure, that makes a lot of sense, since ppss-last is a smaller structure. The modified patch is attached. --------------D733A2DAA3EA032FC5DD15BE Content-Type: text/x-patch; name="alt-ppss-fix-2.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="alt-ppss-fix-2.diff" diff --git a/lisp/emacs-lisp/syntax.el b/lisp/emacs-lisp/syntax.el index d1d5176944..c44e754ac0 100644 --- a/lisp/emacs-lisp/syntax.el +++ b/lisp/emacs-lisp/syntax.el @@ -381,10 +381,26 @@ syntax-begin-function point (where the PPSS is equivalent to nil).") (make-obsolete-variable 'syntax-begin-function nil "25.1") -(defvar-local syntax-ppss-cache nil - "List of (POS . PPSS) pairs, in decreasing POS order.") -(defvar-local syntax-ppss-last nil - "Cache of (LAST-POS . LAST-PPSS).") +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Several caches. +;; +;; Because `syntax-ppss' is equivalent to (parse-partial-sexp +;; (POINT-MIN) x), we need either to empty the cache when we narrow +;; the buffer, which is suboptimal, or we need to use several caches. +;; We use two of them, one for widened buffer, and one for narrowing. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defvar-local syntax-ppss-wide nil + "Cons of two elements (LAST . CACHE). +Where LAST is a pair (LAST-POS . LAST-PPS) caching the last invocation +and CACHE is a list of (POS . PPSS) pairs, in decreasing POS order. +These are valid when the buffer has no restriction.") + +(defvar-local syntax-ppss-narrow nil + "Same as `syntax-ppss-wide' but for a narrowed buffer.") + +(defvar-local syntax-ppss-narrow-start nil + "Start position of the narrowing for `syntax-ppss-narrow'.") (defalias 'syntax-ppss-after-change-function 'syntax-ppss-flush-cache) (defun syntax-ppss-flush-cache (beg &rest ignored) @@ -392,24 +408,29 @@ syntax-ppss-flush-cache ;; Set syntax-propertize to refontify anything past beg. (setq syntax-propertize--done (min beg syntax-propertize--done)) ;; Flush invalid cache entries. - (while (and syntax-ppss-cache (> (caar syntax-ppss-cache) beg)) - (setq syntax-ppss-cache (cdr syntax-ppss-cache))) - ;; Throw away `last' value if made invalid. - (when (< beg (or (car syntax-ppss-last) 0)) - ;; If syntax-begin-function jumped to BEG, then the old state at BEG can - ;; depend on the text after BEG (which is presumably changed). So if - ;; BEG=(car (nth 10 syntax-ppss-last)) don't reuse that data because the - ;; assumed nil state at BEG may not be valid any more. - (if (<= beg (or (syntax-ppss-toplevel-pos (cdr syntax-ppss-last)) - (nth 3 syntax-ppss-last) - 0)) - (setq syntax-ppss-last nil) - (setcar syntax-ppss-last nil))) - ;; Unregister if there's no cache left. Sadly this doesn't work - ;; because `before-change-functions' is temporarily bound to nil here. - ;; (unless syntax-ppss-cache - ;; (remove-hook 'before-change-functions 'syntax-ppss-flush-cache t)) - ) + (dolist (cell (list syntax-ppss-wide syntax-ppss-narrow)) + (pcase cell + (`(,last . ,cache) + (while (and cache (> (caar cache) beg)) + (setq cache (cdr cache))) + ;; Throw away `last' value if made invalid. + (when (< beg (or (car last) 0)) + ;; If syntax-begin-function jumped to BEG, then the old state at BEG can + ;; depend on the text after BEG (which is presumably changed). So if + ;; BEG=(car (nth 10 syntax-ppss-last)) don't reuse that data because the + ;; assumed nil state at BEG may not be valid any more. + (if (<= beg (or (syntax-ppss-toplevel-pos (cdr last)) + (nth 3 last) + 0)) + (setq last nil) + (setcar last nil))) + ;; Unregister if there's no cache left. Sadly this doesn't work + ;; because `before-change-functions' is temporarily bound to nil here. + ;; (unless cache + ;; (remove-hook 'before-change-functions 'syntax-ppss-flush-cache t)) + (setcar cell last) + (setcdr cell cache))) + )) (defvar syntax-ppss-stats [(0 . 0.0) (0 . 0.0) (0 . 0.0) (0 . 0.0) (0 . 0.0) (1 . 2500.0)]) @@ -423,6 +444,17 @@ syntax-ppss-stats (defvar-local syntax-ppss-table nil "Syntax-table to use during `syntax-ppss', if any.") +(defun syntax-ppss--data () + (if (eq (point-min) 1) + (progn + (unless syntax-ppss-wide + (setq syntax-ppss-wide (cons nil nil))) + syntax-ppss-wide) + (unless (eq syntax-ppss-narrow-start (point-min)) + (setq syntax-ppss-narrow-start (point-min)) + (setq syntax-ppss-narrow (cons nil nil))) + syntax-ppss-narrow)) + (defun syntax-ppss (&optional pos) "Parse-Partial-Sexp State at POS, defaulting to point. The returned value is the same as that of `parse-partial-sexp' @@ -439,10 +471,13 @@ syntax-ppss (syntax-propertize pos) ;; (with-syntax-table (or syntax-ppss-table (syntax-table)) - (let ((old-ppss (cdr syntax-ppss-last)) - (old-pos (car syntax-ppss-last)) - (ppss nil) - (pt-min (point-min))) + (let* ((cell (syntax-ppss--data)) + (ppss-last (car cell)) + (ppss-cache (cdr cell)) + (old-ppss (cdr ppss-last)) + (old-pos (car ppss-last)) + (ppss nil) + (pt-min (point-min))) (if (and old-pos (> old-pos pos)) (setq old-pos nil)) ;; Use the OLD-POS if usable and close. Don't update the `last' cache. (condition-case nil @@ -475,7 +510,7 @@ syntax-ppss ;; The OLD-* data can't be used. Consult the cache. (t (let ((cache-pred nil) - (cache syntax-ppss-cache) + (cache ppss-cache) (pt-min (point-min)) ;; I differentiate between PT-MIN and PT-BEST because ;; I feel like it might be important to ensure that the @@ -491,7 +526,7 @@ syntax-ppss (if cache (setq pt-min (caar cache) ppss (cdar cache))) ;; Setup the before-change function if necessary. - (unless (or syntax-ppss-cache syntax-ppss-last) + (unless (or ppss-cache ppss-last) (add-hook 'before-change-functions 'syntax-ppss-flush-cache t t)) @@ -541,7 +576,7 @@ syntax-ppss pt-min (setq pt-min (/ (+ pt-min pos) 2)) nil nil ppss)) (push (cons pt-min ppss) - (if cache-pred (cdr cache-pred) syntax-ppss-cache))) + (if cache-pred (cdr cache-pred) ppss-cache))) ;; Compute the actual return value. (setq ppss (parse-partial-sexp pt-min pos nil nil ppss)) @@ -562,13 +597,15 @@ syntax-ppss (if (> (- (caar cache-pred) pos) syntax-ppss-max-span) (push pair (cdr cache-pred)) (setcar cache-pred pair)) - (if (or (null syntax-ppss-cache) - (> (- (caar syntax-ppss-cache) pos) + (if (or (null ppss-cache) + (> (- (caar ppss-cache) pos) syntax-ppss-max-span)) - (push pair syntax-ppss-cache) - (setcar syntax-ppss-cache pair))))))))) + (push pair ppss-cache) + (setcar ppss-cache pair))))))))) - (setq syntax-ppss-last (cons pos ppss)) + (setq ppss-last (cons pos ppss)) + (setcar cell ppss-last) + (setcdr cell ppss-cache) ppss) (args-out-of-range ;; If the buffer is more narrowed than when we built the cache, @@ -582,7 +619,7 @@ syntax-ppss (defun syntax-ppss-debug () (let ((pt nil) (min-diffs nil)) - (dolist (x (append syntax-ppss-cache (list (cons (point-min) nil)))) + (dolist (x (append (cdr (syntax-ppss--data)) (list (cons (point-min) nil)))) (when pt (push (- pt (car x)) min-diffs)) (setq pt (car x))) min-diffs)) --------------D733A2DAA3EA032FC5DD15BE-- From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 19 16:54:34 2017 Received: (at 22983) by debbugs.gnu.org; 19 Sep 2017 20:54:34 +0000 Received: from localhost ([127.0.0.1]:48696 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1duPXO-0006Dn-Ba for submit@debbugs.gnu.org; Tue, 19 Sep 2017 16:54:34 -0400 Received: from ocolin.muc.de ([193.149.48.4]:31358 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1duPXM-0006Df-Qw for 22983@debbugs.gnu.org; Tue, 19 Sep 2017 16:54:33 -0400 Received: (qmail 58669 invoked by uid 3782); 19 Sep 2017 20:54:27 -0000 Received: from acm.muc.de (p548C6659.dip0.t-ipconnect.de [84.140.102.89]) by colin.muc.de (tmda-ofmipd) with ESMTP; Tue, 19 Sep 2017 22:54:26 +0200 Received: (qmail 21838 invoked by uid 1000); 19 Sep 2017 20:47:53 -0000 Date: Tue, 19 Sep 2017 20:47:53 +0000 To: Dmitry Gutov Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170919204753.GD19168@ACM> References: <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> <20170911201204.GC3605@ACM> <20170917102956.GA4519@ACM> <20170918190847.GB4536@ACM> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry. On Tue, Sep 19, 2017 at 03:02:06 +0300, Dmitry Gutov wrote: > On 9/18/17 10:08 PM, Alan Mackenzie wrote: [ .... ] > > So, I'm willing to go with your version. I haven't tried actually > > running it, yet. > Please do. I have done now, without the slightest cause for concern (see below). > > But there's one small change I would ask you to consider making - that > > is, in the cache conses, to put ppss-last in the car and ppss-cache in > > the cdr. That way, while debugging, ppss-last will be easy to find > > (it's the first element of the list) and ppss-cache will also be easy to > > find (the second element onwards). > Sure, that makes a lot of sense, since ppss-last is a smaller structure. > The modified patch is attached. Thanks. I've done some semi-formal testing on it. My semi-formal test log is: (ii) Do some testing, using xdisp.c as test file. A file.c will not have other calls to syntax-ppss interfering with the tests. o - 1. Normal working: check both caches stay empty. They don't, because syntax-ppss is used, I think, by font locking. o - 2. Normal work in a narrowed buffer. Seems OK. o - 3. Switch back to widened. Seems OK. o - 4. Switch back to narrowed, same point-min. Check the caches. They look OK. o - 5. Switch to a different narrowing and (syntax-ppss (point-min)). This does indeed empty the syntax-ppss-narrow, as it should. s-p-wide looks unchanged. Good. o - 6. Get well filled caches for both narrow and wide regions. With the buffer wide, make a buffer change early in the buffer. Check both caches are properly trimmed. They are. o - 7. Repeat 6, but trim with the buffer narrow. Both caches look OK, the narrow cache being (nil). Maybe I should also try some heavy hacking in, say, Emacs Lisp mode as a kind of soak test, since elisp mode uses syntax-ppss quite a bit, I believe. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 19 16:57:00 2017 Received: (at 22983) by debbugs.gnu.org; 19 Sep 2017 20:57:01 +0000 Received: from localhost ([127.0.0.1]:48701 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1duPZk-0006H6-O7 for submit@debbugs.gnu.org; Tue, 19 Sep 2017 16:57:00 -0400 Received: from ocolin.muc.de ([193.149.48.4]:49755 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1duPZj-0006Gx-Fk for 22983@debbugs.gnu.org; Tue, 19 Sep 2017 16:56:59 -0400 Received: (qmail 59976 invoked by uid 3782); 19 Sep 2017 20:56:58 -0000 Received: from acm.muc.de (p548C6659.dip0.t-ipconnect.de [84.140.102.89]) by colin.muc.de (tmda-ofmipd) with ESMTP; Tue, 19 Sep 2017 22:56:57 +0200 Received: (qmail 21872 invoked by uid 1000); 19 Sep 2017 20:50:24 -0000 Date: Tue, 19 Sep 2017 20:50:24 +0000 To: Philipp Stephani Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170919205024.GE19168@ACM> References: <83h8wlz1kf.fsf@gnu.org> <20170902174027.GB4267@ACM> <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , 22983@debbugs.gnu.org, Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Philipp. On Sun, Sep 17, 2017 at 11:12:25 +0000, Philipp Stephani wrote: > Alan Mackenzie schrieb am So., 10. Sep. 2017 um 13:42 Uhr: > > > - Before this change is pushed to master, or shortly after, I'd like to > > > know that it actually fixed the problem Philipp experienced with > > > python-mode, so we can revert 4fbd330. If it was caused by e.g. > > > syntax-table changing, we've not improved much. > > Philipp, any chance of you trying out python mode with this patch but > > without 4fbd330? > Unfortunately the problem wasn't easily reproducible back then. The problem > would occur from time to time, but I never found a way to trigger it > reproducibly. Therefore the unit test I've added in the commit artificially > generates the symptom. The root cause is still unknown; while syntax-ppss > and narrowing might be a potential root cause (the fontification code uses > both), it might also be something else. OK, I understand. Cache effects are the very devil to debug. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Fri Sep 22 10:09:14 2017 Received: (at 22983) by debbugs.gnu.org; 22 Sep 2017 14:09:14 +0000 Received: from localhost ([127.0.0.1]:52950 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dvOdm-0000zQ-L4 for submit@debbugs.gnu.org; Fri, 22 Sep 2017 10:09:14 -0400 Received: from mail-wm0-f45.google.com ([74.125.82.45]:47528) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dvOdl-0000zB-1p for 22983@debbugs.gnu.org; Fri, 22 Sep 2017 10:09:13 -0400 Received: by mail-wm0-f45.google.com with SMTP id r136so4289461wmf.2 for <22983@debbugs.gnu.org>; Fri, 22 Sep 2017 07:09:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=zk1hsJ1chfC0pzjlbmjdMSOLYldzMGXAsm5XPzrNHoM=; b=OL1ibK0hmKwGBM+VtKm8qXGPFjW1upyuC/TQ/ayF/5n41H8EnCgrX6kRRZ7HHn4Eu6 J8O+RCzRrjAZIvPo2yfIVDUDVGUJO5zTNGvZB1IORbx9HHB9hJ459xzFwYrs1NC1UxJx p/XlLGp/eQlt4S9gYQ1gZuqwy5ObCu844n5cTdgQeV3FP8sYQ/7/3Ib8mec4XTCzOJ3R M2QYJuSmnYGtuwAXoUPb5x3C8aWeGb32c8rStzQ25eGfR5h13Uwoh0B8ythZyKLrl2e2 EYGlMmXXMfc7YiKcny+2e+Wp40WGwrIeqRYGxhBNHlPaUJafjY4lSiUG+X+li6ZzZrOP LKPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=zk1hsJ1chfC0pzjlbmjdMSOLYldzMGXAsm5XPzrNHoM=; b=umNED/OD9UoVic7zKHBtlNoyRTDNydZbi2qXXmGaK3u0yEPANYZ1tUCZe+6LxEwKq7 23xWO4rKOtuaXOLbBxWjk3oJqxlSdzhb9rRG8or85Q2GisfdGFAJZDuEnAol8m3Q0YJU PoDkV44F+pRcYFdq5AIIlTSEEBHADLm3FNtJgcr+lCAvabPg8YI8SYof8LYdC6rp5xz6 U6Mf1af8UdPptd0jr+MFB7WktbFt8EwR6MgxmiEslvYqioXKJuYKFB7OQnsu3Ormm0Nq H/ZLe+zKZeR1luZ91ZqAWta2VF3c0g1K8ByDikQ8/zSI+msYVhtM6YZ/Nodi7xrVlLZT zURA== X-Gm-Message-State: AHPjjUgwCnFhYFugUNAtVoXFEl9NWhUodks6xlUBEpD+BtVYK+vSnlTO WI+UJutzT7TKektuhwqptx6wM02h X-Google-Smtp-Source: AOwi7QCsXmnz0FKe2ILDgpF8BjJ5cPLcRTDYND0GiQdBpTp0kG+o/1AK9Hbrrk/7A5C9tDrZYWZDWQ== X-Received: by 10.80.189.204 with SMTP id z12mr4838747edh.2.1506089347078; Fri, 22 Sep 2017 07:09:07 -0700 (PDT) Received: from [192.168.0.133] (static-nbl2-118.cytanet.com.cy. [212.31.107.118]) by smtp.googlemail.com with ESMTPSA id x29sm2266185eda.51.2017.09.22.07.09.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Sep 2017 07:09:06 -0700 (PDT) Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie References: <20170907204502.GC4488@ACM> <69e034d3-7a52-cc81-dc56-e5308ad5dce0@yandex.ru> <20170910113626.GB3588@ACM> <20170911201204.GC3605@ACM> <20170917102956.GA4519@ACM> <20170918190847.GB4536@ACM> <20170919204753.GD19168@ACM> From: Dmitry Gutov Message-ID: <8819156d-b58f-f87f-14b1-5e347202c752@yandex.ru> Date: Fri, 22 Sep 2017 17:09:03 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: <20170919204753.GD19168@ACM> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 0.7 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.7 (/) Hi Alan, On 9/19/17 11:47 PM, Alan Mackenzie wrote: > I have done now, without the slightest cause for concern (see below). Thank you. Should you commit the patch (with any documentation tweaks you deem necessary), or should I? > I've done some semi-formal testing on it. My semi-formal test log is: > > (ii) Do some testing, using xdisp.c as test file. A file.c will not have > other calls to syntax-ppss interfering with the tests. > o - 1. Normal working: check both caches stay empty. They don't, because > syntax-ppss is used, I think, by font locking. > o - 2. Normal work in a narrowed buffer. Seems OK. > o - 3. Switch back to widened. Seems OK. > o - 4. Switch back to narrowed, same point-min. Check the caches. They > look OK. > o - 5. Switch to a different narrowing and (syntax-ppss (point-min)). This > does indeed empty the syntax-ppss-narrow, as it should. s-p-wide looks > unchanged. Good. > o - 6. Get well filled caches for both narrow and wide regions. With the > buffer wide, make a buffer change early in the buffer. Check both caches > are properly trimmed. They are. > o - 7. Repeat 6, but trim with the buffer narrow. Both caches look OK, the > narrow cache being (nil). Yes, this sounds fine. I've tried out most of those myself too, except usually without checking the cache contents. Just the syntax-ppss results. It would be nice to have 2 or 3 of those added as automated tests, BTW. > Maybe I should also try some heavy hacking in, say, Emacs Lisp mode as a > kind of soak test, since elisp mode uses syntax-ppss quite a bit, I > believe. Sure, except emacs-lisp-mode seems to still retain certain indentation-related problems, even without this change. I don't really expect to uncover problems from this patch much later. That's been the point of making the change as simple as possible. From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 24 07:34:03 2017 Received: (at 22983) by debbugs.gnu.org; 24 Sep 2017 11:34:03 +0000 Received: from localhost ([127.0.0.1]:55250 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dw5Ah-0006yL-2J for submit@debbugs.gnu.org; Sun, 24 Sep 2017 07:34:03 -0400 Received: from ocolin.muc.de ([193.149.48.4]:37918 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1dw5Ae-0006xv-Ur for 22983@debbugs.gnu.org; Sun, 24 Sep 2017 07:34:01 -0400 Received: (qmail 9930 invoked by uid 3782); 24 Sep 2017 11:33:59 -0000 Received: from acm.muc.de (p548C6746.dip0.t-ipconnect.de [84.140.103.70]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sun, 24 Sep 2017 13:33:57 +0200 Received: (qmail 5987 invoked by uid 1000); 24 Sep 2017 11:26:37 -0000 Date: Sun, 24 Sep 2017 11:26:37 +0000 To: Dmitry Gutov Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20170924112637.GA5725@ACM> References: <20170910113626.GB3588@ACM> <20170911201204.GC3605@ACM> <20170917102956.GA4519@ACM> <20170918190847.GB4536@ACM> <20170919204753.GD19168@ACM> <8819156d-b58f-f87f-14b1-5e347202c752@yandex.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8819156d-b58f-f87f-14b1-5e347202c752@yandex.ru> User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry. On Fri, Sep 22, 2017 at 17:09:03 +0300, Dmitry Gutov wrote: > Hi Alan, > On 9/19/17 11:47 PM, Alan Mackenzie wrote: > > I have done now, without the slightest cause for concern (see below). > Thank you. Should you commit the patch (with any documentation tweaks > you deem necessary), or should I? Could I ask you to do it, please? I'm somewhat exhausted from debating another basic Emacs change. Ah yes, the documentation. I checked the doc in the elisp manual, and twice the phrase "from the beginning of the buffer" was used. I've clarified that with "from the beginning of the visible portion of the buffer". I've also amended "a cache" to "caches", though this doesn't seem too important. What do you think: diff --git a/doc/lispref/syntax.texi b/doc/lispref/syntax.texi index e3ae53536f..b37f2b22b8 100644 --- a/doc/lispref/syntax.texi +++ b/doc/lispref/syntax.texi @@ -751,7 +751,8 @@ Position Parse @defun syntax-ppss &optional pos This function returns the parser state that the parser would reach at -position @var{pos} starting from the beginning of the buffer. +position @var{pos} starting from the beginning of the visible portion +of the buffer. @iftex See the next section for @end iftex @@ -762,11 +763,11 @@ Position Parse The return value is the same as if you call the low-level parsing function @code{parse-partial-sexp} to parse from the beginning of the -buffer to @var{pos} (@pxref{Low-Level Parsing}). However, -@code{syntax-ppss} uses a cache to speed up the computation. Due to -this optimization, the second value (previous complete subexpression) -and sixth value (minimum parenthesis depth) in the returned parser -state are not meaningful. +visible portion of the buffer to @var{pos} (@pxref{Low-Level +Parsing}). However, @code{syntax-ppss} uses caches to speed up the +computation. Due to this optimization, the second value (previous +complete subexpression) and sixth value (minimum parenthesis depth) in +the returned parser state are not meaningful. This function has a side effect: it adds a buffer-local entry to @code{before-change-functions} (@pxref{Change Hooks}) for -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 25 19:54:05 2017 Received: (at 22983) by debbugs.gnu.org; 25 Sep 2017 23:54:05 +0000 Received: from localhost ([127.0.0.1]:59236 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dwdCP-0003qB-2F for submit@debbugs.gnu.org; Mon, 25 Sep 2017 19:54:05 -0400 Received: from mail-wm0-f51.google.com ([74.125.82.51]:50391) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dwdCL-0003pe-Cm for 22983@debbugs.gnu.org; Mon, 25 Sep 2017 19:54:02 -0400 Received: by mail-wm0-f51.google.com with SMTP id b195so2323739wmb.5 for <22983@debbugs.gnu.org>; Mon, 25 Sep 2017 16:54:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=EvnVMcpJEuiTJIzZy0BQN2/AqVqx8R+oFcRQPoSk2O0=; b=tZ0EyNkcaTiBd1artJl+p96sFpYcdb+il77Aks6rv8+Ui6Rf5Hw2XCrFsUIQJJdb7B IHrQt2DgoCji6NzVEG5BRnx+2jNgfZ7j8lYHePlSI+SBBwqdwoPBlkqaBV7OjxH8llMT 9NEEXQ680T91gJpH9t4aVC+zq9FA7Tt2A0e4JWoi7rX9xlt9yDRe2N3hZZ3w4pHoxSQO uZbj20G4xBk3AfYwivELIpso6sRpNa7u1lkNYe1DSavy3KuzYl+VnxLu6fJcCMOQbfGQ jzFqGxGbVvKfG7cWRTAf7zadSDW1/UKB2kinQKbxhUuEFm0Tink0gzAwJik8xz+EMzvo xJuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=EvnVMcpJEuiTJIzZy0BQN2/AqVqx8R+oFcRQPoSk2O0=; b=QeCSpLL0iwlc2xpAVloWZDKZMkK3m9IKfi37bBoT1ho9DXOXnfiRhnw2GWI4vlQE5H c2jU4aB2x5uM+IKg5MIPAQhc+x0jQsQCbP4HSLvkaWNjUHvXj6NPg1Km0LmT3hjmkEKT bAqo1ytzcFfx6Lsh1DB7iNb4H5QkK7ljKwep2cUikDLyg3OxdGu5k0t/lnCCjfKQJ/SR RRPpIi96S/i2OjI7IVHARK/ij6P00TnrvCh0SQJOVAwFe0lFx77dH+vaQCTZE7CPs2/2 GdDKWWFdTfQcPohjtH+bCW0bh6va2idGM/ePVWJ4G5ZbdzcDlLF4zPvQW3ZD4RZSx5mS Ju+g== X-Gm-Message-State: AHPjjUiD8o3m3k9y6zrpt3eBFyPKEP9W+rmyT7iG+1ejETI41Vdn2461 5egUBEt2MxDIspKVWAFQOvuIze+V X-Google-Smtp-Source: AOwi7QD5npclNr0OHLFG5BnC1a/Ok2zCV0EKM5aWqvtUzvsj1h+BolJIXv9avP22KQFW9RYAZRGKgg== X-Received: by 10.28.1.69 with SMTP id 66mr1865826wmb.88.1506383635459; Mon, 25 Sep 2017 16:53:55 -0700 (PDT) Received: from [192.168.1.3] ([185.105.174.193]) by smtp.googlemail.com with ESMTPSA id c11sm7399257wrb.14.2017.09.25.16.53.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Sep 2017 16:53:54 -0700 (PDT) Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. To: Alan Mackenzie References: <20170910113626.GB3588@ACM> <20170911201204.GC3605@ACM> <20170917102956.GA4519@ACM> <20170918190847.GB4536@ACM> <20170919204753.GD19168@ACM> <8819156d-b58f-f87f-14b1-5e347202c752@yandex.ru> <20170924112637.GA5725@ACM> From: Dmitry Gutov Message-ID: Date: Tue, 26 Sep 2017 02:53:52 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Thunderbird/56.0 MIME-Version: 1.0 In-Reply-To: <20170924112637.GA5725@ACM> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 0.7 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.7 (/) Hi Alan, On 9/24/17 2:26 PM, Alan Mackenzie wrote: > Could I ask you to do it, please? I'm somewhat exhausted from debating > another basic Emacs change. Pushed to emacs-26, thanks. > Ah yes, the documentation. I checked the doc in the elisp manual, and > twice the phrase "from the beginning of the buffer" was used. I've > clarified that with "from the beginning of the visible portion of the > buffer". I've also amended "a cache" to "caches", though this doesn't > seem too important. What do you think: LGTM. I think you can push it and finally close this bug. ;-) From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 01 12:31:06 2017 Received: (at 22983-done) by debbugs.gnu.org; 1 Oct 2017 16:31:06 +0000 Received: from localhost ([127.0.0.1]:42956 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dyh8z-0007ub-Sf for submit@debbugs.gnu.org; Sun, 01 Oct 2017 12:31:05 -0400 Received: from ocolin.muc.de ([193.149.48.4]:54674 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1dyh8y-0007uR-E5 for 22983-done@debbugs.gnu.org; Sun, 01 Oct 2017 12:31:04 -0400 Received: (qmail 24904 invoked by uid 3782); 1 Oct 2017 16:31:03 -0000 Date: 1 Oct 2017 16:31:03 -0000 Message-ID: <20171001163103.24902.qmail@mail.muc.de> From: Alan Mackenzie To: 22983-done@debbugs.gnu.org Subject: Re: bug#22983: syntax-ppss returns wrong result. Organization: muc.de e.V. In-Reply-To: X-Newsgroups: gnu.emacs.bug User-Agent: tin/2.4.1-20161224 ("Daill") (UNIX) (FreeBSD/11.0-RELEASE-p2 (amd64)) X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983-done X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) The bug has been fixed by patches to the emacs-26 branch. -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 01 12:45:04 2017 Received: (at 22983) by debbugs.gnu.org; 1 Oct 2017 16:45:04 +0000 Received: from localhost ([127.0.0.1]:42970 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dyhMV-0008G2-No for submit@debbugs.gnu.org; Sun, 01 Oct 2017 12:45:04 -0400 Received: from ocolin.muc.de ([193.149.48.4]:54898 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1dyhMT-0008FU-Kx for 22983@debbugs.gnu.org; Sun, 01 Oct 2017 12:45:02 -0400 Received: (qmail 44663 invoked by uid 3782); 1 Oct 2017 16:44:56 -0000 Received: from acm.muc.de (p548C6954.dip0.t-ipconnect.de [84.140.105.84]) by colin.muc.de (tmda-ofmipd) with ESMTP; Sun, 01 Oct 2017 18:44:55 +0200 Received: (qmail 29500 invoked by uid 1000); 1 Oct 2017 16:36:13 -0000 Date: Sun, 1 Oct 2017 16:36:13 +0000 To: Dmitry Gutov Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. Message-ID: <20171001163613.GB3461@ACM> References: <20170911201204.GC3605@ACM> <20170917102956.GA4519@ACM> <20170918190847.GB4536@ACM> <20170919204753.GD19168@ACM> <8819156d-b58f-f87f-14b1-5e347202c752@yandex.ru> <20170924112637.GA5725@ACM> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) X-Delivery-Agent: TMDA/1.1.12 (Macallan) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hello, Dmitry. On Tue, Sep 26, 2017 at 02:53:52 +0300, Dmitry Gutov wrote: > Hi Alan, > On 9/24/17 2:26 PM, Alan Mackenzie wrote: > > Could I ask you to do it, please? I'm somewhat exhausted from debating > > another basic Emacs change. > Pushed to emacs-26, thanks. > > Ah yes, the documentation. I checked the doc in the elisp manual, and > > twice the phrase "from the beginning of the buffer" was used. I've > > clarified that with "from the beginning of the visible portion of the > > buffer". I've also amended "a cache" to "caches", though this doesn't > > seem too important. What do you think: > LGTM. I think you can push it and finally close this bug. ;-) Thanks. I've just done both of these things. Phew! -- Alan Mackenzie (Nuremberg, Germany). From debbugs-submit-bounces@debbugs.gnu.org Wed Oct 04 16:07:45 2017 Received: (at 22983) by debbugs.gnu.org; 4 Oct 2017 20:07:45 +0000 Received: from localhost ([127.0.0.1]:49270 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dzpxI-0005KZ-Vx for submit@debbugs.gnu.org; Wed, 04 Oct 2017 16:07:45 -0400 Received: from manu26.manufrog.com ([98.142.98.2]:44926) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dzpxG-0005KM-Ua for 22983@debbugs.gnu.org; Wed, 04 Oct 2017 16:07:43 -0400 Received: from c-3902e555.04-211-6c6b701.cust.bredbandsbolaget.se ([85.229.2.57]:34032 helo=muon.localdomain) by manu26.manufrog.com with esmtpa (Exim 4.89) (envelope-from ) id 1dzpx8-0001kt-IM; Wed, 04 Oct 2017 22:07:34 +0200 Received: by muon.localdomain (Postfix, from userid 1000) id AB5ED48421D; Wed, 4 Oct 2017 22:07:32 +0200 (CEST) From: =?utf-8?Q?Johan_Bockg=C3=A5rd?= To: Alan Mackenzie Subject: Re: bug#22983: [ Patch ] Re: bug#22983: syntax-ppss returns wrong result. References: <20170910113626.GB3588@ACM> <20170911201204.GC3605@ACM> <20170917102956.GA4519@ACM> <20170918190847.GB4536@ACM> <20170919204753.GD19168@ACM> <8819156d-b58f-f87f-14b1-5e347202c752@yandex.ru> <20170924112637.GA5725@ACM> Date: Wed, 04 Oct 2017 22:07:32 +0200 In-Reply-To: <20170924112637.GA5725@ACM> (Alan Mackenzie's message of "Sun, 24 Sep 2017 11:26:37 +0000") Message-ID: <878tgqzngb.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - manu26.manufrog.com X-AntiAbuse: Original Domain - debbugs.gnu.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - gnu.org X-Get-Message-Sender-Via: manu26.manufrog.com: authenticated_id: noreply@tryserumgardar.se X-Authenticated-Sender: manu26.manufrog.com: noreply@tryserumgardar.se X-Source: X-Source-Args: X-Source-Dir: X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 22983 Cc: John Wiegley , Philipp Stephani , 22983@debbugs.gnu.org, Dmitry Gutov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 1.0 (+) Alan Mackenzie writes: > Ah yes, the documentation. I checked the doc in the elisp manual, and > twice the phrase "from the beginning of the buffer" was used. I've > clarified that with "from the beginning of the visible portion of the > buffer". The manual uses the term "accessible portion" for this. ("Visible" usually refers to text in a window.) From unknown Fri Jun 20 07:29:12 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Thu, 02 Nov 2017 11:24:06 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator