ruricolist / serapeum

Utilities beyond Alexandria
MIT License
425 stars 42 forks source link

Can't build with SBCL if declarations are ON #46

Closed nsrahmad closed 4 years ago

nsrahmad commented 4 years ago

It gets stuck in infinte recursion. The declaration in question is:

(proclaim '(optimize (safety 3) (speed 0) (compilation-speed 0) (debug 3)))

Output:

➜  ~ sbcl                                                                                                               
This is SBCL 1.5.8, 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.
* (ql:quickload 'serapeum)
To load "serapeum":
  Load 1 ASDF system:
    serapeum
; Loading "serapeum"
.
Switching to the BALLAND2006 optimizer
.................................................
[package serapeum]................................
[package serapeum-user]...........................
..................................................
[package serapeum/op].............................
..................................................
[package serapeum/vector=]........................
[package serapeum/mop]............................
[package serapeum/internal-definitions]...........
[package serapeum/dispatch-case].......INFO: Control stack guard page unprotected
Control stack guard page temporarily disabled: proceed with caution

debugger invoked on a SB-KERNEL::CONTROL-STACK-EXHAUSTED in thread
#<THREAD "main thread" RUNNING {10005604C3}>:
  Control stack exhausted (no more space for function call frames).
This is probably due to heavily nested or infinitely recursive function
calls, or a tail call that SBCL cannot or has not optimized away.

PROCEED WITH CAUTION.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [RETRY                        ] Retry
                                     compiling #<CL-SOURCE-FILE "serapeum" "level2" "range">.
  1: [ACCEPT                       ] Continue, treating
                                     compiling #<CL-SOURCE-FILE "serapeum" "level2" "range">
                                     as having been successful.
  2:                                 Retry ASDF operation.
  3: [CLEAR-CONFIGURATION-AND-RETRY] Retry ASDF operation after resetting the
                                     configuration.
  4:                                 Retry ASDF operation.
  5:                                 Retry ASDF operation after resetting the
                                     configuration.
  6: [ABORT                        ] Give up on "serapeum"
  7:                                 Exit debugger, returning to top level.

(SB-KERNEL::CONTROL-STACK-EXHAUSTED-ERROR)
0] :backtrace

Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {10005604C3}>
0: (SB-KERNEL::CONTROL-STACK-EXHAUSTED-ERROR)
1: ("foreign function: call_into_lisp")
2: ("foreign function: post_signal_tramp")
3: (MAKE-BUCKET :INVALID-VALUE-FOR-UNESCAPED-REGISTER-STORAGE :INVALID-VALUE-FOR-UNESCAPED-REGISTER-STORAGE) [optional]
4: (MAKE-BUCKET (((ARRAY-INDEX ARRAY-INDEX NON-NEGATIVE-INTEGER) (GO #:TAG2)) ((NON-NEGATIVE-INTEGER NON-NEGATIVE-INTEGER NON-NEGATIVE-INTEGER) (GO #:TAG3)) ((INTEGER INTEGER INTEGER) (GO #:TAG4)) ((RATIO RATIONAL RATIONAL) (GO #:TAG5)) ((RATIONAL RATIO RATIONAL) (GO #:TAG6)) ((RATIONAL RATIONAL RATIO) (GO #:TAG7)) ((RATIONAL FLOAT FLOAT) (GO #:TAG13)) ((RATIONAL FLOAT RATIONAL) (GO #:TAG14)) ((RATIONAL RATIONAL FLOAT) (GO #:TAG15)) ((SINGLE-FLOAT SINGLE-FLOAT SINGLE-FLOAT) (GO #:TAG8)) ((DOUBLE-FLOAT DOUBLE-FLOAT DOUBLE-FLOAT) (GO #:TAG9)) ((SHORT-FLOAT SHORT-FLOAT SHORT-FLOAT) (GO #:TAG10)) ...) ((ARRAY-INDEX ARRAY-INDEX NON-NEGATIVE-INTEGER) (GO #:TAG2)))
5: (MAKE-BUCKET (((ARRAY-INDEX ARRAY-INDEX NON-NEGATIVE-INTEGER) (GO #:TAG2)) ((NON-NEGATIVE-INTEGER NON-NEGATIVE-INTEGER NON-NEGATIVE-INTEGER) (GO #:TAG3)) ((INTEGER INTEGER INTEGER) (GO #:TAG4)) ((RATIO RATIONAL RATIONAL) (GO #:TAG5)) ((RATIONAL RATIO RATIONAL) (GO #:TAG6)) ((RATIONAL RATIONAL RATIO) (GO #:TAG7)) ((RATIONAL FLOAT FLOAT) (GO #:TAG13)) ((RATIONAL FLOAT RATIONAL) (GO #:TAG14)) ((RATIONAL RATIONAL FLOAT) (GO #:TAG15)) ((SINGLE-FLOAT SINGLE-FLOAT SINGLE-FLOAT) (GO #:TAG8)) ((DOUBLE-FLOAT DOUBLE-FLOAT DOUBLE-FLOAT) (GO #:TAG9)) ((SHORT-FLOAT SHORT-FLOAT SHORT-FLOAT) (GO #:TAG10)) ...) ((ARRAY-INDEX ARRAY-INDEX NON-NEGATIVE-INTEGER) (GO #:TAG2)))
6: (MAKE-BUCKET (((ARRAY-INDEX ARRAY-INDEX NON-NEGATIVE-INTEGER) (GO #:TAG2)) ((NON-NEGATIVE-INTEGER NON-NEGATIVE-INTEGER NON-NEGATIVE-INTEGER) (GO #:TAG3)) ((INTEGER INTEGER INTEGER) (GO #:TAG4)) ((RATIO RATIONAL RATIONAL) (GO #:TAG5)) ((RATIONAL RATIO RATIONAL) (GO #:TAG6)) ((RATIONAL RATIONAL RATIO) (GO #:TAG7)) ((RATIONAL FLOAT FLOAT) (GO #:TAG13)) ((RATIONAL FLOAT RATIONAL) (GO #:TAG14)) ((RATIONAL RATIONAL FLOAT) (GO #:TAG15)) ((SINGLE-FLOAT SINGLE-FLOAT SINGLE-FLOAT) (GO #:TAG8)) ((DOUBLE-FLOAT DOUBLE-FLOAT DOUBLE-FLOAT) (GO #:TAG9)) ((SHORT-FLOAT SHORT-FLOAT SHORT-FLOAT) (GO #:TAG10)) ...) ((ARRAY-INDEX ARRAY-INDEX NON-NEGATIVE-INTEGER) (GO #:TAG2)))
ruricolist commented 4 years ago

Are you aware that (debug 3) disables merging tail calls? That's probably why you're running out of stack space. This is unlikely to be the only thing that breaks if you change the optimization settings globally.

nsrahmad commented 4 years ago

Are you aware that (debug 3) disables merging tail calls? That's probably why you're running out of stack space.

OK, thanks. That explains it.

This is unlikely to be the only thing that breaks if you change the optimization settings globally.

Never had any problems before, but I rarely use CL. I think people prefer not to depend on TCO in CL.