interaction of print-object with class-prototype breaks inspector, describe
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
SBCL |
Fix Released
|
Medium
|
Unassigned |
Bug Description
This is similar to #310101
CL-USER> (defclass test-class ()
((a1 :initform nil)))
#<STANDARD-CLASS TEST-CLASS>
CL-USER> (sb-mop:
NIL
CL-USER> (inspect (find-class 'test-class))
The object is a STANDARD-OBJECT of type STANDARD-CLASS.
0. %TYPE: (CLASS #<STANDARD-CLASS TEST-CLASS>)
1. SOURCE: #S(SB-C:
2. PLIST: NIL
3. NAME: TEST-CLASS
4. CLASS-EQ-
5. DIRECT-
6. DIRECT-SUBCLASSES: NIL
7. DIRECT-METHODS: (NIL)
8. %DOCUMENTATION: NIL
9. SAFE-P: NIL
10. FINALIZED-P: T
11. %CLASS-
12. CPL-AVAILABLE-P: T
13. CAN-PRECEDE-LIST: (#<BUILT-IN-CLASS T>
14. INCOMPATIBLE-
15. WRAPPER: #<SB-PCL::WRAPPER #<STANDARD-CLASS TEST-CLASS> {12703289}>
16. PROTOTYPE: NIL
17. DIRECT-SLOTS: (#<SB-MOP:
18. SLOTS: (#<SB-MOP:
> q
; No value
;; Everything works fine so far
CL-USER> (defmethod print-object ((test test-class) stream)
#<STANDARD-METHOD PRINT-OBJECT (TEST-CLASS T) {12A7D919}>
CL-USER> (describe (find-class 'test-class))
#<STANDARD-CLASS TEST-CLASS>
[standard-object]
Class precedence-list: TEST-CLASS, STANDARD-OBJECT, SB-PCL:
Direct superclasses: STANDARD-OBJECT
No subclasses.
Direct slots:
A1
Slots with :INSTANCE allocation:
%TYPE = (CLASS #<STANDARD-CLASS TEST-CLASS>)
SOURCE = #S(SB-C:
PLIST = NIL
NAME = TEST-CLASS
CLASS-
DIRECT-
DIRECT-SUBCLASSES = NIL
DIRECT-METHODS = ((#<STANDARD-METHOD PRINT-OBJECT (TEST-CLASS T) {12A7D919}>))
%DOCUMENTATION = NIL
SAFE-P = NIL
FINALIZED-P = T
%CLASS-
CPL-AVAILABLE-P = T
CAN-PRECEDE-LIST = (#<BUILT-IN-CLASS T> #<SB-PCL:
INCOMPATIBLE-
WRAPPER = #<SB-PCL::WRAPPER #<STANDARD-CLASS TEST-CLASS> {12703289}>
PROTOTYPE = NIL
DIRECT-SLOTS = (#<SB-MOP:
SLOTS = (#<SB-MOP:
; No value
;; This will fill the prototype slot of the class with a prototype instance
CL-USER> (progn
; No value
The object is a STANDARD-OBJECT of type STANDARD-CLASS.
0. %TYPE: (CLASS #<STANDARD-CLASS TEST-CLASS>)
1. SOURCE: #S(SB-C:
2. PLIST: NIL
3. NAME: TEST-CLASS
4. CLASS-EQ-
5. DIRECT-
6. DIRECT-SUBCLASSES: NIL
7. DIRECT-METHODS: ((#<STANDARD-METHOD PRINT-OBJECT (TEST-CLASS
8. %DOCUMENTATION: NIL
9. SAFE-P: NIL
10. FINALIZED-P: T
11. %CLASS-
12. CPL-AVAILABLE-P: T
13. CAN-PRECEDE-LIST: (#<BUILT-IN-CLASS T>
14. INCOMPATIBLE-
15. WRAPPER: #<SB-PCL::WRAPPER #<STANDARD-CLASS TEST-CLASS> {12703289}>
16. PROTOTYPE: #<TEST-CLASS ; Evaluation aborted.
;; ^^ Here unbound-slot condition is raised as print-object is called on the prototype instance
CL-USER> (describe (find-class 'test-class))
#<STANDARD-CLASS TEST-CLASS>
[standard-object]
Class precedence-list: TEST-CLASS, STANDARD-OBJECT, SB-PCL:
Direct superclasses: STANDARD-OBJECT
No subclasses.
Direct slots:
A1
Slots with :INSTANCE allocation:
%TYPE = (CLASS #<STANDARD-CLASS TEST-CLASS>)
SOURCE = #S(SB-C:
PLIST = NIL
NAME = TEST-CLASS
CLASS-
DIRECT-
DIRECT-SUBCLASSES = NIL
DIRECT-METHODS = ((#<STANDARD-METHOD PRINT-OBJECT (TEST-CLASS T) {119DF381}>))
%DOCUMENTATION = NIL
SAFE-P = NIL
FINALIZED-P = T
%CLASS-
CPL-AVAILABLE-P = T
CAN-PRECEDE-LIST = (#<BUILT-IN-CLASS T> #<SB-PCL:
INCOMPATIBLE-
;; Same with describe
The slot A1 is unbound in the object .
[Condition of type UNBOUND-SLOT]
Restarts:
0: [USE-VALUE] Return a value as the slot-value.
1: [STORE-VALUE] Store and return a value as the slot-value.
2: [RETRY] Retry SLIME REPL evaluation request.
3: [ABORT] Return to SLIME's top level.
4: [TERMINATE-THREAD] Terminate this thread (#<THREAD "repl-thread" RUNNING {1201AC61}>)
; Evaluation aborted.
This interaction between print-object and class-prototype also manifests in the slime inspector.
When one inspects a class with slime, class-prototype is called by swank and then unbound-slot
conditions are raised. CCL has the 'with-errorfree
to deal with this issue.
Changed in sbcl: | |
status: | New → Confirmed |
importance: | Undecided → Medium |
tags: | added: easy |
Changed in sbcl: | |
status: | Confirmed → In Progress |
assignee: | nobody → Jan Moringen (scymtym) |
Changed in sbcl: | |
status: | In Progress → Fix Committed |
assignee: | Jan Moringen (scymtym) → nobody |
Changed in sbcl: | |
status: | Fix Committed → Fix Released |
FWIW, the problem has been fixed in the Slime inspector by wrapping
some handler-case around the code which prints the parts of the object
being inspected.