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 buffer-length () (the bufsize 10))
(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 about CCL visit http://ccl.clozure.com. To enquire about Clozure's Common Lisp consulting services e-mail info@clozure.com or visit http://www.clozure.com.
? (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. More information about SBCL is available at http://www.sbcl.org/.
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
On 2015/9/2 23:34, Patrick Stein wrote:
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 buffer-length () (the bufsize 10))
(defun calculate-new-buffer-length (new-capacity) (declare (type bufsize new-capacity)) (min (buffer-length) new-capacity))
[…]
Filed as [ticket][397]. Your case definitely seems to be a bug in our compiler. Having such nicely specified, small test cases helps us immensely in tracking down problems in the current compiler.
[397]: http://abcl.org/trac/ticket/397
Thanks for the bug report.
I distilled the test case down when I was trying to track down why my USERIAL library was failing with ABCL in CL-TEST-GRID:
https://common-lisp.net/project/cl-test-grid/library/userial.html https://common-lisp.net/project/cl-test-grid/library/userial.html http://cl-test-grid.appspot.com/blob?key=k3y3y5ama1 http://cl-test-grid.appspot.com/blob?key=k3y3y5ama1
I don’t think that’s going to lend any more insight than the case below. But, anyhow….
Thanks, Patrick
On Sep 2, 2015, at 5:34 PM, Mark Evenson evenson@panix.com wrote:
On 2015/9/2 23:34, Patrick Stein wrote:
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 buffer-length () (the bufsize 10))
(defun calculate-new-buffer-length (new-capacity) (declare (type bufsize new-capacity)) (min (buffer-length) new-capacity))
[…]
Filed as [ticket][397]. Your case definitely seems to be a bug in our compiler. Having such nicely specified, small test cases helps us immensely in tracking down problems in the current compiler.
[397]: http://abcl.org/trac/ticket/397 http://abcl.org/trac/ticket/397
Thanks for the bug report.
-- "A screaming comes across the sky. It has happened before, but there is nothing to compare to it now."
armedbear-devel@common-lisp.net