joaotavora / sly

Sylvester the Cat's Common Lisp IDE
1.26k stars 142 forks source link

Sly 'muffles' restarts #60

Closed PuercoPop closed 9 years ago

PuercoPop commented 9 years ago

How to reproduce

  1. Compile the test code (C-c C-k). It will warn about an undefined function, bar.
  2. Remove the #+(or) from the defpackage form and evaluate it again.

    What do I see

Error message displayed on the minibuffer

What I expect

To see a list of restarts to handle the condition, including the shadowing-import-it from name-conflict. Note there may be two issues here as I don't find the shadowing-import-it restart in the available restarts

Test Code

(defpackage #:bar
  (:export #:bar))

(defpackage #:foo
  (:use #:cl)
  #+(or)(:import-from #:bar
                #:bar))

(in-package #:foo)

(defun fubar ()
  (bar))

#+Run-this-to-see-there-are-restarts-available
(handler-case (defpackage #:foo
                (:use #:cl)
                (:import-from #:bar
                              #:bar))
  (error () (compute-restarts)))
joaotavora commented 9 years ago

I don't think it has anything to do with SLY at all. The handler code in your handler-case that computes the restarts runs when the stack is already unwound after the error you caught, i.e. by definition those restarts are no longer available. I think you possibly meant:

(catch 'aha
  (handler-bind
      ((error (lambda (e)
               (throw 'aha (compute-restarts e)))))

    (defpackage #:foo
      (:use #:cl)
      (:import-from #:bar
                    #:bar))))

Evaluating this gives me:

(#<RESTART SB-IMPL::SHADOWING-IMPORT-IT {1005419FA3}>
 #<RESTART SB-IMPL::DONT-IMPORT-IT {100541A023}>
 #<RESTART SB-EXT:RESOLVE-CONFLICT {100541A0A3}>
 #<RESTART SLYNK::RETRY {10053CC283}> 
 #<RESTART ABORT {10053CB613}>
 #<RESTART ABORT {10053CB1B3}>)

The three restarts you were seeing were indeed the only restarts available on the stack, albeit the higher-level ones for aborting/retrying the slynk request and killing the whole thread and such.

Also, I believe that the conflict-resolving restarts aren't standard, they're "nice-to-haves": some implementations have them, some don't, and some have them by different names. I tested in SBCL which is what I assume you are using (right?)

PuercoPop commented 9 years ago

Yes I am using SBCL. You are right about the test-code of the restarts, the shadowing-import-it restart is there when using catch-throw. But I think I didn't make myself clear as to what is the crux of the issue. I am seeing no restarts, just a condition in sly-db and a message in the minibuffer

Sly-db

IMPORT BAR:BAR causes name-conflicts in #<PACKAGE "FOO"> between
the following symbols:
  BAR:BAR, FOO::BAR
   [Condition of type SB-EXT:NAME-CONFLICT]

Minibuffer

error in process filter: [sly] Elisp sly-dcase failed: (:references ((:ansi-cl :section (11 1 1 2 5))))

Backtrace

(when debug-on-error is t)

Debugger entered--Lisp error: (error "[sly] Elisp sly-dcase failed: (:references ((:ansi-cl :section (11 1 1 2 5))))")
  signal(error ("[sly] Elisp sly-dcase failed: (:references ((:ansi-cl :section (11 1 1 2 5))))"))
  error("[sly] Elisp sly-dcase failed: %S" (:references ((:ansi-cl :section (11 1 1 2 5)))))
  apply(error "[sly] Elisp sly-dcase failed: %S" (:references ((:ansi-cl :section (11 1 1 2 5)))))
  sly-error("Elisp sly-dcase failed: %S" (:references ((:ansi-cl :section (11 1 1 2 5)))))
  sly-stickers--handle-break((:references ((:ansi-cl :section (11 1 1 2 5)))))
  run-hook-with-args-until-success(sly-stickers--handle-break (:references ((:ansi-cl :section (11 1 1 2 5)))))
  sly-db-dispatch-extras(((:references ((:ansi-cl :section (11 1 1 2 5))))))
  sly-db-insert-condition((#("IMPORT BAR:BAR causes name-conflicts in #<PACKAGE \"FOO\"> between\nthe following symbols:\n  BAR:BAR, FOO::BAR" 0 107 (face sly-db-topline-face)) #("   [Condition of type SB-EXT:NAME-CONFLICT]" 0 43 (face sly-db-condition-face)) ((:references ((:ansi-cl :section (11 1 1 2 5)))))))
  sly-db-setup(2 1 (#("IMPORT BAR:BAR causes name-conflicts in #<PACKAGE \"FOO\"> between\nthe following symbols:\n  BAR:BAR, FOO::BAR" 0 107 (face sly-db-topline-face)) #("   [Condition of type SB-EXT:NAME-CONFLICT]" 0 43 (face sly-db-condition-face)) ((:references ((:ansi-cl :section (11 1 1 2 5)))))) (("SHADOWING-IMPORT-IT" "Shadowing-import BAR:BAR, uninterning BAR.") ("DONT-IMPORT-IT" "Don't import BAR:BAR, keeping BAR.") ("RESOLVE-CONFLICT" "Resolve conflict.") ("RETRY" "Retry SLY interactive evaluation request.") ("*ABORT" "Return to SLY's top level.") ("ABORT" "abort thread (#<THREAD \"slynk-worker\" RUNNING {1007AD6DF3}>)")) ((0 "(SB-EXT:NAME-CONFLICT #<PACKAGE \"FOO\"> IMPORT BAR:BAR BAR:BAR BAR)") (1 "((FLET SB-IMPL::THUNK :IN IMPORT))") (2 "((FLET #:WITHOUT-INTERRUPTS-BODY-561 :IN SB-THREAD::CALL-WITH-RECURSIVE-LOCK))") (3 "(SB-THREAD::CALL-WITH-RECURSIVE-LOCK #<CLOSURE (FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN SB-IMPL::CALL-WITH-PACKAGE-GRAPH) {7FFFF21E50EB}> #<SB-THREAD:MUTEX \"Package Graph Lock\" owner: #<SB-THREA..") (4 "(SB-IMPL::CALL-WITH-PACKAGE-GRAPH #<CLOSURE (FLET SB-IMPL::THUNK :IN IMPORT) {7FFFF21E513B}>)") (5 "(IMPORT (BAR:BAR) #<PACKAGE \"FOO\">)") (6 "(SB-IMPL::UPDATE-PACKAGE #<PACKAGE \"FOO\"> NIL #S(SB-C:DEFINITION-SOURCE-LOCATION :NAMESTRING NIL :TOPLEVEL-FORM-NUMBER NIL :FORM-NUMBER NIL :PLIST NIL) NIL NIL (#<PACKAGE \"COMMON-LISP\">) (BAR:BAR) NIL..") (7 "((FLET #:WITHOUT-INTERRUPTS-BODY-561 :IN SB-THREAD::CALL-WITH-RECURSIVE-LOCK))") (8 "(SB-THREAD::CALL-WITH-RECURSIVE-LOCK #<CLOSURE (FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN SB-IMPL::CALL-WITH-PACKAGE-GRAPH) {7FFFF21E540B}> #<SB-THREAD:MUTEX \"Package Graph Lock\" owner: #<SB-THREA..") (9 "(SB-IMPL::CALL-WITH-PACKAGE-GRAPH #<CLOSURE (FLET SB-IMPL::THUNK :IN SB-IMPL::%DEFPACKAGE) {7FFFF21E545B}>)") (10 "(SB-IMPL::%DEFPACKAGE \"FOO\" NIL NIL NIL NIL (\"CL\") ((\"BAR\" \"BAR\")) NIL NIL (\"FOO\") NIL NIL #S(SB-C:DEFINITION-SOURCE-LOCATION :NAMESTRING NIL :TOPLEVEL-FORM-NUMBER NIL :FORM-NUMBER NIL :PLIST NIL) NIL..") (11 "(SB-INT:SIMPLE-EVAL-IN-LEXENV (SB-IMPL::%DEFPACKAGE \"FOO\" (QUOTE NIL) (QUOTE NIL) (QUOTE NIL) (QUOTE NIL) ...) #<NULL-LEXENV>)") (12 "(SB-INT:SIMPLE-EVAL-IN-LEXENV (DEFPACKAGE #:FOO (:USE #:CL) (:IMPORT-FROM #:BAR #:BAR)) #<NULL-LEXENV>)") (13 "(EVAL (DEFPACKAGE #:FOO (:USE #:CL) (:IMPORT-FROM #:BAR #:BAR)))") (14 "((LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL))" (:restartable t)) (15 "(SLYNK::CALL-WITH-RETRY-RESTART \"Retry SLY interactive evaluation request.\" #<CLOSURE (LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL) {1007A912CB}>)" (:restartable t)) (16 "((LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL))" (:restartable t)) (17 "(SLYNK-BACKEND:CALL-WITH-SYNTAX-HOOKS #<CLOSURE (LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL) {1007A912AB}>)" (:restartable t)) (18 "(SLYNK::CALL-WITH-BUFFER-SYNTAX NIL NIL #<CLOSURE (LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL) {1007A912AB}>)" (:restartable t)) (19 "(SLYNK:INTERACTIVE-EVAL \"(defpackage #:foo ..)" (:restartable t))) (40))
  sly-dispatch-event((:debug 2 1 (#("IMPORT BAR:BAR causes name-conflicts in #<PACKAGE \"FOO\"> between\nthe following symbols:\n  BAR:BAR, FOO::BAR" 0 107 (face sly-db-topline-face)) #("   [Condition of type SB-EXT:NAME-CONFLICT]" 0 43 (face sly-db-condition-face)) ((:references ((:ansi-cl :section (11 1 1 2 5)))))) (("SHADOWING-IMPORT-IT" "Shadowing-import BAR:BAR, uninterning BAR.") ("DONT-IMPORT-IT" "Don't import BAR:BAR, keeping BAR.") ("RESOLVE-CONFLICT" "Resolve conflict.") ("RETRY" "Retry SLY interactive evaluation request.") ("*ABORT" "Return to SLY's top level.") ("ABORT" "abort thread (#<THREAD \"slynk-worker\" RUNNING {1007AD6DF3}>)")) ((0 "(SB-EXT:NAME-CONFLICT #<PACKAGE \"FOO\"> IMPORT BAR:BAR BAR:BAR BAR)") (1 "((FLET SB-IMPL::THUNK :IN IMPORT))") (2 "((FLET #:WITHOUT-INTERRUPTS-BODY-561 :IN SB-THREAD::CALL-WITH-RECURSIVE-LOCK))") (3 "(SB-THREAD::CALL-WITH-RECURSIVE-LOCK #<CLOSURE (FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN SB-IMPL::CALL-WITH-PACKAGE-GRAPH) {7FFFF21E50EB}> #<SB-THREAD:MUTEX \"Package Graph Lock\" owner: #<SB-THREA..") (4 "(SB-IMPL::CALL-WITH-PACKAGE-GRAPH #<CLOSURE (FLET SB-IMPL::THUNK :IN IMPORT) {7FFFF21E513B}>)") (5 "(IMPORT (BAR:BAR) #<PACKAGE \"FOO\">)") (6 "(SB-IMPL::UPDATE-PACKAGE #<PACKAGE \"FOO\"> NIL #S(SB-C:DEFINITION-SOURCE-LOCATION :NAMESTRING NIL :TOPLEVEL-FORM-NUMBER NIL :FORM-NUMBER NIL :PLIST NIL) NIL NIL (#<PACKAGE \"COMMON-LISP\">) (BAR:BAR) NIL..") (7 "((FLET #:WITHOUT-INTERRUPTS-BODY-561 :IN SB-THREAD::CALL-WITH-RECURSIVE-LOCK))") (8 "(SB-THREAD::CALL-WITH-RECURSIVE-LOCK #<CLOSURE (FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN SB-IMPL::CALL-WITH-PACKAGE-GRAPH) {7FFFF21E540B}> #<SB-THREAD:MUTEX \"Package Graph Lock\" owner: #<SB-THREA..") (9 "(SB-IMPL::CALL-WITH-PACKAGE-GRAPH #<CLOSURE (FLET SB-IMPL::THUNK :IN SB-IMPL::%DEFPACKAGE) {7FFFF21E545B}>)") (10 "(SB-IMPL::%DEFPACKAGE \"FOO\" NIL NIL NIL NIL (\"CL\") ((\"BAR\" \"BAR\")) NIL NIL (\"FOO\") NIL NIL #S(SB-C:DEFINITION-SOURCE-LOCATION :NAMESTRING NIL :TOPLEVEL-FORM-NUMBER NIL :FORM-NUMBER NIL :PLIST NIL) NIL..") (11 "(SB-INT:SIMPLE-EVAL-IN-LEXENV (SB-IMPL::%DEFPACKAGE \"FOO\" (QUOTE NIL) (QUOTE NIL) (QUOTE NIL) (QUOTE NIL) ...) #<NULL-LEXENV>)") (12 "(SB-INT:SIMPLE-EVAL-IN-LEXENV (DEFPACKAGE #:FOO (:USE #:CL) (:IMPORT-FROM #:BAR #:BAR)) #<NULL-LEXENV>)") (13 "(EVAL (DEFPACKAGE #:FOO (:USE #:CL) (:IMPORT-FROM #:BAR #:BAR)))") (14 "((LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL))" (:restartable t)) (15 "(SLYNK::CALL-WITH-RETRY-RESTART \"Retry SLY interactive evaluation request.\" #<CLOSURE (LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL) {1007A912CB}>)" (:restartable t)) (16 "((LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL))" (:restartable t)) (17 "(SLYNK-BACKEND:CALL-WITH-SYNTAX-HOOKS #<CLOSURE (LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL) {1007A912AB}>)" (:restartable t)) (18 "(SLYNK::CALL-WITH-BUFFER-SYNTAX NIL NIL #<CLOSURE (LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL) {1007A912AB}>)" (:restartable t)) (19 "(SLYNK:INTERACTIVE-EVAL \"(defpackage #:foo ..)" (:restartable t))) (40)) #<process sly-1>)
  sly-process-available-input(#<process sly-1>)
  sly-net-filter(#<process sly-1> "000B60(:debug 2 1 (\"IMPORT BAR:BAR causes name-conflicts in #<PACKAGE \\\"FOO\\\"> between\nthe following symbols:\n  BAR:BAR, FOO::BAR\" \"   [Condition of type SB-EXT:NAME-CONFLICT]\" ((:references ((:ansi-cl :section (11 1 1 2 5)))))) ((\"SHADOWING-IMPORT-IT\" \"Shadowing-import BAR:BAR, uninterning BAR.\") (\"DONT-IMPORT-IT\" \"Don't import BAR:BAR, keeping BAR.\") (\"RESOLVE-CONFLICT\" \"Resolve conflict.\") (\"RETRY\" \"Retry SLY interactive evaluation request.\") (\"*ABORT\" \"Return to SLY's top level.\") (\"ABORT\" \"abort thread (#<THREAD \\\"slynk-worker\\\" RUNNING {1007AD6DF3}>)\")) ((0 \"(SB-EXT:NAME-CONFLICT #<PACKAGE \\\"FOO\\\"> IMPORT BAR:BAR BAR:BAR BAR)\") (1 \"((FLET SB-IMPL::THUNK :IN IMPORT))\") (2 \"((FLET #:WITHOUT-INTERRUPTS-BODY-561 :IN SB-THREAD::CALL-WITH-RECURSIVE-LOCK))\") (3 \"(SB-THREAD::CALL-WITH-RECURSIVE-LOCK #<CLOSURE (FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN SB-IMPL::CALL-WITH-PACKAGE-GRAPH) {7FFFF21E50EB}> #<SB-THREAD:MUTEX \\\"Package Graph Lock\\\" owner: #<SB-THREA..\") (4 \"(SB-IMPL::CALL-WITH-PACKAGE-GRAPH #<CLOSURE (FLET SB-IMPL::THUNK :IN IMPORT) {7FFFF21E513B}>)\") (5 \"(IMPORT (BAR:BAR) #<PACKAGE \\\"FOO\\\">)\") (6 \"(SB-IMPL::UPDATE-PACKAGE #<PACKAGE \\\"FOO\\\"> NIL #S(SB-C:DEFINITION-SOURCE-LOCATION :NAMESTRING NIL :TOPLEVEL-FORM-NUMBER NIL :FORM-NUMBER NIL :PLIST NIL) NIL NIL (#<PACKAGE \\\"COMMON-LISP\\\">) (BAR:BAR) NIL..\") (7 \"((FLET #:WITHOUT-INTERRUPTS-BODY-561 :IN SB-THREAD::CALL-WITH-RECURSIVE-LOCK))\") (8 \"(SB-THREAD::CALL-WITH-RECURSIVE-LOCK #<CLOSURE (FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN SB-IMPL::CALL-WITH-PACKAGE-GRAPH) {7FFFF21E540B}> #<SB-THREAD:MUTEX \\\"Package Graph Lock\\\" owner: #<SB-THREA..\") (9 \"(SB-IMPL::CALL-WITH-PACKAGE-GRAPH #<CLOSURE (FLET SB-IMPL::THUNK :IN SB-IMPL::%DEFPACKAGE) {7FFFF21E545B}>)\") (10 \"(SB-IMPL::%DEFPACKAGE \\\"FOO\\\" NIL NIL NIL NIL (\\\"CL\\\") ((\\\"BAR\\\" \\\"BAR\\\")) NIL NIL (\\\"FOO\\\") NIL NIL #S(SB-C:DEFINITION-SOURCE-LOCATION :NAMESTRING NIL :TOPLEVEL-FORM-NUMBER NIL :FORM-NUMBER NIL :PLIST NIL) NIL..\") (11 \"(SB-INT:SIMPLE-EVAL-IN-LEXENV (SB-IMPL::%DEFPACKAGE \\\"FOO\\\" (QUOTE NIL) (QUOTE NIL) (QUOTE NIL) (QUOTE NIL) ...) #<NULL-LEXENV>)\") (12 \"(SB-INT:SIMPLE-EVAL-IN-LEXENV (DEFPACKAGE #:FOO (:USE #:CL) (:IMPORT-FROM #:BAR #:BAR)) #<NULL-LEXENV>)\") (13 \"(EVAL (DEFPACKAGE #:FOO (:USE #:CL) (:IMPORT-FROM #:BAR #:BAR)))\") (14 \"((LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL))\" (:restartable t)) (15 \"(SLYNK::CALL-WITH-RETRY-RESTART \\\"Retry SLY interactive evaluation request.\\\" #<CLOSURE (LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL) {1007A912CB}>)\" (:restartable t)) (16 \"((LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL))\" (:restartable t)) (17 \"(SLYNK-BACKEND:CALL-WITH-SYNTAX-HOOKS #<CLOSURE (LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL) {1007A912AB}>)\" (:restartable t)) (18 \"(SLYNK::CALL-WITH-BUFFER-SYNTAX NIL NIL #<CLOSURE (LAMBDA NIL :IN SLYNK:INTERACTIVE-EVAL) {1007A912AB}>)\" (:restartable t)) (19 \"(SLYNK:INTERACTIVE-EVAL \\\"(defpackage #:foo ..)\" (:restartable t))) (40))")

This is a unexpected behavior right?

joaotavora commented 9 years ago

This is a unexpected behavior right?

@PuercoPop, oh yes indeed :) but are you sure you have e2f77d119a64b36c38387effe39981458ddf6488 of three weeks ago?

It should fix this very same issue...

PuercoPop commented 9 years ago

I'm up to date with the current master afaik. Will double check when I get to a machine

PuercoPop commented 9 years ago

After doing make clean; make on the current master you are right that the issue is no longer present.

Maybe it was a stale .elc? Anyhow sorry for the false report.

joaotavora commented 9 years ago

Maybe it was a stale .elc?

Seems likely... There's a new emacs option that always prefers newer el over elc, but it's off by default. I forgot the name, it should contain "prefer" and "new" tho...

The name is load-prefer-newer