]> gitweb.factorcode.org Git - factor.git/commitdiff
io.ports: make sure read/write is to a pinned alien
authorJohn Benediktsson <mrjbq7@gmail.com>
Thu, 20 Jul 2023 19:07:55 +0000 (12:07 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Thu, 20 Jul 2023 19:07:55 +0000 (12:07 -0700)
basis/io/ports/ports.factor

index c83d1429c07caae6cd433cbf7382b87a25e390ee..82801f21eb8227ea9d782594dd4873d3e7663a42 100644 (file)
@@ -61,11 +61,10 @@ M: input-port stream-read1
 :: read-loop ( dst n-remaining port n-read -- n-total )
     n-remaining port read-step :> ( n-buffered ptr )
     ptr [
-        dst ptr n-buffered memcpy
+        n-read dst <displaced-alien> ptr n-buffered memcpy
         n-remaining n-buffered fixnum-fast :> n-remaining'
         n-read n-buffered fixnum+fast :> n-read'
-        n-buffered dst <displaced-alien> :> dst'
-        dst' n-remaining' port n-read' read-loop
+        dst n-remaining' port n-read' read-loop
     ] [ n-read ] if ; inline recursive
 
 PRIVATE>
@@ -140,24 +139,21 @@ M: output-port stream-write1
 
 <PRIVATE
 
-:: port-write ( c-ptr n-remaining port -- )
+:: port-write ( src n-remaining port n-write  -- )
     port buffer>> :> buffer
-    n-remaining buffer size>> min :> n-write
+    n-remaining buffer size>> min :> n-chunk
 
-    n-write port wait-to-write
-    c-ptr n-write buffer buffer-write
+    n-chunk port wait-to-write
+    n-write src >c-ptr <displaced-alien> n-chunk buffer buffer-write
 
-    n-remaining n-write fixnum-fast dup 0 > [
-        n-write c-ptr <displaced-alien> swap port port-write
+    n-remaining n-chunk fixnum-fast dup 0 > [
+        src swap port n-write n-chunk fixnum+fast port-write
     ] [ drop ] if ; inline recursive
 
 PRIVATE>
 
 M: output-port stream-write
-    check-disposed [
-        binary-object
-        [ c-ptr check-instance ] [ integer>fixnum-strict ] bi*
-    ] [ port-write ] bi* ;
+    [ dup byte-length integer>fixnum-strict ] dip check-disposed 0 port-write ;
 
 HOOK: tell-handle os ( handle -- n )