emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Compiled code in Emacs-26 will fail in Emacs-25 if use pcase [was: A


From: Richard Copley
Subject: Re: Compiled code in Emacs-26 will fail in Emacs-25 if use pcase [was: Add new bytecode op `switch' for implementing branch tables.]
Date: Thu, 23 Feb 2017 08:36:14 +0000

On 23 February 2017 at 04:35, Tino Calancha <address@hidden> wrote:
>
> Sorry if this is obvious, then just ignore.
>
> I have a custom lib using `pcase' somewhere.  That lib is
> compatible with Emacs25.
> Usually i compile this lib against the master branch.  Then, i load
> that very same resulting .elc in Emacs-25 and runs same as in Emacs-26.
> (Maybe this is just wrong and i must keep separated .elc)
>
> After the new bytecode those parts of the lib using pcase fail.
> For instance, put the following in a file:
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> (defun test-case ()
>   (let ((val "foo"))
>     (pcase val
>       ("foo" "foo")
>       ("bar" "bar")
>       (_ (error "Neither 'foo' nor 'bar'")))))
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> I) Compile under master branch.
> II) Load the resultant .elc with Emacs-25
> II) M-: (test-case)
> ;; Signal error: Invalid byte opcode: op=183, ptr=4
>
> So, in conclusion:
> From now on, we need to keep two separated .elc in such custom libs, right?

Yes, ideally.

You need to arrange not to run byte-compiled libs in an earlier
version of Emacs than where they were compiled. This isn't a new
requirement. There has never been a guarantee that newer versions'
bytecode will run on older versions, but in reality incompatible
changes don't happen every day so at times you could get away with
ignoring the issue.

There are various options that avoid the problem.
* keep your `load-path' entries version specific
* don't byte compile libs that are shared between versions
* byte compile them with the earliest Emacs you'll use
* don't use different versions of Emacs

Eli recommended the first option (the same one you suggested) to me,
see #14513. In `emacs -Q' by default all `load-path' entries are in a
version-specific subdirectory.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]