From 25f3032d0412e0fd8d05afbe983ffa9ab469b453 Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Thu, 20 Nov 2014 17:19:16 -0800 Subject: [PATCH] io.ports: use fixnum where possible, assert c-ptr since we use memcpy. --- basis/io/ports/ports.factor | 39 +++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/basis/io/ports/ports.factor b/basis/io/ports/ports.factor index 1254a4dce4..8e7a529c5f 100644 --- a/basis/io/ports/ports.factor +++ b/basis/io/ports/ports.factor @@ -2,8 +2,8 @@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien byte-arrays combinators destructors hints io io.backend io.buffers io.encodings io.files io.timeouts -kernel kernel.private libc locals math math.order namespaces -sequences strings system ; +kernel kernel.private libc locals math math.order math.private +namespaces sequences strings system ; IN: io.ports SYMBOL: default-buffer-size @@ -42,6 +42,11 @@ M: input-port stream-read1 dup check-disposed dup wait-to-read [ drop f ] [ buffer>> buffer-pop ] if ; inline +ERROR: not-a-c-ptr object ; + +: check-c-ptr ( c-ptr -- c-ptr ) + dup c-ptr? [ not-a-c-ptr ] unless ; inline + ( n-buffered ptr ) ptr [ dst ptr n-buffered memcpy - n-remaining n-buffered - :> n-remaining' - n-read n-buffered + :> n-read' + n-remaining n-buffered fixnum-fast :> n-remaining' + n-read n-buffered fixnum+fast :> n-read' n-buffered dst :> dst' dst' n-remaining' port n-read' read-loop ] [ n-read ] if ; inline recursive @@ -68,11 +73,11 @@ M: input-port stream-read1 PRIVATE> M: input-port stream-read-partial-unsafe - swapd prepare-read read-step + [ check-c-ptr swap ] dip prepare-read read-step [ swap [ memcpy ] keep ] [ 2drop 0 ] if* ; M: input-port stream-read-unsafe - swapd prepare-read 0 read-loop ; + [ check-c-ptr swap ] dip prepare-read 0 read-loop ; -M: input-port stream-read-until ( seps port -- byte-array/f sep/f ) +M: input-port stream-read-until 2dup read-until-step dup [ [ 2drop ] 2dip ] [ over [ drop @@ -127,9 +132,9 @@ M: output-port stream-flush [ drop ] [ port-flush ] if ; inline M: output-port stream-write1 - dup check-disposed - 1 over wait-to-write - buffer>> buffer-write1 ; inline + [ check-disposed ] + [ 1 swap wait-to-write ] + [ buffer>> buffer-write1 ] tri ; inline [ + n-remaining n-write fixnum-fast dup 0 > [ n-write c-ptr swap port port-write ] [ drop ] if ; inline recursive PRIVATE> M: output-port stream-write - dup check-disposed - [ binary-object integer>fixnum-strict ] [ port-write ] bi* ; + dup check-disposed [ + binary-object + [ check-c-ptr ] [ integer>fixnum-strict ] bi* + ] [ port-write ] bi* ; HOOK: tell-handle os ( handle -- n ) @@ -235,9 +242,3 @@ M: object underlying-handle underlying-port handle>> ; HINTS: (decode-until) { string input-port object } ; - -HINTS: M\ input-port stream-read-partial-unsafe - { fixnum byte-array object } ; - -HINTS: M\ input-port stream-read-unsafe - { fixnum byte-array object } ;