From unknown Sat Jun 21 03:07:15 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#6991 <6991@debbugs.gnu.org> To: bug#6991 <6991@debbugs.gnu.org> Subject: Status: Please keep bytecode out of *Backtrace* buffers Reply-To: bug#6991 <6991@debbugs.gnu.org> Date: Sat, 21 Jun 2025 10:07:15 +0000 retitle 6991 Please keep bytecode out of *Backtrace* buffers reassign 6991 emacs submitter 6991 jidanni@jidanni.org severity 6991 wishlist tag 6991 fixed notabug thanks From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 06 21:33:37 2010 Received: (at submit) by debbugs.gnu.org; 7 Sep 2010 01:33:38 +0000 Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Osn45-0002kC-JP for submit@debbugs.gnu.org; Mon, 06 Sep 2010 21:33:37 -0400 Received: from eggs.gnu.org ([140.186.70.92]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Osn43-0002k7-3C for submit@debbugs.gnu.org; Mon, 06 Sep 2010 21:33:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Osn5p-0005Jf-PU for submit@debbugs.gnu.org; Mon, 06 Sep 2010 21:35:29 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from lists.gnu.org ([199.232.76.165]:46258) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Osn5p-0005Jb-No for submit@debbugs.gnu.org; Mon, 06 Sep 2010 21:35:25 -0400 Received: from [140.186.70.92] (port=47005 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Osn5l-0004ye-9f for bug-gnu-emacs@gnu.org; Mon, 06 Sep 2010 21:35:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Osn5g-0005Hx-VD for bug-gnu-emacs@gnu.org; Mon, 06 Sep 2010 21:35:21 -0400 Received: from caiajhbdcbbj.dreamhost.com ([208.97.132.119]:56250 helo=homiemail-a3.g.dreamhost.com) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Osn5g-0005Hp-Q7 for bug-gnu-emacs@gnu.org; Mon, 06 Sep 2010 21:35:16 -0400 Received: from homiemail-a3.g.dreamhost.com (localhost [127.0.0.1]) by homiemail-a3.g.dreamhost.com (Postfix) with ESMTP id A6D8928406E for ; Mon, 6 Sep 2010 18:35:14 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=jidanni.org; h=from:to:subject :date:message-id:mime-version:content-type; q=dns; s=jidanni.org ; b=l+6AOJ3+9DiSmTP9m9YrLSqWqf/9anZ2tj0e0+6VXubRHPWV+yuH36FtDInt MfOjOFmC6+ESnp/65OWW8AFxWHkqYopU8KFDfE+imJs8Hr0IX5jQAxq5FMdl0ggG TalBStu/s9XlGCtSDuYiH0TCixeiWfdzoDQw1Y2yCh1yPX8= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=jidanni.org; h=from:to :subject:date:message-id:mime-version:content-type; s= jidanni.org; bh=bJ+OnNvdtzepCtntQ/ZxH96hQZI=; b=bb1BOxEjLMhwvVGo M9QKLA498HyPEd0PszTLXwW/hEoXD4w00fC8PhMK7WEs6dr9Q1SrXhjH4qUdGSd8 Ycu2u6iZq3zP6de3BY5rbM+TJJV0szGf5yX++UxP/Gj3Hz5HGOglquFqLIvJCLdT 52Q+XDOofvgr3xLMaTkgCOCP3DQ= Received: from jidanni.org (218-163-0-194.dynamic.hinet.net [218.163.0.194]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: jidanni@jidanni.org) by homiemail-a3.g.dreamhost.com (Postfix) with ESMTPSA id 5AB6F28406C for ; Mon, 6 Sep 2010 18:35:14 -0700 (PDT) From: jidanni@jidanni.org To: bug-gnu-emacs@gnu.org Subject: Please keep bytecode out of *Backtrace* buffers Date: Tue, 07 Sep 2010 09:35:10 +0800 Message-ID: <8739tm9vzl.fsf@jidanni.org> MIME-Version: 1.0 Content-Type: text/plain X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Spam-Score: -5.3 (-----) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -5.3 (-----) Please keep bytecode out of *Backtrace* buffers. * It is unreadable. * It will cause problems when sent via email. Even if one runs col(1) and strings(1) on it, nobody can read it anyway. * The mountain of gobbledygook makes people reading give up on trying to help. E.g., http://article.gmane.org/gmane.emacs.w3m/8695 From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 21 20:04:54 2012 Received: (at 6991-done) by debbugs.gnu.org; 22 Feb 2012 01:04:54 +0000 Received: from localhost ([127.0.0.1]:49497 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1S00dZ-0003XT-GO for submit@debbugs.gnu.org; Tue, 21 Feb 2012 20:04:54 -0500 Received: from fencepost.gnu.org ([140.186.70.10]:54427 ident=Debian-exim) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1S00dW-0003XM-MP for 6991-done@debbugs.gnu.org; Tue, 21 Feb 2012 20:04:51 -0500 Received: from rgm by fencepost.gnu.org with local (Exim 4.71) (envelope-from ) id 1S00bG-0001Hh-Sy; Tue, 21 Feb 2012 20:02:30 -0500 From: Glenn Morris To: 6991-done@debbugs.gnu.org Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> X-Spook: Manfurov Plame assassination Dateline infowar Security X-Ran: ma^xv{LQ.|a.wS5>J!+M3f;GIe&G:z!Q:SLEK>F.,yg0\lA\Cl]$= X-Hue: blue X-Attribution: GM Date: Tue, 21 Feb 2012 20:02:30 -0500 In-Reply-To: <8739tm9vzl.fsf@jidanni.org> (jidanni@jidanni.org's message of "Tue, 07 Sep 2010 09:35:10 +0800") Message-ID: User-Agent: Gnus (www.gnus.org), GNU Emacs (www.gnu.org/software/emacs/) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Score: -4.2 (----) X-Debbugs-Envelope-To: 6991-done X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.2 (----) No. Closed as wontfix. From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 22 11:45:52 2012 Received: (at 6991) by debbugs.gnu.org; 22 Feb 2012 16:45:52 +0000 Received: from localhost ([127.0.0.1]:51245 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1S0FKB-00019o-Dq for submit@debbugs.gnu.org; Wed, 22 Feb 2012 11:45:52 -0500 Received: from acsinet15.oracle.com ([141.146.126.227]:23653) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1S0FK8-00019X-25; Wed, 22 Feb 2012 11:45:49 -0500 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by acsinet15.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id q1MGhGXE019510 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 22 Feb 2012 16:43:17 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id q1MGhG2p001137 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 22 Feb 2012 16:43:16 GMT Received: from abhmt106.oracle.com (abhmt106.oracle.com [141.146.116.58]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id q1MGhFBW026558; Wed, 22 Feb 2012 10:43:15 -0600 Received: from dradamslap1 (/130.35.178.194) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 22 Feb 2012 08:43:15 -0800 From: "Drew Adams" To: "'Glenn Morris'" , <6991-done@debbugs.gnu.org>, <6991@debbugs.gnu.org> References: <8739tm9vzl.fsf@jidanni.org> Subject: RE: bug#6991: Please keep bytecode out of *Backtrace* buffers Date: Wed, 22 Feb 2012 08:43:14 -0800 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Office Outlook 11 In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 Thread-Index: Aczw/bWJZB8lQJggSF6L8nsDU3tTWAAguSJA X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Auth-Type: Internal IP X-CT-RefId: str=0001.0A090208.4F451B27.0069,ss=1,re=0.000,fgs=0 X-Spam-Score: -6.9 (------) X-Debbugs-Envelope-To: 6991 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -6.9 (------) > No. Closed as wontfix. Why? No reason given. This is a reasonable request, which would improve correspondence about bugs and user difficulties. Users who are aware of the problem often have to manually excise such binary codes and replace them with `...' or nothing. Users who are unaware of the problem can end up sending an incomplete backtrace. This should at least be a wishlist item, IMO. Or at least give a convincing argument why the request is not appropriate. From unknown Sat Jun 21 03:07:15 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: Did not alter fixed versions and reopened. Date: Wed, 22 Feb 2012 16:47:01 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # Did not alter fixed versions and reopened. thanks # This fakemail brought to you by your local debbugs # administrator From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 22 12:05:11 2012 Received: (at 6991) by debbugs.gnu.org; 22 Feb 2012 17:05:11 +0000 Received: from localhost ([127.0.0.1]:51258 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1S0Fcq-0002Qt-2o for submit@debbugs.gnu.org; Wed, 22 Feb 2012 12:05:11 -0500 Received: from mail-pz0-f44.google.com ([209.85.210.44]:35624) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1S0Fck-0002QC-G8; Wed, 22 Feb 2012 12:05:06 -0500 Received: by dakl33 with SMTP id l33so205977dak.3 for ; Wed, 22 Feb 2012 09:02:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type:content-transfer-encoding; bh=16boqr98XwITSmCcrDIaHUm6v3mU6Fgo2kldF1AsF7c=; b=hhLDxGS2OU6h4Rj5yRbZ0KJwuRXEgSfe6M02xB7uGnr8PJBwc6wZ617ulvH8RqlToJ PGviyml1icebiWMK+9j2+uI69YIHyOHOIj8ZTZAeKEDDNe2KiYk5ODhBT17Kr/MNTLcg W0Rt8gHwDntkZuQsTy472VXZ0RSaf1KEXZ+GY= Received: by 10.68.73.138 with SMTP id l10mr74651516pbv.22.1329930153179; Wed, 22 Feb 2012 09:02:33 -0800 (PST) MIME-Version: 1.0 Received: by 10.142.241.5 with HTTP; Wed, 22 Feb 2012 09:01:53 -0800 (PST) In-Reply-To: References: <8739tm9vzl.fsf@jidanni.org> From: Juanma Barranquero Date: Wed, 22 Feb 2012 18:01:53 +0100 Message-ID: Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers To: Drew Adams Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.6 (--) X-Debbugs-Envelope-To: 6991 Cc: Glenn Morris , 6991-done@debbugs.gnu.org, 6991@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -2.6 (--) On Wed, Feb 22, 2012 at 17:43, Drew Adams wrote: > Why? =C2=A0No reason given. =C2=A0This is a reasonable request, which wou= ld improve > correspondence about bugs and user difficulties. > > Users who are aware of the problem often have to manually excise such bin= ary > codes and replace them with `...' or nothing. Yes. Not two days ago I had to do exactly that. > This should at least be a wishlist item, IMO. =C2=A0Or at least give a co= nvincing > argument why the request is not appropriate. Agreed. =C2=A0 =C2=A0 Juanma From unknown Sat Jun 21 03:07:15 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, 22 Mar 2012 11:24:04 +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 From unknown Sat Jun 21 03:07:15 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: Did not alter fixed versions and reopened. Date: Mon, 02 Jul 2012 17:34:01 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # Did not alter fixed versions and reopened. thanks # This fakemail brought to you by your local debbugs # administrator From debbugs-submit-bounces@debbugs.gnu.org Mon Jul 02 13:36:04 2012 Received: (at control) by debbugs.gnu.org; 2 Jul 2012 17:36:04 +0000 Received: from localhost ([127.0.0.1]:43025 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1SlkXb-0001jU-Hh for submit@debbugs.gnu.org; Mon, 02 Jul 2012 13:36:04 -0400 Received: from rcsinet15.oracle.com ([148.87.113.117]:33735) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1SlkXZ-0001j6-B1 for control@debbugs.gnu.org; Mon, 02 Jul 2012 13:36:02 -0400 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by rcsinet15.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id q62HVN3M004935 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 2 Jul 2012 17:31:24 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id q62HVNO1025592 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 2 Jul 2012 17:31:23 GMT Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id q62HVNZU021137 for ; Mon, 2 Jul 2012 12:31:23 -0500 Received: from dradamslap1 (/130.35.178.194) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 02 Jul 2012 10:31:22 -0700 From: "Drew Adams" To: Subject: bug #6991: unarchive, reopen Date: Mon, 2 Jul 2012 10:31:22 -0700 Message-ID: <4E9E5776046C4B938155471C701459FF@us.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Office Outlook 11 Thread-Index: Ac1YeH9XJkT1TBeNQpyv2p9omxlPJA== X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Spam-Score: -6.9 (------) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -6.9 (------) unarchive 6991 reopen 6991 thanks From unknown Sat Jun 21 03:07:15 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: Did not alter fixed versions and reopened. Date: Mon, 02 Jul 2012 17:37:02 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # Did not alter fixed versions and reopened. thanks # This fakemail brought to you by your local debbugs # administrator From debbugs-submit-bounces@debbugs.gnu.org Mon Jul 02 13:45:21 2012 Received: (at 6991) by debbugs.gnu.org; 2 Jul 2012 17:45:21 +0000 Received: from localhost ([127.0.0.1]:43046 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1Slkgb-0002Py-Co for submit@debbugs.gnu.org; Mon, 02 Jul 2012 13:45:21 -0400 Received: from rcsinet15.oracle.com ([148.87.113.117]:50979) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1SlkgZ-0002NN-9T; Mon, 02 Jul 2012 13:45:20 -0400 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by rcsinet15.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id q62HeeZN013493 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 2 Jul 2012 17:40:41 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id q62HeeG1026731 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 2 Jul 2012 17:40:40 GMT Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id q62HeekG027200; Mon, 2 Jul 2012 12:40:40 -0500 Received: from dradamslap1 (/130.35.178.194) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 02 Jul 2012 10:40:39 -0700 From: "Drew Adams" To: "'Juanma Barranquero'" References: <8739tm9vzl.fsf@jidanni.org> Subject: RE: bug#6991: Please keep bytecode out of *Backtrace* buffers Date: Mon, 2 Jul 2012 10:40:38 -0700 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-Mailer: Microsoft Office Outlook 11 In-Reply-To: Thread-Index: Aczxg8XkzBt0gwdOQjC5j/k7I06MExm9TxlA X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Spam-Score: -6.9 (------) X-Debbugs-Envelope-To: 6991 Cc: 'Glenn Morris' , 6991-done@debbugs.gnu.org, 6991@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -6.9 (------) > > Why? =A0No reason given. =A0This is a reasonable request, which=20 > > would improve correspondence about bugs and user difficulties. And no response to that question. I've reopened this bug. > > Users who are aware of the problem often have to manually=20 > > excise such binary codes and replace them with `...' or nothing. >=20 > Yes. Not two days ago I had to do exactly that. I do it quite frequently. And I see portions of backtrace text sent by = email and posted to websites quite often - including in this bug list! Posting a backtrace is a common and reasonable way to communicate about = many Emacs problems. Needing to hand-sanitize a backtrace log to remove byte = code portions is silly. That's what machines and software are for. > > This should at least be a wishlist item, IMO. =A0Or at least=20 > > give a convincing argument why the request is not appropriate. >=20 > Agreed. Users should be able to control this (e.g. via an option, and perhaps = even a toggle key in buffer *Backtrace*. The usefulness of this should be a no-brainer. I cannot speak to the difficulty of implementating the fix. From unknown Sat Jun 21 03:07:15 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: Did not alter fixed versions and reopened. Date: Mon, 02 Jul 2012 17:50:01 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # Did not alter fixed versions and reopened. thanks # This fakemail brought to you by your local debbugs # administrator From debbugs-submit-bounces@debbugs.gnu.org Mon Jul 02 14:43:22 2012 Received: (at 6991) by debbugs.gnu.org; 2 Jul 2012 18:43:22 +0000 Received: from localhost ([127.0.0.1]:43164 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1Sllaj-0004wJ-RE for submit@debbugs.gnu.org; Mon, 02 Jul 2012 14:43:22 -0400 Received: from ironport2-out.teksavvy.com ([206.248.154.182]:23452) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1Sllag-0004w6-VX; Mon, 02 Jul 2012 14:43:19 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ai0FAG6Zu09FxKFY/2dsb2JhbABEsEiDSYEIghUBAQQBViMQCzQSFBgNJIgcBboJkEQDozOBWIMF X-IronPort-AV: E=Sophos;i="4.75,637,1330923600"; d="scan'208";a="192491918" Received: from 69-196-161-88.dsl.teksavvy.com (HELO pastel.home) ([69.196.161.88]) by ironport2-out.teksavvy.com with ESMTP/TLS/ADH-AES256-SHA; 02 Jul 2012 14:38:41 -0400 Received: by pastel.home (Postfix, from userid 20848) id 276505976E; Mon, 2 Jul 2012 14:38:41 -0400 (EDT) From: Stefan Monnier To: "Drew Adams" Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers Message-ID: References: <8739tm9vzl.fsf@jidanni.org> Date: Mon, 02 Jul 2012 14:38:40 -0400 In-Reply-To: (Drew Adams's message of "Mon, 2 Jul 2012 10:40:38 -0700") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -1.9 (-) X-Debbugs-Envelope-To: 6991 Cc: 'Juanma Barranquero' , 6991-done@debbugs.gnu.org, 6991@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.9 (-) >> > Why? =A0No reason given. =A0This is a reasonable request, which=20 >> > would improve correspondence about bugs and user difficulties. > And no response to that question. I've reopened this bug. You can try the simple patch below. It doesn't cut it for me, and I think the only way to make it work well would be to change the representation of the byte-codes so that they're not just a "unibyte string" but an object with a distinctive type: the patch only catches the case where the byte-codes appear within a printed byte-compiled-function, not when they're arguments to the `byte-code' function or to the `make-byte-code' function, and I'm sure there can be other cases. Stefan =3D=3D=3D modified file 'src/print.c' --- src/print.c 2012-06-28 11:11:48 +0000 +++ src/print.c 2012-07-02 18:37:46 +0000 @@ -1937,8 +1937,11 @@ else { ptrdiff_t size =3D ASIZE (obj); + int bytecode =3D 0; + if (COMPILEDP (obj)) { PRINTCHAR ('#'); + bytecode =3D 1; size &=3D PSEUDOVECTOR_SIZE_MASK; } @@ -1978,6 +1981,9 @@ { if (i) PRINTCHAR (' '); tem =3D AREF (obj, i); + if (bytecode && i =3D=3D 1 && INTEGERP (Vprint_level)) + strout ("\"....\"", 16, 16, printcharfun); + else print_object (tem, printcharfun, escapeflag); } if (size < real_size) From debbugs-submit-bounces@debbugs.gnu.org Mon Jul 02 15:11:12 2012 Received: (at 6991) by debbugs.gnu.org; 2 Jul 2012 19:11:12 +0000 Received: from localhost ([127.0.0.1]:43192 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1Slm1g-0005YZ-2M for submit@debbugs.gnu.org; Mon, 02 Jul 2012 15:11:12 -0400 Received: from acsinet15.oracle.com ([141.146.126.227]:27976) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1Slm1d-0005YR-CZ for 6991@debbugs.gnu.org; Mon, 02 Jul 2012 15:11:10 -0400 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by acsinet15.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id q62J6TMx005901 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 2 Jul 2012 19:06:30 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id q62J6TfW002163 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 2 Jul 2012 19:06:29 GMT Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id q62J6Tsc027946; Mon, 2 Jul 2012 14:06:29 -0500 Received: from dradamslap1 (/130.35.178.194) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 02 Jul 2012 12:06:28 -0700 From: "Drew Adams" To: "'Stefan Monnier'" References: <8739tm9vzl.fsf@jidanni.org> Subject: RE: bug#6991: Please keep bytecode out of *Backtrace* buffers Date: Mon, 2 Jul 2012 12:06:27 -0700 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Office Outlook 11 In-Reply-To: Thread-Index: Ac1YgeiZaRRlgG2uRbKxzdP0en3irAAA3gNw X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Spam-Score: -6.9 (------) X-Debbugs-Envelope-To: 6991 Cc: 'Juanma Barranquero' , 6991@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -6.9 (------) > You can try the simple patch below. It doesn't cut it for me, and > I think the only way to make it work well would be to change the > representation of the byte-codes so that they're not just a "unibyte > string" but an object with a distinctive type: the patch only catches > the case where the byte-codes appear within a printed > byte-compiled-function, not when they're arguments to the `byte-code' > function or to the `make-byte-code' function, and I'm sure > there can be other cases. Thanks, but I don't build Emacs. Hopefully something like this will be added to Emacs itself, even if it is only a partial solution. Did you mean to close the bug? It seems to be getting closed just because (?) 6991-done is in the recipients list. If you did not mean to close it, let's please reopen it. Even if it is made only a wishlist item, it is a useful enhancement request. From unknown Sat Jun 21 03:07:15 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: Did not alter fixed versions and reopened. Date: Tue, 03 Jul 2012 14:39:01 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # Did not alter fixed versions and reopened. thanks # This fakemail brought to you by your local debbugs # administrator From debbugs-submit-bounces@debbugs.gnu.org Thu Jan 24 17:43:29 2013 Received: (at 6991) by debbugs.gnu.org; 24 Jan 2013 22:43:29 +0000 Received: from localhost ([127.0.0.1]:48269 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TyVW5-0000hY-B0 for submit@debbugs.gnu.org; Thu, 24 Jan 2013 17:43:29 -0500 Received: from userp1040.oracle.com ([156.151.31.81]:28491) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TyVW2-0000hQ-Ek for 6991@debbugs.gnu.org; Thu, 24 Jan 2013 17:43:27 -0500 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id r0OMhKVC024030 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 24 Jan 2013 22:43:21 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r0OMhIYj003797 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 24 Jan 2013 22:43:19 GMT Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id r0OMhHvH005017; Thu, 24 Jan 2013 16:43:17 -0600 Received: from dradamslap1 (/130.35.178.8) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 24 Jan 2013 14:43:17 -0800 From: "Drew Adams" To: "'Stefan Monnier'" References: <8739tm9vzl.fsf@jidanni.org> Subject: RE: bug#6991: Please keep bytecode out of *Backtrace* buffers Date: Thu, 24 Jan 2013 14:43:16 -0800 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Office Outlook 11 In-reply-to: Thread-Index: Ac1YgeiZaRRlgG2uRbKxzdP0en3irAAA3gNwKH83EAA= X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Spam-Score: -1.5 (-) X-Debbugs-Envelope-To: 6991 Cc: 'Juanma Barranquero' , 6991@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -1.5 (-) > Sent: Monday, July 02, 2012 12:06 PM > > > You can try the simple patch below. It doesn't cut it for me, and > > I think the only way to make it work well would be to change the > > representation of the byte-codes so that they're not just a "unibyte > > string" but an object with a distinctive type: the patch > > only catches the case where the byte-codes appear within a printed > > byte-compiled-function, not when they're arguments to the > > `byte-code' function or to the `make-byte-code' function, and I'm sure > > there can be other cases. > > Thanks, but I don't build Emacs. Hopefully something like > this will be added to Emacs itself, even if it is only a partial > solution. > > Did you mean to close the bug? It seems to be getting closed > just because (?) 6991-done is in the recipients list. > > If you did not mean to close it, let's please reopen it. > Even if it is made only a wishlist item, it is a useful enhancement > request. Can we please follow up on this? The status seems to be `wishlist' but tagged `wontfix', which doesn't make a lot of sense to me. I cannot build Emacs to test this. Could someone else please test it? Or could it please be installed without testing? (Seriously.) It would _really_ be helpful if there were no binary crap in Lisp backtraces. Does that stuff actually help anyone? If so, perhaps we can keep it as a (non-default) option, but otherwise, can't we simply elide anything that is not a printable character, at the least? I mean replace it by `...', not just change a `display' property. The problems I encounter arise from trying to copy + paste the backtrace. I don't understand why we even have backtraces that one cannot copy & paste completely, into, e.g., an email. What's the point of that? If I try to paste a copied backtrace I need to paste bits of it piecemeal, because the binary parts do not paste. That is tedious and error prone. Many users might not even realize that the backtrace did not get completely pasted. Why is it so hard to advance on something like this? Stefan provided a C patch to test, and that was the end of the thread. So much stuff gets added to the Emacs C sources anyway, sometimes breaking all kinds of stuff. Why don't you please just go ahead and install your patch, Stefan, so we can see whether and how much it helps? Please consider trying to do something to advance this schmilblick. I am sure that it will be appreciated by more than just me. From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 07 18:25:14 2013 Received: (at 6991) by debbugs.gnu.org; 7 Aug 2013 22:25:14 +0000 Received: from localhost ([127.0.0.1]:46277 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1V7CAL-0006Av-Lj for submit@debbugs.gnu.org; Wed, 07 Aug 2013 18:25:14 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:29929) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1V7CAI-0006AU-FU for 6991@debbugs.gnu.org; Wed, 07 Aug 2013 18:25:11 -0400 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r77MP3Y7030785 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 7 Aug 2013 22:25:04 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r77MP163024765 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 7 Aug 2013 22:25:02 GMT Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r77MP1Bq017625; Wed, 7 Aug 2013 22:25:01 GMT MIME-Version: 1.0 Message-ID: <0095ac50-a6da-4058-a981-43954ba62e12@default> Date: Wed, 7 Aug 2013 15:25:01 -0700 (PDT) From: Drew Adams To: Stefan Monnier Subject: RE: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <<8739tm9vzl.fsf@jidanni.org>> <> In-Reply-To: <> X-Priority: 3 X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.8 (707110) [OL 12.0.6668.5000 (x86)] Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 6991 Cc: Juanma Barranquero , 6991@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 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 (--) Can we please fix this? What about Stefan's patch? Etc. > Sent: Thursday, January 24, 2013 2:43 PM >=20 > > Sent: Monday, July 02, 2012 12:06 PM > > > > > You can try the simple patch below. It doesn't cut it for me, and > > > I think the only way to make it work well would be to change the > > > representation of the byte-codes so that they're not just a "unibyte > > > string" but an object with a distinctive type: the patch > > > only catches the case where the byte-codes appear within a printed > > > byte-compiled-function, not when they're arguments to the > > > `byte-code' function or to the `make-byte-code' function, and I'm sur= e > > > there can be other cases. > > > > Thanks, but I don't build Emacs. Hopefully something like > > this will be added to Emacs itself, even if it is only a partial > > solution. > > > > Did you mean to close the bug? It seems to be getting closed > > just because (?) 6991-done is in the recipients list. > > > > If you did not mean to close it, let's please reopen it. > > Even if it is made only a wishlist item, it is a useful enhancement > > request. >=20 > Can we please follow up on this? The status seems to be `wishlist' but > tagged `wontfix', which doesn't make a lot of sense to me. >=20 > I cannot build Emacs to test this. Could someone else please test it? O= r > could it please be installed without testing? (Seriously.) >=20 > It would _really_ be helpful if there were no binary crap in Lisp > backtraces. Does that stuff actually help anyone? If so, perhaps we can > keep it as a (non-default) option, but otherwise, can't we simply elide > anything that is not a printable character, at the least? >=20 > I mean replace it by `...', not just change a `display' property. The > problems > I encounter arise from trying to copy + paste the backtrace. >=20 > I don't understand why we even have backtraces that one cannot copy & pas= te > completely, into, e.g., an email. What's the point of that? If I try to > paste a copied backtrace I need to paste bits of it piecemeal, because th= e > binary parts do not paste. That is tedious and error prone. Many users > might not even realize that the backtrace did not get completely pasted. >=20 > Why is it so hard to advance on something like this? Stefan provided a C > patch to test, and that was the end of the thread. >=20 > So much stuff gets added to the Emacs C sources anyway, sometimes breakin= g > all kinds of stuff. Why don't you please just go ahead and install your > patch, Stefan, so we can see whether and how much it helps? >=20 > Please consider trying to do something to advance this schmilblick. I am > sure that it will be appreciated by more than just me. From debbugs-submit-bounces@debbugs.gnu.org Sat Feb 01 02:28:40 2014 Received: (at control) by debbugs.gnu.org; 1 Feb 2014 07:28:40 +0000 Received: from localhost ([127.0.0.1]:43743 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1W9V0J-0002L8-6L for submit@debbugs.gnu.org; Sat, 01 Feb 2014 02:28:39 -0500 Received: from hermes.netfonds.no ([80.91.224.195]:34642) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1W9V0G-0002Ky-Ci for control@debbugs.gnu.org; Sat, 01 Feb 2014 02:28:36 -0500 Received: from [204.14.154.233] (helo=building.gnus.org) by hermes.netfonds.no with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.72) (envelope-from ) id 1W9V00-00021v-OB for control@debbugs.gnu.org; Sat, 01 Feb 2014 08:28:21 +0100 Date: Fri, 31 Jan 2014 23:27:28 -0800 Message-Id: <87ioszpa1r.fsf@building.gnus.org> To: control@debbugs.gnu.org From: Lars Ingebrigtsen Subject: control message for bug #6991 X-MailScanner-ID: 1W9V00-00021v-OB X-Netfonds-MailScanner: Found to be clean X-Netfonds-MailScanner-From: larsi@gnus.org MailScanner-NULL-Check: 1391844503.1419@Y+eFLf1teF7C/EJm6B/qVQ X-Spam-Status: No X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 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 (/) tags 6991 - wontfix From debbugs-submit-bounces@debbugs.gnu.org Sat Feb 01 02:28:43 2014 Received: (at control) by debbugs.gnu.org; 1 Feb 2014 07:28:43 +0000 Received: from localhost ([127.0.0.1]:43746 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1W9V0M-0002LQ-MZ for submit@debbugs.gnu.org; Sat, 01 Feb 2014 02:28:43 -0500 Received: from hermes.netfonds.no ([80.91.224.195]:34647) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1W9V0J-0002LB-Oc for control@debbugs.gnu.org; Sat, 01 Feb 2014 02:28:40 -0500 Received: from [204.14.154.233] (helo=building.gnus.org) by hermes.netfonds.no with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.72) (envelope-from ) id 1W9V06-000222-0r for control@debbugs.gnu.org; Sat, 01 Feb 2014 08:28:26 +0100 Date: Fri, 31 Jan 2014 23:27:34 -0800 Message-Id: <87ha8jpa1l.fsf@building.gnus.org> To: control@debbugs.gnu.org From: Lars Ingebrigtsen Subject: control message for bug #6991 X-MailScanner-ID: 1W9V06-000222-0r X-Netfonds-MailScanner: Found to be clean X-Netfonds-MailScanner-From: larsi@gnus.org MailScanner-NULL-Check: 1391844506.64258@M2mXOsHUoYuks3oO3+LIkg X-Spam-Status: No X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 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 (/) tags 6991 patch From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 26 01:42:33 2016 Received: (at 6991) by debbugs.gnu.org; 26 Feb 2016 06:42:33 +0000 Received: from localhost ([127.0.0.1]:46684 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aZC6j-00024R-7Z for submit@debbugs.gnu.org; Fri, 26 Feb 2016 01:42:33 -0500 Received: from hermes.netfonds.no ([80.91.224.195]:35230) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aZC6h-000240-6w; Fri, 26 Feb 2016 01:42:31 -0500 Received: from [175.103.25.178] (helo=mouse) by hermes.netfonds.no with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.72) (envelope-from ) id 1aZC5l-0005d1-U9; Fri, 26 Feb 2016 07:41:34 +0100 From: Lars Ingebrigtsen To: Stefan Monnier Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> Date: Fri, 26 Feb 2016 17:11:28 +1030 In-Reply-To: (Stefan Monnier's message of "Mon, 02 Jul 2012 14:38:40 -0400") Message-ID: <87vb5ct1lz.fsf@gnus.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable X-MailScanner-ID: 1aZC5l-0005d1-U9 X-Netfonds-MailScanner: Found to be clean X-Netfonds-MailScanner-From: larsi@gnus.org MailScanner-NULL-Check: 1457073695.03617@r/7BUhvppLOz3Q4DVaJjkA X-Spam-Status: No X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 6991 Cc: 'Juanma Barranquero' , 6991-done@debbugs.gnu.org, Drew Adams , 6991@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 (/) Stefan Monnier writes: > You can try the simple patch below. It doesn't cut it for me, and > I think the only way to make it work well would be to change the > representation of the byte-codes so that they're not just a "unibyte > string" but an object with a distinctive type: the patch only catches > the case where the byte-codes appear within a printed > byte-compiled-function, not when they're arguments to the `byte-code' > function or to the `make-byte-code' function, and I'm sure there can be > other cases. The patch doesn't seem to do what we want. If we don't have debug-on-error, it's OK: eval: Wrong number of arguments: #[(&optional handle) "...." [art= icle-buffer handle temp-buffer coding-system-for-read coding-system-for-wri= te default-process-coding-system mm-dissect-buffer t buffer-name generate-n= ew-buffer ...] 28], 2 But with debug-on-error, the backtrace is as byte-ey as ever: Debugger entered--Lisp error: (wrong-number-of-arguments #[(&optional handl= e) "p \204 \306\307!\214``}\210\212 \211@\203\245\310 @!\203\245\311\312!r q\210\313\216\314 \210\315 @!\210\316\317 8 \211@;\203A @\202E A@@)\"\210\3= 20\211=1C=0B B\321 A@\322\"\211=12\203}\323=12\324\307#\211=12\203}=0E\325= =3D\204}\326\327 =12\"\330 \210\331 \210c\210\332ed\333\324\324\334\335\33= 6\337\340\337\341\342\341\343\341\344\345\346\347-\"\350\346\347.\"\341\351= \352\353&\210.=07*\354 *\207" [article-buffer handle temp-buffer coding-sys= tem-for-read coding-system-for-write default-process-coding-system mm-disse= ct-buffer t buffer-name generate-new-buffer " *temp*" #[nil "\301!\205 \30= 2!\207" [temp-buffer buffer-name kill-buffer] 2] mm-disable-multibyte inse= rt-buffer-substring mm-decode-content-transfer-encoding 2 utf-8 mail-conten= t-type-get charset mm-charset-to-coding-system nil ascii decode-coding-stri= ng buffer-string erase-buffer mm-enable-multibyte call-process-region "w3m"= "-halfdump" "-no-cookie" "-I" "UTF-8" "-O" "-o" "ext_halfdump=3D1" "displa= y_ins_del=3D2" "pre_conv=3D1" "-t" format "%s" "-cols" "display_image=3Don"= "-T" "text/html" gnus-html-wash-tags tab-width gnus-html-frame-width] 28] = 2) gnus-article-html(1 2) eval((gnus-article-html 1 2) nil) eval-expression((gnus-article-html 1 2) nil) funcall-interactively(eval-expression (gnus-article-html 1 2) nil) call-interactively(eval-expression nil nil) command-execute(eval-expression) --=20 (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 26 09:12:07 2016 Received: (at 6991) by debbugs.gnu.org; 26 Feb 2016 14:12:07 +0000 Received: from localhost ([127.0.0.1]:47045 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aZJ7m-0004YA-WB for submit@debbugs.gnu.org; Fri, 26 Feb 2016 09:12:07 -0500 Received: from aserp1040.oracle.com ([141.146.126.69]:46210) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aZJ7l-0004Xe-S3; Fri, 26 Feb 2016 09:12:06 -0500 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u1QEBxDb015295 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Feb 2016 14:11:59 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u1QEBx3c029789 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Fri, 26 Feb 2016 14:11:59 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u1QEBvQ2018994; Fri, 26 Feb 2016 14:11:58 GMT MIME-Version: 1.0 Message-ID: Date: Fri, 26 Feb 2016 06:11:56 -0800 (PST) From: Drew Adams To: Lars Ingebrigtsen , Stefan Monnier Subject: RE: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> In-Reply-To: <87vb5ct1lz.fsf@gnus.org> X-Priority: 3 X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.9 (901082) [OL 12.0.6691.5000 (x86)] Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 6991 Cc: Juanma Barranquero , 6991-done@debbugs.gnu.org, 6991@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 (--) Why is this bug classified as "Won't Fix"? Isn't this something we would all like to see fixed? Not fixing today does not mean that it should not be fixed. What's more, _users_ currently do the work by hand, so it must be possible to at least partly (probably fully) get it done by program. If users can manually (time-consuming and error-prone) redact the byte-code when pasting a backtrace into a mail etc. then that can be done by program. The fact that no one has done this yet is not a good reason to close this as "wont-fix". From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 26 19:53:15 2016 Received: (at 6991) by debbugs.gnu.org; 27 Feb 2016 00:53:15 +0000 Received: from localhost ([127.0.0.1]:48022 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aZT8F-0004W0-93 for submit@debbugs.gnu.org; Fri, 26 Feb 2016 19:53:15 -0500 Received: from mail-pa0-f54.google.com ([209.85.220.54]:36073) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aZT8A-0004VS-Rr; Fri, 26 Feb 2016 19:53:11 -0500 Received: by mail-pa0-f54.google.com with SMTP id yy13so59086815pab.3; Fri, 26 Feb 2016 16:53:10 -0800 (PST) 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:reply-to:mime-version; bh=mEsEGoKHQYnX1NQlQZsSF9WNeFfxOS7IU8zMfncugTk=; b=CFNC/CuvWBCAwMQ0Hr/1MXnQQPd9H4En04gSeXGePsfJ43J6f8GdexZ0tgGxfn29Oq FS0ONoZ5OfRQYXspP0j+4pNm1XctSLZI7exNtbpLU0FEnwBs+k798CsJ3bACcA/ZktZp slsfSgf8L5zLhRiFONFrHSudjbknnCp2BH2dhOBnyimpBFqBqX6VnTygN50Xpm21ObbI gLxRQqS4FSODis1lUDv3MbQxlqKxaE58QTbEXIK08srawW2X9M9GBQ687BJ4NOiKiHRe YlnsO9B/8P4oTIv3t4TVtxoZVaKfoAtFdxdtwu5b6fLsbxAPF6ScpCW0xdxluLFh3RRs dtag== 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:reply-to:mime-version; bh=mEsEGoKHQYnX1NQlQZsSF9WNeFfxOS7IU8zMfncugTk=; b=PApvVPk0SdwIW+H6MuCS4XIFpe96Z7p1ZSnyXuSmDqpEEyaILJUxyjqsHqFW62zc7Z sdsIlNG83CTS3ccmAnA12sggaFpcXje8wEywCogtidubBDdVprQxPmPDBU9BgO0wC980 x6Fx0DFsMom9PVwt1mc3VEJVTDXzK2fN9wUjaNruGGymqNoo56Irmam5lG7WOhXG8QW+ GbK8hqHsbdZWbgFZPipQ9VDdszVymOuP2SCBpLiKUS1y2Y6LrDSp2UFUUWw4JO/n8oAd dTpk7rHmjSUxE6KpNlOzv7cvSBjRBfppnALzDPKxFfBmDDIsY8ZzRkV6sW6oKhbA30cA OaMQ== X-Gm-Message-State: AD7BkJJc6F9d8peK99BP2QTJEfx0I3Tn0OKYTbtqKmTekrm/xmHHX1q/+O8xedQBDzOe0w== X-Received: by 10.66.62.195 with SMTP id a3mr6292993pas.28.1456534385346; Fri, 26 Feb 2016 16:53:05 -0800 (PST) Received: from Vulcan.local (76-234-68-79.lightspeed.frokca.sbcglobal.net. [76.234.68.79]) by smtp.gmail.com with ESMTPSA id u90sm21846376pfa.60.2016.02.26.16.53.03 (version=TLS1 cipher=AES128-SHA bits=128/128); Fri, 26 Feb 2016 16:53:04 -0800 (PST) From: John Wiegley X-Google-Original-From: "John Wiegley" Received: by Vulcan.local (Postfix, from userid 501) id 6474A131CCD51; Fri, 26 Feb 2016 16:53:03 -0800 (PST) To: Drew Adams Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers In-Reply-To: (Drew Adams's message of "Fri, 26 Feb 2016 06:11:56 -0800 (PST)") Date: Fri, 26 Feb 2016 16:52:52 -0800 Message-ID: References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> User-Agent: Gnus/5.130014 (Ma Gnus v0.14) Emacs/24.5 (darwin) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 6991 Cc: Juanma Barranquero , Lars Ingebrigtsen , 6991@debbugs.gnu.org, Stefan Monnier , 6991-done@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: , Reply-To: John Wiegley Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) >>>>> Drew Adams writes: > What's more, _users_ currently do the work by hand, so it must be possible > to at least partly (probably fully) get it done by program. If users can > manually (time-consuming and error-prone) redact the byte-code when pasting > a backtrace into a mail etc. then that can be done by program. Drew, can you show me what it will look like to have the elision performed? Sometimes the byte-code contains strings that give me a clue as to the problem, so I'm wondering what will disappear if this is fixed. -- John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 26 20:50:13 2016 Received: (at 6991) by debbugs.gnu.org; 27 Feb 2016 01:50:13 +0000 Received: from localhost ([127.0.0.1]:48047 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aZU1M-0005oG-QR for submit@debbugs.gnu.org; Fri, 26 Feb 2016 20:50:13 -0500 Received: from aserp1040.oracle.com ([141.146.126.69]:27615) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aZU1L-0005ny-Oy; Fri, 26 Feb 2016 20:50:12 -0500 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u1R1o5Bd019684 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 27 Feb 2016 01:50:05 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u1R1o41N006274 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 27 Feb 2016 01:50:04 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u1R1o0rG021227; Sat, 27 Feb 2016 01:50:03 GMT MIME-Version: 1.0 Message-ID: <2223f654-1e67-4a9a-a471-828fd4078410@default> Date: Fri, 26 Feb 2016 17:49:59 -0800 (PST) From: Drew Adams To: John Wiegley Subject: RE: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> In-Reply-To: X-Priority: 3 X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.9 (901082) [OL 12.0.6691.5000 (x86)] Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 6991 Cc: Juanma Barranquero , Lars Ingebrigtsen , 6991@debbugs.gnu.org, Stefan Monnier , 6991-done@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 (--) > Drew, can you show me what it will look like to have the elision > performed? Sometimes the byte-code contains strings that give me > a clue as to the problem, so I'm wondering what will disappear if > this is fixed. Nothing prevents letting a user control the degree of elision. If someone thinks that part of a #[...] occurrence might be helpful then a yankable and readable part of it could be included. In general, my guess is that most #[...] occurrences can just be removed (replaced by an elision indicator). I can show what I do, at least: 1. I start by trying to yank a whole backtrace into a bug-report buffer. 2. That typically doesn't work completely: some of the yanked text is truncated (not yanked) because it is binary stuff from byte-code. 3. So I often have to yank separate pieces of a backtrace - parts that are yankable (which might still contain some byte-code, but byte-code that is yankable). 4. I remove anything that is problematic/meaningless, leaving ordinary text that humans can read. In my experience there is nothing in the byte code that is of interest and that doesn't also appear anyway in the non-byte-code part of the backtrace. 5. I can include some from an Emacs 24.5 backtrace (Emacs 25 is unusable for me - crashes within a minute or two, and has done so for a couple years now). 6. Caveat: I byte-compile my code with the oldest Emacs version that that particular code supports. That could be Emacs 20, 22, 23 (or maybe 24 or 25, for some libraries). Here's a backtrace with some byte-code in it: Debugger entered--entering a function: * icicle-ucs-names() * #[(prompt &optional names) "=08\204 See, only the top two lines got pasted (even into an Outlook window, and the second line was truncated at the first null byte (it appears as ^@ in the backtrace, where that is a null char and not two chars). The " \204 that you (might) see here looks like this in Emacs: "^H\204^G^@\306" etc., but each of those ^LETTER occurrences is a control char, not a doublet with first char ^. Then I would yank a bit more, not bothering to copy the same byte-code that appears in the third line: * apply(#[(prompt &optional names) "=08\204 Then I would copy and paste some more - in this case all of the rest of the backtrace has no byte-code: * read-char-by-name("Unicode (name or hex): ") (list (read-char-by-name "Unicode (name or hex): ") (prefix-numeric-value= current-prefix-arg) t t) call-interactively(ucsc-insert nil nil) command-execute(ucsc-insert) Then I would clean up the byte-code that was successfully yanked, probably replacing it with "...". I don't have a special way of doing these things. I just edit manually, to give something like this: Debugger entered--entering a function: * icicle-ucs-names() * #[(prompt &optional names) "..." [names cands prompt new-prompt enable-re= cursive-minibuffers completion-ignore-case icicle-ucs-names delq nil mapcar= icicle-make-char-candidate copy-sequence t (1) "=09" ((3 (face icicle-cand= idate-part))) icicle-mctize-all lambda (string pred action) if (eq action (= quote metadata)) (quote (metadata (category . unicode-name))) complete-with= -action action quote (string pred) completing-read string-match-p "\\`[0-9a= -fA-F]+\\'" string-to-number 16 "^#" read assoc-string try-completion icicl= e-transform-multi-completion (2) get-text-property 0 icicle-whole-candidate= characterp error "Invalid character: `%s'" add-to-list icicle-read-char-hi= story icicle-read-char-by-name-multi-completion-flag icicle-show-multi-comp= letion-flag icicle-multi-completing-p icicle-list-use-nth-parts icicle-tran= sform-before-sort-p ...] 10 "Read a character... I'VE ELIDED MOST OF A LONG= DOC STRING HERE") * apply(#[(prompt &optional names) - same as line above.) * read-char-by-name("Unicode (name or hex): ") (list (read-char-by-name "Unicode (name or hex): ") (prefix-numeric-value= current-prefix-arg) t t) call-interactively(ucsc-insert nil nil) command-execute(ucsc-insert)=20 In this case I also manually elided a long doc string, not just byte-code. Is it worthwhile to keep some of what is inside #[...]? Here, I did - I removed only the binary code stuff. But it might be good in most cases to just elide each occurrence of #[STUFF]. HTH - Drew From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 26 23:13:37 2016 Received: (at 6991) by debbugs.gnu.org; 27 Feb 2016 04:13:37 +0000 Received: from localhost ([127.0.0.1]:48094 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aZWG9-0000gJ-Ig for submit@debbugs.gnu.org; Fri, 26 Feb 2016 23:13:37 -0500 Received: from hermes.netfonds.no ([80.91.224.195]:53454) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aZWG8-0000g5-2e; Fri, 26 Feb 2016 23:13:36 -0500 Received: from [175.103.25.178] (helo=mouse) by hermes.netfonds.no with esmtpsa (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.72) (envelope-from ) id 1aZWFe-000213-Vf; Sat, 27 Feb 2016 05:13:07 +0100 From: Lars Ingebrigtsen To: John Wiegley Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> Date: Sat, 27 Feb 2016 14:43:00 +1030 In-Reply-To: (John Wiegley's message of "Fri, 26 Feb 2016 16:52:52 -0800") Message-ID: <8760xalrjn.fsf@gnus.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-MailScanner-ID: 1aZWFe-000213-Vf X-Netfonds-MailScanner: Found to be clean X-Netfonds-MailScanner-From: larsi@gnus.org MailScanner-NULL-Check: 1457151187.83406@1WCNZN0jaZ70r5NU+BifkA X-Spam-Status: No X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 6991 Cc: Juanma Barranquero , John Wiegley , Stefan Monnier , 6991@debbugs.gnu.org, 6991-done@debbugs.gnu.org, Drew Adams 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 (/) John Wiegley writes: >>>>>> Drew Adams writes: > >> What's more, _users_ currently do the work by hand, so it must be possible >> to at least partly (probably fully) get it done by program. If users can >> manually (time-consuming and error-prone) redact the byte-code when pasting >> a backtrace into a mail etc. then that can be done by program. > > Drew, can you show me what it will look like to have the elision performed? > Sometimes the byte-code contains strings that give me a clue as to the > problem, so I'm wondering what will disappear if this is fixed. I thought the post I made yesterday showed the difference? And it's that the byte codes themselves get replaced by "....", and not the symbols (etc.) that are useful for figuring out backtraces. But the patch was backwards -- it inhibited it outside of backtraces instead of in backtraces. -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no From unknown Sat Jun 21 03:07:15 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: Did not alter fixed versions and reopened. Date: Sat, 27 Feb 2016 04:14:02 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # Did not alter fixed versions and reopened. thanks # This fakemail brought to you by your local debbugs # administrator From unknown Sat Jun 21 03:07:15 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Sat, 26 Mar 2016 11:24:04 +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 From debbugs-submit-bounces@debbugs.gnu.org Fri Nov 18 19:22:59 2016 Received: (at control) by debbugs.gnu.org; 19 Nov 2016 00:22:59 +0000 Received: from localhost ([127.0.0.1]:34312 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c7tQl-0002LB-Sh for submit@debbugs.gnu.org; Fri, 18 Nov 2016 19:22:59 -0500 Received: from mail-it0-f48.google.com ([209.85.214.48]:35620) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c7tQg-0002Ku-Ia for control@debbugs.gnu.org; Fri, 18 Nov 2016 19:22:54 -0500 Received: by mail-it0-f48.google.com with SMTP id c20so50195391itb.0 for ; Fri, 18 Nov 2016 16:22:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=azySjieXMsApdfFcAlQGd+S4w0dJu9j62AWQlyK5Eh8=; b=b+KcRGivIFk5hZIRte+xN8n2gmpRP4wUniTQAwlEUZC6pl2vlv0v1/Zn8XBqzzFGj1 CINdCaxJ1yR0HZ2FKuh5OiYnVrOT6NGWIZUgNFZNF4sRU33ucQ63Z+GywH3y10AmP6Kb cQvEspTL/gmLovcO17emREgNFbsr8yKlsguXXt/E2lu+6W/uTxWFKJ3dhi/lFZ4Bvl6u El/JffNd1bnzBfMELxaDp1rQSaeVlj0mjjo7wrm+T+bjvsA9UYFZJb3m7z8+ffrRNxtI zpc3g4QcejA272j1vuyr2tYhHdlZwLYY57NEZ5yhfKhVXfBfJvbetlbTdqQxyBcYlrGU yW5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=azySjieXMsApdfFcAlQGd+S4w0dJu9j62AWQlyK5Eh8=; b=TuNQPqUXeofzwSMqcqhzSbBtvsWzc3hKg46i7SI7uonMYu7q4qO3g+pbfVliBrxqw5 8qomhcu2emvn/18zBH3Y4MpxEUu7a/6sbIlQ85tjAcLRlw8Yuo9KpQariqjF9DyvGIaW dZ1KQaX6vgXBm9BTEoJC3Is/sNhu3IZ8spNN3n2BnrmKOUFYbEsLhD8kVa6/EOfmDKy0 sCwN6kasobiIRQBtvvapGwy0ckpQ+FJGVZUm+L5W28vo3SwsADqq/NZLo7ZELcp9whzo 09z+3LQtxbB5Yz3zmAlBEeDln/6nl8QYBWTZ4Aw+zER8rR66u5jf5GHZ6xbuXFeOWxdv oT/w== X-Gm-Message-State: AKaTC00dRgkxC0aLxadMNCGF5fKF/bEzm0OTsx0L6x0YgPDaPNtTXjsxoXVZOCv6LuFhHg== X-Received: by 10.107.8.105 with SMTP id 102mr2193011ioi.154.1479514964711; Fri, 18 Nov 2016 16:22:44 -0800 (PST) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id h127sm3810490ioa.41.2016.11.18.16.22.44 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 18 Nov 2016 16:22:44 -0800 (PST) From: npostavs@users.sourceforge.net To: control@debbugs.gnu.org Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <8760xalrjn.fsf@gnus.org> Date: Fri, 18 Nov 2016 19:23:36 -0500 In-Reply-To: <8760xalrjn.fsf@gnus.org> (Lars Ingebrigtsen's message of "Sat, 27 Feb 2016 14:43:00 +1030") Message-ID: <87inrkl3lj.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.5 (/) 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.5 (/) unarchive 6991 # seems to have been closed by accident a few times reopen 6991 # patch doesn't work tags 6991 - patch quit Lars Ingebrigtsen writes: > > But the patch was backwards -- it inhibited it outside of backtraces > instead of in backtraces. From unknown Sat Jun 21 03:07:15 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: Did not alter fixed versions and reopened. Date: Sat, 19 Nov 2016 00:23:02 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # Did not alter fixed versions and reopened. thanks # This fakemail brought to you by your local debbugs # administrator From debbugs-submit-bounces@debbugs.gnu.org Fri Nov 18 20:55:10 2016 Received: (at 6991) by debbugs.gnu.org; 19 Nov 2016 01:55:10 +0000 Received: from localhost ([127.0.0.1]:34337 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c7us2-0006E9-GO for submit@debbugs.gnu.org; Fri, 18 Nov 2016 20:55:10 -0500 Received: from mail-it0-f67.google.com ([209.85.214.67]:36553) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c7us0-0006Ds-R4 for 6991@debbugs.gnu.org; Fri, 18 Nov 2016 20:55:09 -0500 Received: by mail-it0-f67.google.com with SMTP id n68so8199003itn.3 for <6991@debbugs.gnu.org>; Fri, 18 Nov 2016 17:55:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=/7e+AxNpXUeeDCHj6TZNgLuoJcV0UvnKbhbWg75/5UQ=; b=fAyoBIyjHWqAumAuyxzKYeO0SaIE4w0lT3qaGN6xhiXKnmQqFYISsssyA8GEuetkdA DiEJk6Gs7lRbvQNMkcXl5+F8AQnQpsAazKbNpJpVj4TcpBW68oOEvoBcZ5g2RTy32i8C xP2G5pU4cH8QsPHSC7pxgy1rBdyagedK13YaZDTSLB+Nzel6hwdIIifT5S3ftDZvR8PP Z+CeFabG1wxKZ9nwEyqCzdVfDjJIRqUxiaHJIUaM8HsAq4uLG74EP1z7cUH1nuAYitWl atKCeGpF9l/bT1IJhIMb71r+xuYI5W9IbuMGy72f4d7bbLajx/eBDutehL7+CBKAUwec RE7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=/7e+AxNpXUeeDCHj6TZNgLuoJcV0UvnKbhbWg75/5UQ=; b=aOWvy5aG39uu7kXcjE9w1QPYzqGGg2rbjQv4pMdTc8U27rHVzOFpBYGdQ0WcCFSdwd QjG/nH+HJy3JJH7NmnN51T+uTN6qqgsT/Kp33iyKS1uV7dfFhjq3KzsKFbiFUSrLGL/Y 6PuwOUGUVVf3cgS55mb6J9gmV4CbxTyqLJOSOQpg57ledmiHQbMsOggg+8d0h1pHNXFo 5lKvB3a5kGf6YyTbMv+yN700p1FFHhtCzfRvEdP2uDgyXa7+CTtQfDnPG7VIj6Sbp9MT Ira4QgCz9OFt8TZRvwD7anqm6AMdeLpWCzfMgLA7XFtUOFBml9l0cU3AHWCTp9lQRCDv HIuA== X-Gm-Message-State: AKaTC00cKvJ8Kq+2vKj561ERJdikDlZkSaPmLRE9Nr2dByT8tYANQhcy8MMfG/bCj9ysHw== X-Received: by 10.107.201.86 with SMTP id z83mr2434811iof.156.1479520503251; Fri, 18 Nov 2016 17:55:03 -0800 (PST) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id p20sm2114675itc.2.2016.11.18.17.55.01 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 18 Nov 2016 17:55:02 -0800 (PST) From: npostavs@users.sourceforge.net To: Drew Adams Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> Date: Fri, 18 Nov 2016 20:55:54 -0500 In-Reply-To: <2223f654-1e67-4a9a-a471-828fd4078410@default> (Drew Adams's message of "Fri, 26 Feb 2016 17:49:59 -0800 (PST)") Message-ID: <87fumokzbp.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 6991 Cc: Juanma Barranquero , Lars Ingebrigtsen , John Wiegley , Stefan Monnier , 6991@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 (/) It looks like this bug was closed a couple times because 6991-done@debbugs.gnu.org was added to the Cc list. I've removed it, and let's try not to add it again. Drew Adams writes: > > Here's a backtrace with some byte-code in it: > > Debugger entered--entering a function: > * icicle-ucs-names() > * #[(prompt &optional names) "\204 > > > See, only the top two lines got pasted (even into an Outlook > window, and the second line was truncated at the first null > byte (it appears as ^@ in the backtrace, where that is a null > char and not two chars). I would propose something like the below, which will cause the NUL byte to be rendered as \0 instead of ^@. We could potentially do this with other control characters too, if they cause trouble too? I do think it's worth keeping the bytecode in the backtrace, because it's not useless: you can run `disassemble' on it and get something meaningful. Perhaps hiding the byte code with display properties would be useful. modified src/print.c @@ -1477,18 +1477,20 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag) could be taken as part of it, output `\ ' to prevent that. */ if (need_nonhex && c_isxdigit (c)) print_c_string ("\\ ", printcharfun); + need_nonhex = false; if (c == '\n' && print_escape_newlines ? (c = 'n', true) : c == '\f' && print_escape_newlines ? (c = 'f', true) + : c == '\0' && print_escape_nonascii + ? (c = '0', need_nonhex = true) : c == '\"' || c == '\\') printchar ('\\', printcharfun); printchar (c, printcharfun); - need_nonhex = false; } } printchar ('\"', printcharfun); From debbugs-submit-bounces@debbugs.gnu.org Fri Nov 18 21:38:04 2016 Received: (at 6991) by debbugs.gnu.org; 19 Nov 2016 02:38:04 +0000 Received: from localhost ([127.0.0.1]:34341 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c7vXX-0007Is-U9 for submit@debbugs.gnu.org; Fri, 18 Nov 2016 21:38:04 -0500 Received: from userp1040.oracle.com ([156.151.31.81]:35442) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c7vXW-0007IM-8i for 6991@debbugs.gnu.org; Fri, 18 Nov 2016 21:38:02 -0500 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id uAJ2bqAF011775 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 19 Nov 2016 02:37:54 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.14.4) with ESMTP id uAJ2bq1j011835 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 19 Nov 2016 02:37:52 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id uAJ2bo6q003660; Sat, 19 Nov 2016 02:37:50 GMT MIME-Version: 1.0 Message-ID: <7b850a43-ee03-418d-ae71-decfcae4ad50@default> Date: Fri, 18 Nov 2016 18:37:49 -0800 (PST) From: Drew Adams To: npostavs@users.sourceforge.net Subject: RE: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> In-Reply-To: <87fumokzbp.fsf@users.sourceforge.net> X-Priority: 3 X-Mailer: Oracle Beehive Extensions for Outlook 2.0.1.9.1 (1003210) [OL 12.0.6753.5000 (x86)] Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Spam-Score: -5.2 (-----) X-Debbugs-Envelope-To: 6991 Cc: Juanma Barranquero , Lars Ingebrigtsen , John Wiegley , Stefan Monnier , 6991@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: -5.2 (-----) > I would propose something like the below, which will cause the NUL > byte to be rendered as \0 instead of ^@. We could potentially do this > with other control characters too, if they cause trouble too? >=20 > I do think it's worth keeping the bytecode in the backtrace, because > it's not useless: you can run `disassemble' on it and get something > meaningful. Perhaps hiding the byte code with display properties > would be useful. Any improvement is an improvement. Please go for it. Thx. That's a simple change that shouldn't introduce new problems. If others propose more elaborate improvements, they will likely be independent - this won't bother them. From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 19 02:41:39 2016 Received: (at 6991) by debbugs.gnu.org; 19 Nov 2016 07:41:39 +0000 Received: from localhost ([127.0.0.1]:34384 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c80HL-00080X-Ed for submit@debbugs.gnu.org; Sat, 19 Nov 2016 02:41:39 -0500 Received: from eggs.gnu.org ([208.118.235.92]:43544) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c80HK-00080L-0c for 6991@debbugs.gnu.org; Sat, 19 Nov 2016 02:41:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c80HB-0008TW-44 for 6991@debbugs.gnu.org; Sat, 19 Nov 2016 02:41:32 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-2.1 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]:37022) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c80H6-0008QD-Qz; Sat, 19 Nov 2016 02:41:24 -0500 Received: from 84.94.185.246.cable.012.net.il ([84.94.185.246]:3381 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.82) (envelope-from ) id 1c80H5-0000ZO-Fr; Sat, 19 Nov 2016 02:41:23 -0500 Date: Sat, 19 Nov 2016 09:41:29 +0200 Message-Id: <83oa1bc3x2.fsf@gnu.org> From: Eli Zaretskii To: npostavs@users.sourceforge.net In-reply-to: <87fumokzbp.fsf@users.sourceforge.net> (npostavs@users.sourceforge.net) Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> 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: -7.9 (-------) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, drew.adams@oracle.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: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -7.9 (-------) > From: npostavs@users.sourceforge.net > Date: Fri, 18 Nov 2016 20:55:54 -0500 > Cc: Juanma Barranquero , Lars Ingebrigtsen , > John Wiegley , > Stefan Monnier , 6991@debbugs.gnu.org > > Drew Adams writes: > > > > Here's a backtrace with some byte-code in it: > > > > Debugger entered--entering a function: > > * icicle-ucs-names() > > * #[(prompt &optional names) "\204 > > > > > > See, only the top two lines got pasted (even into an Outlook > > window, and the second line was truncated at the first null > > byte (it appears as ^@ in the backtrace, where that is a null > > char and not two chars). > > I would propose something like the below, which will cause the NUL byte > to be rendered as \0 instead of ^@. We could potentially do this with > other control characters too, if they cause trouble too? Isn't the fact that copying text into the clipboard stops at the first null character a Windows-specific issue? And if it isn't Windows specific, isn't it at least specific to selections? I think Emacs doesn't need this change for all occurrences of the null byte, because Emacs Lisp strings and buffer text will happily DTRT with them (they were designed to do so). So I thin we should only "fix" this problem where it happens, not in print functions in general. > I do think it's worth keeping the bytecode in the backtrace, because > it's not useless: you can run `disassemble' on it and get something > meaningful. Exactly. But if we change print_object like you suggest, there's no way of being sure the null bytes won't be mangled by some application of a print function. From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 19 09:38:25 2016 Received: (at 6991) by debbugs.gnu.org; 19 Nov 2016 14:38:25 +0000 Received: from localhost ([127.0.0.1]:34575 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c86mf-0003Un-2y for submit@debbugs.gnu.org; Sat, 19 Nov 2016 09:38:25 -0500 Received: from mail-io0-f181.google.com ([209.85.223.181]:33792) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c86md-0003UO-HD for 6991@debbugs.gnu.org; Sat, 19 Nov 2016 09:38:23 -0500 Received: by mail-io0-f181.google.com with SMTP id c21so7438626ioj.1 for <6991@debbugs.gnu.org>; Sat, 19 Nov 2016 06:38:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=HhUHKfYBqnALJgkyoFb+8w+pCi+yGeeGf10eQCvsh8I=; b=rQd6NCZ5qO5kLyesK1KSts1jYUzegMxtLVaacY+pPc/b67MS6jBPQKKimdexDiWveX 0c/uAvc6pJJDaqk91rNTzfCToxfvMD5bOWChegO3iGMUUKy9/M0Xm7ugwdx9IUk2koNg T4zCI4LefYM3Z+cMpZjWCu4RtDGudVf1usoP4yQZlu81AX+V/gmgjOQToPEVuMwAJBbE yBqRv1Fl89SxUlWgKZ6N6pwUX5Z4kJTKmfeIqIgeYKVh1ayVO0RkwNUvMzqwwd+Bn0pv QzV9b9gqgWKL9Syvn+2HVegEg0gRLRuvhelnemJtEPp2lFF6iColvXreKZUEIjwZ6NrR pMOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=HhUHKfYBqnALJgkyoFb+8w+pCi+yGeeGf10eQCvsh8I=; b=kc36M0sYVCX5oi94xszZBUnmDliUi8GFLZb/rJd5vsBeIoolZml8mY4s4dsdQWWJHc OcmdnuyzoBAd6nNINdKN1PV2fweSYsyqAX372762WAOwtnVf0I8MtfM6+Z+ZQtooEE6G ArK59U7UoyiSq0P+bz9hjZvrTcZrvgcm19G6G4Kew/f7un8BpkaA6/nGb1jnRzwnribT ie5LwsvhAUlC+yQktYnoXuk28l/J8MYilGMpnbfochZK0bsDxNliFa7D2ccp1AN3Qd1z a8Um+3ZPLmEpObqNCi+JLH1UgZINQDZdPu6tCkQpPU1YVCY6A9f5jezomSJXQwSABBYQ E/xw== X-Gm-Message-State: AKaTC00WxarYaW3HD7Pbo2TShxMT6EvSpujOv7R+GJuL+ZqGa+2etchTHECn9lOcEAoVTA== X-Received: by 10.107.149.144 with SMTP id x138mr4725997iod.23.1479566297942; Sat, 19 Nov 2016 06:38:17 -0800 (PST) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id i18sm3538960itb.0.2016.11.19.06.38.17 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 19 Nov 2016 06:38:17 -0800 (PST) From: npostavs@users.sourceforge.net To: Eli Zaretskii Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> Date: Sat, 19 Nov 2016 09:39:09 -0500 In-Reply-To: <83oa1bc3x2.fsf@gnu.org> (Eli Zaretskii's message of "Sat, 19 Nov 2016 09:41:29 +0200") Message-ID: <87d1hrlek2.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) Eli Zaretskii writes: >> >> I would propose something like the below, which will cause the NUL byte >> to be rendered as \0 instead of ^@. We could potentially do this with >> other control characters too, if they cause trouble too? > > Isn't the fact that copying text into the clipboard stops at the first > null character a Windows-specific issue? And if it isn't Windows > specific, isn't it at least specific to selections? It seems to be application specific. When I copy to a Firefox text area on GNU/Linux I get a truncated result, but using xclip | od -c, I can see the NUL byte and following characters are there. > > I think Emacs doesn't need this change for all occurrences of the null > byte, because Emacs Lisp strings and buffer text will happily DTRT > with them (they were designed to do so). So I thin we should only > "fix" this problem where it happens, not in print functions in > general. We could try fixing this in `gui-select-text', but the problem there is that we don't necessarily know that replace NUL with "\0" is valid. > > Exactly. But if we change print_object like you suggest, there's no > way of being sure the null bytes won't be mangled by some application > of a print function. I'm not sure what you mean. From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 19 10:07:52 2016 Received: (at 6991) by debbugs.gnu.org; 19 Nov 2016 15:07:52 +0000 Received: from localhost ([127.0.0.1]:35266 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c87F8-0004TS-OV for submit@debbugs.gnu.org; Sat, 19 Nov 2016 10:07:52 -0500 Received: from eggs.gnu.org ([208.118.235.92]:49411) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c87F4-0004TC-Dg for 6991@debbugs.gnu.org; Sat, 19 Nov 2016 10:07:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c87Ey-0003ph-8A for 6991@debbugs.gnu.org; Sat, 19 Nov 2016 10:07:41 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-2.1 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]:42346) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c87EH-0003iN-DP; Sat, 19 Nov 2016 10:06:57 -0500 Received: from 84.94.185.246.cable.012.net.il ([84.94.185.246]:4549 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.82) (envelope-from ) id 1c87EG-0005vQ-3d; Sat, 19 Nov 2016 10:06:56 -0500 Date: Sat, 19 Nov 2016 17:07:02 +0200 Message-Id: <83eg27bjah.fsf@gnu.org> From: Eli Zaretskii To: npostavs@users.sourceforge.net In-reply-to: <87d1hrlek2.fsf@users.sourceforge.net> (npostavs@users.sourceforge.net) Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> 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: -7.9 (-------) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, drew.adams@oracle.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: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -7.9 (-------) > From: npostavs@users.sourceforge.net > Cc: 6991@debbugs.gnu.org, lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, larsi@gnus.org, drew.adams@oracle.com > Date: Sat, 19 Nov 2016 09:39:09 -0500 > > Eli Zaretskii writes: > >> > >> I would propose something like the below, which will cause the NUL byte > >> to be rendered as \0 instead of ^@. We could potentially do this with > >> other control characters too, if they cause trouble too? > > > > Isn't the fact that copying text into the clipboard stops at the first > > null character a Windows-specific issue? And if it isn't Windows > > specific, isn't it at least specific to selections? > > It seems to be application specific. When I copy to a Firefox text area > on GNU/Linux I get a truncated result, but using xclip | od -c, I can > see the NUL byte and following characters are there. If this happens on both Windows and X, then both xselect.c and w32select.c should "encode" null bytes. Would that solve the problem? > > Exactly. But if we change print_object like you suggest, there's no > > way of being sure the null bytes won't be mangled by some application > > of a print function. > > I'm not sure what you mean. A literal string can be printed, and the result is generally the string itself. But with your suggestion, the null bytes will be lossily converted to something else. From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 19 10:20:09 2016 Received: (at 6991) by debbugs.gnu.org; 19 Nov 2016 15:20:09 +0000 Received: from localhost ([127.0.0.1]:35274 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c87R2-0004o0-Ob for submit@debbugs.gnu.org; Sat, 19 Nov 2016 10:20:09 -0500 Received: from mail-io0-f178.google.com ([209.85.223.178]:34842) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c87Qz-0004nR-No for 6991@debbugs.gnu.org; Sat, 19 Nov 2016 10:20:07 -0500 Received: by mail-io0-f178.google.com with SMTP id n13so7941086ioe.2 for <6991@debbugs.gnu.org>; Sat, 19 Nov 2016 07:20:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=xK07P73HXM/2rrnup7vjXkeTBRq/lfhCIbxSn6Aq9tQ=; b=b9eVNABRiViMNZM7Z+N2maukJetRv5hRVdEuHZYtJHX1HqNQXps7Y8paEKjMknJGk4 SqKfJDLHnnk5GNaPYparPc3hSRF2amAhOocd1HdUiw54cbl+ZDfliWmYXzMDDHZXSztc qiiLOgHhW1Ugw4leJvt5lCbXXZeldSHuxmdI98FsijJaZhEdNxiJPHPPxurkr97nTPsl wSufArnTiO8KrKM5Cb22CmMfUnTm7sVpRCFDVraoMz21GAeHlw1kXxSLLY2pJOa4b28q UGqk2BnGbuIn58Ij6n8r/5kKIXhianLjOs14QF4yLzeNSrOj3AJQp9EfhP30gPqfIMqw vrfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=xK07P73HXM/2rrnup7vjXkeTBRq/lfhCIbxSn6Aq9tQ=; b=ekIgd42iFsfIKXKsmGHpjEuB322juXC7188xztFi6USiDDD0j6yH8AnWgfCrMgD76A kIni1Z/CEs2XuKclc/nKx79rWEjjRr+3SeS9lKrnxS0G7p8HK8sBrvkt2jeQAuaYUHlt 8m0w0I96yIQjmmQmJaF1X+AwOUR5JNazaIeB0WTfOeaZdUmPF7sv6YDWlnEvA785Ld7v MpFC2iKmQSgyOqwXo+VVJc3pBaqDEflZbFS1yjy+M9CuYRUzbAYVh716Coi1AUta/4ep +i4XU1A84C0cjZuBUCdj0bL6kDrjVie0MFCzWcXkiz7pr0Gvrf8/0RCWjFdXmCboxoHV 8qHQ== X-Gm-Message-State: AKaTC01B6KKl1lT2Qy8HkJ/vLjpQVx/nibvSlqC8HRn20IBA2ViHRbz0LAiGIQWMsab7tg== X-Received: by 10.107.155.70 with SMTP id d67mr4832837ioe.64.1479568800171; Sat, 19 Nov 2016 07:20:00 -0800 (PST) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id n206sm1656904itg.1.2016.11.19.07.19.59 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 19 Nov 2016 07:19:59 -0800 (PST) From: npostavs@users.sourceforge.net To: Eli Zaretskii Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> Date: Sat, 19 Nov 2016 10:20:51 -0500 In-Reply-To: <83eg27bjah.fsf@gnu.org> (Eli Zaretskii's message of "Sat, 19 Nov 2016 17:07:02 +0200") Message-ID: <87a8cvlcmk.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) Eli Zaretskii writes: >> From: npostavs@users.sourceforge.net >> Cc: 6991@debbugs.gnu.org, lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, larsi@gnus.org, drew.adams@oracle.com >> Date: Sat, 19 Nov 2016 09:39:09 -0500 >> >> Eli Zaretskii writes: >> >> >> >> I would propose something like the below, which will cause the NUL byte >> >> to be rendered as \0 instead of ^@. We could potentially do this with >> >> other control characters too, if they cause trouble too? >> > >> > Isn't the fact that copying text into the clipboard stops at the first >> > null character a Windows-specific issue? And if it isn't Windows >> > specific, isn't it at least specific to selections? >> >> It seems to be application specific. When I copy to a Firefox text area >> on GNU/Linux I get a truncated result, but using xclip | od -c, I can >> see the NUL byte and following characters are there. > > If this happens on both Windows and X, then both xselect.c and > w32select.c should "encode" null bytes. Would that solve the problem? When printing a string literal, a null byte can be encoded as "\0", but in general, when copying an arbitrary piece of text this encoding might not necessarily be correct. > >> > Exactly. But if we change print_object like you suggest, there's no >> > way of being sure the null bytes won't be mangled by some application >> > of a print function. >> >> I'm not sure what you mean. > > A literal string can be printed, and the result is generally the > string itself. But with your suggestion, the null bytes will be > lossily converted to something else. I don't think it's lossy. Furthermore, newlines and form feeds are already being converted to "\n" and "\f", respectively. Bytes higher than 0x80 are also converted to octal escapes. From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 19 12:08:26 2016 Received: (at 6991) by debbugs.gnu.org; 19 Nov 2016 17:08:26 +0000 Received: from localhost ([127.0.0.1]:35296 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c897q-0007gI-GS for submit@debbugs.gnu.org; Sat, 19 Nov 2016 12:08:26 -0500 Received: from eggs.gnu.org ([208.118.235.92]:53782) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c897o-0007g3-Li for 6991@debbugs.gnu.org; Sat, 19 Nov 2016 12:08:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c897h-00038l-Oa for 6991@debbugs.gnu.org; Sat, 19 Nov 2016 12:08:19 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-4.8 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]:44617) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c897U-0002dL-6Q; Sat, 19 Nov 2016 12:08:04 -0500 Received: from rms by fencepost.gnu.org with local (Exim 4.82) (envelope-from ) id 1c897S-00052A-Mf; Sat, 19 Nov 2016 12:08:02 -0500 Content-Type: text/plain; charset=Utf-8 From: Richard Stallman To: Eli Zaretskii In-reply-to: <83oa1bc3x2.fsf@gnu.org> (message from Eli Zaretskii on Sat, 19 Nov 2016 09:41:29 +0200) Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> Message-Id: Date: Sat, 19 Nov 2016 12:08:02 -0500 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: -7.9 (-------) X-Debbugs-Envelope-To: 6991 Cc: npostavs@users.sourceforge.net, lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.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: , Reply-To: rms@gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -7.9 (-------) [[[ 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. ]]] Showing the byte-compiled code is not very useful. Perhaps it would be good to make the byte-compiled function have the name of the function it was compiled from as one of its elements. We could make princ output while not changing what prin1 outputs. Then the debugger could use princ for byte-compiled functions, and provide some commmand to access the actual function object to examine it. -- 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 Sat Nov 19 13:36:08 2016 Received: (at 6991) by debbugs.gnu.org; 19 Nov 2016 18:36:08 +0000 Received: from localhost ([127.0.0.1]:35312 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c8AUe-0001h7-Ls for submit@debbugs.gnu.org; Sat, 19 Nov 2016 13:36:08 -0500 Received: from eggs.gnu.org ([208.118.235.92]:46323) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c8AUa-0001gX-G6 for 6991@debbugs.gnu.org; Sat, 19 Nov 2016 13:36:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c8AUR-0006Ux-JR for 6991@debbugs.gnu.org; Sat, 19 Nov 2016 13:35:55 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-2.1 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]:46489) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c8ATt-0006Iw-Gx; Sat, 19 Nov 2016 13:35:17 -0500 Received: from 84.94.185.246.cable.012.net.il ([84.94.185.246]:4709 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.82) (envelope-from ) id 1c8ATm-0005Yt-4b; Sat, 19 Nov 2016 13:35:16 -0500 Date: Sat, 19 Nov 2016 20:34:50 +0200 Message-Id: <8360njb9o5.fsf@gnu.org> From: Eli Zaretskii To: npostavs@users.sourceforge.net In-reply-to: <87a8cvlcmk.fsf@users.sourceforge.net> (npostavs@users.sourceforge.net) Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> 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: -7.9 (-------) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, drew.adams@oracle.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: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -7.9 (-------) > From: npostavs@users.sourceforge.net > Cc: 6991@debbugs.gnu.org, lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, larsi@gnus.org, drew.adams@oracle.com > Date: Sat, 19 Nov 2016 10:20:51 -0500 > > >> > Isn't the fact that copying text into the clipboard stops at the first > >> > null character a Windows-specific issue? And if it isn't Windows > >> > specific, isn't it at least specific to selections? > >> > >> It seems to be application specific. When I copy to a Firefox text area > >> on GNU/Linux I get a truncated result, but using xclip | od -c, I can > >> see the NUL byte and following characters are there. > > > > If this happens on both Windows and X, then both xselect.c and > > w32select.c should "encode" null bytes. Would that solve the problem? > > When printing a string literal, a null byte can be encoded as "\0", but > in general, when copying an arbitrary piece of text this encoding might > not necessarily be correct. Not sure what you have in mind. Can you show an example of when it's not correct? At least on MS-Windows, we only support text selections, so doing so in w32select.c should be TRT, because clipboard text cannot include null bytes on Windows, AFAIK. I also think it's TRT elsewhere, when the selection value is some kind of text. > > A literal string can be printed, and the result is generally the > > string itself. But with your suggestion, the null bytes will be > > lossily converted to something else. > > I don't think it's lossy. It's lossy because you can never know whether it came from a null byte or from a literal ASCII text "\0". From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 19 17:32:34 2016 Received: (at 6991) by debbugs.gnu.org; 19 Nov 2016 22:32:34 +0000 Received: from localhost ([127.0.0.1]:35373 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c8EBT-0008Fo-2S for submit@debbugs.gnu.org; Sat, 19 Nov 2016 17:32:34 -0500 Received: from mail-io0-f180.google.com ([209.85.223.180]:36550) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c8EBO-0008FW-Uz for 6991@debbugs.gnu.org; Sat, 19 Nov 2016 17:32:30 -0500 Received: by mail-io0-f180.google.com with SMTP id x94so12774803ioi.3 for <6991@debbugs.gnu.org>; Sat, 19 Nov 2016 14:32:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=Ua2MrWF0iOtyRbhIwK0AXkMLT11wMdLHZBvB9yt0Uow=; b=sVpbEQY5xNTLWB+fQ8CXm0JnPJvT3RAaoLk0FSP8IuyBtCg3Osgjbtk3ish4yWH+Iq zGw96vQ0JctJUShbMbHujQlWWk7ugS638pFloCvmNVf5EwcKDIxIXttFO9iJ1nGYRhwq 337EJfo+CBUuu2nwUlK+M0xTz52HNgfZYAQuSGwVHv0HQdygGN2RmZm+8T8lETxhmklR rIdaz36dRBLyr94/Q9smt2NwHBq74GyFg0TeMSpuVLDix4HKwt3Ev1vhpcPhbUT4afGC IoqwacWuxQ3hhxzduDOArWM+AeKYd9zFWeg4qEXidyjzEQgTiTm7JiQ/Ga170uSppLC9 v1zA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=Ua2MrWF0iOtyRbhIwK0AXkMLT11wMdLHZBvB9yt0Uow=; b=fxRvZNc681XDua6pmTm9w/Bii0bbwH5XCdAvO7nK+OomCunjk77pMrs6Sd7cwVLx6G ed77z8X+J4mSESwV1fi5UT/6NHFfI12PoygcXWWI8HsHZw/nXm7TRvXX2zgzfHLWHfcd IuKx9N0plOgfG/Z7I7I2RhFcmFZVfcGIjQKpU22PSK8y4n27d7s5wQLR8T9moqrZ5ypl 7glfNjIX5st7P/uzgZM+K1hRkvZaf7MUl4Yf8+ndGeUu/MAep+eJ5XciJjBcm5vM8wQR U/Xb5B6fS7poqkEVDiB9DGbxYc5Em7xUb60npzNI/2awGSodIu8OCcr21e5XDPocrtl+ FR8Q== X-Gm-Message-State: AKaTC00IKKD6Y5VeaIhm6yGi1s+fDG7YNCp2pJD50JBriOt6aa4sycTWZyKGI/sxjhvy0Q== X-Received: by 10.107.34.8 with SMTP id i8mr5089594ioi.132.1479594741148; Sat, 19 Nov 2016 14:32:21 -0800 (PST) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id a71sm3487918itc.11.2016.11.19.14.32.19 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 19 Nov 2016 14:32:20 -0800 (PST) From: npostavs@users.sourceforge.net To: Eli Zaretskii Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> Date: Sat, 19 Nov 2016 17:33:11 -0500 In-Reply-To: <8360njb9o5.fsf@gnu.org> (Eli Zaretskii's message of "Sat, 19 Nov 2016 20:34:50 +0200") Message-ID: <877f7zksm0.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.5 (/) Eli Zaretskii writes: >> From: npostavs@users.sourceforge.net >> Cc: 6991@debbugs.gnu.org, lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, larsi@gnus.org, drew.adams@oracle.com >> Date: Sat, 19 Nov 2016 10:20:51 -0500 >> >> >> > Isn't the fact that copying text into the clipboard stops at the first >> >> > null character a Windows-specific issue? And if it isn't Windows >> >> > specific, isn't it at least specific to selections? >> >> >> >> It seems to be application specific. When I copy to a Firefox text area >> >> on GNU/Linux I get a truncated result, but using xclip | od -c, I can >> >> see the NUL byte and following characters are there. >> > >> > If this happens on both Windows and X, then both xselect.c and >> > w32select.c should "encode" null bytes. Would that solve the problem? >> >> When printing a string literal, a null byte can be encoded as "\0", but >> in general, when copying an arbitrary piece of text this encoding might >> not necessarily be correct. > > Not sure what you have in mind. Can you show an example of when it's > not correct? I can't really think of a practical example, but it seems that the same objection you raised below applies: how would you know whether what was copied had the literal ASCII text "\0" or a null byte? > > At least on MS-Windows, we only support text selections, so doing so > in w32select.c should be TRT, because clipboard text cannot include > null bytes on Windows, AFAIK. I also think it's TRT elsewhere, when > the selection value is some kind of text. It doesn't really feel like the Right Thing to me, there's no particular reason to choose "\0" for this, e.g., why not use "^@" (an ASCII caret followed by at sign)? In the case of printing a string literal, it's established that a backslash means escaping within the double quotes. > >> > A literal string can be printed, and the result is generally the >> > string itself. But with your suggestion, the null bytes will be >> > lossily converted to something else. >> >> I don't think it's lossy. > > It's lossy because you can never know whether it came from a null byte > or from a literal ASCII text "\0". It's already the case that ASCII text "\0" is printed as "\\0", without my patch: (print (string 0 ?\\ ?0) (current-buffer)) "^@\\0" ;; I replaced the null byte with "^@" to avoid trouble with ;; email clients With my patch, ^@ is replaced with \0: (print (string 0 ?\\ ?0) (current-buffer)) "\0\\0" From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 20 10:47:22 2016 Received: (at 6991) by debbugs.gnu.org; 20 Nov 2016 15:47:22 +0000 Received: from localhost ([127.0.0.1]:36260 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c8UKw-00068Q-6a for submit@debbugs.gnu.org; Sun, 20 Nov 2016 10:47:22 -0500 Received: from eggs.gnu.org ([208.118.235.92]:49110) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c8UKu-00068A-JG for 6991@debbugs.gnu.org; Sun, 20 Nov 2016 10:47:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c8UKl-0005CG-2k for 6991@debbugs.gnu.org; Sun, 20 Nov 2016 10:47:15 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-2.2 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]:60854) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c8UK3-00055G-TR; Sun, 20 Nov 2016 10:46:27 -0500 Received: from 84.94.185.246.cable.012.net.il ([84.94.185.246]:1653 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.82) (envelope-from ) id 1c8UK2-00024D-UZ; Sun, 20 Nov 2016 10:46:27 -0500 Date: Sun, 20 Nov 2016 17:46:35 +0200 Message-Id: <83oa1a9msk.fsf@gnu.org> From: Eli Zaretskii To: npostavs@users.sourceforge.net In-reply-to: <877f7zksm0.fsf@users.sourceforge.net> (npostavs@users.sourceforge.net) Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> 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: -7.9 (-------) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, drew.adams@oracle.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: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -7.9 (-------) > From: npostavs@users.sourceforge.net > Cc: 6991@debbugs.gnu.org, lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, larsi@gnus.org, drew.adams@oracle.com > Date: Sat, 19 Nov 2016 17:33:11 -0500 > > >> > If this happens on both Windows and X, then both xselect.c and > >> > w32select.c should "encode" null bytes. Would that solve the problem? > >> > >> When printing a string literal, a null byte can be encoded as "\0", but > >> in general, when copying an arbitrary piece of text this encoding might > >> not necessarily be correct. > > > > Not sure what you have in mind. Can you show an example of when it's > > not correct? > > I can't really think of a practical example, but it seems that the same > objection you raised below applies: how would you know whether what was > copied had the literal ASCII text "\0" or a null byte? We can't. But since null bytes cannot be put into the Windows clipboard, we have only 2 possible ways of action: either replace the null bytes with something else, or lose everything past the first null bytes (which is the current behavior, against which this bug report was submitted). So if we want to solve this problem, what else can we do except use some lossy conversion? > > At least on MS-Windows, we only support text selections, so doing so > > in w32select.c should be TRT, because clipboard text cannot include > > null bytes on Windows, AFAIK. I also think it's TRT elsewhere, when > > the selection value is some kind of text. > > It doesn't really feel like the Right Thing to me, there's no particular > reason to choose "\0" for this, e.g., why not use "^@" (an ASCII caret > followed by at sign)? If you thought I was arguing against ^@ and for \0, then this is a misunderstanding: I don't really care one way of the other. I was saying that we must do _something_ to replace those null bytes, if we want the text beyond the first one be seen in the application into which you paste. > > It's lossy because you can never know whether it came from a null byte > > or from a literal ASCII text "\0". > > It's already the case that ASCII text "\0" is printed as "\\0", without > my patch: > > (print (string 0 ?\\ ?0) (current-buffer)) > > "^@\\0" ;; I replaced the null byte with "^@" to avoid trouble with > ;; email clients > > With my patch, ^@ is replaced with \0: > > (print (string 0 ?\\ ?0) (current-buffer)) > > "\0\\0" It just doesn't feel right to me to fix a problem that is specific to selections in a general-purpose low-level facility for printing strings. Emacs can handle null bytes in strings very well, so I see no need to change the print functions. From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 22 13:07:22 2016 Received: (at 6991) by debbugs.gnu.org; 22 Nov 2016 18:07:23 +0000 Received: from localhost ([127.0.0.1]:38534 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c9FTW-0005Sm-NB for submit@debbugs.gnu.org; Tue, 22 Nov 2016 13:07:22 -0500 Received: from mail-oi0-f65.google.com ([209.85.218.65]:36459) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c9FTU-0005Sa-Rj for 6991@debbugs.gnu.org; Tue, 22 Nov 2016 13:07:21 -0500 Received: by mail-oi0-f65.google.com with SMTP id u15so3770899oie.3 for <6991@debbugs.gnu.org>; Tue, 22 Nov 2016 10:07:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=h3W+BQM80ZdUzCwI2Z58Ss0hKeX3FhYl3DjWXptyPUI=; b=wipRiRmfYl7p7VrX8Ka/UvwIfJWe2EsCcRkj5cmpphKkxJyxMisOO9ovATv1KQdt2p U1uYhVpWts5UE0ilTeaNaddhwS+0sClqv1wuvpWmh2y4nRoBE8BBL3jT2L9qOHCO0UvC ARvFvQOFQXt6af8WKPmQCl19ydgV85ioQLnEXvEugN4a6A32RyNfqr0ZS0uvQdj4kag4 AkiN6MXizDkcsPzlqwiJyhrcluXcwh1iE1j/pL4lClJrM8SCGJ+LS0DZGg8yapg+Ropu bZp1aT776VEvjsgHm54KlG0vQd34kDIVNlk3qdJ97Bmr4rxmUYFRyUVtvY5BmgoGIyQ0 Vyeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=h3W+BQM80ZdUzCwI2Z58Ss0hKeX3FhYl3DjWXptyPUI=; b=k4eVYLZ1QgkULGsXHfF+kTPxZ571K6jlmgtObN38hFAHByLseClNTR9GGk7Jty/YKX 2SFFIDQjDEV5aXWer/W61RsMVgWrjIteMIkS9MnVJ48+nH+HKyfjESWnlmtP5qnUqurv i5k4VtV+EeZJkM7FcXJ6dgv89Q9rbtl67tnUFBgecM13ZTwhiA7XN+LbemUx++AHeAFL HJawRdxoNGrOPiHGGMyQRJXTw2zbdzxhgf/sGO2IE+wHTiFRGE6ciAj48V0QbgbX86BY UddIJD4EaSorV5eGQJIA7/JLtOfM2jWSh+doLMRNc2i1vP3aeUfEkUp7lBx7OI5Mu52K eo5g== X-Gm-Message-State: AKaTC02PETHWtesmOxEM7+SuVYlOn4uuxpkf64uSqQ99X3n7swTC4riiWo6nVDhK0DQfSfbb8Us4N4KCMPvWrQ== X-Received: by 10.202.85.77 with SMTP id j74mr9610186oib.108.1479838034368; Tue, 22 Nov 2016 10:07:14 -0800 (PST) MIME-Version: 1.0 Received: by 10.157.4.67 with HTTP; Tue, 22 Nov 2016 10:07:13 -0800 (PST) In-Reply-To: <83oa1a9msk.fsf@gnu.org> References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> From: Noam Postavsky Date: Tue, 22 Nov 2016 13:07:13 -0500 X-Google-Sender-Auth: 6iHKL9FTr4aOSdUz-p9GF_cwaSY Message-ID: Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers To: Eli Zaretskii Content-Type: text/plain; charset=UTF-8 X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 6991 Cc: Juanma Barranquero , John Wiegley , Stefan Monnier , 6991@debbugs.gnu.org, Lars Magne Ingebrigtsen , Drew Adams 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 Sun, Nov 20, 2016 at 10:46 AM, Eli Zaretskii wrote: > > It just doesn't feel right to me to fix a problem that is specific to > selections in a general-purpose low-level facility for printing > strings. Emacs can handle null bytes in strings very well, so I see > no need to change the print functions. Does the fact that this replacement would only happen when `print-escape-nonascii' is non-nil help at all? And the fact that this same function already escapes newline, formfeed, and every character larger than 0x80 (all of which Emacs can handle in strings too)? Can we have both solutions? The selection fix is lossy, so avoiding the need for it where possible seems like a good thing to me. From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 22 13:54:02 2016 Received: (at 6991) by debbugs.gnu.org; 22 Nov 2016 18:54:02 +0000 Received: from localhost ([127.0.0.1]:38594 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c9GCc-0006ZB-Tv for submit@debbugs.gnu.org; Tue, 22 Nov 2016 13:54:02 -0500 Received: from eggs.gnu.org ([208.118.235.92]:60569) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c9GCY-0006Yw-V0 for 6991@debbugs.gnu.org; Tue, 22 Nov 2016 13:53:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c9GCQ-0005Kv-Cq for 6991@debbugs.gnu.org; Tue, 22 Nov 2016 13:53:49 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-2.9 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]:40814) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c9GBm-0004bW-Gp; Tue, 22 Nov 2016 13:53:06 -0500 Received: from 84.94.185.246.cable.012.net.il ([84.94.185.246]:1253 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.82) (envelope-from ) id 1c9GBl-0007Qa-2L; Tue, 22 Nov 2016 13:53:05 -0500 Date: Tue, 22 Nov 2016 20:52:53 +0200 Message-Id: <83vavf73ei.fsf@gnu.org> From: Eli Zaretskii To: Noam Postavsky In-reply-to: (message from Noam Postavsky on Tue, 22 Nov 2016 13:07:13 -0500) Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> 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: -8.0 (--------) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, drew.adams@oracle.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: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -8.0 (--------) > From: Noam Postavsky > Date: Tue, 22 Nov 2016 13:07:13 -0500 > Cc: 6991@debbugs.gnu.org, Juanma Barranquero , John Wiegley , > Stefan Monnier , Lars Magne Ingebrigtsen , > Drew Adams > > On Sun, Nov 20, 2016 at 10:46 AM, Eli Zaretskii wrote: > > > > It just doesn't feel right to me to fix a problem that is specific to > > selections in a general-purpose low-level facility for printing > > strings. Emacs can handle null bytes in strings very well, so I see > > no need to change the print functions. > > Does the fact that this replacement would only happen when > `print-escape-nonascii' is non-nil help at all? And the fact that this > same function already escapes newline, formfeed, and every character > larger than 0x80 (all of which Emacs can handle in strings too)? > > Can we have both solutions? The selection fix is lossy, so avoiding > the need for it where possible seems like a good thing to me. I'm confused: which problem the above is supposed to fix? Are we still talking about putting null bytes in selections, or are we talking about something else? From debbugs-submit-bounces@debbugs.gnu.org Tue Nov 22 16:07:24 2016 Received: (at 6991) by debbugs.gnu.org; 22 Nov 2016 21:07:24 +0000 Received: from localhost ([127.0.0.1]:38633 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c9IHg-0001G5-8r for submit@debbugs.gnu.org; Tue, 22 Nov 2016 16:07:24 -0500 Received: from mail-oi0-f68.google.com ([209.85.218.68]:36371) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c9IHY-0001Fk-SO for 6991@debbugs.gnu.org; Tue, 22 Nov 2016 16:07:16 -0500 Received: by mail-oi0-f68.google.com with SMTP id u15so4612113oie.3 for <6991@debbugs.gnu.org>; Tue, 22 Nov 2016 13:07:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=JvxF92pYNty+YFz5S7SwaWNZF5GWO+3CbmyHeEgdUxc=; b=WNlnRD4883fvfDBUXO5xhBU2dDF3ge+mAvvdLHDVMlzAHpYH1jl1by++hpho8Vjttm DCTYGLFNQIWihs11mZ5tLl0upY44/z4JhrMYdSIj/Ka7NckFdkBTbdwc82sh7eyegnkl fwbY/zvixcWPaaxbG1saEBD7PG0ltwYbhpW3wAAomU4Dp4AUSe4afF8olAPdARyFVZvB RI/dnJk9GumVA94PjhcEcqpgu9PEob3ySSd7eACy88yAgi0+MDlYHK8Tf6lsXjd/Ru+V /UeUK1XhBBz3XGByGVBcIiZ28Nw3cu2+82WvPhOfQKvVlErBJhbAe3Gjp6/gxVsESYz0 IRIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=JvxF92pYNty+YFz5S7SwaWNZF5GWO+3CbmyHeEgdUxc=; b=gI71qS4s9fEUQVPEjDrXw1P7XPm6h2x1zeH/8iN2k6jtS9dOw9rQIAtf7cqd1UaQel 0qWi4+443ZglRqfwmnyUjVYshHGv/rWawpwjBOPfmMJIJ18BRYuA5t5ng/OjcC3RR7Zc aSA/WK9XpQ30M5C36UrWiGuSM3xuddOc24v1OkCZg5Uo0kQUvCpV2yBhvi7VYD3WwXll 0o0KJPjt85rXchtMtw1ynqbrZs+ewEXN3J6pCei9eMkYZ/72/7Lq6Z+EX1BGxz3oZ35h DfGfqD9weBkwg8XaI95ajNHRGdpQ0W5e2cZ1G3DDAxkQ1ls59sNT6ahGSJNMaWe/dAgJ nNhg== X-Gm-Message-State: AKaTC00oFQC6Kk2hRybJMdZgr45ZabvmzY4tc4bIqrDRVdcD5oL3QORVaP34JmNse4RwVexy8wYdhLDOU6Mp/Q== X-Received: by 10.202.198.23 with SMTP id w23mr14523717oif.187.1479848826933; Tue, 22 Nov 2016 13:07:06 -0800 (PST) MIME-Version: 1.0 Received: by 10.157.4.67 with HTTP; Tue, 22 Nov 2016 13:07:06 -0800 (PST) In-Reply-To: <83vavf73ei.fsf@gnu.org> References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> From: Noam Postavsky Date: Tue, 22 Nov 2016 16:07:06 -0500 X-Google-Sender-Auth: s1qbQ4sTIUza7V6iWsxsCs20ChU Message-ID: Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers To: Eli Zaretskii Content-Type: text/plain; charset=UTF-8 X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 6991 Cc: Juanma Barranquero , John Wiegley , Stefan Monnier , 6991@debbugs.gnu.org, Lars Magne Ingebrigtsen , Drew Adams 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 Tue, Nov 22, 2016 at 1:52 PM, Eli Zaretskii wrote: >> From: Noam Postavsky >> Date: Tue, 22 Nov 2016 13:07:13 -0500 >> Cc: 6991@debbugs.gnu.org, Juanma Barranquero , John Wiegley , >> Stefan Monnier , Lars Magne Ingebrigtsen , >> Drew Adams >> >> On Sun, Nov 20, 2016 at 10:46 AM, Eli Zaretskii wrote: >> > >> > It just doesn't feel right to me to fix a problem that is specific to >> > selections in a general-purpose low-level facility for printing >> > strings. Emacs can handle null bytes in strings very well, so I see >> > no need to change the print functions. >> >> Does the fact that this replacement would only happen when >> `print-escape-nonascii' is non-nil help at all? And the fact that this >> same function already escapes newline, formfeed, and every character >> larger than 0x80 (all of which Emacs can handle in strings too)? >> >> Can we have both solutions? The selection fix is lossy, so avoiding >> the need for it where possible seems like a good thing to me. > > I'm confused: which problem the above is supposed to fix? Are we > still talking about putting null bytes in selections, or are we > talking about something else? The original bug report is about copying backtraces containing byte code to other applications (e.g., web browser, mail client, etc). The byte code in backtraces is currently printed with several characters backslash escaped (newline, formfeed, backslash, double quote, and characters higher than 0x80). I propose to extend this escaping to null bytes as well. That will (somewhat indirectly) solve the problem of copying backtraces to other applications, without lossyness (i.e., (equal (read (print str)) str) remains true). It won't solve the problem of copying arbitrary text containing null bytes to other applications, it only avoids the most common case of the user needing to copy text containing null bytes. So in addition to that, your proposal to escape null bytes in xselect and w32select would still be needed to cover the general case. The drawback to replacing nulls in the {x,w32}select code is that the conversion is lossy, and there is a slightly increased chance of the user not noticing there was lossy conversion (relative to the current lossy "conversion" of truncating the string). From debbugs-submit-bounces@debbugs.gnu.org Wed Nov 23 11:06:45 2016 Received: (at 6991) by debbugs.gnu.org; 23 Nov 2016 16:06:46 +0000 Received: from localhost ([127.0.0.1]:39442 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c9a4I-00061S-HW for submit@debbugs.gnu.org; Wed, 23 Nov 2016 11:06:45 -0500 Received: from eggs.gnu.org ([208.118.235.92]:39978) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c9a4E-00061D-2a for 6991@debbugs.gnu.org; Wed, 23 Nov 2016 11:06:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c9a45-0001bA-BK for 6991@debbugs.gnu.org; Wed, 23 Nov 2016 11:06:32 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-2.1 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]:56622) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c9a3V-00011n-6M; Wed, 23 Nov 2016 11:05:53 -0500 Received: from 84.94.185.246.cable.012.net.il ([84.94.185.246]:2497 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.82) (envelope-from ) id 1c9a3U-0003Zo-99; Wed, 23 Nov 2016 11:05:52 -0500 Date: Wed, 23 Nov 2016 18:05:37 +0200 Message-Id: <8360ne6v1q.fsf@gnu.org> From: Eli Zaretskii To: Noam Postavsky In-reply-to: (message from Noam Postavsky on Tue, 22 Nov 2016 16:07:06 -0500) Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> 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: -7.9 (-------) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, drew.adams@oracle.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: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -7.9 (-------) > From: Noam Postavsky > Date: Tue, 22 Nov 2016 16:07:06 -0500 > Cc: 6991@debbugs.gnu.org, Juanma Barranquero , John Wiegley , > Stefan Monnier , Lars Magne Ingebrigtsen , > Drew Adams > > > I'm confused: which problem the above is supposed to fix? Are we > > still talking about putting null bytes in selections, or are we > > talking about something else? > > The original bug report is about copying backtraces containing byte > code to other applications (e.g., web browser, mail client, etc). The > byte code in backtraces is currently printed with several characters > backslash escaped (newline, formfeed, backslash, double quote, and > characters higher than 0x80). I propose to extend this escaping to > null bytes as well. That will (somewhat indirectly) solve the problem > of copying backtraces to other applications, without lossyness (i.e., > (equal (read (print str)) str) remains true). It won't solve the > problem of copying arbitrary text containing null bytes to other > applications, it only avoids the most common case of the user needing > to copy text containing null bytes. I'm not necessarily opposed, but I never had any problems with binary nulls, except when copying to clipboard. > So in addition to that, your proposal to escape null bytes in xselect > and w32select would still be needed to cover the general case. The > drawback to replacing nulls in the {x,w32}select code is that the > conversion is lossy, and there is a slightly increased chance of the > user not noticing there was lossy conversion (relative to the current > lossy "conversion" of truncating the string). Yes, it's lossy, but what other alternative do we have, except losing much more? From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 26 12:17:20 2016 Received: (at 6991) by debbugs.gnu.org; 26 Nov 2016 17:17:21 +0000 Received: from localhost ([127.0.0.1]:42590 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAgbE-0005OJ-HM for submit@debbugs.gnu.org; Sat, 26 Nov 2016 12:17:20 -0500 Received: from mail-io0-f195.google.com ([209.85.223.195]:32956) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAgb9-0005O4-HZ for 6991@debbugs.gnu.org; Sat, 26 Nov 2016 12:17:14 -0500 Received: by mail-io0-f195.google.com with SMTP id j92so14954664ioi.0 for <6991@debbugs.gnu.org>; Sat, 26 Nov 2016 09:17:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=84IbJSAQ+20bpuanwKa51Ta2iDkmvfQwGvHCUYQbxjs=; b=LmgeCS0So2l4s0mOUGGLxJv+Dwjk+ahPz/XHzSx32qtLKkDY3D++HifqDA2P0Vl1R5 u+1l1G6bAjnUpXJDrqkUxaXY9T1wzCo1dTIvarPC+Wz9pF2Wc5E1A7ni4b/uRGd5aJb+ 7pmnG3aFxLO6qMrxNisOS1IEowcUGRQ5yDtSaC3rpTCii8l4MIvkjr+OqbWI8K0/UNXz ROVTQzedNCkrMlrTJKvjHTAVoSFjADstBp3+im6VlaLIyq54wrm/rRYoSoFgrfacs4Vz nTOhEe1EF07aVTiLTR/1llpFn8BOJ8LxkCxKXyP4r9NL7CuWMLBdubUs6lknGxd/Cw0G XpPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=84IbJSAQ+20bpuanwKa51Ta2iDkmvfQwGvHCUYQbxjs=; b=Q4TCGq84nZn56KN3PYvUxlcAXBm5mcLt2T4jjY+f6H/Vmak7AkAeYQz6iSAv+hy/ne F5AT0KElsSnyl1aJ/aPTLrelUadQZGjvsVVfpN11sr5zVqPrAOjkWPWM7JijgDIitDv4 OrQhzcAxyH20qkr4HD97tjdXy2RaF17x6u+AGg/Qzrl+EVWX4pslZrJxlBx9Tpyr/dAG piHp7MYmThUcFkleeIilrsE9r0tzZBxMhAkMnXsmd51F1MwcaGnhc/WBJOufXjAB8CGI +KT6wyKA1lbOj+4yAJYnC+/zGTo2E7YUksQoUu4txOH9i69rvdwQu1Z1zzPbv6zV/DIz 8sNQ== X-Gm-Message-State: AKaTC02sXP9o9KReBr94qPBTiTUYRNZRhEQIclcmBZH9mzHH8c4PFBrek35CHxhqBAqv+w== X-Received: by 10.36.254.74 with SMTP id w71mr11852686ith.38.1480180625894; Sat, 26 Nov 2016 09:17:05 -0800 (PST) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id 17sm16860268ioh.12.2016.11.26.09.17.04 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 26 Nov 2016 09:17:04 -0800 (PST) From: npostavs@users.sourceforge.net To: Eli Zaretskii Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> Date: Sat, 26 Nov 2016 12:18:00 -0500 In-Reply-To: <8360ne6v1q.fsf@gnu.org> (Eli Zaretskii's message of "Wed, 23 Nov 2016 18:05:37 +0200") Message-ID: <874m2ujh2v.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.5 (/) Eli Zaretskii writes: >> From: Noam Postavsky >> Date: Tue, 22 Nov 2016 16:07:06 -0500 >> Cc: 6991@debbugs.gnu.org, Juanma Barranquero , John Wiegley , >> Stefan Monnier , Lars Magne Ingebrigtsen , >> Drew Adams >> >> > I'm confused: which problem the above is supposed to fix? Are we >> > still talking about putting null bytes in selections, or are we >> > talking about something else? >> >> The original bug report is about copying backtraces containing byte >> code to other applications (e.g., web browser, mail client, etc). The >> byte code in backtraces is currently printed with several characters >> backslash escaped (newline, formfeed, backslash, double quote, and >> characters higher than 0x80). I propose to extend this escaping to >> null bytes as well. That will (somewhat indirectly) solve the problem >> of copying backtraces to other applications, without lossyness (i.e., >> (equal (read (print str)) str) remains true). It won't solve the >> problem of copying arbitrary text containing null bytes to other >> applications, it only avoids the most common case of the user needing >> to copy text containing null bytes. > > I'm not necessarily opposed, but I never had any problems with binary > nulls, except when copying to clipboard. I've never needed to copy binary nulls except when a backtrace had one. > >> So in addition to that, your proposal to escape null bytes in xselect >> and w32select would still be needed to cover the general case. The >> drawback to replacing nulls in the {x,w32}select code is that the >> conversion is lossy, and there is a slightly increased chance of the >> user not noticing there was lossy conversion (relative to the current >> lossy "conversion" of truncating the string). > > Yes, it's lossy, but what other alternative do we have, except losing > much more? Yes, there's no perfect solution. That's why I prefer to solve just the immediate problem by extending the escaping in `print' to cover null bytes. And this will keep working if, for example, we make the general case of copying null bytes to clipboard use a customizable replacement. From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 26 13:54:45 2016 Received: (at 6991) by debbugs.gnu.org; 26 Nov 2016 18:54:45 +0000 Received: from localhost ([127.0.0.1]:42634 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAi7Z-0007kS-Bx for submit@debbugs.gnu.org; Sat, 26 Nov 2016 13:54:45 -0500 Received: from ironport2-out.teksavvy.com ([206.248.154.181]:19157) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAi7X-0007kG-JR for 6991@debbugs.gnu.org; Sat, 26 Nov 2016 13:54:44 -0500 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0DcBQALW9BX/9qixEVdGwEBAQMBAQGDLQEBAQEBHoRNt0mGFgQCAoFpPBEBAgEBAQEBAQFeJ4RiAQEDAVYjBQsLNBIUGA1SiCcIvFUBAQEBBgIBJIp9hQyFEAWPHYo8kRUWhF6DBIYLjw2BPjQggmUegWsehgoBAQE X-IPAS-Result: A0DcBQALW9BX/9qixEVdGwEBAQMBAQGDLQEBAQEBHoRNt0mGFgQCAoFpPBEBAgEBAQEBAQFeJ4RiAQEDAVYjBQsLNBIUGA1SiCcIvFUBAQEBBgIBJIp9hQyFEAWPHYo8kRUWhF6DBIYLjw2BPjQggmUegWsehgoBAQE X-IronPort-AV: E=Sophos;i="5.30,296,1470715200"; d="scan'208";a="280710893" Received: from 69-196-162-218.dsl.teksavvy.com (HELO milanesa.home) ([69.196.162.218]) by smtp.teksavvy.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 26 Nov 2016 13:54:36 -0500 Received: by milanesa.home (Postfix, from userid 20848) id 77C5E660E7; Sat, 26 Nov 2016 13:54:36 -0500 (EST) From: Stefan Monnier To: npostavs@users.sourceforge.net Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers Message-ID: References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> Date: Sat, 26 Nov 2016 13:54:36 -0500 In-Reply-To: <874m2ujh2v.fsf@users.sourceforge.net> (npostavs's message of "Sat, 26 Nov 2016 12:18:00 -0500") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.3 (/) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.3 (/) > Yes, there's no perfect solution. That's why I prefer to solve just the > immediate problem by extending the escaping in `print' to cover null > bytes. FWIW, I agree. The only issue I can see here is that depending on how it's done, it could affect the size of the .elc files (by using two bytes per bytecode 0 rather than 1). Nothing too terrible, but it's probably worth checking whether it does make such a difference and if so how serious it is. Stefan From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 26 18:45:48 2016 Received: (at 6991) by debbugs.gnu.org; 26 Nov 2016 23:45:48 +0000 Received: from localhost ([127.0.0.1]:42719 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAmfE-0006mJ-8G for submit@debbugs.gnu.org; Sat, 26 Nov 2016 18:45:48 -0500 Received: from eggs.gnu.org ([208.118.235.92]:33541) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAmfC-0006lt-DT for 6991@debbugs.gnu.org; Sat, 26 Nov 2016 18:45:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cAmf1-0002Eg-Aw for 6991@debbugs.gnu.org; Sat, 26 Nov 2016 18:45:36 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-4.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]:47233) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cAmep-00021a-Tx; Sat, 26 Nov 2016 18:45:23 -0500 Received: from rms by fencepost.gnu.org with local (Exim 4.82) (envelope-from ) id 1cAmep-0006mz-2W; Sat, 26 Nov 2016 18:45:23 -0500 Content-Type: text/plain; charset=Utf-8 From: Richard Stallman To: npostavs@users.sourceforge.net In-reply-to: <874m2ujh2v.fsf@users.sourceforge.net> (npostavs@users.sourceforge.net) Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> Message-Id: Date: Sat, 26 Nov 2016 18:45:23 -0500 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: -8.0 (--------) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, eliz@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: , Reply-To: rms@gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -8.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. ]]] Why not take the bytecode _entirely_ out of the backtrace buffer? Is it ever any use? I proposed a week ago to print bytecode functions differently, without showing the bytecode. -- 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 Sat Nov 26 19:33:38 2016 Received: (at 6991) by debbugs.gnu.org; 27 Nov 2016 00:33:38 +0000 Received: from localhost ([127.0.0.1]:42762 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAnPV-000800-Sy for submit@debbugs.gnu.org; Sat, 26 Nov 2016 19:33:38 -0500 Received: from mail-oi0-f45.google.com ([209.85.218.45]:34199) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAnPU-0007zo-Ut for 6991@debbugs.gnu.org; Sat, 26 Nov 2016 19:33:37 -0500 Received: by mail-oi0-f45.google.com with SMTP id y198so115692127oia.1 for <6991@debbugs.gnu.org>; Sat, 26 Nov 2016 16:33:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=nbzYbc/pLJZTU/Zuw1iyVgEJummTRiqZqLHKLb+rTSI=; b=cbF0SW6cvZewGwglDnkjLFseAfN3tgLAK7HaN/6z4q7NoKUo/5RDldZAUZDOT0Ai2K lMvrzzNC28dE1wX7XPmyldQ2CTO3ZR6hdcxGUQmSK7ldlg1KTIDJqEKpLEnbNj4sLbFd 1EVD5XEjsW9is45bbqvMTkOmYfT/SLJn3tIYZqDXF8N1bN4fvjmTYHld1p/4f5YHr4/f V+cRMI0DTGy2xfN6VNllNkmEmojG3vdF64f6ncGs1+JL8KADPdgZg3ymAwAGUVj0x0GC HAnGxr8UgsxUrv72c7z4cT934kfTCNjtO7xVrDHBzjezZs09PHQnUoXIWTdUNZwQwK/M mrIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=nbzYbc/pLJZTU/Zuw1iyVgEJummTRiqZqLHKLb+rTSI=; b=fexaxes9ra0M8ayDF2Ttdjs3vrVncUkEl6M7vhM7Ysrgumt26IvW4wfEMDY0fUIpy3 3ZvB4oPHtq4S70RpIeA/uaPdLO4NBRob6r0DRzDxuER3GMfqsjy72ER+tTt1l45faJUX kDf+Y1O0+5WUilDr2wWhfk2/Zkc3jGwaOfhJGb/pp0swsgkf3TVq435D4edrjQN/wk94 Cy5UQX2qK8UDW6LSYjH0CbDO4RTmguID6nXIQKf6onr666M6GqD3rTnZKuYE84/0Ce51 cAeJTjM+yAYNbAqEBkUC+0pecUfI5Hq3QHq4URRrhoFzRHcyWGswu0M7WHErD+HxAnwD AEag== X-Gm-Message-State: AKaTC00mI0l4GdHkhPHtdZxq3wD9dzyysQMWv/RP1GWDZnWLOv8jnS2mt8phi0v5egO1zdJrIO45Fo1U223IIg== X-Received: by 10.157.58.119 with SMTP id j110mr8223803otc.208.1480206811198; Sat, 26 Nov 2016 16:33:31 -0800 (PST) MIME-Version: 1.0 Received: by 10.157.4.67 with HTTP; Sat, 26 Nov 2016 16:33:30 -0800 (PST) In-Reply-To: References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> From: Noam Postavsky Date: Sat, 26 Nov 2016 19:33:30 -0500 X-Google-Sender-Auth: Wip0YTYUifr-ChAToCWrCwB7efY Message-ID: Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers To: rms@gnu.org Content-Type: text/plain; charset=UTF-8 X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 6991 Cc: Juanma Barranquero , John Wiegley , Stefan Monnier , 6991@debbugs.gnu.org, Lars Magne Ingebrigtsen , Eli Zaretskii 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 Sat, Nov 26, 2016 at 6:45 PM, Richard Stallman wrote: > > Why not take the bytecode _entirely_ out of the backtrace buffer? > Is it ever any use? It can be disassembled, and may hold useful information that would otherwise be missing. > > I proposed a week ago to print bytecode functions differently, > without showing the bytecode. I think it might make sense to hide the bytecode with display properties, but keep the text itself so that it's not lost when copied to an email. From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 26 22:35:10 2016 Received: (at submit) by debbugs.gnu.org; 27 Nov 2016 03:35:10 +0000 Received: from localhost ([127.0.0.1]:42809 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAqFC-0004CC-Ic for submit@debbugs.gnu.org; Sat, 26 Nov 2016 22:35:10 -0500 Received: from eggs.gnu.org ([208.118.235.92]:34494) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAqFB-0004Bx-6F for submit@debbugs.gnu.org; Sat, 26 Nov 2016 22:35:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cAqF5-00020q-63 for submit@debbugs.gnu.org; Sat, 26 Nov 2016 22:35:04 -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,FREEMAIL_FROM autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:47996) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cAqF5-00020f-2w for submit@debbugs.gnu.org; Sat, 26 Nov 2016 22:35:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53688) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cAqF3-0001JN-62 for bug-gnu-emacs@gnu.org; Sat, 26 Nov 2016 22:35:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cAqEy-0001vw-Ab for bug-gnu-emacs@gnu.org; Sat, 26 Nov 2016 22:35:01 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:50362) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cAqEx-0001uM-UV for bug-gnu-emacs@gnu.org; Sat, 26 Nov 2016 22:34:56 -0500 Received: from [18.111.109.153] ([18.111.109.153]) by mrelayeu.kundenserver.de (mreue104 [212.227.15.184]) with ESMTPSA (Nemesis) id 0MJU4Z-1c8NWv0OyZ-0032y2 for ; Sun, 27 Nov 2016 04:34:54 +0100 Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers To: bug-gnu-emacs@gnu.org References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> From: =?UTF-8?Q?Cl=c3=a9ment_Pit--Claudel?= Message-ID: <3d6202a2-84d6-c3b4-0d48-c35dc447a0b4@gmail.com> Date: Sat, 26 Nov 2016 22:34:47 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="R0VdHRmWKnsqAMuptsO6r6bCq0hR2F9kl" X-Provags-ID: V03:K0:U9UqhrFlPrEyhTnbim/0w+Pz/SnhRILIhgnd9y6Y3ZbHXP1WqwI 8nzigKsyVGMZdZngwVSOBeG0N57Q3NOtUCwpKXxvlarmgV+g9+uraU8JBM1LSCPkZ41+L4m jYqxpYQay00zcZyCsIwdmDZI7FSzhcaVcEHoldijk8bDceG7R8oVYi2ggbwduoxdi9gcW4l S8pRK2LoqOv+v0UOiNjhg== X-UI-Out-Filterresults: notjunk:1;V01:K0:4JWurSKqiAM=:lkKiZ+8nYlO/ODNh1HVYhh pE1L4PT3N7eZdqoCYMokNRu5d5nHK7/QH2MR9c0fMqTVtnuPxLz8Z0RBib+Cw6EhVIl1GFY5Z 7fCotzbojTKlSjhom3t2PM0eLgyRlwCBBWiQyU5enhUjWlSchdGfX9eqMEuFv6Sa/yh2kd2MI SqwklRe/og7L8aFbY/i4+scgqpml1XsMsQuQ0FSh9CvE50NVxvnvAegz2WSzAP4uGNuxFNOy3 f5mCxxJ7HNvoQKDRtxsbQ7LQ76Qm6LcX/atFwjb1rO89mksP3Nem7dc1dGJGU32zkztJBTrkK 2wtldkENTNKdTkNIsJXrLJIt86EgKVoxfKOpjl6DCnxlXth25Swls/33zSa/iQSbbUCiQ+GWT lL7WXctEccjhzlVJ4xICzAdLIoyf24cvSdb5sesmP1G7ifPp8/S6pkuHxgWd+7Yg1F5aHvTbg Db0DveRLnPBhDwUFCgcPR3eGNCWe2R23Hbn8R9Byl9C+QWSRvjyAdiWYh1169CGEQGxcgUVFq vgW2bJHlBYut9Kfr7Bx8BXiQbGl++tNB148FYaZX7Fr3/xU75uyYWFGvKvYVBa5BhVlK3EAKM eY2yISoZnI+0FgIvwaqw41Z5x0rvu7AHHaM6VGLDwF2eLf42FFcKOYj9cOw85/bYId1dNijdO ZONSIUgAfF6mGIG/d1yIzmlOxv3Yq8ev37+6gUatCkunH8PGBbA9C/nae5NoChu+jO3c= 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: -4.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: -4.0 (----) This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --R0VdHRmWKnsqAMuptsO6r6bCq0hR2F9kl Content-Type: multipart/mixed; boundary="wQKJp8Fkqbt8hmwnkDtW3X1HxI8jsWjN5"; protected-headers="v1" From: =?UTF-8?Q?Cl=c3=a9ment_Pit--Claudel?= To: bug-gnu-emacs@gnu.org Message-ID: <3d6202a2-84d6-c3b4-0d48-c35dc447a0b4@gmail.com> Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> In-Reply-To: --wQKJp8Fkqbt8hmwnkDtW3X1HxI8jsWjN5 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 2016-11-26 19:33, Noam Postavsky wrote: > I think it might make sense to hide the bytecode with display > properties, but keep the text itself so that it's not lost when copied > to an email. This sounds like a great idea! Maybe with an indication that bytecode wa= s omitted? Something like "[bytecode]"? I wonder if it would make sense to move `backtrace' to Lisp, too; it woul= d make it easier to customize it. Cl=C3=A9ment. --wQKJp8Fkqbt8hmwnkDtW3X1HxI8jsWjN5-- --R0VdHRmWKnsqAMuptsO6r6bCq0hR2F9kl Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJYOlRXAAoJEPqg+cTm90wjkxsP/AhSg7Ps1a0vHWcsFAHMZYuA bcXmMlj36/cnpJll+m9ulaaV6ZxDGzV7iEepIVJpej+LhLbiuitpAESsNdB1wHwN nzcKOqc8ZOUvYecqbq1fWwOby+ysuD5Bn/OE3b1l5xwpKDxp+kbrzC0dySUWop3g StNkXBNP+EDJNgloRFPCbG01cg022tal8LVI3dgJ91RSAIiD2mz+DjZfF2R0veCH US0GQCM9s/JiL5xb0w/t6hG2rfL6LvSGpN/fJdR2B1lpa8qj3gOGMfD/A4mpOBQQ RnI+7sSMDkZOZDuREM7Bv4/ASKa4x/S/+R6q1NThkGV3TNKZZS0RoWufrCK4pAsN JeEPIt8dcpqjMjUbz4bZINHiTelWsbdqNqM7qqyjVK5fdjYBO4eXtwOZ/75TZCQ0 QdSawnnUj5Qz+ydComeEJfCbbnvVgMpgA/p1/i4D/pgM1HmZQZJw04hz3RwFjWCD V0Ae3eQHgN2L/YOf6fcTn82q8Dks19xsvZu3kNr++HfYIh9ssDSRpb7yGnGa4C05 2ULQBNqA7oSLLlz4udaRA1J9jZUz3ir5YHwXFK9ibMLlmLuHMtfIGC05KqS3UOZv jpRzP0VQgwvBxCBjEVQ+xg4tvYOF09y9W3xed+tN6ytYT1gwLDRFRG1CuV9Vuyj9 9r8ju0JADLTdD240sLAx =l/GA -----END PGP SIGNATURE----- --R0VdHRmWKnsqAMuptsO6r6bCq0hR2F9kl-- From debbugs-submit-bounces@debbugs.gnu.org Sat Nov 26 22:37:12 2016 Received: (at 6991) by debbugs.gnu.org; 27 Nov 2016 03:37:12 +0000 Received: from localhost ([127.0.0.1]:42813 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAqH6-0004FC-Vn for submit@debbugs.gnu.org; Sat, 26 Nov 2016 22:37:12 -0500 Received: from eggs.gnu.org ([208.118.235.92]:34838) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cAqH5-0004Em-2r for 6991@debbugs.gnu.org; Sat, 26 Nov 2016 22:37:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cAqGv-0003Th-1Y for 6991@debbugs.gnu.org; Sat, 26 Nov 2016 22:37:01 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=5.0 tests=BAYES_20,RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:49569) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cAqGZ-0003IF-A8; Sat, 26 Nov 2016 22:36:35 -0500 Received: from 84.94.185.246.cable.012.net.il ([84.94.185.246]:4849 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.82) (envelope-from ) id 1cAqGN-0002Sz-Cu; Sat, 26 Nov 2016 22:36:23 -0500 Date: Sun, 27 Nov 2016 05:36:17 +0200 Message-Id: <83bmx11tn2.fsf@gnu.org> From: Eli Zaretskii To: Noam Postavsky In-reply-to: (message from Noam Postavsky on Sat, 26 Nov 2016 19:33:30 -0500) Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> 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: -8.0 (--------) X-Debbugs-Envelope-To: 6991 Cc: rms@gnu.org, lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.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: , Reply-To: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -8.0 (--------) > From: Noam Postavsky > Date: Sat, 26 Nov 2016 19:33:30 -0500 > Cc: Eli Zaretskii , Juanma Barranquero , John Wiegley , > Stefan Monnier , 6991@debbugs.gnu.org, > Lars Magne Ingebrigtsen > > I think it might make sense to hide the bytecode with display > properties, but keep the text itself so that it's not lost when copied > to an email. Text properties won't prevent the hidden text from being copied. From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 27 09:11:05 2016 Received: (at 6991) by debbugs.gnu.org; 27 Nov 2016 14:11:05 +0000 Received: from localhost ([127.0.0.1]:42981 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cB0AX-0005Ra-IV for submit@debbugs.gnu.org; Sun, 27 Nov 2016 09:11:05 -0500 Received: from mail-oi0-f46.google.com ([209.85.218.46]:36615) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cB0AS-0005RC-LG for 6991@debbugs.gnu.org; Sun, 27 Nov 2016 09:11:00 -0500 Received: by mail-oi0-f46.google.com with SMTP id v84so124483832oie.3 for <6991@debbugs.gnu.org>; Sun, 27 Nov 2016 06:10:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=ovXjm+DzCqhwit2/amo0DgOrAgvNorNvRilghmoYdeE=; b=iRL2GB3BKz5ET/h1/QWJbJaCwzLgXEjbB7psRLDjm3UsIB4GGNojaQVhuA8cLRM6Ax IHC6vYig5Bd2gb/SpShqaehp6IZphQOibQS2d71UZYGYCrZk7dRfLr2s2GzyH3HlhqDK Yv/ocQ/z37m3JOxjy/IEr0xR033FE45eSOdwt0yAZMd5zdcVxo2sP2iP3ou8pNDJg3B9 EVHadoG5rMeXuOkr2U+/gJn8nDPkCxe5ygKsmwEaQEl+lGpJ9Zzdg06J2FDgpExkGrAF RSm/0yKDhpKTrqVpDxcZHPW1yv4AQ6974shLByAdcxz+WPfy5I51Ge0zgwzhRfCSC+U1 63IA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=ovXjm+DzCqhwit2/amo0DgOrAgvNorNvRilghmoYdeE=; b=WqYFQskbTKR8U+psL8AqVx6+cEdguyZ7NJeG3oQ32VysT2w5G/Zs0tncsMMY1HYA1y xrVdsqD+jrF00EeJKd/DTGRiqqQ9h9UmhT+++CfjDgmPeeYXC3x7NFX5Fx/IsYa1ZvTP AF1EpN60Tek46yX2EwzUEu3LCU+1vT2Bw7bMFK+KaO797AJf+pDrGGt+x0KVeDF58Lv1 mO6QHSQTpznMDhWpIcdWRHwD0p37t/v+aD2aBmCF+KJH6/3lghaD0Rhq5RstSzra64kH qTaAUBnuYm9OhP6fpb6fi1/0vOrYcXJVltbs+Cn9QWTTi+9OJev1NH1rEPxF309/S1Ob /pqg== X-Gm-Message-State: AKaTC01BBJO2HArYFg9H2tHwhWZcI4FMONWCP2a5LIBwFo3l5Md6gfvFp4hmDz4bM2AvPYcDrlzw85ATuf6t+w== X-Received: by 10.157.17.89 with SMTP id p25mr10566637otp.239.1480255851160; Sun, 27 Nov 2016 06:10:51 -0800 (PST) MIME-Version: 1.0 Received: by 10.157.4.67 with HTTP; Sun, 27 Nov 2016 06:10:50 -0800 (PST) In-Reply-To: <83bmx11tn2.fsf@gnu.org> References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> <83bmx11tn2.fsf@gnu.org> From: Noam Postavsky Date: Sun, 27 Nov 2016 09:10:50 -0500 X-Google-Sender-Auth: 8QxMtKhU8ekffISGaiCbdBljMlg Message-ID: Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers To: Eli Zaretskii Content-Type: text/plain; charset=UTF-8 X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 6991 Cc: rms@gnu.org, Juanma Barranquero , John Wiegley , Stefan Monnier , 6991@debbugs.gnu.org, Lars Magne Ingebrigtsen 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, Nov 26, 2016 at 10:36 PM, Eli Zaretskii wrote: >> From: Noam Postavsky >> Date: Sat, 26 Nov 2016 19:33:30 -0500 >> Cc: Eli Zaretskii , Juanma Barranquero , John Wiegley , >> Stefan Monnier , 6991@debbugs.gnu.org, >> Lars Magne Ingebrigtsen >> >> I think it might make sense to hide the bytecode with display >> properties, but keep the text itself so that it's not lost when copied >> to an email. > > Text properties won't prevent the hidden text from being copied. Yes, that was my intention. From debbugs-submit-bounces@debbugs.gnu.org Sun Nov 27 18:22:14 2016 Received: (at 6991) by debbugs.gnu.org; 27 Nov 2016 23:22:14 +0000 Received: from localhost ([127.0.0.1]:43996 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cB8ly-0003Vb-G0 for submit@debbugs.gnu.org; Sun, 27 Nov 2016 18:22:14 -0500 Received: from eggs.gnu.org ([208.118.235.92]:43439) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cB8lx-0003VM-As for 6991@debbugs.gnu.org; Sun, 27 Nov 2016 18:22:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cB8lr-0005k7-CT for 6991@debbugs.gnu.org; Sun, 27 Nov 2016 18:22:08 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-4.8 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]:33150) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cB8lY-0005YM-2l; Sun, 27 Nov 2016 18:21:48 -0500 Received: from rms by fencepost.gnu.org with local (Exim 4.82) (envelope-from ) id 1cB8lX-0004ho-27; Sun, 27 Nov 2016 18:21:47 -0500 Content-Type: text/plain; charset=Utf-8 From: Richard Stallman To: Noam Postavsky In-reply-to: (message from Noam Postavsky on Sat, 26 Nov 2016 19:33:30 -0500) Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> Message-Id: Date: Sun, 27 Nov 2016 18:21:47 -0500 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: -7.9 (-------) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, monnier@iro.umontreal.ca, 6991@debbugs.gnu.org, larsi@gnus.org, eliz@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: , Reply-To: rms@gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -7.9 (-------) [[[ 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. ]]] > > Why not take the bytecode _entirely_ out of the backtrace buffer? > > Is it ever any use? > It can be disassembled, and may hold useful information that would > otherwise be missing. That is no reason to put the bytecode in the backtrace by default. We can make another way to get the bytecode when you really want that. > I think it might make sense to hide the bytecode with display > properties, but keep the text itself so that it's not lost when copied > to an email. That might be a good approach. -- 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 Sat Feb 11 21:25:30 2017 Received: (at 6991) by debbugs.gnu.org; 12 Feb 2017 02:25:30 +0000 Received: from localhost ([127.0.0.1]:36089 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ccjr0-0002sp-Ge for submit@debbugs.gnu.org; Sat, 11 Feb 2017 21:25:30 -0500 Received: from mail-it0-f68.google.com ([209.85.214.68]:36333) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ccjqz-0002sd-74 for 6991@debbugs.gnu.org; Sat, 11 Feb 2017 21:25:29 -0500 Received: by mail-it0-f68.google.com with SMTP id f200so7963893itf.3 for <6991@debbugs.gnu.org>; Sat, 11 Feb 2017 18:25:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=2dvbK89puM7a0YrcZxQrjYVMrerc8uEyMz1PUo1Mc/8=; b=Ce8Y0csZ7dX8qecIkHiKWgav4ghG0kGCg+HYhSTpLnfQyDeS2IxRQ9shjGDx0zOGHd fWKP6Wv+cI3nYhKvRoF9KL3lvo/5tx/TD984rmn1hxwSnC4gqLPE5baQEkP+tmIY2LyQ KkUaC9R/3J5ub7l4+2nBdNudoSVVZxSOwdkguET5pzWxAaTCIed+zfQDZ/bEVNb1esfO wlWTEPv1e/UNWLCstrP1zx7uEztr7GJVXXzqSUZbzdxC5En41M4lW52uymuCJG8DA0rZ u0tNlIK3ZPCPix50QkN0dHdZLW6AOQe7mfs7+RYaSpw+CHGsi8M1VD1e0BwI6ye9KDeI i56A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=2dvbK89puM7a0YrcZxQrjYVMrerc8uEyMz1PUo1Mc/8=; b=sr7fGorJhlaqBtdUiNKzJb1qQk6I1mcEcVvX05rZlfjhq2T9cztbrXhPA5kURvj31v EoLgHN+o7u5UinEZwOSAS9DHGVGxp6/2oN5irAHQWuFlFtZHrk248xNIU2KGZllMLAmU voemgrbiRA3s/uH0ovfR0y7mDHF1YymMPCXSVWkC3KkmbLhuyr3CZW/zGzSQmRGVwHFw Jj9vNBhg+Ax0AvIglbg2wFWGD5kQi+f4930ZMKx4tikIM3lem62IuRmL8NKsqiiNYfsp 9Wmloyyb73lAdtLxtRaAWNS93QvzA2TtnquYxtRxB8WAIL8ZhpGsR8bgT3K+q6FEYuPA mbUA== X-Gm-Message-State: AIkVDXI+N1aCPbbcjvJ84Z/6BB6/C71JBSYJcY6Bwp98QhKyC5PiWR7/BVlPlKG5RnjPug== X-Received: by 10.36.155.11 with SMTP id o11mr35885835itd.11.1486866322974; Sat, 11 Feb 2017 18:25:22 -0800 (PST) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id a128sm2432983itg.22.2017.02.11.18.25.20 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 11 Feb 2017 18:25:21 -0800 (PST) From: npostavs@users.sourceforge.net To: Stefan Monnier Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> Date: Sat, 11 Feb 2017 21:26:31 -0500 In-Reply-To: (Stefan Monnier's message of "Sat, 26 Nov 2016 13:54:36 -0500") Message-ID: <87wpcwkuug.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --=-=-= Content-Type: text/plain Stefan Monnier writes: > FWIW, I agree. The only issue I can see here is that depending on how > it's done, it could affect the size of the .elc files (by using two bytes > per bytecode 0 rather than 1). Nothing too terrible, but it's probably > worth checking whether it does make such a difference and if so how serious > it is. On average it increases Emacs' .elc by ~200 bytes each, 276kB in total, or 100.62%. --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=elc-sizes.org.gz Content-Transfer-Encoding: base64 Content-Description: table of size changes for print NUL as \0 H4sICGcYU1gAA2VsYy1zaXplcy5vcmcAjFzZktu4kn2fiPkHxo2YpxtqY1/+ZV5YEsvFtiTqUlK5 a8IfPwkRyATJpFT14GY77GMAuZ1cgD/N2P5uzvdj86eBn3/9r/gXfJ3bU9e8+nn8hebQHW8tfI/t rR+a/2n+/Pd//dmVn38zX09//s1+J0z4p7Sx0TbTVxAKvtq3t7H7/Ks77l+us2mU8OlbCvGXE03G NCJ4+fgjRgrnEuax/3l+AYmYclpQwjShYDrtjX78EWdkxjwO99vud3/42d2uG+AF0yiN63QZU4lo nEm/raQI1iPm9/YudSRMX9YpvY2PI4EvF9IptOdrv9sPx2F8glvW2QSz3ru23k6Y2gmVDqe9jMNl 2Nr0AlO5UDC9xfMU+nGK6Svoh9zH/e40HLqnoHie019+YOLelY+TOjQqCGMemGP79W25a9QlEwum 1d5P+mmNtI913m8fu+twH/dPllowtUdMj/oJKhTD9Eec1WHCHNrx5/fOE/Qb5a5Q7spaMcldOWEy Zn++duMzfUJMS3LXeJ7WhMmOlHXGZkwwzu9hSoeY6SuvUzqd1wmq+tDPz6E/fFtGSk6Y8i+BmEp6 PZ2nklEmo3hrb7dufCF5xPRo72m7xYfoGCcfIlx4YPbnQ3/++VzpUefJjkjuHgxp8iGw3sfhvA3D r1M7/voeZpQoI8S0Qhs16aewKp3s2wuzXOwdbVOjbYL1aJXtSD2+3u7v77tTd74/gyafjPrp8Tyl ET7L3cjH19v9dhteOWVcJ4epnM1+CVyMToezb4/7H+mXXdudt3QU1+kN6hLqvAlGTbpkovJqjnnc tNCCGQxietTPoFSYdClo4+Icc+xvHzxq8fMyiIJZ2aYSZvKfSukwXydo6qt1au0KpkUfoqINGTPG xd73w+ntxXnqgJiafF2w2Sc3wT2cdoV5Of7zAlPaWDAD+fkYQo5HQqn5OrvTW7fhTWjvtmDKsncp YswhGmLx48ArzH823V3BjBb9PK1Tyqhc9slTPCLM99cyAsEXzEjxyNvJVTc2aGvnmMN42jB+1E+B /lNHikfFNhsH7nmOObb7FzJqCg8BXapiR7BZlwA9zDHv5/2LdU5inc7TEQ9xQhcestDPn2N7eW5H zWR6095J54WJOcYJt/AhH93x8ko/q1iMfKkBRzxxBvha7L0/gyU9X2fj8TzJz4MhZLlLJ+zch/zq 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 g9zvmtoBAA== --=-=-= Content-Type: text/plain But actually, while looking at this, I understood more about what the print_escape_nonascii flag is used for (i.e., multibyte vs unibyte stuff), and I no longer think it makes sense for it to affect printing the NUL byte anyway. I propose adding a new flag print_escape_control_characters instead (see patch #3 in the series). I also implemented hiding the byte code functions with text properties in #4. It's not quite satisfactory though, because it doesn't cover byte code functions values that are arguments, only byte code being called. I think printing needs to be made more flexible in order to cleanly catch all byte code values. Patch #5 replaces NUL bytes with "\0" in X selections (I guess it covers w32 as well? Haven't checked yet). --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=backtrace-6991-screenshot.png Content-Transfer-Encoding: base64 Content-Description: screenshot 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 gSW53dgxlz1mXg77RTGyGLtw+RQLLfyuSvRzmf74j5PbbPE1YrzY43Pnf5ni79Yf/wXl/ri9f6v3 zQ/Z6m2G2Og/CWIuPru0G35Dl0m/nNiLPGhUTcvJttxzLtPnbPvQ0XGg8uvrR7Z57vWLSmXJTk8h sUNBFX3qh//YUHBaom3ZpJqDZtLIGOPnffkch7/S082dj1++7O3UtvT7Df/nNa8jd+OaO+076bN9 kQ3z6f134gHKvNcPXmsOmOt+wPdfT1uN91f/8b6diruPyo9KZ0cf99jmH2PksM33xI7Jxh8vbNl8 6YuohyHIU+6+YEE/5e+vMnutc7Gkxtx59EnS9eAlfqcOWHdg84RGSWHHd53/gB4ypSDtV4CPFDAS Evip9/ZvDSqwWXP07Mlds5q+89p6PqbQfe67iPheqw6fObraKttv+78vSB9LJcF/Uk3wU1PSlCr2 UstPvb93/enETs47fc/4eNhSg7YefppdzogwEU+qpo4GLy0lk8QnTqjd0H/mWK7vXLvJ6990njWE GRlwwGP1trORyeL7tsQzKHoqST1E97P4MRf+U/i/0gc/9+vLt8kCZtsOol2xc1/cjtQavHDrcb+L u+203/pt3Rss+vnhx131WLEvJMVsgfeli4eWWaZHvCwxt8jPfHl41YbAxMaj3bcv6q2HMXqtvHLn 9r9OpnR8NcSKK3fu3r15SBjdiw7e15i8fquOXb58cuv0zsL3BDnLZb8+vNLj3HuTaQf8LnvNNHl3 0n3tmc+ixbTl1ZdUuiWN5b54FKncqVvnbt1bfg8NLRoWrbbypAyzP777QjNtW7p/LJWrFhN4KUmp yto6yM6qsmnb5rxP72PxduSn3N6y8t/4bksO+V09v20sFuC+L7Swa8998/RnL7dTV85tHsL189z3 iKjLz//ut3lnhMkcL3+/Q7M1o58WzkpLpeO/GVUI8LS2sw5fvlSi+67cbPDS3Yf3rLBr8iPg3yvf dAf9729Xp34Naah0slpFkBF+7vx7owlu8/qot568dl7njKATt36W+TWjKisr429Q7LxcgmJ5vAKB ICf26YOILzmaHUfPH99R/Aag2tNxkV3vVsYa+G673ToZU9kf3omG/lD5ZafnR926GyfQ7jnCurGa agMr606qBV8ehIojPKahY6Cvq0Glausb6euzKFmZ2ZIKYLo9B/c11mo51KYDg58Q+bJsxYqrg7Jf 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 s+fMJhM7AAAAAElFTkSuQmCC --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v1-0001-Operate-on-frame-list-instead-of-printed-backtrac.patch Content-Description: patch >From 622b9b1f328cfbf527e0dd350fd45566f4716849 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 09:19:00 -0500 Subject: [PATCH v1 1/5] Operate on frame list instead of printed backtrace * lisp/emacs-lisp/debug.el (debugger--insert-backtrace): New function, prints the given backtrace frames. (debugger-setup-buffer): Use it instead of editing the backtrace buffer text. --- lisp/emacs-lisp/debug.el | 84 +++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index cb77148c28..f24f62fa71 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -264,6 +264,40 @@ debug (setq debug-on-next-call debugger-step-after-exit) debugger-value))) + +(defun debugger-insert-backtrace (frames do-xrefs) + "Format and insert the backtrace FRAMES at point. +Make functions into cross-reference buttons if DO-XREFS is non-nil." + (let ((standard-output (current-buffer)) + (eval-buffers eval-buffer-list)) + (require 'help-mode) ; Define `help-function-def' button type. + (pcase-dolist (`(,evald ,fun ,args ,flags) frames) + (insert (if (plist-get flags :debug-on-exit) + "* " " ")) + (let ((fun-file (and do-xrefs (symbol-file fun 'defun))) + (fun-pt (point))) + (cond + ((and evald (not debugger-stack-frame-as-list)) + (prin1 fun) + (if args (prin1 args) (princ "()"))) + (t + (prin1 (cons fun args)) + (cl-incf fun-pt))) + (when fun-file + (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) + :type 'help-function-def + 'help-args (list fun fun-file)))) + ;; After any frame that uses eval-buffer, insert a line that + ;; states the buffer position it's reading at. + (when (and eval-buffers (memq fun '(eval-buffer eval-region))) + (insert (format " ; Reading at buffer position %d" + ;; This will get the wrong result if there are + ;; two nested eval-region calls for the same + ;; buffer. That's not a very useful case. + (with-current-buffer (pop eval-buffers) + (point))))) + (insert "\n")))) + (defun debugger-setup-buffer (args) "Initialize the `*Backtrace*' buffer for entry to the debugger. That buffer should be current already." @@ -271,22 +305,6 @@ debugger-setup-buffer (erase-buffer) (set-buffer-multibyte t) ;Why was it nil ? -stef (setq buffer-undo-list t) - (let ((standard-output (current-buffer)) - (print-escape-newlines t) - (print-level 8) - (print-length 50)) - ;; FIXME the debugger could pass a custom callback to mapbacktrace - ;; instead of manipulating printed results. - (mapbacktrace #'backtrace--print-frame 'debug)) - (goto-char (point-min)) - (delete-region (point) - (progn - (forward-line (if (eq (car args) 'debug) - ;; Remove debug--implement-debug-on-entry - ;; and the advice's `apply' frame. - 3 - 1)) - (point))) (insert "Debugger entered") ;; lambda is for debug-on-call when a function call is next. ;; debug is for debug-on-entry function called. @@ -301,10 +319,7 @@ debugger-setup-buffer (setq pos (point)) (setq debugger-value (nth 1 args)) (prin1 debugger-value (current-buffer)) - (insert ?\n) - (delete-char 1) - (insert ? ) - (beginning-of-line)) + (insert ?\n)) ;; Watchpoint triggered. ((and `watchpoint (let `(,symbol ,newval . ,details) (cdr args))) (insert @@ -341,23 +356,20 @@ debugger-setup-buffer (cdr args) args) (current-buffer)) (insert ?\n))) + (let ((frames (nthcdr + ;; Remove debug--implement-debug-on-entry and the + ;; advice's `apply' frame. + (if (eq (car args) 'debug) 3 1) + (backtrace-frames 'debug))) + (print-escape-newlines t) + (print-level 8) + (print-length 50)) + (when (eq (car args) 'exit) + (setf (cl-getf (nth 3 (car frames)) :debug-on-exit) nil)) + (debugger-insert-backtrace frames t)) ;; Place point on "stack frame 0" (bug#15101). - (goto-char pos)) - ;; After any frame that uses eval-buffer, - ;; insert a line that states the buffer position it's reading at. - (save-excursion - (let ((tem eval-buffer-list)) - (while (and tem - (re-search-forward "^ eval-\\(buffer\\|region\\)(" nil t)) - (end-of-line) - (insert (format " ; Reading at buffer position %d" - ;; This will get the wrong result - ;; if there are two nested eval-region calls - ;; for the same buffer. That's not a very useful case. - (with-current-buffer (car tem) - (point)))) - (pop tem)))) - (debugger-make-xrefs)) + (goto-char pos))) + (defun debugger-make-xrefs (&optional buffer) "Attach cross-references to function names in the `*Backtrace*' buffer." -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v1-0002-Improve-ert-backtrace-recording.patch Content-Description: patch >From 356c3e17edb19f5daef9f83f2c4d5694290f1221 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 17:19:41 -0500 Subject: [PATCH v1 2/5] Improve ert backtrace recording Change ert to use the new `backtrace-frames' function instead of collecting frames one by one with `backtrace-frame'. Additionally, collect frames starting from `signal' instead the somewhat arbitrary "6 from the bottom". Skipping 6 frames would skip the expression that actually caused the signal that triggered the debugger. Possibly 6 was chosen because in the case of a failed test, the triggering frame is an `ert-fail' call, which is not so interesting. But in case of test throwing an error, this drop the `error' call which is too much. * lisp/emacs-lisp/ert.el (ert--print-backtrace): Remove. (ert--print-backtrace): Add DO-XREFS parameter, delegate to `debugger-insert-backtrace'. (ert--run-test-debugger): Record the backtrace frames starting from the instigating `signal' call. (ert-run-tests-batch): Pass nil for `ert--print-backtrace's new DO-XREFS parameter. (ert-results-pop-to-backtrace-for-test-at-point): Pass t as DO-XREFS to `ert--print-backtrace' and remove call to `debugger-make-xrefs'. * test/lisp/emacs-lisp/ert-tests.el (ert-test-record-backtrace): Check the backtrace list instead of comparing its string representation. Expect `signal' to be the first frame. --- lisp/emacs-lisp/ert.el | 62 ++++++++++++--------------------------- test/lisp/emacs-lisp/ert-tests.el | 8 ++--- 2 files changed, 21 insertions(+), 49 deletions(-) diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el index 785f4aca1c..98e4cd7c24 100644 --- a/lisp/emacs-lisp/ert.el +++ b/lisp/emacs-lisp/ert.el @@ -669,48 +669,12 @@ ert-debug-on-error (cl-defstruct (ert-test-aborted-with-non-local-exit (:include ert-test-result))) - -(defun ert--record-backtrace () - "Record the current backtrace (as a list) and return it." - ;; Since the backtrace is stored in the result object, result - ;; objects must only be printed with appropriate limits - ;; (`print-level' and `print-length') in place. For interactive - ;; use, the cost of ensuring this possibly outweighs the advantage - ;; of storing the backtrace for - ;; `ert-results-pop-to-backtrace-for-test-at-point' given that we - ;; already have `ert-results-rerun-test-debugging-errors-at-point'. - ;; For batch use, however, printing the backtrace may be useful. - (cl-loop - ;; 6 is the number of frames our own debugger adds (when - ;; compiled; more when interpreted). FIXME: Need to describe a - ;; procedure for determining this constant. - for i from 6 - for frame = (backtrace-frame i) - while frame - collect frame)) - -(defun ert--print-backtrace (backtrace) +(defun ert--print-backtrace (backtrace do-xrefs) "Format the backtrace BACKTRACE to the current buffer." - ;; This is essentially a reimplementation of Fbacktrace - ;; (src/eval.c), but for a saved backtrace, not the current one. (let ((print-escape-newlines t) (print-level 8) (print-length 50)) - (dolist (frame backtrace) - (pcase-exhaustive frame - (`(nil ,special-operator . ,arg-forms) - ;; Special operator. - (insert - (format " %S\n" (cons special-operator arg-forms)))) - (`(t ,fn . ,args) - ;; Function call. - (insert (format " %S(" fn)) - (cl-loop for firstp = t then nil - for arg in args do - (unless firstp - (insert " ")) - (insert (format "%S" arg))) - (insert ")\n")))))) + (debugger-insert-backtrace backtrace do-xrefs))) ;; A container for the state of the execution of a single test and ;; environment data needed during its execution. @@ -749,7 +713,19 @@ ert--run-test-debugger ((quit) 'quit) ((ert-test-skipped) 'skipped) (otherwise 'failed))) - (backtrace (ert--record-backtrace)) + ;; We store the backtrace in the result object for + ;; `ert-results-pop-to-backtrace-for-test-at-point'. + ;; This means we have to limit `print-level' and + ;; `print-length' when printing result objects. That + ;; might not be worth while when we can also use + ;; `ert-results-rerun-test-debugging-errors-at-point', + ;; (i.e., when running interactively) but having the + ;; backtrace ready for printing is important for batch + ;; use. + ;; + ;; Grab the frames starting from `signal', frames below + ;; that are all from the debugger. + (backtrace (backtrace-frames 'signal)) (infos (reverse ert--infos))) (setf (ert--test-execution-info-result info) (cl-ecase type @@ -1404,8 +1380,9 @@ ert-run-tests-batch (ert-test-result-with-condition (message "Test %S backtrace:" (ert-test-name test)) (with-temp-buffer - (ert--print-backtrace (ert-test-result-with-condition-backtrace - result)) + (ert--print-backtrace + (ert-test-result-with-condition-backtrace result) + nil) (goto-char (point-min)) (while (not (eobp)) (let ((start (point)) @@ -2394,8 +2371,7 @@ ert-results-pop-to-backtrace-for-test-at-point ;; Use unibyte because `debugger-setup-buffer' also does so. (set-buffer-multibyte nil) (setq truncate-lines t) - (ert--print-backtrace backtrace) - (debugger-make-xrefs) + (ert--print-backtrace backtrace t) (goto-char (point-min)) (insert (substitute-command-keys "Backtrace for test `")) (ert-insert-test-name-button (ert-test-name test)) diff --git a/test/lisp/emacs-lisp/ert-tests.el b/test/lisp/emacs-lisp/ert-tests.el index fc5790c365..317838b250 100644 --- a/test/lisp/emacs-lisp/ert-tests.el +++ b/test/lisp/emacs-lisp/ert-tests.el @@ -367,12 +367,8 @@ ert-test--which-file (test (make-ert-test :body test-body)) (result (ert-run-test test))) (should (ert-test-failed-p result)) - (with-temp-buffer - (ert--print-backtrace (ert-test-failed-backtrace result)) - (goto-char (point-min)) - (end-of-line) - (let ((first-line (buffer-substring-no-properties (point-min) (point)))) - (should (equal first-line (format " %S()" test-body))))))) + (should (eq (nth 1 (car (ert-test-failed-backtrace result))) + 'signal)))) (ert-deftest ert-test-messages () :tags '(:causes-redisplay) -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v1-0003-Escape-control-characters-in-backtraces-Bug-6991.patch Content-Description: patch >From 85bcf94d7bcf55e718f80fb22a3e0c8e351b0787 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 18:13:54 -0500 Subject: [PATCH v1 3/5] Escape control characters in backtraces (Bug#6991) * src/print.c (syms_of_print): Add new variable, print-escape-control-characters. (print_object): Print control characters with octal escape codes when print-escape-control-characters is true. * lisp/subr.el (backtrace): * lisp/emacs-lisp/debug.el (debugger-setup-buffer): Bind `print-escape-control-characters' to t. --- lisp/emacs-lisp/debug.el | 2 +- lisp/subr.el | 3 ++- src/print.c | 40 +++++++++++++++++++++++++++++----------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index f24f62fa71..42e44761de 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -361,7 +361,7 @@ debugger-setup-buffer ;; advice's `apply' frame. (if (eq (car args) 'debug) 3 1) (backtrace-frames 'debug))) - (print-escape-newlines t) + (print-escape-control-characters t) (print-level 8) (print-length 50)) (when (eq (car args) 'exit) diff --git a/lisp/subr.el b/lisp/subr.el index a204577ddf..6e4779ef1f 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -4472,7 +4472,8 @@ backtrace--print-frame (defun backtrace () "Print a trace of Lisp function calls currently active. Output stream used is value of `standard-output'." - (let ((print-level (or print-level 8))) + (let ((print-level (or print-level 8)) + (print-escape-control-characters t)) (mapbacktrace #'backtrace--print-frame 'backtrace))) (defun backtrace-frames (&optional base) diff --git a/src/print.c b/src/print.c index db3d00f51f..1d3958a39e 100644 --- a/src/print.c +++ b/src/print.c @@ -1476,17 +1476,29 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag) /* If we just had a hex escape, and this character could be taken as part of it, output `\ ' to prevent that. */ - if (need_nonhex && c_isxdigit (c)) - print_c_string ("\\ ", printcharfun); - - if (c == '\n' && print_escape_newlines - ? (c = 'n', true) - : c == '\f' && print_escape_newlines - ? (c = 'f', true) - : c == '\"' || c == '\\') - printchar ('\\', printcharfun); - - printchar (c, printcharfun); + if (c_isxdigit (c)) + { + if (need_nonhex) + print_c_string ("\\ ", printcharfun); + printchar (c, printcharfun); + } + else if (c == '\n' && print_escape_newlines + ? (c = 'n', true) + : c == '\f' && print_escape_newlines + ? (c = 'f', true) + : c == '\"' || c == '\\') + { + printchar ('\\', printcharfun); + printchar (c, printcharfun); + } + else if (print_escape_control_characters && c_iscntrl (c)) + { + char outbuf[5]; + int len = sprintf (outbuf, "\\%03o", c + 0u); + strout (outbuf, len, len, printcharfun); + } + else + printchar (c, printcharfun); need_nonhex = false; } } @@ -2264,6 +2276,11 @@ syms_of_print (void) Also print formfeeds as `\\f'. */); print_escape_newlines = 0; + DEFVAR_BOOL ("print-escape-control-characters", print_escape_control_characters, + doc: /* Non-nil means print control characters in strings as `\\OOO'. +\(OOO is the octal representation of the character code.)*/); + print_escape_control_characters = 0; + DEFVAR_BOOL ("print-escape-nonascii", print_escape_nonascii, doc: /* Non-nil means print unibyte non-ASCII chars in strings as \\OOO. \(OOO is the octal representation of the character code.) @@ -2352,6 +2369,7 @@ representation) and `#N#' in place of each subsequent occurrence, DEFSYM (Qprint_escape_newlines, "print-escape-newlines"); DEFSYM (Qprint_escape_multibyte, "print-escape-multibyte"); DEFSYM (Qprint_escape_nonascii, "print-escape-nonascii"); + DEFSYM (Qprint_escape_control_characters, "print-escape-control-characters"); print_prune_charset_plist = Qnil; staticpro (&print_prune_charset_plist); -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v1-0004-Hide-byte-code-in-backtraces-Bug-6991.patch Content-Description: patch >From bbec49e74acae529ddac91a23a9c81af53454e7e Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 19:00:19 -0500 Subject: [PATCH v1 4/5] Hide byte code in backtraces (Bug#6991) * lisp/emacs-lisp/debug.el (help-byte-code): New button type, calls `disassemble' in its action. (debugger-insert-backtrace): Cover byte code with help-byte-code button. --- lisp/emacs-lisp/debug.el | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 42e44761de..94b683dcb9 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -265,6 +265,12 @@ debug debugger-value))) +(define-button-type 'help-byte-code + 'follow-link t + 'action (lambda (button) + (disassemble (button-get button 'byte-code-function))) + 'help-echo (purecopy "mouse-2, RET: disassemble this function")) + (defun debugger-insert-backtrace (frames do-xrefs) "Format and insert the backtrace FRAMES at point. Make functions into cross-reference buttons if DO-XREFS is non-nil." @@ -286,7 +292,15 @@ debugger-insert-backtrace (when fun-file (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) :type 'help-function-def - 'help-args (list fun fun-file)))) + 'help-args (list fun fun-file))) + (when (byte-code-function-p fun) + (goto-char fun-pt) + (forward-sexp) + (make-text-button fun-pt (point) + :type 'help-byte-code + 'byte-code-function fun + 'display "#") + (end-of-line))) ;; After any frame that uses eval-buffer, insert a line that ;; states the buffer position it's reading at. (when (and eval-buffers (memq fun '(eval-buffer eval-region))) -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v1-0005-Escape-NUL-bytes-in-X-selections-Bug-6991.patch Content-Description: patch >From 4f49294621e64a20462c369499d128523bf4a5de Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 19:47:55 -0500 Subject: [PATCH v1 5/5] Escape NUL bytes in X selections (Bug#6991) * lisp/select.el (xselect--encode-string): Replace NUL bytes with "\0". --- lisp/select.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lisp/select.el b/lisp/select.el index a4a79255a9..705d6469d3 100644 --- a/lisp/select.el +++ b/lisp/select.el @@ -475,6 +475,9 @@ xselect--encode-string (t (error "Unknown selection type: %S" type))))) + ;; Most programs are unable to handle NUL bytes in strings. + (setq str (replace-regexp-in-string "\0" "\\0" str t t)) + (setq next-selection-coding-system nil) (cons type str)))) -- 2.11.1 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 21 23:43:43 2017 Received: (at control) by debbugs.gnu.org; 22 Feb 2017 04:43:43 +0000 Received: from localhost ([127.0.0.1]:49532 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cgOmC-0005VE-4i for submit@debbugs.gnu.org; Tue, 21 Feb 2017 23:43:43 -0500 Received: from mail-io0-f195.google.com ([209.85.223.195]:33373) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cgOm7-0005Uw-JL; Tue, 21 Feb 2017 23:43:39 -0500 Received: by mail-io0-f195.google.com with SMTP id d198so247524ioe.0; Tue, 21 Feb 2017 20:43:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=MXNzJYK/z/TxPj41z3ccVof2vtk7buYOqmaj5x8AIPU=; b=ZAFSimLJqqQetLjuwGE2/IRB2EOh95k/ACNvp9YfuU3xPcY4zY+PK59gcU/W0uqdYD rPRAB2JMIufKtUezx+Kpp5Oyl6i/UFjKf+CUbzQ9ZCaswpUojfJyALprdHBFq64rtQ2H jfCK37ukJhV9EeSWrp4vOn8J5wnRjQ0KGodLEnkrsWM4NlU8yxRUfHMyAICirNmoutTc kty+PAn99XMZf+PiBc+qbVAsUdAoVPwvC6TO4mbmA4YSdRF8jzc57QOu5p1x8KWtHMxR 7CH8RqrJ9WTyJxztuXb4rqID3e4AjfJaBjSiExcXVe0RYyBFtDEDqJy57p6e+RH2xqm+ +Clg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=MXNzJYK/z/TxPj41z3ccVof2vtk7buYOqmaj5x8AIPU=; b=l9aLe6gs10RqDllrAVwYcSM3PuWe5zgsUUKI62s7x9MDTtpYFigdnw7KTD2bk9pHrF detz5D2feTxT/z4gwfioWVcb0VD0SfvKDQFrAxOEjy/fCmrbaalSidTzU7AjkhRer1h0 cD7SD32HETf5C5ltzRLOf4HxWH8EsKJpPFf4oCYhdsw7H9zCs5yapk0H2wleO/xtoij9 ip4lrBaNjlCrI7HuyaVEdqu4cP35r+09BEl+SNPnUmzBp1yMP68cuYS+t6PuLuPwXGav NnJdKy4QrKqVBwFz8mXnMUtcX3ZkxouMmmzTQEkkx2THTG8x6LumJkwViajisWGfQzZV eViQ== X-Gm-Message-State: AMke39lleN52OMrV28Sba+7VyZLSgVQSNOhgNziLSsjtjq1iig3aY4h6LGXtCr3KhTGDzA== X-Received: by 10.107.162.194 with SMTP id l185mr25495047ioe.184.1487738610082; Tue, 21 Feb 2017 20:43:30 -0800 (PST) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id 62sm514602itl.1.2017.02.21.20.43.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 21 Feb 2017 20:43:29 -0800 (PST) From: npostavs@users.sourceforge.net To: Lars Ingebrigtsen Subject: Re: bug#15789: 24.3.50; backtrace produces unreadable output References: <5274BDCB.4090100@poczta.onet.pl> <87r3fqiao8.fsf@gnus.org> Date: Tue, 21 Feb 2017 23:44:42 -0500 In-Reply-To: <87r3fqiao8.fsf@gnus.org> (Lars Ingebrigtsen's message of "Fri, 04 Mar 2016 14:23:51 +0000") Message-ID: <878toyhm11.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.1 (/) X-Debbugs-Envelope-To: control Cc: 15789@debbugs.gnu.org, Jarek Czekalski 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.1 (/) forcemerge 6991 15789 quit Lars Ingebrigtsen writes: > Jarek Czekalski writes: > >> This is the code I use to produce an example backtrace: >> >> (defadvice tmm-add-prompt (before emacspeak pre act comp) >> "Speaks the list of completions we have available." >> (backtrace)) >> >> Then launch M-x tmm-menubar to have it output the backtrace. > > I can't reproduce this on the trunk -- I don't even get a backtrace. > Has defadvice stopped working? You maybe didn't realize that the backtrace is silently printed to *Messages*. From debbugs-submit-bounces@debbugs.gnu.org Sun May 28 10:56:53 2017 Received: (at 6991) by debbugs.gnu.org; 28 May 2017 14:56:53 +0000 Received: from localhost ([127.0.0.1]:41807 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dEzcj-0006gj-0u for submit@debbugs.gnu.org; Sun, 28 May 2017 10:56:53 -0400 Received: from mail-it0-f68.google.com ([209.85.214.68]:35522) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dEzcg-0006gW-St for 6991@debbugs.gnu.org; Sun, 28 May 2017 10:56:51 -0400 Received: by mail-it0-f68.google.com with SMTP id 67so5307463itx.2 for <6991@debbugs.gnu.org>; Sun, 28 May 2017 07:56:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=qSgAQMfq/qAEUxCRlifb3eXlggeJnqlEQr0+imvwofI=; b=jvyUEWDmh6CS508dRjMZxuG2FtwV/+JnoKip8TyrJsbFHgE/xRt3UtVsyNWk6xi87H WE/waLvJGnubUnHvnaiI2emy+T7h21wsqsG2DPbvPvA+5kExVHhaUA3/erkllyUGw5TK lnnMSvuyOknPWlqmaGrIq0aQKj3NAqyy5CGh8YgwbKJZsZ34NcljFNmp8+ZuwctFa0ni IukByF2z7WYsKwbuZCOQJ03y+EtbJhOWLqaE8c+g9+QoMZtZIqsUwj9p0MDx9vOHg0qg XDqU/wQxOp6IQ3DP6u6z4/8J3gbfHrnz9cKhHsyoH5yXdRxawrMXDbBkHrjX1jAhV+1C NbBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=qSgAQMfq/qAEUxCRlifb3eXlggeJnqlEQr0+imvwofI=; b=UU7ndvoWcs+PJF8QEH8w96WUGRvEZ3/uDRnTENPQfjYMTeSuVmQz+DNqAz1oMv48g8 WzZlbVoX+qNMHYOYo1WxO6mw8BsUbEql7WBt8O/I1KVpqAc7d1CdI45g1ZFFRuCIntqS qWG/n/QeQqw//EuxXZdYkZG4tFtvgKkYYua8icSUkLJ/8/dvubC0bT3sW3p4dsgiExw6 PurqJiC6R2PwaOg9uN8tbHvNdrYHjZo2E66N7Bks5f9v/rVdzf/bZqZWfWCfWAkIZKOd xPSmb2wD9nJjAxozH8WN11rTQmTrNsPpNvBBRhDwFVFTWtKbV7L6Rqa/V7OVdio5fG6u z2kQ== X-Gm-Message-State: AODbwcCYxSX07r5mxnX5N9ILSAjocPRZZSmlzPUSYJpRWvkiPvor7prC 5p5Cx0xNR5YS4A== X-Received: by 10.36.107.201 with SMTP id v192mr10931324itc.81.1495983405224; Sun, 28 May 2017 07:56:45 -0700 (PDT) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id 78sm2950651iou.36.2017.05.28.07.56.43 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 28 May 2017 07:56:44 -0700 (PDT) From: npostavs@users.sourceforge.net To: Stefan Monnier Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> <87wpcwkuug.fsf@users.sourceforge.net> Date: Sun, 28 May 2017 10:58:21 -0400 In-Reply-To: <87wpcwkuug.fsf@users.sourceforge.net> (npostavs@users.sourceforge.net's message of "Sat, 11 Feb 2017 21:26:31 -0500") Message-ID: <87zidx3u5u.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.2 (/) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.2 (/) --=-=-= Content-Type: text/plain npostavs@users.sourceforge.net writes: > I propose adding a new flag print_escape_control_characters instead (see > patch #3 in the series). I also implemented hiding the byte code > functions with text properties in #4. It's not quite satisfactory > though, because it doesn't cover byte code functions values that are > arguments, only byte code being called. I think printing needs to be > made more flexible in order to cleanly catch all byte code values. > Patch #5 replaces NUL bytes with "\0" in X selections (I guess it covers > w32 as well? Haven't checked yet). Updated the patchset to use cl-prin1, now it applies to function values in arguments as well. This one actually doesn't include the byte code text at all (path of least resistance: cl-print-object wasn't already omitting bytecode and I haven't bothered adding it). --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v2-0001-Operate-on-frame-list-instead-of-printed-backtrac.patch Content-Description: patch >From 92415966acf8ba30869b11d7ee81e88d96253a40 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 09:19:00 -0500 Subject: [PATCH v2 1/6] Operate on frame list instead of printed backtrace * lisp/emacs-lisp/debug.el (debugger--insert-backtrace): New function, prints the given backtrace frames. (debugger-setup-buffer): Use it instead of editing the backtrace buffer text. --- lisp/emacs-lisp/debug.el | 84 +++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 83456fc31a..0c8306d428 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -264,6 +264,40 @@ (defun debug (&rest args) (setq debug-on-next-call debugger-step-after-exit) debugger-value))) + +(defun debugger-insert-backtrace (frames do-xrefs) + "Format and insert the backtrace FRAMES at point. +Make functions into cross-reference buttons if DO-XREFS is non-nil." + (let ((standard-output (current-buffer)) + (eval-buffers eval-buffer-list)) + (require 'help-mode) ; Define `help-function-def' button type. + (pcase-dolist (`(,evald ,fun ,args ,flags) frames) + (insert (if (plist-get flags :debug-on-exit) + "* " " ")) + (let ((fun-file (and do-xrefs (symbol-file fun 'defun))) + (fun-pt (point))) + (cond + ((and evald (not debugger-stack-frame-as-list)) + (prin1 fun) + (if args (prin1 args) (princ "()"))) + (t + (prin1 (cons fun args)) + (cl-incf fun-pt))) + (when fun-file + (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) + :type 'help-function-def + 'help-args (list fun fun-file)))) + ;; After any frame that uses eval-buffer, insert a line that + ;; states the buffer position it's reading at. + (when (and eval-buffers (memq fun '(eval-buffer eval-region))) + (insert (format " ; Reading at buffer position %d" + ;; This will get the wrong result if there are + ;; two nested eval-region calls for the same + ;; buffer. That's not a very useful case. + (with-current-buffer (pop eval-buffers) + (point))))) + (insert "\n")))) + (defun debugger-setup-buffer (args) "Initialize the `*Backtrace*' buffer for entry to the debugger. That buffer should be current already." @@ -271,22 +305,6 @@ (defun debugger-setup-buffer (args) (erase-buffer) (set-buffer-multibyte t) ;Why was it nil ? -stef (setq buffer-undo-list t) - (let ((standard-output (current-buffer)) - (print-escape-newlines t) - (print-level 8) - (print-length 50)) - ;; FIXME the debugger could pass a custom callback to mapbacktrace - ;; instead of manipulating printed results. - (mapbacktrace #'backtrace--print-frame 'debug)) - (goto-char (point-min)) - (delete-region (point) - (progn - (forward-line (if (eq (car args) 'debug) - ;; Remove debug--implement-debug-on-entry - ;; and the advice's `apply' frame. - 3 - 1)) - (point))) (insert "Debugger entered") ;; lambda is for debug-on-call when a function call is next. ;; debug is for debug-on-entry function called. @@ -301,10 +319,7 @@ (defun debugger-setup-buffer (args) (setq pos (point)) (setq debugger-value (nth 1 args)) (prin1 debugger-value (current-buffer)) - (insert ?\n) - (delete-char 1) - (insert ? ) - (beginning-of-line)) + (insert ?\n)) ;; Watchpoint triggered. ((and `watchpoint (let `(,symbol ,newval . ,details) (cdr args))) (insert @@ -341,23 +356,20 @@ (defun debugger-setup-buffer (args) (cdr args) args) (current-buffer)) (insert ?\n))) + (let ((frames (nthcdr + ;; Remove debug--implement-debug-on-entry and the + ;; advice's `apply' frame. + (if (eq (car args) 'debug) 3 1) + (backtrace-frames 'debug))) + (print-escape-newlines t) + (print-level 8) + (print-length 50)) + (when (eq (car args) 'exit) + (setf (cl-getf (nth 3 (car frames)) :debug-on-exit) nil)) + (debugger-insert-backtrace frames t)) ;; Place point on "stack frame 0" (bug#15101). - (goto-char pos)) - ;; After any frame that uses eval-buffer, - ;; insert a line that states the buffer position it's reading at. - (save-excursion - (let ((tem eval-buffer-list)) - (while (and tem - (re-search-forward "^ eval-\\(buffer\\|region\\)(" nil t)) - (end-of-line) - (insert (format " ; Reading at buffer position %d" - ;; This will get the wrong result - ;; if there are two nested eval-region calls - ;; for the same buffer. That's not a very useful case. - (with-current-buffer (car tem) - (point)))) - (pop tem)))) - (debugger-make-xrefs)) + (goto-char pos))) + (defun debugger-make-xrefs (&optional buffer) "Attach cross-references to function names in the `*Backtrace*' buffer." -- 2.11.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v2-0002-Improve-ert-backtrace-recording.patch Content-Description: patch >From 2308506a4cc49e934a9b358737d54cb2932583ab Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 17:19:41 -0500 Subject: [PATCH v2 2/6] Improve ert backtrace recording Change ert to use the new `backtrace-frames' function instead of collecting frames one by one with `backtrace-frame'. Additionally, collect frames starting from `signal' instead the somewhat arbitrary "6 from the bottom". Skipping 6 frames would skip the expression that actually caused the signal that triggered the debugger. Possibly 6 was chosen because in the case of a failed test, the triggering frame is an `ert-fail' call, which is not so interesting. But in case of test throwing an error, this drop the `error' call which is too much. * lisp/emacs-lisp/ert.el (ert--print-backtrace): Remove. (ert--print-backtrace): Add DO-XREFS parameter, delegate to `debugger-insert-backtrace'. (ert--run-test-debugger): Record the backtrace frames starting from the instigating `signal' call. (ert-run-tests-batch): Pass nil for `ert--print-backtrace's new DO-XREFS parameter. (ert-results-pop-to-backtrace-for-test-at-point): Pass t as DO-XREFS to `ert--print-backtrace' and remove call to `debugger-make-xrefs'. * test/lisp/emacs-lisp/ert-tests.el (ert-test-record-backtrace): Check the backtrace list instead of comparing its string representation. Expect `signal' to be the first frame. --- lisp/emacs-lisp/ert.el | 62 ++++++++++++--------------------------- test/lisp/emacs-lisp/ert-tests.el | 8 ++--- 2 files changed, 21 insertions(+), 49 deletions(-) diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el index 2c49a634e3..402798603a 100644 --- a/lisp/emacs-lisp/ert.el +++ b/lisp/emacs-lisp/ert.el @@ -670,48 +670,12 @@ (cl-defstruct (ert-test-skipped (:include ert-test-result-with-condition))) (cl-defstruct (ert-test-aborted-with-non-local-exit (:include ert-test-result))) - -(defun ert--record-backtrace () - "Record the current backtrace (as a list) and return it." - ;; Since the backtrace is stored in the result object, result - ;; objects must only be printed with appropriate limits - ;; (`print-level' and `print-length') in place. For interactive - ;; use, the cost of ensuring this possibly outweighs the advantage - ;; of storing the backtrace for - ;; `ert-results-pop-to-backtrace-for-test-at-point' given that we - ;; already have `ert-results-rerun-test-debugging-errors-at-point'. - ;; For batch use, however, printing the backtrace may be useful. - (cl-loop - ;; 6 is the number of frames our own debugger adds (when - ;; compiled; more when interpreted). FIXME: Need to describe a - ;; procedure for determining this constant. - for i from 6 - for frame = (backtrace-frame i) - while frame - collect frame)) - -(defun ert--print-backtrace (backtrace) +(defun ert--print-backtrace (backtrace do-xrefs) "Format the backtrace BACKTRACE to the current buffer." - ;; This is essentially a reimplementation of Fbacktrace - ;; (src/eval.c), but for a saved backtrace, not the current one. (let ((print-escape-newlines t) (print-level 8) (print-length 50)) - (dolist (frame backtrace) - (pcase-exhaustive frame - (`(nil ,special-operator . ,arg-forms) - ;; Special operator. - (insert - (format " %S\n" (cons special-operator arg-forms)))) - (`(t ,fn . ,args) - ;; Function call. - (insert (format " %S(" fn)) - (cl-loop for firstp = t then nil - for arg in args do - (unless firstp - (insert " ")) - (insert (format "%S" arg))) - (insert ")\n")))))) + (debugger-insert-backtrace backtrace do-xrefs))) ;; A container for the state of the execution of a single test and ;; environment data needed during its execution. @@ -750,7 +714,19 @@ (defun ert--run-test-debugger (info args) ((quit) 'quit) ((ert-test-skipped) 'skipped) (otherwise 'failed))) - (backtrace (ert--record-backtrace)) + ;; We store the backtrace in the result object for + ;; `ert-results-pop-to-backtrace-for-test-at-point'. + ;; This means we have to limit `print-level' and + ;; `print-length' when printing result objects. That + ;; might not be worth while when we can also use + ;; `ert-results-rerun-test-debugging-errors-at-point', + ;; (i.e., when running interactively) but having the + ;; backtrace ready for printing is important for batch + ;; use. + ;; + ;; Grab the frames starting from `signal', frames below + ;; that are all from the debugger. + (backtrace (backtrace-frames 'signal)) (infos (reverse ert--infos))) (setf (ert--test-execution-info-result info) (cl-ecase type @@ -1409,8 +1385,9 @@ (defun ert-run-tests-batch (&optional selector) (ert-test-result-with-condition (message "Test %S backtrace:" (ert-test-name test)) (with-temp-buffer - (ert--print-backtrace (ert-test-result-with-condition-backtrace - result)) + (ert--print-backtrace + (ert-test-result-with-condition-backtrace result) + nil) (goto-char (point-min)) (while (not (eobp)) (let ((start (point)) @@ -2420,8 +2397,7 @@ (defun ert-results-pop-to-backtrace-for-test-at-point () ;; Use unibyte because `debugger-setup-buffer' also does so. (set-buffer-multibyte nil) (setq truncate-lines t) - (ert--print-backtrace backtrace) - (debugger-make-xrefs) + (ert--print-backtrace backtrace t) (goto-char (point-min)) (insert (substitute-command-keys "Backtrace for test `")) (ert-insert-test-name-button (ert-test-name test)) diff --git a/test/lisp/emacs-lisp/ert-tests.el b/test/lisp/emacs-lisp/ert-tests.el index fc5790c365..317838b250 100644 --- a/test/lisp/emacs-lisp/ert-tests.el +++ b/test/lisp/emacs-lisp/ert-tests.el @@ -367,12 +367,8 @@ (ert-deftest ert-test-record-backtrace () (test (make-ert-test :body test-body)) (result (ert-run-test test))) (should (ert-test-failed-p result)) - (with-temp-buffer - (ert--print-backtrace (ert-test-failed-backtrace result)) - (goto-char (point-min)) - (end-of-line) - (let ((first-line (buffer-substring-no-properties (point-min) (point)))) - (should (equal first-line (format " %S()" test-body))))))) + (should (eq (nth 1 (car (ert-test-failed-backtrace result))) + 'signal)))) (ert-deftest ert-test-messages () :tags '(:causes-redisplay) -- 2.11.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v2-0003-Escape-control-characters-in-backtraces-Bug-6991.patch Content-Description: patch >From f740346aeffaa2b5c70727ef0fe83c8f1e2e0d33 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 18:13:54 -0500 Subject: [PATCH v2 3/6] Escape control characters in backtraces (Bug#6991) * src/print.c (syms_of_print): Add new variable, print-escape-control-characters. (print_object): Print control characters with octal escape codes when print-escape-control-characters is true. * lisp/subr.el (backtrace): * lisp/emacs-lisp/debug.el (debugger-setup-buffer): Bind `print-escape-control-characters' to t. --- lisp/emacs-lisp/debug.el | 1 + lisp/subr.el | 3 ++- src/print.c | 45 +++++++++++++++++++++++++++++++++------------ 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 0c8306d428..effe7f0cb3 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -362,6 +362,7 @@ (defun debugger-setup-buffer (args) (if (eq (car args) 'debug) 3 1) (backtrace-frames 'debug))) (print-escape-newlines t) + (print-escape-control-characters t) (print-level 8) (print-length 50)) (when (eq (car args) 'exit) diff --git a/lisp/subr.el b/lisp/subr.el index 8d5d2a779c..c8036665db 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -4513,7 +4513,8 @@ (defun backtrace--print-frame (evald func args flags) (defun backtrace () "Print a trace of Lisp function calls currently active. Output stream used is value of `standard-output'." - (let ((print-level (or print-level 8))) + (let ((print-level (or print-level 8)) + (print-escape-control-characters t)) (mapbacktrace #'backtrace--print-frame 'backtrace))) (defun backtrace-frames (&optional base) diff --git a/src/print.c b/src/print.c index 49408bbeb4..dd95507624 100644 --- a/src/print.c +++ b/src/print.c @@ -1839,21 +1839,36 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag) } else { + bool still_need_nonhex = false; /* If we just had a hex escape, and this character could be taken as part of it, output `\ ' to prevent that. */ - if (need_nonhex && c_isxdigit (c)) - print_c_string ("\\ ", printcharfun); - - if (c == '\n' && print_escape_newlines - ? (c = 'n', true) - : c == '\f' && print_escape_newlines - ? (c = 'f', true) - : c == '\"' || c == '\\') - printchar ('\\', printcharfun); - - printchar (c, printcharfun); - need_nonhex = false; + if (c_isxdigit (c)) + { + if (need_nonhex) + print_c_string ("\\ ", printcharfun); + printchar (c, printcharfun); + } + else if (c == '\n' && print_escape_newlines + ? (c = 'n', true) + : c == '\f' && print_escape_newlines + ? (c = 'f', true) + : c == '\0' && print_escape_control_characters + ? (c = '0', still_need_nonhex = true) + : c == '\"' || c == '\\') + { + printchar ('\\', printcharfun); + printchar (c, printcharfun); + } + else if (print_escape_control_characters && c_iscntrl (c)) + { + char outbuf[1 + 3 + 1]; + int len = sprintf (outbuf, "\\%03o", c + 0u); + strout (outbuf, len, len, printcharfun); + } + else + printchar (c, printcharfun); + need_nonhex = still_need_nonhex; } } printchar ('\"', printcharfun); @@ -2298,6 +2313,11 @@ syms_of_print (void) Also print formfeeds as `\\f'. */); print_escape_newlines = 0; + DEFVAR_BOOL ("print-escape-control-characters", print_escape_control_characters, + doc: /* Non-nil means print control characters in strings as `\\OOO'. +\(OOO is the octal representation of the character code.)*/); + print_escape_control_characters = 0; + DEFVAR_BOOL ("print-escape-nonascii", print_escape_nonascii, doc: /* Non-nil means print unibyte non-ASCII chars in strings as \\OOO. \(OOO is the octal representation of the character code.) @@ -2387,6 +2407,7 @@ representation) and `#N#' in place of each subsequent occurrence, DEFSYM (Qprint_escape_newlines, "print-escape-newlines"); DEFSYM (Qprint_escape_multibyte, "print-escape-multibyte"); DEFSYM (Qprint_escape_nonascii, "print-escape-nonascii"); + DEFSYM (Qprint_escape_control_characters, "print-escape-control-characters"); print_prune_charset_plist = Qnil; staticpro (&print_prune_charset_plist); -- 2.11.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v2-0004-Hide-byte-code-in-backtraces-Bug-6991.patch Content-Description: patch >From e5499ea5fdb3b4aad76b4d38f4d657b034778711 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 19:00:19 -0500 Subject: [PATCH v2 4/6] Hide byte code in backtraces (Bug#6991) * lisp/emacs-lisp/cl-print.el: Autoload `disassemble-1'. (cl-print-compiled-button): New variable. (help-byte-code): New button type, calls `disassemble' in its action. (cl-print-object): Use it if `cl-print-compiled-button' is non-nil. (debugger-insert-backtrace): Use `cl-print' with `cl-print-compiled-button' let-bound to t. * lisp/emacs-lisp/cl-print.el --- lisp/emacs-lisp/cl-print.el | 33 +++++++++++++++++++++++++++++---- lisp/emacs-lisp/debug.el | 11 ++++++++--- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/lisp/emacs-lisp/cl-print.el b/lisp/emacs-lisp/cl-print.el index 65c86d2b65..44c6a4312d 100644 --- a/lisp/emacs-lisp/cl-print.el +++ b/lisp/emacs-lisp/cl-print.el @@ -33,6 +33,8 @@ ;;; Code: +(require 'button) + (defvar cl-print-readably nil "If non-nil, try and make sure the result can be `read'.") @@ -74,13 +76,27 @@ (cl-defmethod cl-print-object ((object vector) stream) (cl-print-object (aref object i) stream)) (princ "]" stream)) +(define-button-type 'help-byte-code + 'follow-link t + 'action (lambda (button) + (disassemble (button-get button 'byte-code-function))) + 'help-echo (purecopy "mouse-2, RET: disassemble this function")) + (defvar cl-print-compiled nil "Control how to print byte-compiled functions. Can be: - `static' to print the vector of constants. - `disassemble' to print the disassembly of the code. - nil to skip printing any details about the code.") +(defvar cl-print-compiled-button nil + "Control how to print byte-compiled functions into buffers. +When the stream is a buffer, make the bytecode part of the output +into a button whose action shows the function's disassembly.") + +(autoload 'disassemble-1 "disass") + (cl-defmethod cl-print-object ((object compiled-function) stream) + (unless stream (setq stream standard-output)) ;; We use "#f(...)" rather than "#<...>" so that pp.el gives better results. (princ "#f(compiled-function " stream) (let ((args (help-function-arglist object 'preserve-names))) @@ -108,10 +124,19 @@ (cl-defmethod cl-print-object ((object compiled-function) stream) (disassemble-1 object 0) (buffer-string)) stream) - (princ " #" stream) - (when (eq cl-print-compiled 'static) - (princ " " stream) - (cl-print-object (aref object 2) stream))) + (princ " " stream) + (let ((button-start (and cl-print-compiled-button + (bufferp stream) + (with-current-buffer stream (point))))) + (princ "#" stream) + (when (eq cl-print-compiled 'static) + (princ " " stream) + (cl-print-object (aref object 2) stream)) + (when button-start + (with-current-buffer stream + (make-text-button button-start (point) + :type 'help-byte-code + 'byte-code-function object))))) (princ ")" stream)) ;; This belongs in nadvice.el, of course, but some load-ordering issues make it diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index effe7f0cb3..83c206e163 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -265,10 +265,15 @@ (defun debug (&rest args) debugger-value))) +(defvar cl-print-compiled) +(defvar cl-print-compiled-button) + (defun debugger-insert-backtrace (frames do-xrefs) "Format and insert the backtrace FRAMES at point. Make functions into cross-reference buttons if DO-XREFS is non-nil." (let ((standard-output (current-buffer)) + (cl-print-compiled nil) + (cl-print-compiled-button t) (eval-buffers eval-buffer-list)) (require 'help-mode) ; Define `help-function-def' button type. (pcase-dolist (`(,evald ,fun ,args ,flags) frames) @@ -278,10 +283,10 @@ (defun debugger-insert-backtrace (frames do-xrefs) (fun-pt (point))) (cond ((and evald (not debugger-stack-frame-as-list)) - (prin1 fun) - (if args (prin1 args) (princ "()"))) + (cl-prin1 fun) + (if args (cl-prin1 args) (princ "()"))) (t - (prin1 (cons fun args)) + (cl-prin1 (cons fun args)) (cl-incf fun-pt))) (when fun-file (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) -- 2.11.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v2-0005-Escape-NUL-bytes-in-X-selections-Bug-6991.patch Content-Description: patch >From 57e94182464e6d6fec3e0f7dccdda8a45abf38df Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 19:47:55 -0500 Subject: [PATCH v2 5/6] Escape NUL bytes in X selections (Bug#6991) * lisp/select.el (xselect--encode-string): Replace NUL bytes with "\0". --- lisp/select.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lisp/select.el b/lisp/select.el index 4849d7d515..579c5c7e2e 100644 --- a/lisp/select.el +++ b/lisp/select.el @@ -475,6 +475,9 @@ (defun xselect--encode-string (type str &optional can-modify) (t (error "Unknown selection type: %S" type))))) + ;; Most programs are unable to handle NUL bytes in strings. + (setq str (replace-regexp-in-string "\0" "\\0" str t t)) + (setq next-selection-coding-system nil) (cons type str)))) -- 2.11.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v2-0006-Don-t-redundantly-cl-print-arglist-in-function-do.patch Content-Description: patch >From 2ad16d82d8d5e521b646c2ca53a047e30b05c1c8 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 27 May 2017 22:40:46 -0400 Subject: [PATCH v2 6/6] Don't redundantly cl-print arglist in function docstring again * lisp/emacs-lisp/cl-print.el (cl-print-object): Don't print arglist part of docstring. --- lisp/emacs-lisp/cl-print.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lisp/emacs-lisp/cl-print.el b/lisp/emacs-lisp/cl-print.el index 44c6a4312d..3958ee80a3 100644 --- a/lisp/emacs-lisp/cl-print.el +++ b/lisp/emacs-lisp/cl-print.el @@ -103,10 +103,10 @@ (cl-defmethod cl-print-object ((object compiled-function) stream) (if args (prin1 args stream) (princ "()" stream))) - (let ((doc (documentation object 'raw))) - (when doc - (princ " " stream) - (prin1 doc stream))) + (pcase (help-split-fundoc (documentation object 'raw) object) + (`(,_ . ,(and doc (guard (stringp doc)))) + (princ " " stream) + (prin1 doc stream))) (let ((inter (interactive-form object))) (when inter (princ " " stream) -- 2.11.1 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Sat Jun 24 18:26:19 2017 Received: (at 6991) by debbugs.gnu.org; 24 Jun 2017 22:26:19 +0000 Received: from localhost ([127.0.0.1]:36067 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dOtVS-0006IW-Do for submit@debbugs.gnu.org; Sat, 24 Jun 2017 18:26:19 -0400 Received: from mail-it0-f66.google.com ([209.85.214.66]:34715) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dOtVQ-0006II-5U for 6991@debbugs.gnu.org; Sat, 24 Jun 2017 18:26:17 -0400 Received: by mail-it0-f66.google.com with SMTP id y134so10528017itc.1 for <6991@debbugs.gnu.org>; Sat, 24 Jun 2017 15:26:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=IXlsJVPV36pGabWuMDWZxkWap+Kc/ZkRs9W3an6P1JQ=; b=TxFcMUSghwQGSv9tK07ld7GpZYta/zNkmxIm9YYf7/my1xdOssbsA7EUMlhYXIWVZ+ 5PVogeuYIfDXt/ko6cX5N4QArrXXd6iUYhrjju3FxEB2AvKQX2zZnzowokKea9zJ283V Hn/A1uZE39wMEUFLMZk2A0KImaHnjTSNPrnYzrFoD7ij5u7gzkCaE5UGGQU+6Yr5x68N SELp0KSJH9I2nGQCwfzMr1ZQi/PUz7BEJMtHsZEsMxRx61BInr1dxRVgIJHWNH2RTd1b ohECEXXs3AnGEnvrR4sld7iHVr1+F/N26cTrNnvvdlVwrTzyXmtJVMvxcSZmWDs+UkY5 29lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=IXlsJVPV36pGabWuMDWZxkWap+Kc/ZkRs9W3an6P1JQ=; b=CfaM3fVcUvgANhkL5PuwJDVYze8RJ1G8ybjeU8r8QsRtFdeSDRmAbQwAH/Aaww/RGY 8TmZl/PVo0vj3pGToP9qwQ2oNXAOLlt8d2Vym8ZSPv5MIbmD9NdiGleP9JFcM5qru6/H R4iHU8WXrJEndf1VCUz5HViwetDK55jbedRkprcLnklhqFHR3y5DkD/mvvxqELezPkby i9kUqzogAFfw/d1NM7QGQfXLTSPkKX7Df29BIjYqg15t6aQZuQhmF/mVkgn+G+RdDQD5 reiKaS1Z3xsCjjqFAA+K1iOSUivlmLPqa1k9/1+jLyHlTNMRLrh0xADOuFGVW8PaNgHc 06qA== X-Gm-Message-State: AKS2vOxl96/XDVaqLaV/urp+p6trEsLNJf3qUN6MvMovZXSTdrz6liIb lRy7Ui9V5qEOBw== X-Received: by 10.36.48.146 with SMTP id q140mr15085534itq.59.1498343170633; Sat, 24 Jun 2017 15:26:10 -0700 (PDT) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id b62sm5398506itd.2.2017.06.24.15.26.08 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 24 Jun 2017 15:26:09 -0700 (PDT) From: npostavs@users.sourceforge.net To: Stefan Monnier Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87vb5ct1lz.fsf@gnus.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> <87wpcwkuug.fsf@users.sourceforge.net> <87zidx3u5u.fsf@users.sourceforge.net> Date: Sat, 24 Jun 2017 18:27:46 -0400 In-Reply-To: <87zidx3u5u.fsf@users.sourceforge.net> (npostavs@users.sourceforge.net's message of "Sun, 28 May 2017 10:58:21 -0400") Message-ID: <87o9tdowbh.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.7 (/) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.7 (/) --=-=-= Content-Type: text/plain npostavs@users.sourceforge.net writes: > npostavs@users.sourceforge.net writes: > >> I propose adding a new flag print_escape_control_characters instead (see >> patch #3 in the series). I also implemented hiding the byte code >> functions with text properties in #4. It's not quite satisfactory >> though, because it doesn't cover byte code functions values that are >> arguments, only byte code being called. I think printing needs to be >> made more flexible in order to cleanly catch all byte code values. >> Patch #5 replaces NUL bytes with "\0" in X selections (I guess it covers >> w32 as well? Haven't checked yet). > > Updated the patchset to use cl-prin1, now it applies to function values > in arguments as well. This one actually doesn't include the byte code > text at all (path of least resistance: cl-print-object wasn't already > omitting bytecode and I haven't bothered adding it). I made use of cl-prin1 depend on a custom option, and replace NUL bytes also in w32. I think this is ready to merge now, I will probably do so sometime next week. --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v3-0001-Operate-on-frame-list-instead-of-printed-backtrac.patch Content-Description: patch >From c3aaaccb31bf926ce08cb0dc17b36ffc01ce7e7d Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 09:19:00 -0500 Subject: [PATCH v3 1/6] Operate on frame list instead of printed backtrace * lisp/emacs-lisp/debug.el (debugger--insert-backtrace): New function, prints the given backtrace frames. (debugger-setup-buffer): Use it instead of editing the backtrace buffer text. --- lisp/emacs-lisp/debug.el | 84 +++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 83456fc31a..0c8306d428 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -264,6 +264,40 @@ (defun debug (&rest args) (setq debug-on-next-call debugger-step-after-exit) debugger-value))) + +(defun debugger-insert-backtrace (frames do-xrefs) + "Format and insert the backtrace FRAMES at point. +Make functions into cross-reference buttons if DO-XREFS is non-nil." + (let ((standard-output (current-buffer)) + (eval-buffers eval-buffer-list)) + (require 'help-mode) ; Define `help-function-def' button type. + (pcase-dolist (`(,evald ,fun ,args ,flags) frames) + (insert (if (plist-get flags :debug-on-exit) + "* " " ")) + (let ((fun-file (and do-xrefs (symbol-file fun 'defun))) + (fun-pt (point))) + (cond + ((and evald (not debugger-stack-frame-as-list)) + (prin1 fun) + (if args (prin1 args) (princ "()"))) + (t + (prin1 (cons fun args)) + (cl-incf fun-pt))) + (when fun-file + (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) + :type 'help-function-def + 'help-args (list fun fun-file)))) + ;; After any frame that uses eval-buffer, insert a line that + ;; states the buffer position it's reading at. + (when (and eval-buffers (memq fun '(eval-buffer eval-region))) + (insert (format " ; Reading at buffer position %d" + ;; This will get the wrong result if there are + ;; two nested eval-region calls for the same + ;; buffer. That's not a very useful case. + (with-current-buffer (pop eval-buffers) + (point))))) + (insert "\n")))) + (defun debugger-setup-buffer (args) "Initialize the `*Backtrace*' buffer for entry to the debugger. That buffer should be current already." @@ -271,22 +305,6 @@ (defun debugger-setup-buffer (args) (erase-buffer) (set-buffer-multibyte t) ;Why was it nil ? -stef (setq buffer-undo-list t) - (let ((standard-output (current-buffer)) - (print-escape-newlines t) - (print-level 8) - (print-length 50)) - ;; FIXME the debugger could pass a custom callback to mapbacktrace - ;; instead of manipulating printed results. - (mapbacktrace #'backtrace--print-frame 'debug)) - (goto-char (point-min)) - (delete-region (point) - (progn - (forward-line (if (eq (car args) 'debug) - ;; Remove debug--implement-debug-on-entry - ;; and the advice's `apply' frame. - 3 - 1)) - (point))) (insert "Debugger entered") ;; lambda is for debug-on-call when a function call is next. ;; debug is for debug-on-entry function called. @@ -301,10 +319,7 @@ (defun debugger-setup-buffer (args) (setq pos (point)) (setq debugger-value (nth 1 args)) (prin1 debugger-value (current-buffer)) - (insert ?\n) - (delete-char 1) - (insert ? ) - (beginning-of-line)) + (insert ?\n)) ;; Watchpoint triggered. ((and `watchpoint (let `(,symbol ,newval . ,details) (cdr args))) (insert @@ -341,23 +356,20 @@ (defun debugger-setup-buffer (args) (cdr args) args) (current-buffer)) (insert ?\n))) + (let ((frames (nthcdr + ;; Remove debug--implement-debug-on-entry and the + ;; advice's `apply' frame. + (if (eq (car args) 'debug) 3 1) + (backtrace-frames 'debug))) + (print-escape-newlines t) + (print-level 8) + (print-length 50)) + (when (eq (car args) 'exit) + (setf (cl-getf (nth 3 (car frames)) :debug-on-exit) nil)) + (debugger-insert-backtrace frames t)) ;; Place point on "stack frame 0" (bug#15101). - (goto-char pos)) - ;; After any frame that uses eval-buffer, - ;; insert a line that states the buffer position it's reading at. - (save-excursion - (let ((tem eval-buffer-list)) - (while (and tem - (re-search-forward "^ eval-\\(buffer\\|region\\)(" nil t)) - (end-of-line) - (insert (format " ; Reading at buffer position %d" - ;; This will get the wrong result - ;; if there are two nested eval-region calls - ;; for the same buffer. That's not a very useful case. - (with-current-buffer (car tem) - (point)))) - (pop tem)))) - (debugger-make-xrefs)) + (goto-char pos))) + (defun debugger-make-xrefs (&optional buffer) "Attach cross-references to function names in the `*Backtrace*' buffer." -- 2.11.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v3-0002-Improve-ert-backtrace-recording.patch Content-Description: patch >From aae0b062d707ec490b909b0dec4017483b630dc3 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 17:19:41 -0500 Subject: [PATCH v3 2/6] Improve ert backtrace recording Change ert to use the new `backtrace-frames' function instead of collecting frames one by one with `backtrace-frame'. Additionally, collect frames starting from `signal' instead the somewhat arbitrary "6 from the bottom". Skipping 6 frames would skip the expression that actually caused the signal that triggered the debugger. Possibly 6 was chosen because in the case of a failed test, the triggering frame is an `ert-fail' call, which is not so interesting. But in case of test throwing an error, this drop the `error' call which is too much. * lisp/emacs-lisp/ert.el (ert--print-backtrace): Remove. (ert--print-backtrace): Add DO-XREFS parameter, delegate to `debugger-insert-backtrace'. (ert--run-test-debugger): Record the backtrace frames starting from the instigating `signal' call. (ert-run-tests-batch): Pass nil for `ert--print-backtrace's new DO-XREFS parameter. (ert-results-pop-to-backtrace-for-test-at-point): Pass t as DO-XREFS to `ert--print-backtrace' and remove call to `debugger-make-xrefs'. * test/lisp/emacs-lisp/ert-tests.el (ert-test-record-backtrace): Check the backtrace list instead of comparing its string representation. Expect `signal' to be the first frame. --- lisp/emacs-lisp/ert.el | 62 ++++++++++++--------------------------- test/lisp/emacs-lisp/ert-tests.el | 8 ++--- 2 files changed, 21 insertions(+), 49 deletions(-) diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el index 2c49a634e3..402798603a 100644 --- a/lisp/emacs-lisp/ert.el +++ b/lisp/emacs-lisp/ert.el @@ -670,48 +670,12 @@ (cl-defstruct (ert-test-skipped (:include ert-test-result-with-condition))) (cl-defstruct (ert-test-aborted-with-non-local-exit (:include ert-test-result))) - -(defun ert--record-backtrace () - "Record the current backtrace (as a list) and return it." - ;; Since the backtrace is stored in the result object, result - ;; objects must only be printed with appropriate limits - ;; (`print-level' and `print-length') in place. For interactive - ;; use, the cost of ensuring this possibly outweighs the advantage - ;; of storing the backtrace for - ;; `ert-results-pop-to-backtrace-for-test-at-point' given that we - ;; already have `ert-results-rerun-test-debugging-errors-at-point'. - ;; For batch use, however, printing the backtrace may be useful. - (cl-loop - ;; 6 is the number of frames our own debugger adds (when - ;; compiled; more when interpreted). FIXME: Need to describe a - ;; procedure for determining this constant. - for i from 6 - for frame = (backtrace-frame i) - while frame - collect frame)) - -(defun ert--print-backtrace (backtrace) +(defun ert--print-backtrace (backtrace do-xrefs) "Format the backtrace BACKTRACE to the current buffer." - ;; This is essentially a reimplementation of Fbacktrace - ;; (src/eval.c), but for a saved backtrace, not the current one. (let ((print-escape-newlines t) (print-level 8) (print-length 50)) - (dolist (frame backtrace) - (pcase-exhaustive frame - (`(nil ,special-operator . ,arg-forms) - ;; Special operator. - (insert - (format " %S\n" (cons special-operator arg-forms)))) - (`(t ,fn . ,args) - ;; Function call. - (insert (format " %S(" fn)) - (cl-loop for firstp = t then nil - for arg in args do - (unless firstp - (insert " ")) - (insert (format "%S" arg))) - (insert ")\n")))))) + (debugger-insert-backtrace backtrace do-xrefs))) ;; A container for the state of the execution of a single test and ;; environment data needed during its execution. @@ -750,7 +714,19 @@ (defun ert--run-test-debugger (info args) ((quit) 'quit) ((ert-test-skipped) 'skipped) (otherwise 'failed))) - (backtrace (ert--record-backtrace)) + ;; We store the backtrace in the result object for + ;; `ert-results-pop-to-backtrace-for-test-at-point'. + ;; This means we have to limit `print-level' and + ;; `print-length' when printing result objects. That + ;; might not be worth while when we can also use + ;; `ert-results-rerun-test-debugging-errors-at-point', + ;; (i.e., when running interactively) but having the + ;; backtrace ready for printing is important for batch + ;; use. + ;; + ;; Grab the frames starting from `signal', frames below + ;; that are all from the debugger. + (backtrace (backtrace-frames 'signal)) (infos (reverse ert--infos))) (setf (ert--test-execution-info-result info) (cl-ecase type @@ -1409,8 +1385,9 @@ (defun ert-run-tests-batch (&optional selector) (ert-test-result-with-condition (message "Test %S backtrace:" (ert-test-name test)) (with-temp-buffer - (ert--print-backtrace (ert-test-result-with-condition-backtrace - result)) + (ert--print-backtrace + (ert-test-result-with-condition-backtrace result) + nil) (goto-char (point-min)) (while (not (eobp)) (let ((start (point)) @@ -2420,8 +2397,7 @@ (defun ert-results-pop-to-backtrace-for-test-at-point () ;; Use unibyte because `debugger-setup-buffer' also does so. (set-buffer-multibyte nil) (setq truncate-lines t) - (ert--print-backtrace backtrace) - (debugger-make-xrefs) + (ert--print-backtrace backtrace t) (goto-char (point-min)) (insert (substitute-command-keys "Backtrace for test `")) (ert-insert-test-name-button (ert-test-name test)) diff --git a/test/lisp/emacs-lisp/ert-tests.el b/test/lisp/emacs-lisp/ert-tests.el index fc5790c365..317838b250 100644 --- a/test/lisp/emacs-lisp/ert-tests.el +++ b/test/lisp/emacs-lisp/ert-tests.el @@ -367,12 +367,8 @@ (ert-deftest ert-test-record-backtrace () (test (make-ert-test :body test-body)) (result (ert-run-test test))) (should (ert-test-failed-p result)) - (with-temp-buffer - (ert--print-backtrace (ert-test-failed-backtrace result)) - (goto-char (point-min)) - (end-of-line) - (let ((first-line (buffer-substring-no-properties (point-min) (point)))) - (should (equal first-line (format " %S()" test-body))))))) + (should (eq (nth 1 (car (ert-test-failed-backtrace result))) + 'signal)))) (ert-deftest ert-test-messages () :tags '(:causes-redisplay) -- 2.11.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v3-0003-Escape-control-characters-in-backtraces-Bug-6991.patch Content-Description: patch >From ff73e5a06cb943dcb58ee24213e82316b8594061 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 18:13:54 -0500 Subject: [PATCH v3 3/6] Escape control characters in backtraces (Bug#6991) * src/print.c (syms_of_print): Add new variable, print-escape-control-characters. (print_object): Print control characters with octal escape codes when print-escape-control-characters is true. * lisp/subr.el (backtrace): * lisp/emacs-lisp/debug.el (debugger-setup-buffer): Bind `print-escape-control-characters' to t. --- lisp/emacs-lisp/debug.el | 1 + lisp/subr.el | 3 ++- src/print.c | 45 +++++++++++++++++++++++++++++++++------------ 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 0c8306d428..effe7f0cb3 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -362,6 +362,7 @@ (defun debugger-setup-buffer (args) (if (eq (car args) 'debug) 3 1) (backtrace-frames 'debug))) (print-escape-newlines t) + (print-escape-control-characters t) (print-level 8) (print-length 50)) (when (eq (car args) 'exit) diff --git a/lisp/subr.el b/lisp/subr.el index ef00286b34..76c13a8d23 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -4513,7 +4513,8 @@ (defun backtrace--print-frame (evald func args flags) (defun backtrace () "Print a trace of Lisp function calls currently active. Output stream used is value of `standard-output'." - (let ((print-level (or print-level 8))) + (let ((print-level (or print-level 8)) + (print-escape-control-characters t)) (mapbacktrace #'backtrace--print-frame 'backtrace))) (defun backtrace-frames (&optional base) diff --git a/src/print.c b/src/print.c index 6bf8af9ef9..50c75d7712 100644 --- a/src/print.c +++ b/src/print.c @@ -1870,21 +1870,36 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag) } else { + bool still_need_nonhex = false; /* If we just had a hex escape, and this character could be taken as part of it, output `\ ' to prevent that. */ - if (need_nonhex && c_isxdigit (c)) - print_c_string ("\\ ", printcharfun); - - if (c == '\n' && print_escape_newlines - ? (c = 'n', true) - : c == '\f' && print_escape_newlines - ? (c = 'f', true) - : c == '\"' || c == '\\') - printchar ('\\', printcharfun); - - printchar (c, printcharfun); - need_nonhex = false; + if (c_isxdigit (c)) + { + if (need_nonhex) + print_c_string ("\\ ", printcharfun); + printchar (c, printcharfun); + } + else if (c == '\n' && print_escape_newlines + ? (c = 'n', true) + : c == '\f' && print_escape_newlines + ? (c = 'f', true) + : c == '\0' && print_escape_control_characters + ? (c = '0', still_need_nonhex = true) + : c == '\"' || c == '\\') + { + printchar ('\\', printcharfun); + printchar (c, printcharfun); + } + else if (print_escape_control_characters && c_iscntrl (c)) + { + char outbuf[1 + 3 + 1]; + int len = sprintf (outbuf, "\\%03o", c + 0u); + strout (outbuf, len, len, printcharfun); + } + else + printchar (c, printcharfun); + need_nonhex = still_need_nonhex; } } printchar ('\"', printcharfun); @@ -2329,6 +2344,11 @@ syms_of_print (void) Also print formfeeds as `\\f'. */); print_escape_newlines = 0; + DEFVAR_BOOL ("print-escape-control-characters", print_escape_control_characters, + doc: /* Non-nil means print control characters in strings as `\\OOO'. +\(OOO is the octal representation of the character code.)*/); + print_escape_control_characters = 0; + DEFVAR_BOOL ("print-escape-nonascii", print_escape_nonascii, doc: /* Non-nil means print unibyte non-ASCII chars in strings as \\OOO. \(OOO is the octal representation of the character code.) @@ -2418,6 +2438,7 @@ representation) and `#N#' in place of each subsequent occurrence, DEFSYM (Qprint_escape_newlines, "print-escape-newlines"); DEFSYM (Qprint_escape_multibyte, "print-escape-multibyte"); DEFSYM (Qprint_escape_nonascii, "print-escape-nonascii"); + DEFSYM (Qprint_escape_control_characters, "print-escape-control-characters"); print_prune_charset_plist = Qnil; staticpro (&print_prune_charset_plist); -- 2.11.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v3-0004-Don-t-redundantly-cl-print-arglist-in-function-do.patch Content-Description: patch >From 1a6b3342b1f2f401bb1c9e5bcf14a66ae2d7c472 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 27 May 2017 22:40:46 -0400 Subject: [PATCH v3 4/6] Don't redundantly cl-print arglist in function docstring again * lisp/emacs-lisp/cl-print.el (cl-print-object): Don't print arglist part of docstring. * test/lisp/emacs-lisp/cl-print-tests.el (cl-print-tests-1): Update test accordingly. --- lisp/emacs-lisp/cl-print.el | 8 ++++---- test/lisp/emacs-lisp/cl-print-tests.el | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lisp/emacs-lisp/cl-print.el b/lisp/emacs-lisp/cl-print.el index 89a71d1b6c..6703fc99e2 100644 --- a/lisp/emacs-lisp/cl-print.el +++ b/lisp/emacs-lisp/cl-print.el @@ -105,10 +105,10 @@ (cl-defmethod cl-print-object ((object compiled-function) stream) (if args (prin1 args stream) (princ "()" stream))) - (let ((doc (documentation object 'raw))) - (when doc - (princ " " stream) - (prin1 doc stream))) + (pcase (help-split-fundoc (documentation object 'raw) object) + (`(,_ . ,(and doc (guard (stringp doc)))) + (princ " " stream) + (prin1 doc stream))) (let ((inter (interactive-form object))) (when inter (princ " " stream) diff --git a/test/lisp/emacs-lisp/cl-print-tests.el b/test/lisp/emacs-lisp/cl-print-tests.el index dfbe18d784..6448a1b37f 100644 --- a/test/lisp/emacs-lisp/cl-print-tests.el +++ b/test/lisp/emacs-lisp/cl-print-tests.el @@ -34,7 +34,7 @@ (ert-deftest cl-print-tests-1 () (let ((print-circle t)) (should (equal (cl-prin1-to-string `((x . ,x) (y . ,x))) "((x . #1=#s(cl-print--test :a 1 :b 2)) (y . #1#))"))) - (should (string-match "\\`#f(compiled-function (x) .*\n\n.*)\\'" + (should (string-match "\\`#f(compiled-function (x) \"[^\"]+\" [^\)]*)\\'" (cl-prin1-to-string (symbol-function #'caar)))))) (ert-deftest cl-print-tests-2 () -- 2.11.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v3-0005-Hide-byte-code-in-backtraces-Bug-6991.patch Content-Description: patch >From f6f929626abfff951dcf66d8014a7664a8e4f8c9 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sun, 11 Jun 2017 09:51:38 -0400 Subject: [PATCH v3 5/6] Hide byte code in backtraces (Bug#6991) * lisp/emacs-lisp/debug.el (debugger-print-function): New defcustom, defaulting to `cl-print'. (debugger-insert-backtrace): Use it. * etc/NEWS: Announce it. --- etc/NEWS | 5 +++++ lisp/emacs-lisp/debug.el | 17 ++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 3bbcaef3f4..5c5575d8d7 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -320,6 +320,11 @@ questions, with a handy way to display help texts. all call stack frames in a Lisp backtrace buffer as lists. Both debug.el and edebug.el have been updated to heed to this variable. +--- +** Values in call stack frames are now displayed using 'cl-prin1'. +The old behaviour of using 'prin1' can be restored by customizing the +new option 'debugger-print-function'. + +++ ** The new variable 'x-ctrl-keysym' has been added to the existing roster of X keysyms. It can be used in combination with another diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index effe7f0cb3..e5445416dc 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -49,6 +49,13 @@ (defcustom debugger-batch-max-lines 40 :group 'debugger :version "21.1") +(defcustom debugger-print-function #'cl-prin1 + "Function used to print values in the debugger backtraces." + :type 'function + :options '(cl-prin1 prin1) + :group 'debugger + :version "26.1") + (defcustom debugger-bury-or-kill 'bury "What to do with the debugger buffer when exiting `debug'. The value affects the behavior of operations on any window @@ -265,10 +272,14 @@ (defun debug (&rest args) debugger-value))) +(defvar cl-print-compiled) +(defvar cl-print-compiled-button) + (defun debugger-insert-backtrace (frames do-xrefs) "Format and insert the backtrace FRAMES at point. Make functions into cross-reference buttons if DO-XREFS is non-nil." (let ((standard-output (current-buffer)) + (cl-print-compiled-button t) (eval-buffers eval-buffer-list)) (require 'help-mode) ; Define `help-function-def' button type. (pcase-dolist (`(,evald ,fun ,args ,flags) frames) @@ -278,10 +289,10 @@ (defun debugger-insert-backtrace (frames do-xrefs) (fun-pt (point))) (cond ((and evald (not debugger-stack-frame-as-list)) - (prin1 fun) - (if args (prin1 args) (princ "()"))) + (funcall debugger-print-function fun) + (if args (cl-prin1 args) (princ "()"))) (t - (prin1 (cons fun args)) + (funcall debugger-print-function (cons fun args)) (cl-incf fun-pt))) (when fun-file (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) -- 2.11.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=v3-0006-Escape-NUL-bytes-in-X-selections-Bug-6991.patch Content-Description: patch >From ad896373f17c52806638fcf12a5bb6a86b390f45 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 19:47:55 -0500 Subject: [PATCH v3 6/6] Escape NUL bytes in X selections (Bug#6991) * lisp/term/w32-win.el (w32--set-selection): * lisp/select.el (xselect--encode-string): Replace NUL bytes with "\0". * doc/emacs/killing.texi: Document new behavior. * etc/NEWS (times): Announce it. --- doc/emacs/killing.texi | 4 ++++ etc/NEWS | 4 ++++ lisp/select.el | 3 +++ lisp/term/w32-win.el | 2 +- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/emacs/killing.texi b/doc/emacs/killing.texi index 47de053129..0b5efd04a1 100644 --- a/doc/emacs/killing.texi +++ b/doc/emacs/killing.texi @@ -519,6 +519,10 @@ Clipboard data to the clipboard manager, change the variable @code{x-select-enable-clipboard-manager} to @code{nil}. + Since strings containing NUL bytes are usually truncated when passed +through the clipboard, Emacs replaces such characters with ``\0'' +before transfering them to the system's clipboard. + @vindex select-enable-primary @findex clipboard-kill-region @findex clipboard-kill-ring-save diff --git a/etc/NEWS b/etc/NEWS index 5c5575d8d7..61efba702c 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -326,6 +326,10 @@ The old behaviour of using 'prin1' can be restored by customizing the new option 'debugger-print-function'. +++ +** NUL bytes in strings copied to the system clipboard are now +replaced with "\0". + ++++ ** The new variable 'x-ctrl-keysym' has been added to the existing roster of X keysyms. It can be used in combination with another variable of this kind to swap modifiers in Emacs. diff --git a/lisp/select.el b/lisp/select.el index 4849d7d515..579c5c7e2e 100644 --- a/lisp/select.el +++ b/lisp/select.el @@ -475,6 +475,9 @@ (defun xselect--encode-string (type str &optional can-modify) (t (error "Unknown selection type: %S" type))))) + ;; Most programs are unable to handle NUL bytes in strings. + (setq str (replace-regexp-in-string "\0" "\\0" str t t)) + (setq next-selection-coding-system nil) (cons type str)))) diff --git a/lisp/term/w32-win.el b/lisp/term/w32-win.el index fda93884c4..be895a040d 100644 --- a/lisp/term/w32-win.el +++ b/lisp/term/w32-win.el @@ -396,7 +396,7 @@ (declare-function w32-selection-exists-p "w32select.c") ;;; Fix interface to (X-specific) mouse.el (defun w32--set-selection (type value) (if (eq type 'CLIPBOARD) - (w32-set-clipboard-data value) + (w32-set-clipboard-data (replace-regexp-in-string "\0" "\\0" value t t)) (put 'x-selections (or type 'PRIMARY) value))) (defun w32--get-selection (&optional type data-type) -- 2.11.1 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Sun Jun 25 15:11:13 2017 Received: (at 6991) by debbugs.gnu.org; 25 Jun 2017 19:11:13 +0000 Received: from localhost ([127.0.0.1]:37617 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPCwD-0002Mc-FQ for submit@debbugs.gnu.org; Sun, 25 Jun 2017 15:11:13 -0400 Received: from pruche.dit.umontreal.ca ([132.204.246.22]:56011) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPCwA-0002MT-Sv for 6991@debbugs.gnu.org; Sun, 25 Jun 2017 15:11:12 -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 v5PJB3UH030293; Sun, 25 Jun 2017 15:11:04 -0400 Received: by ceviche.home (Postfix, from userid 20848) id C0BAD662E4; Sun, 25 Jun 2017 15:11:02 -0400 (EDT) From: Stefan Monnier To: npostavs@users.sourceforge.net Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers Message-ID: References: <8739tm9vzl.fsf@jidanni.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> <87wpcwkuug.fsf@users.sourceforge.net> <87zidx3u5u.fsf@users.sourceforge.net> <87o9tdowbh.fsf@users.sourceforge.net> Date: Sun, 25 Jun 2017 15:11:02 -0400 In-Reply-To: <87o9tdowbh.fsf@users.sourceforge.net> (npostavs's message of "Sat, 24 Jun 2017 18:27:46 -0400") 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, RV6055=0 X-NAI-Spam-Version: 2.3.0.9418 : core <6055> : inlines <5949> : streams <1751486> : uri <2450579> X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.3 (-) > I made use of cl-prin1 depend on a custom option, and replace NUL bytes > also in w32. I think this is ready to merge now, I will probably do so > sometime next week. A few questions below. > + (when fun-file > + (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) > + :type 'help-function-def > + 'help-args (list fun fun-file)))) Hmm... this looks like code which was moved from elsewhere, yet I can't find this elsewhere in your patch(es). I think that other code is in debugger-make-xrefs, so can't we remove debugger-make-xrefs? > + (let ((frames (nthcdr > + ;; Remove debug--implement-debug-on-entry and the > + ;; advice's `apply' frame. > + (if (eq (car args) 'debug) 3 1) > + (backtrace-frames 'debug))) > + (print-escape-newlines t) > + (print-level 8) > + (print-length 50)) Why let-bind print-* here rather than inside debugger-insert-backtrace? > + (when (eq (car args) 'exit) > + (setf (cl-getf (nth 3 (car frames)) :debug-on-exit) nil)) This looks like code which was moved from elsewhere, yet I can't find this elsewhere in your patch(es). What am I missing? > + (pcase (help-split-fundoc (documentation object 'raw) object) > + (`(,_ . ,(and doc (guard (stringp doc)))) > + (princ " " stream) > + (prin1 doc stream))) Maybe this deserves a one-line comment explaining that the arglist part was already printed via help-function-arglist. > +(defcustom debugger-print-function #'cl-prin1 > + "Function used to print values in the debugger backtraces." > + :type 'function > + :options '(cl-prin1 prin1) > + :group 'debugger > + :version "26.1") The `:group 'debugger` is redundant (as is the case for all defcustom in this file). > +(defvar cl-print-compiled) Is this used somewhere? > - (prin1 fun) > - (if args (prin1 args) (princ "()"))) > + (funcall debugger-print-function fun) > + (if args (cl-prin1 args) (princ "()"))) This `cl-prin1` should be replaced with debugger-print-function, right? Stefan From debbugs-submit-bounces@debbugs.gnu.org Sun Jun 25 23:33:31 2017 Received: (at 6991) by debbugs.gnu.org; 26 Jun 2017 03:33:31 +0000 Received: from localhost ([127.0.0.1]:37860 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPKmI-0005T8-F0 for submit@debbugs.gnu.org; Sun, 25 Jun 2017 23:33:31 -0400 Received: from mail-io0-f193.google.com ([209.85.223.193]:34222) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPKmF-0005Ss-IU for 6991@debbugs.gnu.org; Sun, 25 Jun 2017 23:33:28 -0400 Received: by mail-io0-f193.google.com with SMTP id m19so11950453ioe.1 for <6991@debbugs.gnu.org>; Sun, 25 Jun 2017 20:33:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=XqHcrgo+tpj/EGqLeP+JC9LBvUGrCuH19rGZbOcLv5Y=; b=pK+VRBE9vN5KnAtqGLY5x+jxb17AMkYjhbLSTJPsqMKZhaiOyK3P2QzBKHJS/lOfvt 0hhJoOZQ3Qh2wuXbf0lqBwwFtpJ1zoGMNiQmgaVGNaaAx/at3dyONlyD1LPAg0IRtgUr i32J+iUkZ7nKxZTLawwSiHCB/wxWpT2aMoFxwDnhBUCzv2v5tM8LjJMGMWLaoi4IVQ99 jLek9ncYCka35WLdpP73nloLNz0Nsh0Z29yfevq4eNUpGGMvKeD5WgstrAT92QiSso43 07qWBQlWCtkf+3QlrWyBqpgLB0U3yBB3BXHB+/w7pTioFFgjY987tji/S85ILrtzhSeC tZ4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=XqHcrgo+tpj/EGqLeP+JC9LBvUGrCuH19rGZbOcLv5Y=; b=SO3JGAbrEHQyAeE9Q8TR25sKMq62UV723tMFkeegfJYfammrBdrr6vHu85XbM9SdGr Gemk42ojN3JmeKUDNDtJ+179voo1fxNyDRSoS7ZlgDfRzfHOYQUc3UkQuutecWE8Ol1c LHGrvcWwud/cqsnSRLAWlKMUdsROrMAQXDKhJp9gFstfVQzCTiJZI7PCZvLzbiHXa82j vyN8GYDFbJQoTC7WMvSL8u0oM7UxYf07XphZhqeEEESyrS44UniLm8v+VuHmSc726PfR qgcZ+aRvgxhYfPZb+87XtzaWoNzzWSdK4zpaFix6WXmlWyaNzeD+NQs4masZQFBHlw4O 5YEw== X-Gm-Message-State: AKS2vOyWknkcJsOh4Y1spKmDehqa6Y+DrWSAgEjM2WEZlJ4Rm9RMMhDb NiOWxfKG11CNuA== X-Received: by 10.107.169.28 with SMTP id s28mr22807924ioe.1.1498448002007; Sun, 25 Jun 2017 20:33:22 -0700 (PDT) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id r124sm6718629iod.38.2017.06.25.20.33.19 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 25 Jun 2017 20:33:20 -0700 (PDT) From: npostavs@users.sourceforge.net To: Stefan Monnier Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> <87wpcwkuug.fsf@users.sourceforge.net> <87zidx3u5u.fsf@users.sourceforge.net> <87o9tdowbh.fsf@users.sourceforge.net> Date: Sun, 25 Jun 2017 23:34:56 -0400 In-Reply-To: (Stefan Monnier's message of "Sun, 25 Jun 2017 15:11:02 -0400") Message-ID: <87mv8vo1zz.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -2.1 (--) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.1 (--) --=-=-= Content-Type: text/plain Stefan Monnier writes: > >> + (when fun-file >> + (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) >> + :type 'help-function-def >> + 'help-args (list fun fun-file)))) > > Hmm... this looks like code which was moved from elsewhere, yet I can't > find this elsewhere in your patch(es). > I think that other code is in debugger-make-xrefs, so can't we remove > debugger-make-xrefs? I'm not sure exactly what you mean by "looks like code which was moved". It does replace the functionality of debugger-make-xrefs. But `ert--make-xrefs-region' is still using `debugger-make-xrefs', and I don't quite see how to remove that usage. >> + (let ((frames (nthcdr >> + ;; Remove debug--implement-debug-on-entry and the >> + ;; advice's `apply' frame. >> + (if (eq (car args) 'debug) 3 1) >> + (backtrace-frames 'debug))) >> + (print-escape-newlines t) >> + (print-level 8) >> + (print-length 50)) > > Why let-bind print-* here rather than inside debugger-insert-backtrace? I thought moving those inside might needlessly make the function less flexible, though nobody is currently making use of the flexibility so maybe it's not worth it... >> + (when (eq (car args) 'exit) >> + (setf (cl-getf (nth 3 (car frames)) :debug-on-exit) nil)) > > This looks like code which was moved from elsewhere, yet I can't find > this elsewhere in your patch(es). What am I missing? backtrace--print-frame I guess? I haven't changed the printing for `backtrace', perhaps I should... >> + (pcase (help-split-fundoc (documentation object 'raw) object) >> + (`(,_ . ,(and doc (guard (stringp doc)))) >> + (princ " " stream) >> + (prin1 doc stream))) > > Maybe this deserves a one-line comment explaining that the arglist part > was already printed via help-function-arglist. Sure. >> +(defcustom debugger-print-function #'cl-prin1 >> + "Function used to print values in the debugger backtraces." >> + :type 'function >> + :options '(cl-prin1 prin1) >> + :group 'debugger >> + :version "26.1") > > The `:group 'debugger` is redundant (as is the case for all defcustom > in this file). Yeah, I just followed the others, I'll remove it. >> +(defvar cl-print-compiled) > > Is this used somewhere? Oh, I think that's leftover from avoiding Bug#27117. >> - (prin1 fun) >> - (if args (prin1 args) (princ "()"))) >> + (funcall debugger-print-function fun) >> + (if args (cl-prin1 args) (princ "()"))) > > This `cl-prin1` should be replaced with debugger-print-function, right? Oops! --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v4-0001-Operate-on-frame-list-instead-of-printed-backtrac.patch Content-Description: patch >From a4bd2230a428560338afd4b5f2e74eccba9c4afc Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 09:19:00 -0500 Subject: [PATCH v4 1/6] Operate on frame list instead of printed backtrace * lisp/emacs-lisp/debug.el (debugger-insert-backtrace): New function, prints the given backtrace frames. (debugger-setup-buffer): Use it instead of editing the backtrace buffer text. --- lisp/emacs-lisp/debug.el | 84 +++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 83456fc31a..0c8306d428 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -264,6 +264,40 @@ (defun debug (&rest args) (setq debug-on-next-call debugger-step-after-exit) debugger-value))) + +(defun debugger-insert-backtrace (frames do-xrefs) + "Format and insert the backtrace FRAMES at point. +Make functions into cross-reference buttons if DO-XREFS is non-nil." + (let ((standard-output (current-buffer)) + (eval-buffers eval-buffer-list)) + (require 'help-mode) ; Define `help-function-def' button type. + (pcase-dolist (`(,evald ,fun ,args ,flags) frames) + (insert (if (plist-get flags :debug-on-exit) + "* " " ")) + (let ((fun-file (and do-xrefs (symbol-file fun 'defun))) + (fun-pt (point))) + (cond + ((and evald (not debugger-stack-frame-as-list)) + (prin1 fun) + (if args (prin1 args) (princ "()"))) + (t + (prin1 (cons fun args)) + (cl-incf fun-pt))) + (when fun-file + (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) + :type 'help-function-def + 'help-args (list fun fun-file)))) + ;; After any frame that uses eval-buffer, insert a line that + ;; states the buffer position it's reading at. + (when (and eval-buffers (memq fun '(eval-buffer eval-region))) + (insert (format " ; Reading at buffer position %d" + ;; This will get the wrong result if there are + ;; two nested eval-region calls for the same + ;; buffer. That's not a very useful case. + (with-current-buffer (pop eval-buffers) + (point))))) + (insert "\n")))) + (defun debugger-setup-buffer (args) "Initialize the `*Backtrace*' buffer for entry to the debugger. That buffer should be current already." @@ -271,22 +305,6 @@ (defun debugger-setup-buffer (args) (erase-buffer) (set-buffer-multibyte t) ;Why was it nil ? -stef (setq buffer-undo-list t) - (let ((standard-output (current-buffer)) - (print-escape-newlines t) - (print-level 8) - (print-length 50)) - ;; FIXME the debugger could pass a custom callback to mapbacktrace - ;; instead of manipulating printed results. - (mapbacktrace #'backtrace--print-frame 'debug)) - (goto-char (point-min)) - (delete-region (point) - (progn - (forward-line (if (eq (car args) 'debug) - ;; Remove debug--implement-debug-on-entry - ;; and the advice's `apply' frame. - 3 - 1)) - (point))) (insert "Debugger entered") ;; lambda is for debug-on-call when a function call is next. ;; debug is for debug-on-entry function called. @@ -301,10 +319,7 @@ (defun debugger-setup-buffer (args) (setq pos (point)) (setq debugger-value (nth 1 args)) (prin1 debugger-value (current-buffer)) - (insert ?\n) - (delete-char 1) - (insert ? ) - (beginning-of-line)) + (insert ?\n)) ;; Watchpoint triggered. ((and `watchpoint (let `(,symbol ,newval . ,details) (cdr args))) (insert @@ -341,23 +356,20 @@ (defun debugger-setup-buffer (args) (cdr args) args) (current-buffer)) (insert ?\n))) + (let ((frames (nthcdr + ;; Remove debug--implement-debug-on-entry and the + ;; advice's `apply' frame. + (if (eq (car args) 'debug) 3 1) + (backtrace-frames 'debug))) + (print-escape-newlines t) + (print-level 8) + (print-length 50)) + (when (eq (car args) 'exit) + (setf (cl-getf (nth 3 (car frames)) :debug-on-exit) nil)) + (debugger-insert-backtrace frames t)) ;; Place point on "stack frame 0" (bug#15101). - (goto-char pos)) - ;; After any frame that uses eval-buffer, - ;; insert a line that states the buffer position it's reading at. - (save-excursion - (let ((tem eval-buffer-list)) - (while (and tem - (re-search-forward "^ eval-\\(buffer\\|region\\)(" nil t)) - (end-of-line) - (insert (format " ; Reading at buffer position %d" - ;; This will get the wrong result - ;; if there are two nested eval-region calls - ;; for the same buffer. That's not a very useful case. - (with-current-buffer (car tem) - (point)))) - (pop tem)))) - (debugger-make-xrefs)) + (goto-char pos))) + (defun debugger-make-xrefs (&optional buffer) "Attach cross-references to function names in the `*Backtrace*' buffer." -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v4-0002-Improve-ert-backtrace-recording.patch Content-Description: patch >From 65b27e283c7037a049969ba03098b59018ff3553 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 17:19:41 -0500 Subject: [PATCH v4 2/6] Improve ert backtrace recording Change ert to use the new `backtrace-frames' function instead of collecting frames one by one with `backtrace-frame'. Additionally, collect frames starting from `signal' instead the somewhat arbitrary "6 from the bottom". Skipping 6 frames would skip the expression that actually caused the signal that triggered the debugger. Possibly 6 was chosen because in the case of a failed test, the triggering frame is an `ert-fail' call, which is not so interesting. But in case of test throwing an error, this drops the `error' call which is too much. * lisp/emacs-lisp/ert.el (ert--print-backtrace): Remove. (ert--print-backtrace): Add DO-XREFS parameter, delegate to `debugger-insert-backtrace'. (ert--run-test-debugger): Record the backtrace frames starting from the instigating `signal' call. (ert-run-tests-batch): Pass nil for `ert--print-backtrace's new DO-XREFS parameter. (ert-results-pop-to-backtrace-for-test-at-point): Pass t as DO-XREFS to `ert--print-backtrace' and remove call to `debugger-make-xrefs'. * test/lisp/emacs-lisp/ert-tests.el (ert-test-record-backtrace): Check the backtrace list instead of comparing its string representation. Expect `signal' to be the first frame. --- lisp/emacs-lisp/ert.el | 62 ++++++++++++--------------------------- test/lisp/emacs-lisp/ert-tests.el | 8 ++--- 2 files changed, 21 insertions(+), 49 deletions(-) diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el index 2c49a634e3..402798603a 100644 --- a/lisp/emacs-lisp/ert.el +++ b/lisp/emacs-lisp/ert.el @@ -670,48 +670,12 @@ (cl-defstruct (ert-test-skipped (:include ert-test-result-with-condition))) (cl-defstruct (ert-test-aborted-with-non-local-exit (:include ert-test-result))) - -(defun ert--record-backtrace () - "Record the current backtrace (as a list) and return it." - ;; Since the backtrace is stored in the result object, result - ;; objects must only be printed with appropriate limits - ;; (`print-level' and `print-length') in place. For interactive - ;; use, the cost of ensuring this possibly outweighs the advantage - ;; of storing the backtrace for - ;; `ert-results-pop-to-backtrace-for-test-at-point' given that we - ;; already have `ert-results-rerun-test-debugging-errors-at-point'. - ;; For batch use, however, printing the backtrace may be useful. - (cl-loop - ;; 6 is the number of frames our own debugger adds (when - ;; compiled; more when interpreted). FIXME: Need to describe a - ;; procedure for determining this constant. - for i from 6 - for frame = (backtrace-frame i) - while frame - collect frame)) - -(defun ert--print-backtrace (backtrace) +(defun ert--print-backtrace (backtrace do-xrefs) "Format the backtrace BACKTRACE to the current buffer." - ;; This is essentially a reimplementation of Fbacktrace - ;; (src/eval.c), but for a saved backtrace, not the current one. (let ((print-escape-newlines t) (print-level 8) (print-length 50)) - (dolist (frame backtrace) - (pcase-exhaustive frame - (`(nil ,special-operator . ,arg-forms) - ;; Special operator. - (insert - (format " %S\n" (cons special-operator arg-forms)))) - (`(t ,fn . ,args) - ;; Function call. - (insert (format " %S(" fn)) - (cl-loop for firstp = t then nil - for arg in args do - (unless firstp - (insert " ")) - (insert (format "%S" arg))) - (insert ")\n")))))) + (debugger-insert-backtrace backtrace do-xrefs))) ;; A container for the state of the execution of a single test and ;; environment data needed during its execution. @@ -750,7 +714,19 @@ (defun ert--run-test-debugger (info args) ((quit) 'quit) ((ert-test-skipped) 'skipped) (otherwise 'failed))) - (backtrace (ert--record-backtrace)) + ;; We store the backtrace in the result object for + ;; `ert-results-pop-to-backtrace-for-test-at-point'. + ;; This means we have to limit `print-level' and + ;; `print-length' when printing result objects. That + ;; might not be worth while when we can also use + ;; `ert-results-rerun-test-debugging-errors-at-point', + ;; (i.e., when running interactively) but having the + ;; backtrace ready for printing is important for batch + ;; use. + ;; + ;; Grab the frames starting from `signal', frames below + ;; that are all from the debugger. + (backtrace (backtrace-frames 'signal)) (infos (reverse ert--infos))) (setf (ert--test-execution-info-result info) (cl-ecase type @@ -1409,8 +1385,9 @@ (defun ert-run-tests-batch (&optional selector) (ert-test-result-with-condition (message "Test %S backtrace:" (ert-test-name test)) (with-temp-buffer - (ert--print-backtrace (ert-test-result-with-condition-backtrace - result)) + (ert--print-backtrace + (ert-test-result-with-condition-backtrace result) + nil) (goto-char (point-min)) (while (not (eobp)) (let ((start (point)) @@ -2420,8 +2397,7 @@ (defun ert-results-pop-to-backtrace-for-test-at-point () ;; Use unibyte because `debugger-setup-buffer' also does so. (set-buffer-multibyte nil) (setq truncate-lines t) - (ert--print-backtrace backtrace) - (debugger-make-xrefs) + (ert--print-backtrace backtrace t) (goto-char (point-min)) (insert (substitute-command-keys "Backtrace for test `")) (ert-insert-test-name-button (ert-test-name test)) diff --git a/test/lisp/emacs-lisp/ert-tests.el b/test/lisp/emacs-lisp/ert-tests.el index fc5790c365..317838b250 100644 --- a/test/lisp/emacs-lisp/ert-tests.el +++ b/test/lisp/emacs-lisp/ert-tests.el @@ -367,12 +367,8 @@ (ert-deftest ert-test-record-backtrace () (test (make-ert-test :body test-body)) (result (ert-run-test test))) (should (ert-test-failed-p result)) - (with-temp-buffer - (ert--print-backtrace (ert-test-failed-backtrace result)) - (goto-char (point-min)) - (end-of-line) - (let ((first-line (buffer-substring-no-properties (point-min) (point)))) - (should (equal first-line (format " %S()" test-body))))))) + (should (eq (nth 1 (car (ert-test-failed-backtrace result))) + 'signal)))) (ert-deftest ert-test-messages () :tags '(:causes-redisplay) -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v4-0003-Escape-control-characters-in-backtraces-Bug-6991.patch Content-Description: patch >From dc941652d3b7f37fbe950b68bfbea00e0a626513 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 18:13:54 -0500 Subject: [PATCH v4 3/6] Escape control characters in backtraces (Bug#6991) * src/print.c (syms_of_print): Add new variable, print-escape-control-characters. (print_object): Print control characters with octal escape codes when print-escape-control-characters is true. * lisp/subr.el (backtrace): * lisp/emacs-lisp/debug.el (debugger-setup-buffer): Bind `print-escape-control-characters' to t. --- lisp/emacs-lisp/debug.el | 1 + lisp/subr.el | 3 ++- src/print.c | 45 +++++++++++++++++++++++++++++++++------------ 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 0c8306d428..effe7f0cb3 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -362,6 +362,7 @@ (defun debugger-setup-buffer (args) (if (eq (car args) 'debug) 3 1) (backtrace-frames 'debug))) (print-escape-newlines t) + (print-escape-control-characters t) (print-level 8) (print-length 50)) (when (eq (car args) 'exit) diff --git a/lisp/subr.el b/lisp/subr.el index d0c8517c54..a9edff6166 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -4514,7 +4514,8 @@ (defun backtrace--print-frame (evald func args flags) (defun backtrace () "Print a trace of Lisp function calls currently active. Output stream used is value of `standard-output'." - (let ((print-level (or print-level 8))) + (let ((print-level (or print-level 8)) + (print-escape-control-characters t)) (mapbacktrace #'backtrace--print-frame 'backtrace))) (defun backtrace-frames (&optional base) diff --git a/src/print.c b/src/print.c index 6bf8af9ef9..50c75d7712 100644 --- a/src/print.c +++ b/src/print.c @@ -1870,21 +1870,36 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag) } else { + bool still_need_nonhex = false; /* If we just had a hex escape, and this character could be taken as part of it, output `\ ' to prevent that. */ - if (need_nonhex && c_isxdigit (c)) - print_c_string ("\\ ", printcharfun); - - if (c == '\n' && print_escape_newlines - ? (c = 'n', true) - : c == '\f' && print_escape_newlines - ? (c = 'f', true) - : c == '\"' || c == '\\') - printchar ('\\', printcharfun); - - printchar (c, printcharfun); - need_nonhex = false; + if (c_isxdigit (c)) + { + if (need_nonhex) + print_c_string ("\\ ", printcharfun); + printchar (c, printcharfun); + } + else if (c == '\n' && print_escape_newlines + ? (c = 'n', true) + : c == '\f' && print_escape_newlines + ? (c = 'f', true) + : c == '\0' && print_escape_control_characters + ? (c = '0', still_need_nonhex = true) + : c == '\"' || c == '\\') + { + printchar ('\\', printcharfun); + printchar (c, printcharfun); + } + else if (print_escape_control_characters && c_iscntrl (c)) + { + char outbuf[1 + 3 + 1]; + int len = sprintf (outbuf, "\\%03o", c + 0u); + strout (outbuf, len, len, printcharfun); + } + else + printchar (c, printcharfun); + need_nonhex = still_need_nonhex; } } printchar ('\"', printcharfun); @@ -2329,6 +2344,11 @@ syms_of_print (void) Also print formfeeds as `\\f'. */); print_escape_newlines = 0; + DEFVAR_BOOL ("print-escape-control-characters", print_escape_control_characters, + doc: /* Non-nil means print control characters in strings as `\\OOO'. +\(OOO is the octal representation of the character code.)*/); + print_escape_control_characters = 0; + DEFVAR_BOOL ("print-escape-nonascii", print_escape_nonascii, doc: /* Non-nil means print unibyte non-ASCII chars in strings as \\OOO. \(OOO is the octal representation of the character code.) @@ -2418,6 +2438,7 @@ representation) and `#N#' in place of each subsequent occurrence, DEFSYM (Qprint_escape_newlines, "print-escape-newlines"); DEFSYM (Qprint_escape_multibyte, "print-escape-multibyte"); DEFSYM (Qprint_escape_nonascii, "print-escape-nonascii"); + DEFSYM (Qprint_escape_control_characters, "print-escape-control-characters"); print_prune_charset_plist = Qnil; staticpro (&print_prune_charset_plist); -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v4-0004-Don-t-redundantly-cl-print-arglist-in-function-do.patch Content-Description: patch >From db0b3569a4baac81c40c86da88e93f4ae6561b79 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 27 May 2017 22:40:46 -0400 Subject: [PATCH v4 4/6] Don't redundantly cl-print arglist in function docstring again * lisp/emacs-lisp/cl-print.el (cl-print-object): Don't print arglist part of docstring. * test/lisp/emacs-lisp/cl-print-tests.el (cl-print-tests-1): Update test accordingly. --- lisp/emacs-lisp/cl-print.el | 9 +++++---- test/lisp/emacs-lisp/cl-print-tests.el | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lisp/emacs-lisp/cl-print.el b/lisp/emacs-lisp/cl-print.el index 89a71d1b6c..824d0b7b4f 100644 --- a/lisp/emacs-lisp/cl-print.el +++ b/lisp/emacs-lisp/cl-print.el @@ -105,10 +105,11 @@ (cl-defmethod cl-print-object ((object compiled-function) stream) (if args (prin1 args stream) (princ "()" stream))) - (let ((doc (documentation object 'raw))) - (when doc - (princ " " stream) - (prin1 doc stream))) + (pcase (help-split-fundoc (documentation object 'raw) object) + ;; Drop args which `help-function-arglist' already printed. + (`(,_usage . ,(and doc (guard (stringp doc)))) + (princ " " stream) + (prin1 doc stream))) (let ((inter (interactive-form object))) (when inter (princ " " stream) diff --git a/test/lisp/emacs-lisp/cl-print-tests.el b/test/lisp/emacs-lisp/cl-print-tests.el index dfbe18d784..6448a1b37f 100644 --- a/test/lisp/emacs-lisp/cl-print-tests.el +++ b/test/lisp/emacs-lisp/cl-print-tests.el @@ -34,7 +34,7 @@ (ert-deftest cl-print-tests-1 () (let ((print-circle t)) (should (equal (cl-prin1-to-string `((x . ,x) (y . ,x))) "((x . #1=#s(cl-print--test :a 1 :b 2)) (y . #1#))"))) - (should (string-match "\\`#f(compiled-function (x) .*\n\n.*)\\'" + (should (string-match "\\`#f(compiled-function (x) \"[^\"]+\" [^\)]*)\\'" (cl-prin1-to-string (symbol-function #'caar)))))) (ert-deftest cl-print-tests-2 () -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v4-0005-Hide-byte-code-in-backtraces-Bug-6991.patch Content-Description: patch >From f4a9c861f2b14f9958925d328c7ce19f6eca0e2a Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sun, 11 Jun 2017 09:51:38 -0400 Subject: [PATCH v4 5/6] Hide byte code in backtraces (Bug#6991) * lisp/emacs-lisp/debug.el (debugger-print-function): New defcustom, defaulting to `cl-print'. (debugger-insert-backtrace): Use it. * etc/NEWS: Announce it. --- etc/NEWS | 5 +++++ lisp/emacs-lisp/debug.el | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index c7a5674e51..21510fe539 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -320,6 +320,11 @@ questions, with a handy way to display help texts. all call stack frames in a Lisp backtrace buffer as lists. Both debug.el and edebug.el have been updated to heed to this variable. +--- +** Values in call stack frames are now displayed using 'cl-prin1'. +The old behaviour of using 'prin1' can be restored by customizing the +new option 'debugger-print-function'. + +++ ** The new variable 'x-ctrl-keysym' has been added to the existing roster of X keysyms. It can be used in combination with another diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index effe7f0cb3..78e29c4f17 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -49,6 +49,12 @@ (defcustom debugger-batch-max-lines 40 :group 'debugger :version "21.1") +(defcustom debugger-print-function #'cl-prin1 + "Function used to print values in the debugger backtraces." + :type 'function + :options '(cl-prin1 prin1) + :version "26.1") + (defcustom debugger-bury-or-kill 'bury "What to do with the debugger buffer when exiting `debug'. The value affects the behavior of operations on any window @@ -265,10 +271,13 @@ (defun debug (&rest args) debugger-value))) +(defvar cl-print-compiled-button) + (defun debugger-insert-backtrace (frames do-xrefs) "Format and insert the backtrace FRAMES at point. Make functions into cross-reference buttons if DO-XREFS is non-nil." (let ((standard-output (current-buffer)) + (cl-print-compiled-button t) (eval-buffers eval-buffer-list)) (require 'help-mode) ; Define `help-function-def' button type. (pcase-dolist (`(,evald ,fun ,args ,flags) frames) @@ -278,10 +287,10 @@ (defun debugger-insert-backtrace (frames do-xrefs) (fun-pt (point))) (cond ((and evald (not debugger-stack-frame-as-list)) - (prin1 fun) - (if args (prin1 args) (princ "()"))) + (funcall debugger-print-function fun) + (if args (funcall debugger-print-function args) (princ "()"))) (t - (prin1 (cons fun args)) + (funcall debugger-print-function (cons fun args)) (cl-incf fun-pt))) (when fun-file (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=v4-0006-Escape-NUL-bytes-in-X-selections-Bug-6991.patch Content-Description: patch >From bd576ed162cd3379cb945d8796d158d9563aa48e Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 19:47:55 -0500 Subject: [PATCH v4 6/6] Escape NUL bytes in X selections (Bug#6991) * lisp/term/w32-win.el (w32--set-selection): * lisp/select.el (xselect--encode-string): Replace NUL bytes with "\0". * doc/emacs/killing.texi: Document new behavior. * etc/NEWS (times): Announce it. --- doc/emacs/killing.texi | 4 ++++ etc/NEWS | 4 ++++ lisp/select.el | 3 +++ lisp/term/w32-win.el | 2 +- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/emacs/killing.texi b/doc/emacs/killing.texi index 47de053129..0b5efd04a1 100644 --- a/doc/emacs/killing.texi +++ b/doc/emacs/killing.texi @@ -519,6 +519,10 @@ Clipboard data to the clipboard manager, change the variable @code{x-select-enable-clipboard-manager} to @code{nil}. + Since strings containing NUL bytes are usually truncated when passed +through the clipboard, Emacs replaces such characters with ``\0'' +before transfering them to the system's clipboard. + @vindex select-enable-primary @findex clipboard-kill-region @findex clipboard-kill-ring-save diff --git a/etc/NEWS b/etc/NEWS index 21510fe539..281bacffd0 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -326,6 +326,10 @@ The old behaviour of using 'prin1' can be restored by customizing the new option 'debugger-print-function'. +++ +** NUL bytes in strings copied to the system clipboard are now +replaced with "\0". + ++++ ** The new variable 'x-ctrl-keysym' has been added to the existing roster of X keysyms. It can be used in combination with another variable of this kind to swap modifiers in Emacs. diff --git a/lisp/select.el b/lisp/select.el index 4849d7d515..579c5c7e2e 100644 --- a/lisp/select.el +++ b/lisp/select.el @@ -475,6 +475,9 @@ (defun xselect--encode-string (type str &optional can-modify) (t (error "Unknown selection type: %S" type))))) + ;; Most programs are unable to handle NUL bytes in strings. + (setq str (replace-regexp-in-string "\0" "\\0" str t t)) + (setq next-selection-coding-system nil) (cons type str)))) diff --git a/lisp/term/w32-win.el b/lisp/term/w32-win.el index fda93884c4..be895a040d 100644 --- a/lisp/term/w32-win.el +++ b/lisp/term/w32-win.el @@ -396,7 +396,7 @@ (declare-function w32-selection-exists-p "w32select.c") ;;; Fix interface to (X-specific) mouse.el (defun w32--set-selection (type value) (if (eq type 'CLIPBOARD) - (w32-set-clipboard-data value) + (w32-set-clipboard-data (replace-regexp-in-string "\0" "\\0" value t t)) (put 'x-selections (or type 'PRIMARY) value))) (defun w32--get-selection (&optional type data-type) -- 2.11.1 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Mon Jun 26 00:02:26 2017 Received: (at 6991) by debbugs.gnu.org; 26 Jun 2017 04:02:26 +0000 Received: from localhost ([127.0.0.1]:37864 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPLEI-00067E-I0 for submit@debbugs.gnu.org; Mon, 26 Jun 2017 00:02:26 -0400 Received: from pruche.dit.umontreal.ca ([132.204.246.22]:36151) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPLEE-000674-Ry for 6991@debbugs.gnu.org; Mon, 26 Jun 2017 00:02:24 -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 v5Q42IK2011782; Mon, 26 Jun 2017 00:02:19 -0400 Received: by ceviche.home (Postfix, from userid 20848) id DE5866627F; Mon, 26 Jun 2017 00:02:17 -0400 (EDT) From: Stefan Monnier To: npostavs@users.sourceforge.net Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers Message-ID: References: <8739tm9vzl.fsf@jidanni.org> <2223f654-1e67-4a9a-a471-828fd4078410@default> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> <87wpcwkuug.fsf@users.sourceforge.net> <87zidx3u5u.fsf@users.sourceforge.net> <87o9tdowbh.fsf@users.sourceforge.net> <87mv8vo1zz.fsf@users.sourceforge.net> Date: Mon, 26 Jun 2017 00:02:17 -0400 In-Reply-To: <87mv8vo1zz.fsf@users.sourceforge.net> (npostavs's message of "Sun, 25 Jun 2017 23:34:56 -0400") 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, RV6055=0 X-NAI-Spam-Version: 2.3.0.9418 : core <6055> : inlines <5949> : streams <1751539> : uri <2450818> X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.3 (-) >>> + (when fun-file >>> + (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) >>> + :type 'help-function-def >>> + 'help-args (list fun fun-file)))) >> Hmm... this looks like code which was moved from elsewhere, yet I can't >> find this elsewhere in your patch(es). >> I think that other code is in debugger-make-xrefs, so can't we remove >> debugger-make-xrefs? > I'm not sure exactly what you mean by "looks like code which was moved". It's not functionality described as new in the commit log, so it's presumably behavior which was earlier implemented elsewhere. > It does replace the functionality of debugger-make-xrefs. But > `ert--make-xrefs-region' is still using `debugger-make-xrefs', and I > don't quite see how to remove that usage. I see. Maybe we should move it to ert.el, then? >>> + (let ((frames (nthcdr >>> + ;; Remove debug--implement-debug-on-entry and the >>> + ;; advice's `apply' frame. >>> + (if (eq (car args) 'debug) 3 1) >>> + (backtrace-frames 'debug))) >>> + (print-escape-newlines t) >>> + (print-level 8) >>> + (print-length 50)) >> >> Why let-bind print-* here rather than inside debugger-insert-backtrace? > I thought moving those inside might needlessly make the function less > flexible, though nobody is currently making use of the flexibility so > maybe it's not worth it... Hmm... I can agree with it for level and length, but I think that the escape-newline behavior is indispensable. >>> + (when (eq (car args) 'exit) >>> + (setf (cl-getf (nth 3 (car frames)) :debug-on-exit) nil)) >> >> This looks like code which was moved from elsewhere, yet I can't find >> this elsewhere in your patch(es). What am I missing? > backtrace--print-frame I guess? I haven't changed the printing for > `backtrace', perhaps I should... Hmm... I don't see anything that corresponds to this setf in backtrace--print-frame. What do the above 2 lines do, and where is the corresponding code in the current debug.el? Or is that a new feature in your code? (if so, where is it documented in the commit message?) Stefan From debbugs-submit-bounces@debbugs.gnu.org Mon Jun 26 08:49:19 2017 Received: (at 6991) by debbugs.gnu.org; 26 Jun 2017 12:49:19 +0000 Received: from localhost ([127.0.0.1]:38156 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPTSB-0005OZ-1K for submit@debbugs.gnu.org; Mon, 26 Jun 2017 08:49:19 -0400 Received: from mail-it0-f68.google.com ([209.85.214.68]:34504) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPTS9-0005ON-Pv for 6991@debbugs.gnu.org; Mon, 26 Jun 2017 08:49:18 -0400 Received: by mail-it0-f68.google.com with SMTP id y134so28503itc.1 for <6991@debbugs.gnu.org>; Mon, 26 Jun 2017 05:49:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=OBZ4zS+fDnsYbFKWKAmOffs1gqbrdy8l0wa3WHUoTno=; b=DjPGUWQOYT7Pyq/kHa5679lcVcfrbnIrziinTAmT04JFu6TewkpNngnzH8heDc2ope OHxSy7WlMRnWPoZoLOg9GrLQ8TmtrfLWDdj7ykovoW+sftxHb4X30tCbLktCE5b2EFyh suNK6GTFT+Y8KQ9hSsgkiw+4vB038zmFebrPoWuht2GXxaZxeqeGjUcQU2bb16I0Q6nx Up8vaVPDuUh10ods4O0vnfLhLT2VtuxRRtqbGGJDCa6NLNbpI3DZHtfNYgKGmgG4zl+X mbKnm145H6EnIH50BZtlGczlS4LN7HK/9vTj4Bpv2UxBDTLjRJb1vyZ29jjRf3nf4Ynk D+zA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=OBZ4zS+fDnsYbFKWKAmOffs1gqbrdy8l0wa3WHUoTno=; b=jW3wXoCdSEAEscWjdIkcMIoH6lZqRZjSnjpmlr8fVM8qx3TiLkVX2z8NOhylVz7vZa hjW/RU8KeDwTdfzxcS45mykRstzv8Gswe1lGrWnGkSE7fd1PDv13x1onft1Jh8WTiY6C 2aVeIlQeoS9ujjBgRduRPiFDILC2rWLCvasu1zWREX5jL0cmyIxCqPQRu4bAIGZTevhk L3gKzmpQgecfM89QeHQ75ujVj2VPdeF3e4fXaloyMToyTo8r5p6eIw+xFGnqwnm18j1K SwXlM6gy0c+kF+OaVNttN5bI1TbFVF9JHCUk88YhyR3JRnNczsX7w29rz/t/acOls/jl KBaA== X-Gm-Message-State: AKS2vOyfRL18sh04TD0GVOL+wbJfJj/mg1e2AVtYz3CxxeBIbrzS+sC8 sJkaukYNxmvc4A== X-Received: by 10.36.54.82 with SMTP id l79mr73506itl.16.1498481351962; Mon, 26 Jun 2017 05:49:11 -0700 (PDT) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id r124sm5273iod.38.2017.06.26.05.49.10 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 26 Jun 2017 05:49:11 -0700 (PDT) From: npostavs@users.sourceforge.net To: Stefan Monnier Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87fumokzbp.fsf@users.sourceforge.net> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> <87wpcwkuug.fsf@users.sourceforge.net> <87zidx3u5u.fsf@users.sourceforge.net> <87o9tdowbh.fsf@users.sourceforge.net> <87mv8vo1zz.fsf@users.sourceforge.net> Date: Mon, 26 Jun 2017 08:50:47 -0400 In-Reply-To: (Stefan Monnier's message of "Mon, 26 Jun 2017 00:02:17 -0400") Message-ID: <87h8z2oqu0.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.7 (/) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.7 (/) Stefan Monnier writes: >> It does replace the functionality of debugger-make-xrefs. But >> `ert--make-xrefs-region' is still using `debugger-make-xrefs', and I >> don't quite see how to remove that usage. > > I see. Maybe we should move it to ert.el, then? Sure. >>>> + (print-escape-newlines t) >>>> + (print-level 8) >>>> + (print-length 50)) >>> >>> Why let-bind print-* here rather than inside debugger-insert-backtrace? > >> I thought moving those inside might needlessly make the function less >> flexible, though nobody is currently making use of the flexibility so >> maybe it's not worth it... > > Hmm... I can agree with it for level and length, but I think that the > escape-newline behavior is indispensable. Okay, that makes sense. >>>> + (when (eq (car args) 'exit) >>>> + (setf (cl-getf (nth 3 (car frames)) :debug-on-exit) nil)) >>> >>> This looks like code which was moved from elsewhere, yet I can't find >>> this elsewhere in your patch(es). What am I missing? > >> backtrace--print-frame I guess? I haven't changed the printing for >> `backtrace', perhaps I should... > > Hmm... I don't see anything that corresponds to this setf in > backtrace--print-frame. What do the above 2 lines do, and where is the > corresponding code in the current debug.el? Or is that a new feature in > your code? (if so, where is it documented in the commit message?) Ah, sorry, my memory of the old code got a little fuzzy, it doesn't correspond to backtrace--print-frame (that function only contains the code which reads the :debug-on-exit flag). It's actually replacing the code removed in this hunk: @@ -301,10 +319,7 @@ (defun debugger-setup-buffer (args) (setq pos (point)) (setq debugger-value (nth 1 args)) (prin1 debugger-value (current-buffer)) - (insert ?\n) - (delete-char 1) - (insert ? ) - (beginning-of-line)) + (insert ?\n)) ;; Watchpoint triggered. ((and `watchpoint (let `(,symbol ,newval . ,details) (cdr args))) (insert So it's another instance of operating on the backtrace frame object directly, instead of manipulating the text after printing (i.e., unsetting the :debug-on-exit flag instead of erasing its representation "*" in the buffer). Also, as I'm looking at this, I wonder if I should replace the (prin1 debugger-value ...) calls with (funcall debugger-print-function ...) too. Hmm, and I probably shouldn't have moved those print-* let-bindings at all because they could be relevant to the code printing "frame 0". From debbugs-submit-bounces@debbugs.gnu.org Mon Jun 26 10:54:13 2017 Received: (at 6991) by debbugs.gnu.org; 26 Jun 2017 14:54:13 +0000 Received: from localhost ([127.0.0.1]:39253 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPVP3-0008W7-4A for submit@debbugs.gnu.org; Mon, 26 Jun 2017 10:54:13 -0400 Received: from chene.dit.umontreal.ca ([132.204.246.20]:53624) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPVP1-0008Vz-7N for 6991@debbugs.gnu.org; Mon, 26 Jun 2017 10:54:12 -0400 Received: from ceviche.home (lechon.iro.umontreal.ca [132.204.27.242]) by chene.dit.umontreal.ca (8.14.7/8.14.1) with ESMTP id v5QEs7mm020740; Mon, 26 Jun 2017 10:54:08 -0400 Received: by ceviche.home (Postfix, from userid 20848) id C7F8F6627F; Mon, 26 Jun 2017 10:54:06 -0400 (EDT) From: Stefan Monnier To: npostavs@users.sourceforge.net Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers Message-ID: References: <8739tm9vzl.fsf@jidanni.org> <83oa1bc3x2.fsf@gnu.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> <87wpcwkuug.fsf@users.sourceforge.net> <87zidx3u5u.fsf@users.sourceforge.net> <87o9tdowbh.fsf@users.sourceforge.net> <87mv8vo1zz.fsf@users.sourceforge.net> <87h8z2oqu0.fsf@users.sourceforge.net> Date: Mon, 26 Jun 2017 10:54:06 -0400 In-Reply-To: <87h8z2oqu0.fsf@users.sourceforge.net> (npostavs's message of "Mon, 26 Jun 2017 08:50:47 -0400") 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, RV6056=0 X-NAI-Spam-Version: 2.3.0.9418 : core <6056> : inlines <5950> : streams <1751603> : uri <2451170> X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.3 (-) > Ah, sorry, my memory of the old code got a little fuzzy, it doesn't > correspond to backtrace--print-frame (that function only contains the > code which reads the :debug-on-exit flag). It's actually replacing the > code removed in this hunk: > @@ -301,10 +319,7 @@ (defun debugger-setup-buffer (args) > (setq pos (point)) > (setq debugger-value (nth 1 args)) > (prin1 debugger-value (current-buffer)) > - (insert ?\n) > - (delete-char 1) > - (insert ? ) > - (beginning-of-line)) > + (insert ?\n)) > ;; Watchpoint triggered. > ((and `watchpoint (let `(,symbol ,newval . ,details) (cdr args))) > (insert > So it's another instance of operating on the backtrace frame object > directly, instead of manipulating the text after printing (i.e., > unsetting the :debug-on-exit flag instead of erasing its representation > "*" in the buffer). Ah, yes, I see it now, thanks. It's a good change, then: the new code is more clear. I wonder why we do that, tho: the previous code didn't have a comment, so I'm left guessing that maybe it's that we don't want to advertise as "will stop when exiting foo" a function which we're exiting? > Also, as I'm looking at this, I wonder if I should replace the (prin1 > debugger-value ...) calls with (funcall debugger-print-function ...) Sounds right. > too. Hmm, and I probably shouldn't have moved those print-* > let-bindings at all because they could be relevant to the code printing > "frame 0". Good point. Stefan From debbugs-submit-bounces@debbugs.gnu.org Mon Jun 26 23:55:29 2017 Received: (at 6991) by debbugs.gnu.org; 27 Jun 2017 03:55:29 +0000 Received: from localhost ([127.0.0.1]:39810 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPhb6-0004tW-RI for submit@debbugs.gnu.org; Mon, 26 Jun 2017 23:55:29 -0400 Received: from mail-it0-f66.google.com ([209.85.214.66]:33099) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPhb4-0004tI-06 for 6991@debbugs.gnu.org; Mon, 26 Jun 2017 23:55:27 -0400 Received: by mail-it0-f66.google.com with SMTP id x12so1801176itb.0 for <6991@debbugs.gnu.org>; Mon, 26 Jun 2017 20:55:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=YlCfpCm6xkODccatwjnLn90TOCyv1EqBnpGhpcMq0gA=; b=eo5WCEMxUoUwyw9K8Z7BB5JIIHloVdiGc+KM86ckSNx4MSjHbSb58m86TByPyYHfxr DGCOJqav8g2I/87CdIL19LZSzR6048ODGBCFaY5FjnT4wZpwqAJRJj66v/usgNRaNbq+ ORpLNEJo4W8ivl/V05iIXZ6KDbK6T2MAuDZx/toTxZz46B1dpmvel6ygnAeUx9NHqg/J pWKISUYtQKjiPNQr2ZF9QRufc8qUgyMyc73V2ZkZEcqLVnl7/LmSbXdW2HoG3ZRySAHJ 0PqnoPcmetuPIFNt3RymmLMlTky3W3ybsj15FGpgjRkZsuYBEz9L76fP/K+oHN0JD9wV SZ+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=YlCfpCm6xkODccatwjnLn90TOCyv1EqBnpGhpcMq0gA=; b=riRCdhh3FSNirpIw2xn1MD5+KBIx6LwpLVxz9PDsGWQZ0Tbv4ybXLYNiC03DGthl7Y 220uWVXjDpMXuveEmE8jiqNgrFUdj3PZJXLTyEN5PQt67quKlItiHkLJ4LE4F6MnXjW2 Duibv4NTs0hhzPgjwEXDtBLl9n6k/axr4WDT/ORnT/cgH2d5o8b2G6GeU7S7olOV+MRc 8NI8iZHcsgRlp/0BzSf13XJuPrFhWP6kk9uAYlJuN+6Ashz3R7QrzcqRzrVJvD/DWzTW z9h+tb9kjF1w03aL5yHDgzJ7wpemXKuM98SFhN1oFzzwJCP0GSBqdQtEK20c1FjlAH5y REOw== X-Gm-Message-State: AKS2vOxADeaP/3Z06YSAHOfyEZ3M6N/VTSxWGALd+F64qvVO+zuO7M68 /6SNbVJnU6gE9Q== X-Received: by 10.36.116.148 with SMTP id o142mr952135itc.74.1498535720215; Mon, 26 Jun 2017 20:55:20 -0700 (PDT) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id e14sm848024itc.30.2017.06.26.20.55.17 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 26 Jun 2017 20:55:18 -0700 (PDT) From: npostavs@users.sourceforge.net To: Stefan Monnier Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87d1hrlek2.fsf@users.sourceforge.net> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> <87wpcwkuug.fsf@users.sourceforge.net> <87zidx3u5u.fsf@users.sourceforge.net> <87o9tdowbh.fsf@users.sourceforge.net> <87mv8vo1zz.fsf@users.sourceforge.net> <87h8z2oqu0.fsf@users.sourceforge.net> Date: Mon, 26 Jun 2017 23:56:54 -0400 In-Reply-To: (Stefan Monnier's message of "Mon, 26 Jun 2017 10:54:06 -0400") Message-ID: <87bmpankvt.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.7 (/) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.7 (/) --=-=-= Content-Type: text/plain Stefan Monnier writes: > I wonder why we do that, tho: > the previous code didn't have a comment, so I'm left guessing that maybe > it's that we don't want to advertise as "will stop when exiting foo" > a function which we're exiting? I tried git-blame, but that code seems to have been like that since "initial revision" (1991). I think your guess sounds reasonable. Anyway, here are the updated patches. --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=0001-Operate-on-frame-list-instead-of-printed-backtrace.patch Content-Description: patch >From 9ff1fc669d1239ac6e84f6fd045f18ec5483f552 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 09:19:00 -0500 Subject: [PATCH 1/6] Operate on frame list instead of printed backtrace * lisp/emacs-lisp/debug.el (debugger-insert-backtrace): New function, prints the given backtrace frames. (debugger-setup-buffer): Use it instead of editing the backtrace buffer text. --- lisp/emacs-lisp/debug.el | 97 +++++++++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 42 deletions(-) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 83456fc31a..1bb1960d07 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -264,6 +264,40 @@ (defun debug (&rest args) (setq debug-on-next-call debugger-step-after-exit) debugger-value))) + +(defun debugger-insert-backtrace (frames do-xrefs) + "Format and insert the backtrace FRAMES at point. +Make functions into cross-reference buttons if DO-XREFS is non-nil." + (let ((standard-output (current-buffer)) + (eval-buffers eval-buffer-list)) + (require 'help-mode) ; Define `help-function-def' button type. + (pcase-dolist (`(,evald ,fun ,args ,flags) frames) + (insert (if (plist-get flags :debug-on-exit) + "* " " ")) + (let ((fun-file (and do-xrefs (symbol-file fun 'defun))) + (fun-pt (point))) + (cond + ((and evald (not debugger-stack-frame-as-list)) + (prin1 fun) + (if args (prin1 args) (princ "()"))) + (t + (prin1 (cons fun args)) + (cl-incf fun-pt))) + (when fun-file + (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) + :type 'help-function-def + 'help-args (list fun fun-file)))) + ;; After any frame that uses eval-buffer, insert a line that + ;; states the buffer position it's reading at. + (when (and eval-buffers (memq fun '(eval-buffer eval-region))) + (insert (format " ; Reading at buffer position %d" + ;; This will get the wrong result if there are + ;; two nested eval-region calls for the same + ;; buffer. That's not a very useful case. + (with-current-buffer (pop eval-buffers) + (point))))) + (insert "\n")))) + (defun debugger-setup-buffer (args) "Initialize the `*Backtrace*' buffer for entry to the debugger. That buffer should be current already." @@ -271,26 +305,19 @@ (defun debugger-setup-buffer (args) (erase-buffer) (set-buffer-multibyte t) ;Why was it nil ? -stef (setq buffer-undo-list t) - (let ((standard-output (current-buffer)) - (print-escape-newlines t) - (print-level 8) - (print-length 50)) - ;; FIXME the debugger could pass a custom callback to mapbacktrace - ;; instead of manipulating printed results. - (mapbacktrace #'backtrace--print-frame 'debug)) - (goto-char (point-min)) - (delete-region (point) - (progn - (forward-line (if (eq (car args) 'debug) - ;; Remove debug--implement-debug-on-entry - ;; and the advice's `apply' frame. - 3 - 1)) - (point))) (insert "Debugger entered") ;; lambda is for debug-on-call when a function call is next. ;; debug is for debug-on-entry function called. - (let ((pos (point))) + (let ((frames (nthcdr + ;; Remove debug--implement-debug-on-entry and the + ;; advice's `apply' frame. + (if (eq (car args) 'debug) 3 1) + (backtrace-frames 'debug))) + (print-escape-newlines t) + (print-escape-control-characters t) + (print-level 8) + (print-length 50) + (pos (point))) (pcase (car args) ((or `lambda `debug) (insert "--entering a function:\n") @@ -300,11 +327,9 @@ (defun debugger-setup-buffer (args) (insert "--returning value: ") (setq pos (point)) (setq debugger-value (nth 1 args)) - (prin1 debugger-value (current-buffer)) - (insert ?\n) - (delete-char 1) - (insert ? ) - (beginning-of-line)) + (funcall debugger-print-function debugger-value (current-buffer)) + (setf (cl-getf (nth 3 (car frames)) :debug-on-exit) nil) + (insert ?\n)) ;; Watchpoint triggered. ((and `watchpoint (let `(,symbol ,newval . ,details) (cdr args))) (insert @@ -327,7 +352,7 @@ (defun debugger-setup-buffer (args) (`error (insert "--Lisp error: ") (setq pos (point)) - (prin1 (nth 1 args) (current-buffer)) + (funcall debugger-print-function (nth 1 args) (current-buffer)) (insert ?\n)) ;; debug-on-call, when the next thing is an eval. (`t @@ -337,27 +362,15 @@ (defun debugger-setup-buffer (args) (_ (insert ": ") (setq pos (point)) - (prin1 (if (eq (car args) 'nil) - (cdr args) args) - (current-buffer)) + (funcall debugger-print-function + (if (eq (car args) 'nil) + (cdr args) args) + (current-buffer)) (insert ?\n))) + (debugger-insert-backtrace frames t) ;; Place point on "stack frame 0" (bug#15101). - (goto-char pos)) - ;; After any frame that uses eval-buffer, - ;; insert a line that states the buffer position it's reading at. - (save-excursion - (let ((tem eval-buffer-list)) - (while (and tem - (re-search-forward "^ eval-\\(buffer\\|region\\)(" nil t)) - (end-of-line) - (insert (format " ; Reading at buffer position %d" - ;; This will get the wrong result - ;; if there are two nested eval-region calls - ;; for the same buffer. That's not a very useful case. - (with-current-buffer (car tem) - (point)))) - (pop tem)))) - (debugger-make-xrefs)) + (goto-char pos))) + (defun debugger-make-xrefs (&optional buffer) "Attach cross-references to function names in the `*Backtrace*' buffer." -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=0002-Improve-ert-backtrace-recording.patch Content-Description: patch >From be573593e5051f3b18c046e9f09b37a6f629ec5d Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 17:19:41 -0500 Subject: [PATCH 2/6] Improve ert backtrace recording Change ert to use the new `backtrace-frames' function instead of collecting frames one by one with `backtrace-frame'. Additionally, collect frames starting from `signal' instead the somewhat arbitrary "6 from the bottom". Skipping 6 frames would skip the expression that actually caused the signal that triggered the debugger. Possibly 6 was chosen because in the case of a failed test, the triggering frame is an `ert-fail' call, which is not so interesting. But in case of test throwing an error, this drops the `error' call which is too much. * lisp/emacs-lisp/debug.el (debugger-make-xrefs): Remove. lisp/emacs-lisp/ert.el (ert--make-xrefs-region): Bring in relevant code from `debugger-make-xrefs'. (ert--print-backtrace): Add DO-XREFS parameter, delegate to `debugger-insert-backtrace'. (ert--run-test-debugger): Record the backtrace frames starting from the instigating `signal' call. (ert-run-tests-batch): Pass nil for `ert--print-backtrace's new DO-XREFS parameter. (ert-results-pop-to-backtrace-for-test-at-point): Pass t as DO-XREFS to `ert--print-backtrace' and remove call to `debugger-make-xrefs'. * test/lisp/emacs-lisp/ert-tests.el (ert-test-record-backtrace): Check the backtrace list instead of comparing its string representation. Expect `signal' to be the first frame. --- lisp/emacs-lisp/debug.el | 71 -------------------------------- lisp/emacs-lisp/ert.el | 85 +++++++++++++++++---------------------- test/lisp/emacs-lisp/ert-tests.el | 8 +--- 3 files changed, 38 insertions(+), 126 deletions(-) diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index 1bb1960d07..a75242aa5a 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -371,77 +371,6 @@ (defun debugger-setup-buffer (args) ;; Place point on "stack frame 0" (bug#15101). (goto-char pos))) - -(defun debugger-make-xrefs (&optional buffer) - "Attach cross-references to function names in the `*Backtrace*' buffer." - (interactive "b") - (with-current-buffer (or buffer (current-buffer)) - (save-excursion - (setq buffer (current-buffer)) - (let ((inhibit-read-only t) - (old-end (point-min)) (new-end (point-min))) - ;; If we saved an old backtrace, find the common part - ;; between the new and the old. - ;; Compare line by line, starting from the end, - ;; because that's the part that is likely to be unchanged. - (if debugger-previous-backtrace - (let (old-start new-start (all-match t)) - (goto-char (point-max)) - (with-temp-buffer - (insert debugger-previous-backtrace) - (while (and all-match (not (bobp))) - (setq old-end (point)) - (forward-line -1) - (setq old-start (point)) - (with-current-buffer buffer - (setq new-end (point)) - (forward-line -1) - (setq new-start (point))) - (if (not (zerop - (let ((case-fold-search nil)) - (compare-buffer-substrings - (current-buffer) old-start old-end - buffer new-start new-end)))) - (setq all-match nil)))) - ;; Now new-end is the position of the start of the - ;; unchanged part in the current buffer, and old-end is - ;; the position of that same text in the saved old - ;; backtrace. But we must subtract (point-min) since strings are - ;; indexed in origin 0. - - ;; Replace the unchanged part of the backtrace - ;; with the text from debugger-previous-backtrace, - ;; since that already has the proper xrefs. - ;; With this optimization, we only need to scan - ;; the changed part of the backtrace. - (delete-region new-end (point-max)) - (goto-char (point-max)) - (insert (substring debugger-previous-backtrace - (- old-end (point-min)))) - ;; Make the unchanged part of the backtrace inaccessible - ;; so it won't be scanned. - (narrow-to-region (point-min) new-end))) - - ;; Scan the new part of the backtrace, inserting xrefs. - (goto-char (point-min)) - (while (progn - (goto-char (+ (point) 2)) - (skip-syntax-forward "^w_") - (not (eobp))) - (let* ((beg (point)) - (end (progn (skip-syntax-forward "w_") (point))) - (sym (intern-soft (buffer-substring-no-properties - beg end))) - (file (and sym (symbol-file sym 'defun)))) - (when file - (goto-char beg) - ;; help-xref-button needs to operate on something matched - ;; by a regexp, so set that up for it. - (re-search-forward "\\(\\sw\\|\\s_\\)+") - (help-xref-button 0 'help-function-def sym file))) - (forward-line 1)) - (widen)) - (setq debugger-previous-backtrace (buffer-string))))) (defun debugger-step-through () "Proceed, stepping through subexpressions of this expression. diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el index 2c49a634e3..7edc40188e 100644 --- a/lisp/emacs-lisp/ert.el +++ b/lisp/emacs-lisp/ert.el @@ -670,48 +670,12 @@ (cl-defstruct (ert-test-skipped (:include ert-test-result-with-condition))) (cl-defstruct (ert-test-aborted-with-non-local-exit (:include ert-test-result))) - -(defun ert--record-backtrace () - "Record the current backtrace (as a list) and return it." - ;; Since the backtrace is stored in the result object, result - ;; objects must only be printed with appropriate limits - ;; (`print-level' and `print-length') in place. For interactive - ;; use, the cost of ensuring this possibly outweighs the advantage - ;; of storing the backtrace for - ;; `ert-results-pop-to-backtrace-for-test-at-point' given that we - ;; already have `ert-results-rerun-test-debugging-errors-at-point'. - ;; For batch use, however, printing the backtrace may be useful. - (cl-loop - ;; 6 is the number of frames our own debugger adds (when - ;; compiled; more when interpreted). FIXME: Need to describe a - ;; procedure for determining this constant. - for i from 6 - for frame = (backtrace-frame i) - while frame - collect frame)) - -(defun ert--print-backtrace (backtrace) +(defun ert--print-backtrace (backtrace do-xrefs) "Format the backtrace BACKTRACE to the current buffer." - ;; This is essentially a reimplementation of Fbacktrace - ;; (src/eval.c), but for a saved backtrace, not the current one. (let ((print-escape-newlines t) (print-level 8) (print-length 50)) - (dolist (frame backtrace) - (pcase-exhaustive frame - (`(nil ,special-operator . ,arg-forms) - ;; Special operator. - (insert - (format " %S\n" (cons special-operator arg-forms)))) - (`(t ,fn . ,args) - ;; Function call. - (insert (format " %S(" fn)) - (cl-loop for firstp = t then nil - for arg in args do - (unless firstp - (insert " ")) - (insert (format "%S" arg))) - (insert ")\n")))))) + (debugger-insert-backtrace backtrace do-xrefs))) ;; A container for the state of the execution of a single test and ;; environment data needed during its execution. @@ -750,7 +714,19 @@ (defun ert--run-test-debugger (info args) ((quit) 'quit) ((ert-test-skipped) 'skipped) (otherwise 'failed))) - (backtrace (ert--record-backtrace)) + ;; We store the backtrace in the result object for + ;; `ert-results-pop-to-backtrace-for-test-at-point'. + ;; This means we have to limit `print-level' and + ;; `print-length' when printing result objects. That + ;; might not be worth while when we can also use + ;; `ert-results-rerun-test-debugging-errors-at-point', + ;; (i.e., when running interactively) but having the + ;; backtrace ready for printing is important for batch + ;; use. + ;; + ;; Grab the frames starting from `signal', frames below + ;; that are all from the debugger. + (backtrace (backtrace-frames 'signal)) (infos (reverse ert--infos))) (setf (ert--test-execution-info-result info) (cl-ecase type @@ -1409,8 +1385,9 @@ (defun ert-run-tests-batch (&optional selector) (ert-test-result-with-condition (message "Test %S backtrace:" (ert-test-name test)) (with-temp-buffer - (ert--print-backtrace (ert-test-result-with-condition-backtrace - result)) + (ert--print-backtrace + (ert-test-result-with-condition-backtrace result) + nil) (goto-char (point-min)) (while (not (eobp)) (let ((start (point)) @@ -1828,12 +1805,23 @@ (defun ert--make-xrefs-region (begin end) BEGIN and END specify a region in the current buffer." (save-excursion - (save-restriction - (narrow-to-region begin end) - ;; Inhibit optimization in `debugger-make-xrefs' that would - ;; sometimes insert unrelated backtrace info into our buffer. - (let ((debugger-previous-backtrace nil)) - (debugger-make-xrefs))))) + (goto-char begin) + (while (progn + (goto-char (+ (point) 2)) + (skip-syntax-forward "^w_") + (< (point) end)) + (let* ((beg (point)) + (end (progn (skip-syntax-forward "w_") (point))) + (sym (intern-soft (buffer-substring-no-properties + beg end))) + (file (and sym (symbol-file sym 'defun)))) + (when file + (goto-char beg) + ;; help-xref-button needs to operate on something matched + ;; by a regexp, so set that up for it. + (re-search-forward "\\(\\sw\\|\\s_\\)+") + (help-xref-button 0 'help-function-def sym file))) + (forward-line 1)))) (defun ert--string-first-line (s) "Return the first line of S, or S if it contains no newlines. @@ -2420,8 +2408,7 @@ (defun ert-results-pop-to-backtrace-for-test-at-point () ;; Use unibyte because `debugger-setup-buffer' also does so. (set-buffer-multibyte nil) (setq truncate-lines t) - (ert--print-backtrace backtrace) - (debugger-make-xrefs) + (ert--print-backtrace backtrace t) (goto-char (point-min)) (insert (substitute-command-keys "Backtrace for test `")) (ert-insert-test-name-button (ert-test-name test)) diff --git a/test/lisp/emacs-lisp/ert-tests.el b/test/lisp/emacs-lisp/ert-tests.el index fc5790c365..317838b250 100644 --- a/test/lisp/emacs-lisp/ert-tests.el +++ b/test/lisp/emacs-lisp/ert-tests.el @@ -367,12 +367,8 @@ (ert-deftest ert-test-record-backtrace () (test (make-ert-test :body test-body)) (result (ert-run-test test))) (should (ert-test-failed-p result)) - (with-temp-buffer - (ert--print-backtrace (ert-test-failed-backtrace result)) - (goto-char (point-min)) - (end-of-line) - (let ((first-line (buffer-substring-no-properties (point-min) (point)))) - (should (equal first-line (format " %S()" test-body))))))) + (should (eq (nth 1 (car (ert-test-failed-backtrace result))) + 'signal)))) (ert-deftest ert-test-messages () :tags '(:causes-redisplay) -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=0003-Escape-control-characters-in-backtraces-Bug-6991.patch Content-Description: patch >From 7f67318c05006c3447e2b1074c78e10d78e5d8ec Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 18:13:54 -0500 Subject: [PATCH 3/6] Escape control characters in backtraces (Bug#6991) * src/print.c (syms_of_print): Add new variable, print-escape-control-characters. (print_object): Print control characters with octal escape codes when print-escape-control-characters is true. * lisp/subr.el (backtrace): * lisp/emacs-lisp/debug.el (debugger-setup-buffer): Bind `print-escape-control-characters' to t. --- lisp/subr.el | 3 ++- src/print.c | 45 +++++++++++++++++++++++++++++++++------------ 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/lisp/subr.el b/lisp/subr.el index d0c8517c54..a9edff6166 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -4514,7 +4514,8 @@ (defun backtrace--print-frame (evald func args flags) (defun backtrace () "Print a trace of Lisp function calls currently active. Output stream used is value of `standard-output'." - (let ((print-level (or print-level 8))) + (let ((print-level (or print-level 8)) + (print-escape-control-characters t)) (mapbacktrace #'backtrace--print-frame 'backtrace))) (defun backtrace-frames (&optional base) diff --git a/src/print.c b/src/print.c index 6bf8af9ef9..50c75d7712 100644 --- a/src/print.c +++ b/src/print.c @@ -1870,21 +1870,36 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag) } else { + bool still_need_nonhex = false; /* If we just had a hex escape, and this character could be taken as part of it, output `\ ' to prevent that. */ - if (need_nonhex && c_isxdigit (c)) - print_c_string ("\\ ", printcharfun); - - if (c == '\n' && print_escape_newlines - ? (c = 'n', true) - : c == '\f' && print_escape_newlines - ? (c = 'f', true) - : c == '\"' || c == '\\') - printchar ('\\', printcharfun); - - printchar (c, printcharfun); - need_nonhex = false; + if (c_isxdigit (c)) + { + if (need_nonhex) + print_c_string ("\\ ", printcharfun); + printchar (c, printcharfun); + } + else if (c == '\n' && print_escape_newlines + ? (c = 'n', true) + : c == '\f' && print_escape_newlines + ? (c = 'f', true) + : c == '\0' && print_escape_control_characters + ? (c = '0', still_need_nonhex = true) + : c == '\"' || c == '\\') + { + printchar ('\\', printcharfun); + printchar (c, printcharfun); + } + else if (print_escape_control_characters && c_iscntrl (c)) + { + char outbuf[1 + 3 + 1]; + int len = sprintf (outbuf, "\\%03o", c + 0u); + strout (outbuf, len, len, printcharfun); + } + else + printchar (c, printcharfun); + need_nonhex = still_need_nonhex; } } printchar ('\"', printcharfun); @@ -2329,6 +2344,11 @@ syms_of_print (void) Also print formfeeds as `\\f'. */); print_escape_newlines = 0; + DEFVAR_BOOL ("print-escape-control-characters", print_escape_control_characters, + doc: /* Non-nil means print control characters in strings as `\\OOO'. +\(OOO is the octal representation of the character code.)*/); + print_escape_control_characters = 0; + DEFVAR_BOOL ("print-escape-nonascii", print_escape_nonascii, doc: /* Non-nil means print unibyte non-ASCII chars in strings as \\OOO. \(OOO is the octal representation of the character code.) @@ -2418,6 +2438,7 @@ representation) and `#N#' in place of each subsequent occurrence, DEFSYM (Qprint_escape_newlines, "print-escape-newlines"); DEFSYM (Qprint_escape_multibyte, "print-escape-multibyte"); DEFSYM (Qprint_escape_nonascii, "print-escape-nonascii"); + DEFSYM (Qprint_escape_control_characters, "print-escape-control-characters"); print_prune_charset_plist = Qnil; staticpro (&print_prune_charset_plist); -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=0004-Don-t-redundantly-cl-print-arglist-in-function-docst.patch Content-Description: patch >From 7d2e4c3ff2788fff7e5ee7481e4983eb185c8402 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 27 May 2017 22:40:46 -0400 Subject: [PATCH 4/6] Don't redundantly cl-print arglist in function docstring again * lisp/emacs-lisp/cl-print.el (cl-print-object): Don't print arglist part of docstring. * test/lisp/emacs-lisp/cl-print-tests.el (cl-print-tests-1): Update test accordingly. --- lisp/emacs-lisp/cl-print.el | 9 +++++---- test/lisp/emacs-lisp/cl-print-tests.el | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lisp/emacs-lisp/cl-print.el b/lisp/emacs-lisp/cl-print.el index 89a71d1b6c..824d0b7b4f 100644 --- a/lisp/emacs-lisp/cl-print.el +++ b/lisp/emacs-lisp/cl-print.el @@ -105,10 +105,11 @@ (cl-defmethod cl-print-object ((object compiled-function) stream) (if args (prin1 args stream) (princ "()" stream))) - (let ((doc (documentation object 'raw))) - (when doc - (princ " " stream) - (prin1 doc stream))) + (pcase (help-split-fundoc (documentation object 'raw) object) + ;; Drop args which `help-function-arglist' already printed. + (`(,_usage . ,(and doc (guard (stringp doc)))) + (princ " " stream) + (prin1 doc stream))) (let ((inter (interactive-form object))) (when inter (princ " " stream) diff --git a/test/lisp/emacs-lisp/cl-print-tests.el b/test/lisp/emacs-lisp/cl-print-tests.el index dfbe18d784..6448a1b37f 100644 --- a/test/lisp/emacs-lisp/cl-print-tests.el +++ b/test/lisp/emacs-lisp/cl-print-tests.el @@ -34,7 +34,7 @@ (ert-deftest cl-print-tests-1 () (let ((print-circle t)) (should (equal (cl-prin1-to-string `((x . ,x) (y . ,x))) "((x . #1=#s(cl-print--test :a 1 :b 2)) (y . #1#))"))) - (should (string-match "\\`#f(compiled-function (x) .*\n\n.*)\\'" + (should (string-match "\\`#f(compiled-function (x) \"[^\"]+\" [^\)]*)\\'" (cl-prin1-to-string (symbol-function #'caar)))))) (ert-deftest cl-print-tests-2 () -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=0005-Hide-byte-code-in-backtraces-Bug-6991.patch Content-Description: patch >From 593c4758cdf1c177ab103bb506321b964c28cf21 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sun, 11 Jun 2017 09:51:38 -0400 Subject: [PATCH 5/6] Hide byte code in backtraces (Bug#6991) * lisp/emacs-lisp/debug.el (debugger-print-function): New defcustom, defaulting to `cl-print'. (debugger-insert-backtrace): Use it. * etc/NEWS: Announce it. --- etc/NEWS | 5 +++++ lisp/emacs-lisp/debug.el | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index c7a5674e51..21510fe539 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -320,6 +320,11 @@ questions, with a handy way to display help texts. all call stack frames in a Lisp backtrace buffer as lists. Both debug.el and edebug.el have been updated to heed to this variable. +--- +** Values in call stack frames are now displayed using 'cl-prin1'. +The old behaviour of using 'prin1' can be restored by customizing the +new option 'debugger-print-function'. + +++ ** The new variable 'x-ctrl-keysym' has been added to the existing roster of X keysyms. It can be used in combination with another diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index a75242aa5a..3f1b4cddb3 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -49,6 +49,12 @@ (defcustom debugger-batch-max-lines 40 :group 'debugger :version "21.1") +(defcustom debugger-print-function #'cl-prin1 + "Function used to print values in the debugger backtraces." + :type 'function + :options '(cl-prin1 prin1) + :version "26.1") + (defcustom debugger-bury-or-kill 'bury "What to do with the debugger buffer when exiting `debug'. The value affects the behavior of operations on any window @@ -265,10 +271,13 @@ (defun debug (&rest args) debugger-value))) +(defvar cl-print-compiled-button) + (defun debugger-insert-backtrace (frames do-xrefs) "Format and insert the backtrace FRAMES at point. Make functions into cross-reference buttons if DO-XREFS is non-nil." (let ((standard-output (current-buffer)) + (cl-print-compiled-button t) (eval-buffers eval-buffer-list)) (require 'help-mode) ; Define `help-function-def' button type. (pcase-dolist (`(,evald ,fun ,args ,flags) frames) @@ -278,10 +287,10 @@ (defun debugger-insert-backtrace (frames do-xrefs) (fun-pt (point))) (cond ((and evald (not debugger-stack-frame-as-list)) - (prin1 fun) - (if args (prin1 args) (princ "()"))) + (funcall debugger-print-function fun) + (if args (funcall debugger-print-function args) (princ "()"))) (t - (prin1 (cons fun args)) + (funcall debugger-print-function (cons fun args)) (cl-incf fun-pt))) (when fun-file (make-text-button fun-pt (+ fun-pt (length (symbol-name fun))) -- 2.11.1 --=-=-= Content-Type: text/plain Content-Disposition: attachment; filename=0006-Escape-NUL-bytes-in-X-selections-Bug-6991.patch Content-Description: patch >From f0b87839fe2cb8279acde98877f24c5e96f7a307 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 19:47:55 -0500 Subject: [PATCH 6/6] Escape NUL bytes in X selections (Bug#6991) * lisp/term/w32-win.el (w32--set-selection): * lisp/select.el (xselect--encode-string): Replace NUL bytes with "\0". * doc/emacs/killing.texi: Document new behavior. * etc/NEWS (times): Announce it. --- doc/emacs/killing.texi | 4 ++++ etc/NEWS | 4 ++++ lisp/select.el | 3 +++ lisp/term/w32-win.el | 2 +- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/emacs/killing.texi b/doc/emacs/killing.texi index 47de053129..0b5efd04a1 100644 --- a/doc/emacs/killing.texi +++ b/doc/emacs/killing.texi @@ -519,6 +519,10 @@ Clipboard data to the clipboard manager, change the variable @code{x-select-enable-clipboard-manager} to @code{nil}. + Since strings containing NUL bytes are usually truncated when passed +through the clipboard, Emacs replaces such characters with ``\0'' +before transfering them to the system's clipboard. + @vindex select-enable-primary @findex clipboard-kill-region @findex clipboard-kill-ring-save diff --git a/etc/NEWS b/etc/NEWS index 21510fe539..281bacffd0 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -326,6 +326,10 @@ The old behaviour of using 'prin1' can be restored by customizing the new option 'debugger-print-function'. +++ +** NUL bytes in strings copied to the system clipboard are now +replaced with "\0". + ++++ ** The new variable 'x-ctrl-keysym' has been added to the existing roster of X keysyms. It can be used in combination with another variable of this kind to swap modifiers in Emacs. diff --git a/lisp/select.el b/lisp/select.el index 4849d7d515..579c5c7e2e 100644 --- a/lisp/select.el +++ b/lisp/select.el @@ -475,6 +475,9 @@ (defun xselect--encode-string (type str &optional can-modify) (t (error "Unknown selection type: %S" type))))) + ;; Most programs are unable to handle NUL bytes in strings. + (setq str (replace-regexp-in-string "\0" "\\0" str t t)) + (setq next-selection-coding-system nil) (cons type str)))) diff --git a/lisp/term/w32-win.el b/lisp/term/w32-win.el index fda93884c4..be895a040d 100644 --- a/lisp/term/w32-win.el +++ b/lisp/term/w32-win.el @@ -396,7 +396,7 @@ (declare-function w32-selection-exists-p "w32select.c") ;;; Fix interface to (X-specific) mouse.el (defun w32--set-selection (type value) (if (eq type 'CLIPBOARD) - (w32-set-clipboard-data value) + (w32-set-clipboard-data (replace-regexp-in-string "\0" "\\0" value t t)) (put 'x-selections (or type 'PRIMARY) value))) (defun w32--get-selection (&optional type data-type) -- 2.11.1 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Jun 27 12:18:50 2017 Received: (at 6991) by debbugs.gnu.org; 27 Jun 2017 16:18:50 +0000 Received: from localhost ([127.0.0.1]:41032 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPtCU-0002Nz-4a for submit@debbugs.gnu.org; Tue, 27 Jun 2017 12:18:50 -0400 Received: from chene.dit.umontreal.ca ([132.204.246.20]:49166) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dPtCQ-0002Nq-I6 for 6991@debbugs.gnu.org; Tue, 27 Jun 2017 12:18:48 -0400 Received: from ceviche.home (lechon.iro.umontreal.ca [132.204.27.242]) by chene.dit.umontreal.ca (8.14.7/8.14.1) with ESMTP id v5RGIWUm008567; Tue, 27 Jun 2017 12:18:37 -0400 Received: by ceviche.home (Postfix, from userid 20848) id 1531B6627F; Tue, 27 Jun 2017 12:18:27 -0400 (EDT) From: Stefan Monnier To: npostavs@users.sourceforge.net Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers Message-ID: References: <8739tm9vzl.fsf@jidanni.org> <83eg27bjah.fsf@gnu.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> <87wpcwkuug.fsf@users.sourceforge.net> <87zidx3u5u.fsf@users.sourceforge.net> <87o9tdowbh.fsf@users.sourceforge.net> <87mv8vo1zz.fsf@users.sourceforge.net> <87h8z2oqu0.fsf@users.sourceforge.net> <87bmpankvt.fsf@users.sourceforge.net> Date: Tue, 27 Jun 2017 12:18:27 -0400 In-Reply-To: <87bmpankvt.fsf@users.sourceforge.net> (npostavs's message of "Mon, 26 Jun 2017 23:56:54 -0400") 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-Level: X-NAI-Spam-Threshold: 5 X-NAI-Spam-Score: 0.2 X-NAI-Spam-Rules: 3 Rules triggered BLANK_LINES_70_80=0.2, EDT_SA_DN_PASS=0, RV6057=0 X-NAI-Spam-Version: 2.3.0.9418 : core <6057> : inlines <5952> : streams <1751754> : uri <2451881> X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.3 (-) > Anyway, here are the updated patches. Looks good to me, thanks, Stefan From debbugs-submit-bounces@debbugs.gnu.org Thu Jun 29 19:50:47 2017 Received: (at 6991) by debbugs.gnu.org; 29 Jun 2017 23:50:47 +0000 Received: from localhost ([127.0.0.1]:45168 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dQjCw-00044n-UU for submit@debbugs.gnu.org; Thu, 29 Jun 2017 19:50:47 -0400 Received: from mail-io0-f174.google.com ([209.85.223.174]:34033) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dQjCu-00044U-Er; Thu, 29 Jun 2017 19:50:45 -0400 Received: by mail-io0-f174.google.com with SMTP id r36so15937467ioi.1; Thu, 29 Jun 2017 16:50:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=lRvtOVDghxMevz15UWN+vJLvkD30yv5PbLAotWsmwHA=; b=STFoN8J2SDJVk1wrdpniaOujdVd7uHmLpumnbjS4vQ6DuM7iInfTxmxlCAsomgeYvx HVTZ/nHhdmJVLaR4GlbFYJWJpxmjljN8tkm15dr+6k9ZLaGnYMtMeAaedt+rUhCO20bm CQzxmMkjSKd8COyfkOkVui/va9OG94hsCnyG2mNiPtjj+IxppC4WaCg9kvXoYW/NiY6z y2MTEzHwk3QMYJzum8cP64pp5dVN604Es4CCqdzHSmy5gM1NsTi+F4OSgze4fBgd7R1E 4h90haDP8Lqugjm8jdi5Y16E3oJQis0+KV1EexABpCNw/0gS+4puYnB23gU8DMEf4S+j /AGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=lRvtOVDghxMevz15UWN+vJLvkD30yv5PbLAotWsmwHA=; b=svYvM8JZP+ijuas4ivzXDbI66WMFjtGImdABUsXxbj8PMsDJRhdVwxd6YYUM7EZQjz P4/5yhFLovLMt26M4FoESQCq1IJE6Qv1ksvkuCSLK/GgxmWtga2QpAtl0hJrXCYUnYE8 X9BuNE4qLpcuhB14gbXc8q+NEgpNi5Rw+TPZ3jCxvaVnWrJ313SOPDAEayj5RAs32TkW ePjQPSKPgbZtDZvA9u0ezpF6rVPBrXz5ASr7jRD5gT1kUYG+JkjdHDrmlks5y0GLChvs 55FuAy/20g/aNod+VfEGl9Cc7YWIXH/9GvlAV/6WazrPnhyX5Vh2VmzymlDdAnyXYnRm bxkg== X-Gm-Message-State: AKS2vOygv1n+39U5QTPrHVD/Zh/8sHGBS5RfUWJv5/CNZAPYzBl/aK6A hSV7zjrkoRTrijyS X-Received: by 10.107.16.9 with SMTP id y9mr21869402ioi.134.1498780238276; Thu, 29 Jun 2017 16:50:38 -0700 (PDT) Received: from zony ([45.2.7.65]) by smtp.googlemail.com with ESMTPSA id b6sm3513005ioj.31.2017.06.29.16.50.36 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 29 Jun 2017 16:50:37 -0700 (PDT) From: npostavs@users.sourceforge.net To: Stefan Monnier Subject: Re: bug#6991: Please keep bytecode out of *Backtrace* buffers References: <8739tm9vzl.fsf@jidanni.org> <87a8cvlcmk.fsf@users.sourceforge.net> <8360njb9o5.fsf@gnu.org> <877f7zksm0.fsf@users.sourceforge.net> <83oa1a9msk.fsf@gnu.org> <83vavf73ei.fsf@gnu.org> <8360ne6v1q.fsf@gnu.org> <874m2ujh2v.fsf@users.sourceforge.net> <87wpcwkuug.fsf@users.sourceforge.net> <87zidx3u5u.fsf@users.sourceforge.net> <87o9tdowbh.fsf@users.sourceforge.net> <87mv8vo1zz.fsf@users.sourceforge.net> <87h8z2oqu0.fsf@users.sourceforge.net> <87bmpankvt.fsf@users.sourceforge.net> Date: Thu, 29 Jun 2017 19:52:13 -0400 In-Reply-To: (Stefan Monnier's message of "Tue, 27 Jun 2017 12:18:27 -0400") Message-ID: <878tkamjwy.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -2.1 (--) X-Debbugs-Envelope-To: 6991 Cc: lekktu@gmail.com, johnw@gnu.org, 6991@debbugs.gnu.org, Eli Zaretskii , larsi@gnus.org, drew.adams@oracle.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: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.1 (--) tags 6991 fixed close 6991 26.1 quit Stefan Monnier writes: >> Anyway, here are the updated patches. > > Looks good to me, thanks, Thanks for the review, it was very helpful! Pushed to master (with minor fix to make sure debugger-print-function is used only after the commit which defines it, plus some commit message typos). [1: 522e3c1585]: 2017-06-29 19:29:10 -0400 Operate on frame list instead of printed backtrace http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=522e3c15853279bf2a0ed1759c5b0ba3c9e0b7be [2: ead545824e]: 2017-06-29 19:37:25 -0400 Improve ert backtrace recording http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=ead545824e511ab18d18b5223eab80e1f4fe3d64 [3: eb9d3eca80]: 2017-06-29 19:40:22 -0400 Escape control characters in backtraces (Bug#6991) http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=eb9d3eca801c1ea847956a96fafd29eef9bbe5d1 [4: b567c48869]: 2017-06-29 19:40:23 -0400 Don't redundantly cl-print arglist in function docstring again http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=b567c48869b1484c6b1d263afc5cb67f22e99125 [5: 0ae28c71c7]: 2017-06-29 19:40:23 -0400 Hide byte code in backtraces (Bug#6991) http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=0ae28c71c739dfecbe94a5ff6786e81021d2d1cf [6: c87c87fcc3]: 2017-06-29 19:40:23 -0400 Escape NUL bytes in X selections (Bug#6991) http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=c87c87fcc361494815bbd1d92f450b0b80a3ecbb [7: 169532b0eb]: 2017-06-29 19:42:32 -0400 ; Merge: Backtrace printing improvements (Bug#6991) http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=169532b0ebc3acb0b1c943d0b3d8b569cd57ca4b From unknown Sat Jun 21 03:07:15 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Fri, 28 Jul 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 From debbugs-submit-bounces@debbugs.gnu.org Sun Sep 10 22:02:44 2017 Received: (at control) by debbugs.gnu.org; 11 Sep 2017 02:02:44 +0000 Received: from localhost ([127.0.0.1]:60093 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drE3f-0008MJ-Su for submit@debbugs.gnu.org; Sun, 10 Sep 2017 22:02:44 -0400 Received: from mail-io0-f182.google.com ([209.85.223.182]:32967) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drDnc-0007yy-UP for control@debbugs.gnu.org; Sun, 10 Sep 2017 21:46:09 -0400 Received: by mail-io0-f182.google.com with SMTP id y123so17353836iod.0 for ; Sun, 10 Sep 2017 18:46:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=pPefiVZ57p1dhbfqurSQokCmttmbEqwe3KeaZXDfEPE=; b=S94jBOz98G3ix4LaC22IA7OZuRaPv3lJvOKihVIdkA8BBiZwU+GBuIQ5ZlSiJO4H3/ piHAKbXjFKq26ziCXSFZLl1VZFZR1xuSAGpfyndhJf1+6IE8pBwnpSKIEbBZ/O19vU6i X0W0IsIhzIUiJ86eBHxOmkjqXwS3qr1VS5X+Wht2QatIg92YDJDxHUBN035bdcycNQ7O m6oofftf6UV1RgWEWbWVbf7pLb+hrCMOH7v+BVvNWSXC0iSF+Ax+1ntGUwrlsCbXvB9u uluxVgvPW7zlOYUSU4QPXY8OD27/PT+ssY7ozS5USq4mqnPC2HiP2wdzcAVfDsr8UEOc rfAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=pPefiVZ57p1dhbfqurSQokCmttmbEqwe3KeaZXDfEPE=; b=mB7m+i/goDadg4OHMyig0uv+z3skA/q3H6uASY/r38BE6M2mc48Ut4y4PiT7JPcV75 Wmbkg1w2VshZm9eppN+tdyI2E5LnpNRHwVHyTKI92LnyYgcqQJMDCEe2cJHwZ2FSrRzA mQLnPDrklR+NQlTgaZnJgTLpltX6zMFohifR4r0zeNUzY0A8I9Thpd73dSVkeRsPemwK iOWwF+8rCGrCozfCRiT4j+tG0/GK/fom5VQKHmqaDZ27n+uVwEKIIAoBn7pOMEqRKQoG Vcum1clvRa2+x/a6mPOvZakl8xLvTkOQUjUzEbmXgTbbpor8304EefiOSjsodcHn3gXT noXA== X-Gm-Message-State: AHPjjUipx2GXR1yp4lTO9mJweDzqtyXl9ecpdhcQgSZ9PNtAq17gXo9w XLEpz5Dr+YzLPIp7/tJcRtI+z9evz3R/cSM= X-Google-Smtp-Source: AOwi7QCRFi0F5cz231CYg/lGdUvAcswKs0xUMBrx4tao0GT+EWQVdsMVvyHT1FgWbPoB2mOhzgU+5fx5ORXVhDiD4pM= X-Received: by 10.202.252.129 with SMTP id a123mr9524418oii.41.1505094362863; Sun, 10 Sep 2017 18:46:02 -0700 (PDT) MIME-Version: 1.0 Received: by 10.157.37.73 with HTTP; Sun, 10 Sep 2017 18:46:02 -0700 (PDT) From: Rocky Bernstein Date: Sun, 10 Sep 2017 21:46:02 -0400 Message-ID: Subject: To: control@debbugs.gnu.org Content-Type: multipart/alternative; boundary="001a113df414da24cd0558e01623" X-Spam-Score: -0.3 (/) X-Debbugs-Envelope-To: control X-Mailman-Approved-At: Sun, 10 Sep 2017 22:02:41 -0400 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 (/) --001a113df414da24cd0558e01623 Content-Type: text/plain; charset="UTF-8" unarchive 6991 --001a113df414da24cd0558e01623 Content-Type: text/html; charset="UTF-8"
unarchive 6991
--001a113df414da24cd0558e01623-- From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 11 06:58:06 2017 Received: (at 6991) by debbugs.gnu.org; 11 Sep 2017 10:58:07 +0000 Received: from localhost ([127.0.0.1]:60577 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drMPm-00069B-Lp for submit@debbugs.gnu.org; Mon, 11 Sep 2017 06:58:06 -0400 Received: from mail-io0-f177.google.com ([209.85.223.177]:37606) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drMPk-00068b-Rr for 6991@debbugs.gnu.org; Mon, 11 Sep 2017 06:58:05 -0400 Received: by mail-io0-f177.google.com with SMTP id j141so23484072ioj.4 for <6991@debbugs.gnu.org>; Mon, 11 Sep 2017 03:58:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:sender:from:date:message-id:subject:to; bh=UsnYedJDfBswcTIe6KSh0HLodqYJg/JePfDJPuSuvIo=; b=Pmze5X7vyP7cvzBjCBMmz0jKCYm093wy9XeaNf7R006/bgj5QL3hgiExLcieGPykaS XAd0b0ei06EHaKwoI8sMgIEBIpTYUL6GEsUxhrc4sF247zmALE/Cemsiv0cPs3e62XUF ZD+eeagCMEDymwobSyKd14ZU08kt11f5mSQAVz+XaQNZOI12lvNMUYEABfipzRhwMsVs QzZYPojl9rhOCloDsf8sf/0QFwblNzGpIVwJRNS1LBtck2rFTfFqwqk/6aJo8SDPn8Dh p931lNvKvID6X5aZ2jlLg3uGMDVoCvuOgu8ujplg+rayLB4N/WXyeVeMryEKGRDZzesd jAZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:from:date:message-id:subject :to; bh=UsnYedJDfBswcTIe6KSh0HLodqYJg/JePfDJPuSuvIo=; b=Fk4LAetm1d7r72+QXBbBmpMQ4kox3cQkENVxII/Q9TktltRGt3pKUtIi5scmriyXe+ l4ZH36rPAHNMFFmbr2fmGjpbj49y+YAxauEHZzPSYD+wojp9+pex4nPHEA6Om1egenn3 3u0yguGXUSSYimS4lX32R6j0KFaOVENPbzFB9GVrSx5k7gR/kvSdY3hC8vE1Jg60UUM3 f/RXq3/mPZLBPUT1M07ptAzhRvJHfJD/+2GO6tVn5MT4tmLdP2x63QFfXuuDeErC/jol NfNtQJ40Mm6lpuwdpdXsAnjI5JQ0Q2zXOZp1Cf/md94Rj59nnXAvN2ObDMzVxc2zdnZH WvRw== X-Gm-Message-State: AHPjjUiLFkiW7ShsJ8mDGHuWgSCT9wpj3El/OiLtfYgpSgPAAZXQNxyL 8mfSOPeyyNhZLoAg4qgzmlSdkZeltZrySXA= X-Google-Smtp-Source: AOwi7QAcgI+KNyWCuaL3YVfETB5h3JiS4Y0DCDkKzDuJPZi2B32ZchTPwE6iqy3jAG35CSFIao0qNQU+89vvkUFlMdE= X-Received: by 10.202.78.87 with SMTP id c84mr11607786oib.252.1505127478725; Mon, 11 Sep 2017 03:57:58 -0700 (PDT) MIME-Version: 1.0 Received: by 10.157.37.73 with HTTP; Mon, 11 Sep 2017 03:57:58 -0700 (PDT) From: Rocky Bernstein Date: Mon, 11 Sep 2017 06:57:58 -0400 X-Google-Sender-Auth: MrR2UTcy3KKuWkbwDZJ3Egt1rOY Message-ID: Subject: bug#6991 To: 6991@debbugs.gnu.org Content-Type: multipart/alternative; boundary="001a1134e26ab610d90558e7cc02" X-Spam-Score: -2.1 (--) X-Debbugs-Envelope-To: 6991 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.1 (--) --001a1134e26ab610d90558e7cc02 Content-Type: text/plain; charset="UTF-8" have started looking at decompiling ELISP bytecode using the techniques from uncompyle6 . So far the results are promising. Of course one isn't going to get the exact source text back. For the bytecode for source text (setq a nil) (setq b nil) when decompiled gives the equivalent: (setq a (setq b nil)) And macros will be in their expanded form. But I believe nevertheless programmers will have a very good idea of what was going on when an error was raised. --001a1134e26ab610d90558e7cc02 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
<= br> have started looking at decompiling ELISP bytecode using the tec= hniques from=C2=A0uncompyle6=C2=A0.=C2=A0

So far the resu= lts are promising. Of course one isn't going to get the exact source te= xt back.=C2=A0

For the bytecode for source text

=C2=A0 =C2=A0(se= tq a nil)
=C2=A0 =C2= =A0(setq b nil)

when decompiled= gives the equivalent:=C2=A0

=C2=A0 =C2=A0 =C2=A0 (setq= a (setq b nil))

<= /font>
And macros will be in their expanded form. But I believe nevertheless=20 programmers will have a very good idea of what was going on when an=20 error was raised.

--001a1134e26ab610d90558e7cc02-- From debbugs-submit-bounces@debbugs.gnu.org Mon Sep 11 10:28:21 2017 Received: (at 6991) by debbugs.gnu.org; 11 Sep 2017 14:28:21 +0000 Received: from localhost ([127.0.0.1]:33579 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drPhF-0004mu-7U for submit@debbugs.gnu.org; Mon, 11 Sep 2017 10:28:21 -0400 Received: from eggs.gnu.org ([208.118.235.92]:34049) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drPhD-0004mh-Jg for 6991@debbugs.gnu.org; Mon, 11 Sep 2017 10:28:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1drPh7-0006zT-L9 for 6991@debbugs.gnu.org; Mon, 11 Sep 2017 10:28:14 -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]:59867) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drPgy-0006tr-Jc; Mon, 11 Sep 2017 10:28:04 -0400 Received: from 84.94.185.246.cable.012.net.il ([84.94.185.246]:4300 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1drPgx-0001Dt-J7; Mon, 11 Sep 2017 10:28:04 -0400 Date: Mon, 11 Sep 2017 17:28:01 +0300 Message-Id: <83bmmhtimm.fsf@gnu.org> From: Eli Zaretskii To: Rocky Bernstein In-reply-to: (message from Rocky Bernstein on Mon, 11 Sep 2017 06:57:58 -0400) Subject: Re: bug#6991: References: <8739tm9vzl.fsf@jidanni.org> 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: 6991 Cc: 6991@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: , Reply-To: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) > From: Rocky Bernstein > Date: Mon, 11 Sep 2017 06:57:58 -0400 > > have started looking at decompiling ELISP bytecode using the techniques from uncompyle6 . > > So far the results are promising. Of course one isn't going to get the exact source text back. > > For the bytecode for source text > > (setq a nil) > (setq b nil) > > when decompiled gives the equivalent: > > (setq a (setq b nil)) > > And macros will be in their expanded form. But I believe nevertheless programmers will have a very good idea > of what was going on when an error was raised. Sounds interesting and potentially useful. Please keep up the good work. Thanks. From debbugs-submit-bounces@debbugs.gnu.org Tue Sep 12 21:13:12 2017 Received: (at 6991) by debbugs.gnu.org; 13 Sep 2017 01:13:12 +0000 Received: from localhost ([127.0.0.1]:36679 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drwEq-0000YH-EK for submit@debbugs.gnu.org; Tue, 12 Sep 2017 21:13:12 -0400 Received: from mail-oi0-f51.google.com ([209.85.218.51]:34927) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1drwEo-0000Y2-94 for 6991@debbugs.gnu.org; Tue, 12 Sep 2017 21:13:10 -0400 Received: by mail-oi0-f51.google.com with SMTP id z73so34621314oia.2 for <6991@debbugs.gnu.org>; Tue, 12 Sep 2017 18:13:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=nEEXM5AftajI+sN3bZ+4XK0Cn0pImv+hCd3PGo8NU9I=; b=LERnKOl/5vXQK+xGCMvX2omQy2bba6guafJWukRPJ5lMHrUsfUfWmw9CfHpeZUPba3 1KDBMsxafZKj+KiESkOOKh9wmh+xbBbNdA490BwrngRAac+nBOc+hHELgnBWGqbRNO7J ZKDaqHUC1cyn0T86XPYG6Cja9VK8H4/DWMwuoJUb+nLyCtSxYnQVM/oopqJLHkf+ABOk 1hZZEZyAZ+zEj7YHt49dUQ6TEh6ztsF7orV/t21rfUG8bBkm4Xy0jFPCF26o5q+CNMCw NWuUj/MtIWnBp9vQUWalhfE1CMpTpTSgsS7RuxK2dJlI/YyrooV7s7MTZHBCr1mScKQV E+1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=nEEXM5AftajI+sN3bZ+4XK0Cn0pImv+hCd3PGo8NU9I=; b=YjqDD7Jl32i2lOoorPOSavevJUnZWovsdDine7uhIL+u1XsS5DxHLjXERsxKHazvK+ zITj7Z22ZnRoZjCMPXQkD0I9vokAspG0VhZ67/kMR1qxbDap/suWbqr8mwO6djZ38OU9 uaU96oTyEtIkk1nxU8u9Si4DgWKG2G6zTXP0jP+BzlcQEor92Usy9xrg/Ri61n4JxGei RquJZH2hNlWPOlY+Vi4YZiY5ErdRWf9eDpl94W1soFCm+UQM/hNf61z+8SHh+pDuvgix G7Q4x85+kKUsTlY4NPA81HyNfHGv9h+vxl5tCpatB1faTE1EMics6Hgm01SghCnJCCeJ fq3A== X-Gm-Message-State: AHPjjUhy5m6yWszhupjo5JjePNFgJrZYzGNlsNrehaxeqMSLDZ1nCC73 b6+qZMqE+mYTC02YPNESFrIcWOOCS8m1Et4jsm3M/cFk X-Google-Smtp-Source: AOwi7QDNoha3VXL1Gf1ch6oivoltVaP3DL+CXu9MG88EFOFFMHyPM1gG/AISeqROVoxLnI4fg6AjxONDkD0gbCTNFqU= X-Received: by 10.202.180.84 with SMTP id d81mr17994728oif.15.1505265184308; Tue, 12 Sep 2017 18:13:04 -0700 (PDT) MIME-Version: 1.0 Received: by 10.157.24.109 with HTTP; Tue, 12 Sep 2017 18:13:03 -0700 (PDT) In-Reply-To: <83bmmhtimm.fsf@gnu.org> References: <8739tm9vzl.fsf@jidanni.org> <83bmmhtimm.fsf@gnu.org> From: Rocky Bernstein Date: Tue, 12 Sep 2017 21:13:03 -0400 X-Google-Sender-Auth: eQUkSAMQ-7xCjShkAYzhkNxzUAM Message-ID: Subject: Re: bug#6991: To: Eli Zaretskii Content-Type: multipart/alternative; boundary="001a113d3f569a87d9055907dc3c" X-Spam-Score: 0.2 (/) X-Debbugs-Envelope-To: 6991 Cc: 6991@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.2 (/) --001a113d3f569a87d9055907dc3c Content-Type: text/plain; charset="UTF-8" Thanks for the kind words. Right now I see no obstacles to getting this done. Just lots of work, and not enough hands. I'm going to try to get the local Emacs group interested in helping out. And if not in this, then contributing to documenting bytecode in of itself is something that would be of value. What I have right now is at https://github.com/rocky/elisp-decompile . Alas, for expediency it is right now written in Python. On Mon, Sep 11, 2017 at 10:28 AM, Eli Zaretskii wrote: > > From: Rocky Bernstein > > Date: Mon, 11 Sep 2017 06:57:58 -0400 > > > > have started looking at decompiling ELISP bytecode using the techniques > from uncompyle6 . > > > > So far the results are promising. Of course one isn't going to get the > exact source text back. > > > > For the bytecode for source text > > > > (setq a nil) > > (setq b nil) > > > > when decompiled gives the equivalent: > > > > (setq a (setq b nil)) > > > > And macros will be in their expanded form. But I believe nevertheless > programmers will have a very good idea > > of what was going on when an error was raised. > > Sounds interesting and potentially useful. Please keep up the good > work. > > Thanks. > --001a113d3f569a87d9055907dc3c Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Thanks for the kind words. Right now I see no obstacles to= getting this done. Just lots of work, and not enough hands. I'm going = to try to get the local Emacs group interested in helping out. And if not i= n this, then contributing to documenting bytecode in of itself is something= that would be of value.

What I have =C2=A0right no= w is at=C2=A0https://g= ithub.com/rocky/elisp-decompile . Alas, for expediency it is right now = written in Python.=C2=A0

On Mon, Sep 11, 2017 at 10:28 AM, Eli Zaretskii <eliz@= gnu.org> wrote:
> From: = Rocky Bernstein <rocky@gnu.org><= br> > Date: Mon, 11 Sep 2017 06:57:58 -0400
>
> have started looking at decompiling ELISP bytecode using the technique= s from uncompyle6 .
>
> So far the results are promising. Of course one isn't going to get= the exact source text back.
>
> For the bytecode for source text
>
> (setq a nil)
> (setq b nil)
>
> when decompiled gives the equivalent:
>
> (setq a (setq b nil))
>
> And macros will be in their expanded form. But I believe nevertheless = programmers will have a very good idea
> of what was going on when an error was raised.

Sounds interesting and potentially useful.=C2=A0 Please keep up the good work.

Thanks.

--001a113d3f569a87d9055907dc3c-- From unknown Sat Jun 21 03:07:15 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Wed, 11 Oct 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