Skip to content

Commit 4db301f

Browse files
committed
more work on spit
1 parent 9490bb1 commit 4db301f

3 files changed

Lines changed: 21 additions & 12 deletions

File tree

pixie/io.pxi

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
(ns pixie.io
22
(require pixie.streams :as st :refer :all)
33
(require pixie.uv :as uv)
4-
(require pixie.stacklets :as st))
4+
(require pixie.stacklets :as st)
5+
(require pixie.ffi :as ffi))
56

67
(defmacro defuvfsfn [nm args return]
78
`(defn ~nm ~args
@@ -97,15 +98,18 @@
9798
(write-byte [this val]
9899
(assert false))
99100
(write [this buffer]
100-
(let [_ (pixie.ffi/set! uvbuf :base buffer)
101-
_ (pixie.ffi/set! uvbuf :len (count buffer))
102-
write-count (fs_write fp uvbuf 1 offset)]
103-
(when (neg? write-count)
104-
(throw (uv/uv_err_name read-count)))
105-
(assert (= write-count (count buffer)) (str "Write error!" write-count " " (count buffer)))
106-
(set-field! this :offset (+ offset write-count))
107-
(set-buffer-count! buffer write-count)
108-
write-count))
101+
(loop [buffer-offset 0]
102+
(let [_ (pixie.ffi/set! uvbuf :base (ffi/ptr-add buffer buffer-offset))
103+
_ (pixie.ffi/set! uvbuf :len (- (count buffer) buffer-offset))
104+
write-count (fs_write fp uvbuf 1 (get-field this :offset))]
105+
(println "offset " offset)
106+
(when (neg? write-count)
107+
(throw (uv/uv_err_name read-count)))
108+
(assert (= write-count (count buffer)) (str "Write error!" write-count " " (count buffer)))
109+
(set-field! this :offset (+ (get-field this :offset) write-count))
110+
(if (< (+ buffer-offset write-count) (count buffer))
111+
(recur (+ buffer-offset write-count))
112+
write-count))))
109113
IClosable
110114
(close [this]
111115
(fclose fp)))
@@ -117,7 +121,7 @@
117121
(set-field! this :idx (inc idx))
118122
(when (= idx (buffer-capacity buffer))
119123
(write downstream buffer)
120-
(set-field this :idx 0)))
124+
(set-field! this :idx 0)))
121125
IClosable
122126
(close [this]
123127
(set-buffer-count! buffer idx)

pixie/vm/libs/ffi.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,11 @@ def pack(ptr, offset, tp, val):
473473
tp.ffi_set_value(ptr, val)
474474
return nil
475475

476+
@as_var(u"pixie.ffi", u"ptr-add")
477+
def pack(ptr, offset):
478+
affirm(isinstance(ptr, VoidP) or isinstance(ptr, Buffer) or isinstance(ptr, CStruct), u"Type is not unpackable")
479+
ptr = rffi.ptradd(ptr.raw_data(), offset.int_val())
480+
return VoidP(ptr)
476481

477482
class CStructType(object.Type):
478483
base_type = object.Type(u"pixie.ffi.CStruct")

tests/pixie/tests/test-io.pxi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,5 @@
2626

2727

2828
(t/deftest test-slurp-spit
29-
(let [val (vec (range 128))]
29+
(let [val (vec (range 1280))]
3030
(t/assert= val (read-string (io/slurp "test.tmp" (io/spit "test.tmp" val))))))

0 commit comments

Comments
 (0)