Skip to content

Commit eb83408

Browse files
committed
Store pointers to inbuf and outbuf as a Ref field
This avoids allocating a new one each time.
1 parent 5db48b1 commit eb83408

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

src/iconv.jl

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ type StringEncoder{S<:IO} <: IO
3939
cd::Ptr{Void}
4040
inbuf::Vector{UInt8}
4141
outbuf::Vector{UInt8}
42+
inbufptr::Ref{Ptr{UInt8}}
43+
outbufptr::Ref{Ptr{UInt8}}
4244
inbytesleft::Ref{Csize_t}
4345
outbytesleft::Ref{Csize_t}
4446
end
@@ -48,25 +50,25 @@ type StringDecoder{S<:IO} <: IO
4850
cd::Ptr{Void}
4951
inbuf::Vector{UInt8}
5052
outbuf::Vector{UInt8}
53+
inbufptr::Ref{Ptr{UInt8}}
54+
outbufptr::Ref{Ptr{UInt8}}
5155
inbytesleft::Ref{Csize_t}
5256
outbytesleft::Ref{Csize_t}
5357
skip::Int
5458
end
5559

5660
function iconv!(cd::Ptr{Void}, inbuf::Vector{UInt8}, outbuf::Vector{UInt8},
61+
inbufptr::Ref{Ptr{UInt8}}, outbufptr::Ref{Ptr{UInt8}},
5762
inbytesleft::Ref{Csize_t}, outbytesleft::Ref{Csize_t})
58-
inbuf2_orig = pointer(inbuf, 1)
59-
outbuf2_orig = pointer(outbuf, 1)
63+
inbufptr[] = pointer(inbuf)
64+
outbufptr[] = pointer(outbuf)
6065

6166
inbytesleft_orig = inbytesleft[]
6267
outbytesleft[] = BUFSIZE
6368

64-
inbuf2 = Ptr{UInt8}[inbuf2_orig]
65-
outbuf2 = Ptr{UInt8}[outbuf2_orig]
66-
6769
ret = ccall((:iconv, :libc), Csize_t,
6870
(Ptr{Void}, Ptr{Ptr{UInt8}}, Ref{Csize_t}, Ptr{Ptr{UInt8}}, Ref{Csize_t}),
69-
cd, pointer(inbuf2, 1), inbytesleft, pointer(outbuf2, 1), outbytesleft)
71+
cd, inbufptr, inbytesleft, outbufptr, outbytesleft)
7072

7173
if ret == reinterpret(Csize_t, -1)
7274
err = errno()
@@ -98,11 +100,11 @@ function iconv_reset!(s::Union{StringEncoder, StringDecoder})
98100
s.skip = 0
99101
end
100102

101-
outbuf2 = Ptr{UInt8}[pointer(s.outbuf, 1)]
103+
s.outbufptr[] = pointer(s.outbuf)
102104
s.outbytesleft[] = BUFSIZE
103105
ret = ccall((:iconv, :libc), Csize_t,
104106
(Ptr{Void}, Ptr{Ptr{UInt8}}, Ref{Csize_t}, Ptr{Ptr{UInt8}}, Ref{Csize_t}),
105-
s.cd, C_NULL, C_NULL, pointer(outbuf2, 1), s.outbytesleft)
107+
s.cd, C_NULL, C_NULL, s.outbufptr, s.outbytesleft)
106108

107109
if ret == reinterpret(Csize_t, -1)
108110
err = errno()
@@ -134,7 +136,9 @@ function StringEncoder(ostream::IO, to::ASCIIString, from::ASCIIString="UTF-8")
134136
cd = iconv_open(to, from)
135137
inbuf = Vector{UInt8}(BUFSIZE)
136138
outbuf = Vector{UInt8}(BUFSIZE)
137-
s = StringEncoder(ostream, cd, inbuf, outbuf, Ref{Csize_t}(0), Ref{Csize_t}(BUFSIZE))
139+
s = StringEncoder(ostream, cd, inbuf, outbuf,
140+
Ref{Ptr{UInt8}}(pointer(inbuf)), Ref{Ptr{UInt8}}(pointer(outbuf)),
141+
Ref{Csize_t}(0), Ref{Csize_t}(BUFSIZE))
138142
finalizer(s, close)
139143
s
140144
end
@@ -149,7 +153,7 @@ function flush(s::StringEncoder)
149153
# until more data is written, which will only trigger an error on close().
150154
s.outbytesleft[] = 0
151155
while s.outbytesleft[] < BUFSIZE
152-
iconv!(s.cd, s.inbuf, s.outbuf, s.inbytesleft, s.outbytesleft)
156+
iconv!(s.cd, s.inbuf, s.outbuf, s.inbufptr, s.outbufptr, s.inbytesleft, s.outbytesleft)
153157
write(s.ostream, sub(s.outbuf, 1:(BUFSIZE - s.outbytesleft[])))
154158
end
155159

@@ -185,7 +189,9 @@ function StringDecoder(istream::IO, from::ASCIIString, to::ASCIIString="UTF-8")
185189
cd = iconv_open(to, from)
186190
inbuf = Vector{UInt8}(BUFSIZE)
187191
outbuf = Vector{UInt8}(BUFSIZE)
188-
s = StringDecoder(istream, cd, inbuf, outbuf, Ref{Csize_t}(0), Ref{Csize_t}(BUFSIZE), 0)
192+
s = StringDecoder(istream, cd, inbuf, outbuf,
193+
Ref{Ptr{UInt8}}(pointer(inbuf)), Ref{Ptr{UInt8}}(pointer(outbuf)),
194+
Ref{Csize_t}(0), Ref{Csize_t}(BUFSIZE), 0)
189195
finalizer(s, close)
190196
s
191197
end
@@ -204,7 +210,7 @@ function fill_buffer!(s::StringDecoder)
204210
end
205211

206212
s.inbytesleft[] += readbytes!(s.istream, sub(s.inbuf, (s.inbytesleft[]+1):BUFSIZE))
207-
iconv!(s.cd, s.inbuf, s.outbuf, s.inbytesleft, s.outbytesleft)
213+
iconv!(s.cd, s.inbuf, s.outbuf, s.inbufptr, s.outbufptr, s.inbytesleft, s.outbytesleft)
208214
end
209215

210216
# In order to know whether more data is available, we need to:

0 commit comments

Comments
 (0)