@@ -59,6 +59,13 @@ String(s::Symbol) = unsafe_string(Cstring(s))
59
59
pointer (s:: String ) = unsafe_convert (Ptr{UInt8}, s)
60
60
pointer (s:: String , i:: Integer ) = pointer (s)+ (i- 1 )
61
61
62
+ function unsafe_load (s:: String , i:: Integer = 1 )
63
+ ptr = pointer (s, i)
64
+ r = unsafe_load (ptr)
65
+ Core. gcuse (s)
66
+ r
67
+ end
68
+
62
69
sizeof (s:: String ) = Core. sizeof (s)
63
70
64
71
"""
@@ -73,7 +80,7 @@ codeunit(s::AbstractString, i::Integer)
73
80
@boundscheck if (i < 1 ) | (i > sizeof (s))
74
81
throw (BoundsError (s,i))
75
82
end
76
- unsafe_load (pointer (s), i)
83
+ unsafe_load (s, i)
77
84
end
78
85
79
86
write (io:: IO , s:: String ) = unsafe_write (io, pointer (s), reinterpret (UInt, sizeof (s)))
@@ -160,26 +167,24 @@ const utf8_trailing = [
160
167
# # required core functionality ##
161
168
162
169
function endof (s:: String )
163
- p = pointer (s)
164
170
i = sizeof (s)
165
- while i > 0 && is_valid_continuation (unsafe_load (p, i))
171
+ while i > 0 && is_valid_continuation (unsafe_load (s, i))
166
172
i -= 1
167
173
end
168
174
i
169
175
end
170
176
171
177
function length (s:: String )
172
- p = pointer (s)
173
178
cnum = 0
174
179
for i = 1 : sizeof (s)
175
- cnum += ! is_valid_continuation (unsafe_load (p, i))
180
+ cnum += ! is_valid_continuation (unsafe_load (s, i))
176
181
end
177
182
cnum
178
183
end
179
184
180
- @noinline function slow_utf8_next (p :: Ptr{UInt8} , b:: UInt8 , i:: Int , l:: Int )
185
+ @noinline function slow_utf8_next (s :: String , b:: UInt8 , i:: Int , l:: Int )
181
186
if is_valid_continuation (b)
182
- throw (UnicodeError (UTF_ERR_INVALID_INDEX, i, unsafe_load (p, i)))
187
+ throw (UnicodeError (UTF_ERR_INVALID_INDEX, i, unsafe_load (s, i)))
183
188
end
184
189
trailing = utf8_trailing[b + 1 ]
185
190
if l < i + trailing
188
193
c:: UInt32 = 0
189
194
for j = 1 : (trailing + 1 )
190
195
c <<= 6
191
- c += unsafe_load (p, i)
196
+ c += unsafe_load (s, i)
192
197
i += 1
193
198
end
194
199
c -= utf8_offset[trailing + 1 ]
@@ -206,12 +211,11 @@ done(s::String, state) = state > sizeof(s)
206
211
@boundscheck if (i < 1 ) | (i > sizeof (s))
207
212
throw (BoundsError (s,i))
208
213
end
209
- p = pointer (s)
210
- b = unsafe_load (p, i)
214
+ b = unsafe_load (s, i)
211
215
if b < 0x80
212
216
return Char (b), i + 1
213
217
end
214
- return slow_utf8_next (p , b, i, sizeof (s))
218
+ return slow_utf8_next (s , b, i, sizeof (s))
215
219
end
216
220
217
221
function first_utf8_byte (ch:: Char )
225
229
226
230
function reverseind (s:: String , i:: Integer )
227
231
j = sizeof (s) + 1 - i
228
- p = pointer (s)
229
- while is_valid_continuation (unsafe_load (p,j))
232
+ while is_valid_continuation (unsafe_load (s, j))
230
233
j -= 1
231
234
end
232
235
return j
235
238
# # overload methods for efficiency ##
236
239
237
240
isvalid (s:: String , i:: Integer ) =
238
- (1 <= i <= sizeof (s)) && ! is_valid_continuation (unsafe_load (pointer (s), i))
241
+ (1 <= i <= sizeof (s)) && ! is_valid_continuation (unsafe_load (s, i))
239
242
240
243
function getindex (s:: String , r:: UnitRange{Int} )
241
244
isempty (r) && return " "
@@ -438,7 +441,7 @@ function repeat(s::String, r::Integer)
438
441
n = sizeof (s)
439
442
out = _string_n (n* r)
440
443
if n == 1 # common case: repeating a single ASCII char
441
- ccall (:memset , Ptr{Void}, (Ptr{UInt8}, Cint, Csize_t), out, unsafe_load (pointer (s) ), r)
444
+ ccall (:memset , Ptr{Void}, (Ptr{UInt8}, Cint, Csize_t), out, unsafe_load (s ), r)
442
445
else
443
446
for i= 1 : r
444
447
unsafe_copy! (pointer (out, 1 + (i- 1 )* n), pointer (s), n)
0 commit comments