From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: npostavs@users.sourceforge.net Newsgroups: gmane.emacs.bugs Subject: bug#24122: Fix byte-compile of interactive closures Date: Sun, 31 Jul 2016 22:23:08 -0400 Message-ID: <87invl9qib.fsf@users.sourceforge.net> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: blaine.gmane.org 1470018272 12039 80.91.229.8 (1 Aug 2016 02:24:32 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Mon, 1 Aug 2016 02:24:32 +0000 (UTC) To: 24122@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Aug 01 04:24:19 2016 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bU2tr-00034D-Ry for geb-bug-gnu-emacs@m.gmane.org; Mon, 01 Aug 2016 04:24:16 +0200 Original-Received: from localhost ([::1]:41531 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bU2tn-0003WE-UT for geb-bug-gnu-emacs@m.gmane.org; Sun, 31 Jul 2016 22:24:11 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:33563) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bU2ti-0003W8-D7 for bug-gnu-emacs@gnu.org; Sun, 31 Jul 2016 22:24:07 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bU2te-0008Vg-7j for bug-gnu-emacs@gnu.org; Sun, 31 Jul 2016 22:24:05 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:55154) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bU2te-0008Vc-3R for bug-gnu-emacs@gnu.org; Sun, 31 Jul 2016 22:24:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1bU2td-0002H6-St for bug-gnu-emacs@gnu.org; Sun, 31 Jul 2016 22:24:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: npostavs@users.sourceforge.net Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 01 Aug 2016 02:24:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 24122 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.14700181988693 (code B ref -1); Mon, 01 Aug 2016 02:24:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 1 Aug 2016 02:23:18 +0000 Original-Received: from localhost ([127.0.0.1]:52451 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bU2sv-0002G8-Ke for submit@debbugs.gnu.org; Sun, 31 Jul 2016 22:23:17 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:42502) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bU2su-0002Fr-Ev for submit@debbugs.gnu.org; Sun, 31 Jul 2016 22:23:16 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bU2so-0008Iy-96 for submit@debbugs.gnu.org; Sun, 31 Jul 2016 22:23:11 -0400 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:50933) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bU2so-0008Ir-5k for submit@debbugs.gnu.org; Sun, 31 Jul 2016 22:23:10 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:33467) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bU2sl-0003Ch-SP for bug-gnu-emacs@gnu.org; Sun, 31 Jul 2016 22:23:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bU2si-0008IG-Ml for bug-gnu-emacs@gnu.org; Sun, 31 Jul 2016 22:23:07 -0400 Original-Received: from mail-io0-x22a.google.com ([2607:f8b0:4001:c06::22a]:34131) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bU2si-0008I5-Hw for bug-gnu-emacs@gnu.org; Sun, 31 Jul 2016 22:23:04 -0400 Original-Received: by mail-io0-x22a.google.com with SMTP id q83so175371819iod.1 for ; Sun, 31 Jul 2016 19:23:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:subject:date:message-id:mime-version; bh=iPVCMx5aNdk38qwQF4yYc9raRzaLl7V0kkWXG9FJD64=; b=ElMuXyz3YAqkIBGaQbXxDTpjNz7l4DJN+zYYk8Xatwxq6ZjLkvBPO72B9Smu5aKHNc uQ7yIGzGL/jnvWsiv6o5xLYqqz6qkPzhJiMHxYqHtr9/Aas0aUQrIhTqfXeE33R7LGlj pI8cewWaUdhOwZALzx78vYF+xyi2mFjLHPYAfld5vhbD+ctj0fSxkS6AeKd8EG4zKTPP pLMhZUjjWbbg3qtszhRwRQ/CWueLSawjdXvnkj4aYxE3fzD9AHQhO0TZaFhEykjvVRfP NVGLwijae1t1eSQlV0XMfNpzh8jxTgLPqdmqZUSCl2iVbTsx5b+VrDeS1EOdXlyNEUdD ClPQ== 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:date:message-id :mime-version; bh=iPVCMx5aNdk38qwQF4yYc9raRzaLl7V0kkWXG9FJD64=; b=D5aOrHI4LFmGIQrqNR39APwW/2lZq6X+283CV8Yw+1UzAgBiHlsIIJvXi3FvmxO1a/ qIc3cV4JHqBx8qLqFiVOtWjqwyFmBLViPEAJ9www/IINd1hIipW4ttecmGkRWuaS5zR9 0gcvQHjTnW60z9Z3hlEX1W/Zze7cn//M4a4W7qwhtzQdlAYSdRW8pzN46h3A1wM8f47w XT9N0b824NmEY6b2YJ0Xzr+TK6WdHpzHYFcoma9HmQWVJxfc2aI/b9Br8t5IeKbdTxEH AcZa6n11Rvx17Jj53iB0QJEwLKveWo0CcQGdh4y9eKpXDLj8DtMGdLtJcbf1KDEQWDFk 3McQ== X-Gm-Message-State: AEkoouvcujvml2dvo4cpcfTNS8glnguHiaJPKaXXrKFvJK5VprqE+idkpCqV2sltBUTnbw== X-Received: by 10.107.182.8 with SMTP id g8mr51523433iof.53.1470018183975; Sun, 31 Jul 2016 19:23:03 -0700 (PDT) Original-Received: from zony (206-188-64-44.cpe.distributel.net. [206.188.64.44]) by smtp.googlemail.com with ESMTPSA id o5sm6894031ith.20.2016.07.31.19.23.02 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 31 Jul 2016 19:23:03 -0700 (PDT) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:121751 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Severity: minor tags: patch found: 24.3 found: 25.1 Running emacs -Q -l bug-byte-compile.el gives bug-byte-compile.el:Warning: misplaced interactive spec: =E2=80=98(inte= ractive)=E2=80=99 where bug-byte-compile.el is --=-=-= Content-Type: text/plain Content-Disposition: inline; filename=bug-byte-compile.el Content-Description: bug demo ;;; -*- lexical-binding: t -*- (let ((foo--var nil)) (defun foo () (interactive) foo--var)) (byte-compile 'foo) --=-=-= Content-Type: text/plain The problem is that byte-compile--reify-function which puts the bindings inside the closure bindings inside the function body as an optimization, puts them in front of the docstring and (interactive ...) form. Here is a fix: --=-=-= Content-Type: text/plain Content-Disposition: inline; filename=v1-0001-Fix-byte-compile-of-interactive-closures.patch Content-Description: patch >From 46cf05f447a7c834789c5ce8805cb5997c685c43 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sun, 31 Jul 2016 20:46:37 -0400 Subject: [PATCH v1] Fix byte-compile of interactive closures * lisp/emacs-lisp/bytecomp.el (byte-compile--reify-function): Put bindings after docstring and `interactive' form, if any. --- lisp/emacs-lisp/bytecomp.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index dc7574e..175690a 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -2582,7 +2582,13 @@ byte-compile--reify-function (pcase-let* (((or (and `(lambda ,args . ,body) (let env nil)) `(closure ,env ,args . ,body)) fun) + (preamble nil) (renv ())) + ;; Split docstring and `interactive' form from body. + (when (stringp (car body)) + (push (pop body) preamble)) + (when (eq (car-safe (car body)) 'interactive) + (push (pop body) preamble)) ;; Turn the function's closed vars (if any) into local let bindings. (dolist (binding env) (cond @@ -2595,8 +2601,8 @@ byte-compile--reify-function ((eq binding t)) (t (push `(defvar ,binding) body)))) (if (null renv) - `(lambda ,args ,@body) - `(lambda ,args (let ,(nreverse renv) ,@body))))) + `(lambda ,args ,@preamble ,@body) + `(lambda ,args ,@preamble (let ,(nreverse renv) ,@body))))) ;;;###autoload (defun byte-compile (form) -- 2.8.0 --=-=-=--