[slime-devel] error in source path parser

Tim Daly Jr. tim at tenkan.org
Wed May 11 12:53:30 UTC 2005


When compiling this file:

    1

    ;; don't delete the one

    (defmethod foo ()
       (call-next-method))

with current SBCL and SLIME, I get this error:

    error while parsing arguments to DESTRUCTURING-BIND:
      invalid number of elements in
        ()
      to satisfy lambda list
        ((SWANK-BACKEND::START . SWANK-BACKEND::END)):
      exactly 1 expected, but 0 found
       [Condition of type SB-KERNEL::ARG-COUNT-ERROR]

This is the first bit of the backtrace:

    Backtrace:
      0: (SWANK-BACKEND::SOURCE-PATH-SOURCE-POSITION (0) 1 #<HASH-TABLE :TEST EQ :COUNT 0 {C3C99C9}>)
          Locals:
            SB-DEBUG::ARG-0 = (0)
            SB-DEBUG::ARG-1 = 1
            SB-DEBUG::ARG-2 = #<HASH-TABLE :TEST EQ :COUNT 0 {C3C99C9}>
          [No catch-tags]
      1: (SB-DEBUG::TRACE-CALL #<SB-DEBUG::TRACE-INFO SWANK-BACKEND::SOURCE-PATH-SOURCE-POSITION>)
      2: (SB-INT:EVAL-IN-LEXENV (SB-DEBUG::TRACE-CALL (QUOTE #<SB-DEBUG::TRACE-INFO SWANK-BACKEND::SOURCE-PATH-SOURCE-POSITION>)) #<NULL-LEXENV>)
      3: (SB-IMPL::ENCAPSULATION (0) 1 #<HASH-TABLE :TEST EQ :COUNT 0 {C3C99C9}>)
      4: (SWANK-BACKEND::SOURCE-PATH-FILE-POSITION (0) #P"/tmp/foo.lisp")
      5: (SWANK-BACKEND::LOCATE-COMPILER-NOTE #P"/tmp/foo.lisp" (0) "  1")
      6: (SWANK-BACKEND::COMPILER-NOTE-LOCATION #<SB-C::COMPILER-ERROR-CONTEXT >)
      7: (SWANK-BACKEND::SIGNAL-COMPILER-CONDITION #<CODE-DELETION-NOTE {C3AFE59}> #<SB-C::COMPILER-ERROR-CONTEXT >)
      8: (SWANK-BACKEND::HANDLE-NOTIFICATION-CONDITION #<CODE-DELETION-NOTE {C3AFE59}>)
      9: (SIGNAL #<CODE-DELETION-NOTE {C3AFE59}>)
      ...


Nearest I can figure, SBCL is generating a code deletion note, and the
location is that 1 at the top of the file.  In order to find the note
in the source file, slime reads the appropriate toplevel form using a
special readtable that records the start and end locations of each
subform in a hashtable called a source-map. It then looks up the
location of the innermost, leftmost subform in the source-map.

I think the problem is that the source location recording readtable
only starts recording when it sees a macro character like #\(.  That's
reasonable, because it splits up the subforms.  However, #\1 is not a
macro character, so nothing is recorded, and the source-map ends up
empty.

This is the best fix I could come up with.  It's not so hot because
the location of the note is not precise, and for some reason that I
haven't understood yet, emacs sometimes doesn't underline the note at
all.  But at least the error is gone, and it doesn't seem to break
anything that already worked.

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: swank-source-path-parser.diff
URL: <https://mailman.common-lisp.net/pipermail/slime-devel/attachments/20050511/329f7cb5/attachment.ksh>
-------------- next part --------------

This does seem like an obscure case.  I encountered it because of a
stray character in a mcclim source file.  

Thanks a ton for slime!  

-- 
-Tim



More information about the slime-devel mailing list