This is a short program for which the compiler creates a file it cannot load. Save this program to a file, then try: (load (compile-file “this-file.lisp”))
;;; This program causes the ABCL compiler to generate code it cannot load.
;;; The code compiles and loads correctly if you do any of the following:
;;; * change BUFSIZE to be 'INTEGER instead of '(INTEGER 0 100)
;;; * delete the INLINE declaration for BUFFER-LENGTH
;;; * delete the FTYPE declaration for BUFFER-LENGTH
;;; * delete the TYPE declaration for NEW-CAPACITY
(deftype bufsize () '(integer 0 100))
(declaim (inline buffer-length)
(ftype (function () bufsize) buffer-length))
(defun calculate-new-buffer-length (new-capacity)
(declare (type bufsize new-capacity))
(min (buffer-length) new-capacity))
As noted in the comment, it is very finicky. There are at least four ways this code could be slightly less-specific and then not trigger the bug. I tried it both with ABCL-1.3.1 and ABCL-1.3.2. The logs of the output are below.
I’d love to be able to say that I’m looking at the compiler now to try to figure out where it’s going wrong, but realistically, I’m not going to have time to delve into it myself, I’ve never really looked at the ABCL compiler before, and I suspect the problem is in the compiling but doesn’t show up until the loading… so it won’t be as easy as exploring the stack when the error shows up.
Thanks,
Patrick
Script started on Tue Sep 1 16:33:56 2015
bash-3.2$ cat compile-problem.lisp
;;; This program causes the ABCL compiler to generate code it cannot load.
;;;
;;; The code compiles and loads correctly if you do any of the following:
;;; * change BUFSIZE to be 'INTEGER instead of '(INTEGER 0 100)
;;; * delete the INLINE declaration for BUFFER-LENGTH
;;; * delete the FTYPE declaration for BUFFER-LENGTH
;;; * delete the TYPE declaration for NEW-CAPACITY
(deftype bufsize () '(integer 0 100))
(declaim (inline buffer-length)
(ftype (function () bufsize) buffer-length))
(defun buffer-length ()
(the bufsize 10))
(defun calculate-new-buffer-length (new-capacity)
(declare (type bufsize new-capacity))
(min (buffer-length) new-capacity))
bash-3.2$ ABCL_HOME=/usr/local/src/abcl-1.3.2 abcl
Armed Bear Common Lisp 1.3.2
Java 1.8.0_45 Oracle Corporation
Java HotSpot(TM) 64-Bit Server VM
Low-level initialization completed in 0.524 seconds.
Startup completed in 2.65 seconds.
Type ":help" for a list of available commands.
CL-USER(1): (load (compile-file "compile-problem.lisp"))
; Compiling /Users/pat/compile-problem.lisp ...
; (DEFTYPE BUFSIZE ...)
; (DECLAIM (INLINE BUFFER-LENGTH) ...)
; (DEFUN BUFFER-LENGTH ...)
; (DEFUN CALCULATE-NEW-BUFFER-LENGTH ...)
; Wrote /Users/pat/compile-problem.abcl (0.208 seconds)
java.lang.VerifyError: (class: org/armedbear/lisp/compile_problem_2, method: execute signature: (Lorg/armedbear/lisp/LispObject;)Lorg/armedbear/lisp/LispObject;) Unable to pop operand off an empty stack
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getConstructor0(Class.java:3075)
at java.lang.Class.newInstance(Class.java:412)
at org.armedbear.lisp.FaslClassLoader.loadFunction(FaslClassLoader.java:130)
at org.armedbear.lisp.FaslClassLoader$pf_get_fasl_function.execute(FaslClassLoader.java:165)
at org.armedbear.lisp.LispThread.execute(LispThread.java:832)
at org.armedbear.lisp.Lisp.evalCall(Lisp.java:582)
at org.armedbear.lisp.Lisp.eval(Lisp.java:540)
at org.armedbear.lisp.Lisp.evalCall(Lisp.java:577)
at org.armedbear.lisp.Lisp.eval(Lisp.java:540)
at org.armedbear.lisp.Load.faslLoadStream(Load.java:667)
at org.armedbear.lisp.Load$init_fasl.execute(Load.java:457)
at org.armedbear.lisp.LispThread.execute(LispThread.java:832)
at org.armedbear.lisp.Lisp.evalCall(Lisp.java:582)
at org.armedbear.lisp.Lisp.eval(Lisp.java:540)
at org.armedbear.lisp.Load.loadStream(Load.java:629)
at org.armedbear.lisp.Load.loadFileFromStream(Load.java:597)
at org.armedbear.lisp.Load.load(Load.java:224)
at org.armedbear.lisp.Load.load(Load.java:745)
at org.armedbear.lisp.Load$_load.execute(Load.java:693)
at org.armedbear.lisp.Symbol.execute(Symbol.java:852)
at org.armedbear.lisp.LispThread.execute(LispThread.java:894)
at org.armedbear.lisp.load_1.execute(load.lisp:33)
at org.armedbear.lisp.CompiledClosure.execute(CompiledClosure.java:98)
at org.armedbear.lisp.LispThread.execute(LispThread.java:814)
at org.armedbear.lisp.Lisp.evalCall(Lisp.java:575)
at org.armedbear.lisp.Lisp.eval(Lisp.java:540)
at org.armedbear.lisp.Lisp.eval(Lisp.java:538)
at org.armedbear.lisp.Primitives$pf__eval.execute(Primitives.java:345)
at org.armedbear.lisp.LispThread.execute(LispThread.java:814)
at org.armedbear.lisp.Lisp.evalCall(Lisp.java:575)
at org.armedbear.lisp.Lisp.eval(Lisp.java:540)
at org.armedbear.lisp.Lisp.progn(Lisp.java:709)
at org.armedbear.lisp.Primitives$sf_block.execute(Primitives.java:3742)
at org.armedbear.lisp.Lisp.eval(Lisp.java:530)
at org.armedbear.lisp.Lisp.progn(Lisp.java:709)
at org.armedbear.lisp.Closure.execute(Closure.java:220)
at org.armedbear.lisp.Closure.execute(Closure.java:148)
at org.armedbear.lisp.LispThread.execute(LispThread.java:814)
at org.armedbear.lisp.Lisp$1.execute(Lisp.java:285)
at org.armedbear.lisp.Symbol.execute(Symbol.java:803)
at org.armedbear.lisp.LispThread.execute(LispThread.java:814)
at org.armedbear.lisp.top_level_47.execute(top-level.lisp:407)
at org.armedbear.lisp.CompiledClosure.execute(CompiledClosure.java:89)
at org.armedbear.lisp.Symbol.execute(Symbol.java:793)
at org.armedbear.lisp.LispThread.execute(LispThread.java:798)
at org.armedbear.lisp.top_level_48.execute(top-level.lisp:415)
at org.armedbear.lisp.LispThread.execute(LispThread.java:798)
at org.armedbear.lisp.Interpreter.run(Interpreter.java:361)
at org.armedbear.lisp.Main$1.run(Main.java:48)
at java.lang.Thread.run(Thread.java:745)
Error loading /Users/pat/compile-problem.abcl at line 15 (offset 668)
#<THREAD "interpreter" {33E81276}>: Debugger invoked on condition of type ERROR
Compiled function can't be loaded: org.armedbear.lisp.compile_problem_2 from org.armedbear.lisp.Pathname@2acec9eb
Restarts:
0: TOP-LEVEL Return to top level.
[1] CL-USER(2): 0
CL-USER(3): (quit)
bash-3.2$ ABCL_HOME=/usr/local/src/abcl-bin-1.3.1 abcl
Armed Bear Common Lisp 1.3.1
Java 1.8.0_45 Oracle Corporation
Java HotSpot(TM) 64-Bit Server VM
Low-level initialization completed in 0.471 seconds.
Startup completed in 2.651 seconds.
Type ":help" for a list of available commands.
CL-USER(1): (load (compile-file "compile-problem.lisp"))
; Compiling /Users/pat/compile-problem.lisp ...
; (DEFTYPE BUFSIZE ...)
; (DECLAIM (INLINE BUFFER-LENGTH) ...)
; (DEFUN BUFFER-LENGTH ...)
; (DEFUN CALCULATE-NEW-BUFFER-LENGTH ...)
; Wrote /Users/pat/compile-problem.abcl (0.199 seconds)
java.lang.VerifyError: (class: org/armedbear/lisp/compile_problem_2, method: execute signature: (Lorg/armedbear/lisp/LispObject;)Lorg/armedbear/lisp/LispObject;) Unable to pop operand off an empty stack
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getConstructor0(Class.java:3075)
at java.lang.Class.newInstance(Class.java:412)
at org.armedbear.lisp.FaslClassLoader.loadFunction(FaslClassLoader.java:130)
at org.armedbear.lisp.FaslClassLoader$pf_get_fasl_function.execute(FaslClassLoader.java:165)
at org.armedbear.lisp.LispThread.execute(LispThread.java:832)
at org.armedbear.lisp.Lisp.evalCall(Lisp.java:582)
at org.armedbear.lisp.Lisp.eval(Lisp.java:540)
at org.armedbear.lisp.Lisp.evalCall(Lisp.java:577)
at org.armedbear.lisp.Lisp.eval(Lisp.java:540)
at org.armedbear.lisp.Load.faslLoadStream(Load.java:667)
at org.armedbear.lisp.Load$init_fasl.execute(Load.java:457)
at org.armedbear.lisp.LispThread.execute(LispThread.java:832)
at org.armedbear.lisp.Lisp.evalCall(Lisp.java:582)
at org.armedbear.lisp.Lisp.eval(Lisp.java:540)
at org.armedbear.lisp.Load.loadStream(Load.java:629)
at org.armedbear.lisp.Load.loadFileFromStream(Load.java:597)
at org.armedbear.lisp.Load.load(Load.java:224)
at org.armedbear.lisp.Load.load(Load.java:745)
at org.armedbear.lisp.Load$_load.execute(Load.java:693)
at org.armedbear.lisp.Symbol.execute(Symbol.java:852)
at org.armedbear.lisp.LispThread.execute(LispThread.java:894)
at org.armedbear.lisp.load_1.execute(load.lisp:33)
at org.armedbear.lisp.CompiledClosure.execute(CompiledClosure.java:98)
at org.armedbear.lisp.LispThread.execute(LispThread.java:814)
at org.armedbear.lisp.Lisp.evalCall(Lisp.java:575)
at org.armedbear.lisp.Lisp.eval(Lisp.java:540)
at org.armedbear.lisp.Lisp.eval(Lisp.java:538)
at org.armedbear.lisp.Primitives$pf__eval.execute(Primitives.java:345)
at org.armedbear.lisp.LispThread.execute(LispThread.java:814)
at org.armedbear.lisp.Lisp.evalCall(Lisp.java:575)
at org.armedbear.lisp.Lisp.eval(Lisp.java:540)
at org.armedbear.lisp.Lisp.progn(Lisp.java:709)
at org.armedbear.lisp.Primitives$sf_block.execute(Primitives.java:3742)
at org.armedbear.lisp.Lisp.eval(Lisp.java:530)
at org.armedbear.lisp.Lisp.progn(Lisp.java:709)
at org.armedbear.lisp.Closure.execute(Closure.java:220)
at org.armedbear.lisp.Closure.execute(Closure.java:148)
at org.armedbear.lisp.LispThread.execute(LispThread.java:814)
at org.armedbear.lisp.Lisp$1.execute(Lisp.java:285)
at org.armedbear.lisp.Symbol.execute(Symbol.java:803)
at org.armedbear.lisp.LispThread.execute(LispThread.java:814)
at org.armedbear.lisp.top_level_47.execute(top-level.lisp:407)
at org.armedbear.lisp.CompiledClosure.execute(CompiledClosure.java:89)
at org.armedbear.lisp.Symbol.execute(Symbol.java:793)
at org.armedbear.lisp.LispThread.execute(LispThread.java:798)
at org.armedbear.lisp.top_level_48.execute(top-level.lisp:415)
at org.armedbear.lisp.LispThread.execute(LispThread.java:798)
at org.armedbear.lisp.Interpreter.run(Interpreter.java:361)
at org.armedbear.lisp.Main$1.run(Main.java:48)
at java.lang.Thread.run(Thread.java:745)
Error loading /Users/pat/compile-problem.abcl at line 15 (offset 668)
#<THREAD "interpreter" {3F8D7E88}>: Debugger invoked on condition of type ERROR
Compiled function can't be loaded: org.armedbear.lisp.compile_problem_2 from org.armedbear.lisp.Pathname@28015d1d
Restarts:
0: TOP-LEVEL Return to top level.
[1] CL-USER(2): 0
CL-USER(3): (quit)
bash-3.2$ ccl --no-init
Welcome to Clozure Common Lisp Version 1.11-dev-r16393-trunk (DarwinX8664)!
CCL is developed and maintained by Clozure Associates. For more information
? (load (compile-file "compile-problem.lisp"))
#P"/Users/pat/compile-problem.dx64fsl"
? (quit)
bash-3.2$ sbcl --no-init
This is SBCL 1.2.3.13-3446e1a-dirty, an implementation of ANSI Common Lisp.
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
* (load (compile-file "compile-problem.lisp"))
; compiling file "/Users/pat/compile-problem.lisp" (written 01 SEP 2015 04:33:38 PM):
; compiling (DEFTYPE BUFSIZE ...)
; compiling (DECLAIM (INLINE BUFFER-LENGTH) ...)
; compiling (DEFUN BUFFER-LENGTH ...)
; compiling (DEFUN CALCULATE-NEW-BUFFER-LENGTH ...)
; /Users/pat/compile-problem.fasl written
; compilation finished in 0:00:00.007
T
* (quit)
bash-3.2$ exit
Script done on Tue Sep 1 16:36:21 2015