Skip to content

Commit 7ea7558

Browse files
committed
fix marked buffering
1 parent f46a80d commit 7ea7558

File tree

3 files changed

+19
-9
lines changed

3 files changed

+19
-9
lines changed

src/buffer.jl

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,8 @@ end
119119
# Make margin with ≥`minsize`.
120120
function makemargin!(buf::Buffer, minsize::Integer)
121121
@assert minsize 0
122-
if buffersize(buf) == 0
123-
if buf.markpos == 0
124-
buf.bufferpos = buf.marginpos = 1
125-
else
126-
buf.bufferpos = buf.marginpos = buf.markpos
127-
end
122+
if buffersize(buf) == 0 && buf.markpos == 0
123+
buf.bufferpos = buf.marginpos = 1
128124
end
129125
if marginsize(buf) < minsize
130126
# shift data to left
@@ -133,11 +129,14 @@ function makemargin!(buf::Buffer, minsize::Integer)
133129
datasize = buffersize(buf)
134130
else
135131
datapos = buf.markpos
136-
datasize = buffersize(buf) + buf.bufferpos - buf.markpos
132+
datasize = buf.marginpos - buf.markpos
137133
end
138134
copy!(buf.data, 1, buf.data, datapos, datasize)
135+
if buf.markpos > 0
136+
buf.markpos -= datapos - 1
137+
end
139138
buf.bufferpos -= datapos - 1
140-
buf.marginpos = buf.bufferpos + datasize
139+
buf.marginpos -= datapos - 1
141140
end
142141
if marginsize(buf) < minsize
143142
# expand data buffer

src/stream.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,14 +327,14 @@ end
327327

328328
function process_to_write(stream::TranscodingStream)
329329
buffer1 = stream.state.buffer1
330-
buffer2 = stream.state.buffer2
331330
if buffersize(buffer1) > 0 && stream.state.code == :end
332331
# reset
333332
stream.state.code = startproc(stream.codec, :write)
334333
if stream.state.code != :ok
335334
error("failed to reset codec")
336335
end
337336
end
337+
buffer2 = stream.state.buffer2
338338
writebuffer!(stream.stream, buffer2)
339339
makemargin!(buffer2, 1)
340340
Δin, Δout, stream.state.code = process(stream.codec, buffermem(buffer1), marginmem(buffer2))

test/runtests.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,17 @@ using Base.Test
6868
@test_throws BoundsError s.state.buffer1[0]
6969
@test_throws BoundsError s.state.buffer1[3]
7070
@test_throws BoundsError s.state.buffer1[3:4]
71+
72+
data = rand(UInt8, 1999)
73+
# unmarked
74+
stream = TranscodingStream(Identity(), IOBuffer(data), bufsize=7)
75+
@test hash(read(stream)) == hash(data)
76+
@test length(stream.state.buffer1) == 7
77+
# marked
78+
stream = TranscodingStream(Identity(), IOBuffer(data), bufsize=7)
79+
mark(stream)
80+
@test hash(read(stream)) == hash(data)
81+
@test hash(stream.state.buffer1.data[1:length(data)]) == hash(data)
7182
end
7283

7384
Pkg.test("CodecZlib")

0 commit comments

Comments
 (0)