[armedbear-ticket] [armedbear] #342: missing default method for gray-streams:stream-finish-output
armedbear
armedbear-devel at common-lisp.net
Mon Jan 13 00:36:38 UTC 2014
#342: missing default method for gray-streams:stream-finish-output
------------------------+-----------------------
Reporter: avodonosov | Owner:
Type: defect | Status: new
Priority: major | Milestone:
Component: streams | Version: 1.3.0-dev
Keywords: |
------------------------+-----------------------
Test case:
{{{
(ql:quickload :flexi-streams)
(let* ((binary-stream (flexi-streams:make-in-memory-output-stream)))
(finish-output binary-stream))
The value #<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM {1E566F3}> is not of type
#<STANDARD-CLASS FLEXI-STREAMS:FLEXI-OUTPUT-STREAM {7D84CE}>.
[Condition of type SIMPLE-TYPE-ERROR]
Backtrace:
0: (#<FUNCTION {1C9E6C0}> #<SIMPLE-TYPE-ERROR {FC82A6}> #<FUNCTION
{1C9E6C0}>)
1: (APPLY #<FUNCTION {1C9E6C0}> (#<SIMPLE-TYPE-ERROR {FC82A6}>
#<FUNCTION {1C9E6C0}>))
2: (SYSTEM::RUN-HOOK SYSTEM::*INVOKE-DEBUGGER-HOOK* #<SIMPLE-TYPE-ERROR
{FC82A6}> #<FUNCTION {1C9E6C0}>)
3: (INVOKE-DEBUGGER #<SIMPLE-TYPE-ERROR {FC82A6}>)
4: (GRAY-STREAMS:STREAM-FINISH-OUTPUT #<FLEXI-STREAMS::VECTOR-OUTPUT-
STREAM {1E566F3}>)
5: (SYSTEM::%FINISH-OUTPUT #<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM
{1E566F3}>)
6: (FINISH-OUTPUT #<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM {1E566F3}>)
}}}
This happens because there is no default method for stream-finish-output.
According to the Gray proposal, default method should exist and do
nothing.
The fix:
{{{
Index: src/org/armedbear/lisp/gray-streams.lisp
===================================================================
--- src/org/armedbear/lisp/gray-streams.lisp (revision 14464)
+++ src/org/armedbear/lisp/gray-streams.lisp (working copy)
@@ -314,6 +314,10 @@
(declare (ignore stream))
nil)
+(defmethod stream-finish-output (stream)
+ (declare (ignore stream))
+ nil)
+
(defmethod stream-clear-output (stream)
(declare (ignore stream))
nil)
}}}
Also, ABCL handles the absence of default method not very correctly.
It should signal "no applicable method". What happens here is that flexi-
streams overrides
stream-finish-output for one of its classes - FLEXI-STREAMS:FLEXI-OUTPUT-
STREAM.
So, I think ABCL sees that there is only one variant of method,
and tries to apply this method, despite we pass object of another class.
And here typecast happen.
--
Ticket URL: <http://abcl.org/trac/ticket/342>
armedbear <http://abcl.org>
armedbear
More information about the armedbear-ticket
mailing list