From: Cyrus H. <ch...@bo...> - 2014-01-16 04:13:09
|
So I’ve been trying to use some flexi-streams (from hunchentoot) with run-program and ran into a problem where run-program only wants to talk to streams whose element-type is :default or (unsigned-byte 8). Any thoughts on the following change to allow subtypes of (unsigned-byte 8) such as flexi-streams:octet to be used? diff --git i/src/code/run-program.lisp w/src/code/run-program.lisp index 0ddd193..07d0759 100644 --- i/src/code/run-program.lisp +++ w/src/code/run-program.lisp @@ -936,7 +936,8 @@ (defun copy-descriptor-to-stream (descriptor stream cookie external-format) (when (/= decode-end (length buf)) (replace buf buf :start2 decode-end :end2 read-end)) (decf read-end decode-end))))) - ((member et '(:default (unsigned-byte 8)) :test #'equal) + ((or (member et '(:default (unsigned-byte 8)) :test #'equal) + (subtypep et '(unsigned-byte 8))) (lambda () (write-sequence buf stream :end read-end) (setf read-end 0))) @@ -1177,8 +1178,9 @@ (defun get-descriptor-for (object (return) (sb-unix:unix-write fd #.(string #\Newline) 0 1))))) - ((member et '(:default (unsigned-byte 8)) - :test 'equal) + ((or (member et '(:default (unsigned-byte 8)) + :test 'equal) + (subtypep et '(unsigned-byte 8))) (loop with buf = (make-array 256 :element-type '(unsigned-byte 8)) for p = (read-sequence buf object) until (zerop p) |
From: Nathan F. <fr...@gm...> - 2014-01-16 10:28:22
|
On Wed, Jan 15, 2014 at 11:12 PM, Cyrus Harmon <ch...@bo...> wrote: > So I’ve been trying to use some flexi-streams (from hunchentoot) with run-program and ran into a problem where run-program only wants to talk to streams whose element-type is :default or (unsigned-byte 8). Any thoughts on the following change to allow subtypes of (unsigned-byte 8) such as flexi-streams:octet to be used? +1, but... > diff --git i/src/code/run-program.lisp w/src/code/run-program.lisp > index 0ddd193..07d0759 100644 > --- i/src/code/run-program.lisp > +++ w/src/code/run-program.lisp > @@ -936,7 +936,8 @@ (defun copy-descriptor-to-stream (descriptor stream cookie external-format) > (when (/= decode-end (length buf)) > (replace buf buf :start2 decode-end :end2 read-end)) > (decf read-end decode-end))))) > - ((member et '(:default (unsigned-byte 8)) :test #'equal) > + ((or (member et '(:default (unsigned-byte 8)) :test #'equal) > + (subtypep et '(unsigned-byte 8))) You really want this check to be (and (subtypep et '(unsigned-byte 8)) (subtypep '(unsigned-byte 8) et)), otherwise streams with an element type of, say, (unsigned-byte 4) are going to be accepted. (Or we could use some fancy compiler-internal TYPE-EQUAL function...) -Nathan |
From: Christophe R. <cs...@ca...> - 2014-01-16 10:31:01
|
Cyrus Harmon <ch...@bo...> writes: > So I’ve been trying to use some flexi-streams (from hunchentoot) with > run-program and ran into a problem where run-program only wants to > talk to streams whose element-type is :default or (unsigned-byte > 8). Any thoughts on the following change to allow subtypes of > (unsigned-byte 8) such as flexi-streams:octet to be used? No! Not _subtypes_ (consider what would happen if someone managed to open a stream with element-type BIT). What's interesting is whether the type is _equivalent_ to (UNSIGNED-BYTE 8), surely? (Presumably, FLEXI-STREAMS:OCTET is a DEFTYPE for that somewhere). Now, there are a number of ways of dealing with this. One is that maybe the streams should remember a type-expanded version of the type specifier used to open them (i.e. the stream-element-type should be canonicalized on stream creation). Another would be to explicitly compute the type equivalence; that can be done with (and (subtypep et '(unsigned-byte 8)) (subtypep '(unsigned-byte 8) et)) or maybe (type= (specifier-type et) (specifier-type '(unsigned-byte 8))) Cheers, Christophe > diff --git i/src/code/run-program.lisp w/src/code/run-program.lisp > index 0ddd193..07d0759 100644 > --- i/src/code/run-program.lisp > +++ w/src/code/run-program.lisp > @@ -936,7 +936,8 @@ (defun copy-descriptor-to-stream (descriptor stream cookie external-format) > (when (/= decode-end (length buf)) > (replace buf buf :start2 decode-end :end2 read-end)) > (decf read-end decode-end))))) > - ((member et '(:default (unsigned-byte 8)) :test #'equal) > + ((or (member et '(:default (unsigned-byte 8)) :test #'equal) > + (subtypep et '(unsigned-byte 8))) > (lambda () > (write-sequence buf stream :end read-end) > (setf read-end 0))) > @@ -1177,8 +1178,9 @@ (defun get-descriptor-for (object > (return) > (sb-unix:unix-write > fd #.(string #\Newline) 0 1))))) > - ((member et '(:default (unsigned-byte 8)) > - :test 'equal) > + ((or (member et '(:default (unsigned-byte 8)) > + :test 'equal) > + (subtypep et '(unsigned-byte 8))) > (loop with buf = (make-array 256 :element-type '(unsigned-byte 8)) > for p = (read-sequence buf object) > until (zerop p) > > > > ------------------------------------------------------------------------------ > CenturyLink Cloud: The Leader in Enterprise Cloud Services. > Learn Why More Businesses Are Choosing CenturyLink Cloud For > Critical Workloads, Development Environments & Everything In Between. > Get a Quote or Start a Free Trial Today. > http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk > _______________________________________________ > Sbcl-devel mailing list > Sbc...@li... > https://lists.sourceforge.net/lists/listinfo/sbcl-devel |
From: Stas B. <sta...@gm...> - 2014-01-16 10:43:07
|
Nathan Froyd <fr...@gm...> writes: > On Wed, Jan 15, 2014 at 11:12 PM, Cyrus Harmon <ch...@bo...> wrote: >> So I’ve been trying to use some flexi-streams (from hunchentoot) >> with run-program and ran into a problem where run-program only wants >> to talk to streams whose element-type is :default or (unsigned-byte >> 8). Any thoughts on the following change to allow subtypes of >> (unsigned-byte 8) such as flexi-streams:octet to be used? > > +1, but... > >> diff --git i/src/code/run-program.lisp w/src/code/run-program.lisp >> index 0ddd193..07d0759 100644 >> --- i/src/code/run-program.lisp >> +++ w/src/code/run-program.lisp >> @@ -936,7 +936,8 @@ (defun copy-descriptor-to-stream (descriptor stream cookie external-format) >> (when (/= decode-end (length buf)) >> (replace buf buf :start2 decode-end :end2 read-end)) >> (decf read-end decode-end))))) >> - ((member et '(:default (unsigned-byte 8)) :test #'equal) >> + ((or (member et '(:default (unsigned-byte 8)) :test #'equal) >> + (subtypep et '(unsigned-byte 8))) > > You really want this check to be (and (subtypep et '(unsigned-byte 8)) > (subtypep '(unsigned-byte 8) et)), otherwise streams with an element > type of, say, (unsigned-byte 4) are going to be accepted. (Or we > could use some fancy compiler-internal TYPE-EQUAL function...) (unsigned-byte 4) should still work. -- With best regards, Stas. |
From: Stas B. <sta...@gm...> - 2014-01-16 10:56:06
|
Stas Boukarev <sta...@gm...> writes: > Nathan Froyd <fr...@gm...> writes: > >> On Wed, Jan 15, 2014 at 11:12 PM, Cyrus Harmon <ch...@bo...> wrote: >>> So I’ve been trying to use some flexi-streams (from hunchentoot) >>> with run-program and ran into a problem where run-program only wants >>> to talk to streams whose element-type is :default or (unsigned-byte >>> 8). Any thoughts on the following change to allow subtypes of >>> (unsigned-byte 8) such as flexi-streams:octet to be used? >> >> +1, but... >> >>> diff --git i/src/code/run-program.lisp w/src/code/run-program.lisp >>> index 0ddd193..07d0759 100644 >>> --- i/src/code/run-program.lisp >>> +++ w/src/code/run-program.lisp >>> @@ -936,7 +936,8 @@ (defun copy-descriptor-to-stream (descriptor stream cookie external-format) >>> (when (/= decode-end (length buf)) >>> (replace buf buf :start2 decode-end :end2 read-end)) >>> (decf read-end decode-end))))) >>> - ((member et '(:default (unsigned-byte 8)) :test #'equal) >>> + ((or (member et '(:default (unsigned-byte 8)) :test #'equal) >>> + (subtypep et '(unsigned-byte 8))) >> >> You really want this check to be (and (subtypep et '(unsigned-byte 8)) >> (subtypep '(unsigned-byte 8) et)), otherwise streams with an element >> type of, say, (unsigned-byte 4) are going to be accepted. (Or we >> could use some fancy compiler-internal TYPE-EQUAL function...) > (unsigned-byte 4) should still work. Or rather, for input streams, streams with element-type being a subtype of (unsigned-byte 8) will work, and for output streams, a supertype of (unsigned-byte 8). The run-program buffers are always 8-bit, so, it will fit into all streams starting with (unsigned-byte 8). And reverse, only streams of element-type (unsigned-byte 8) and subtypes will fit into unsigned-byte-8 buffers. Or, even easier, just don't care about element-types of streams, if the stream contains an element which does not fit into unsigned-byte-8 buffers or vice versa, read-sequence/write-sequence would signal an error. -- With best regards, Stas. |
From: Stas B. <sta...@gm...> - 2014-01-16 11:51:39
|
Cyrus Harmon <ch...@bo...> writes: > So I’ve been trying to use some flexi-streams (from hunchentoot) with run-program and ran into a problem where run-program only wants to talk to streams whose element-type is :default or (unsigned-byte 8). Any thoughts on the following change to allow subtypes of (unsigned-byte 8) such as flexi-streams:octet to be used? I committed a change that just forgoes checking for stream-element-type, and expects write/read-sequence to signal any problems, and wrapped it in handler-bind to resignal them in a nicer way. -- With best regards, Stas. |