strings: cleanup unsafe casts in some of strings.Builder ops (#13819)

pull/13823/head
Delyan Angelov 2022-03-25 00:07:15 +02:00 committed by GitHub
parent 5b492e26dd
commit d6c40865f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 13 additions and 6 deletions

View File

@ -103,11 +103,20 @@ pub fn (mut b Builder) go_back(n int) {
b.trim(b.len - n)
}
[inline]
fn (b &Builder) spart(start_pos int, n int) string {
unsafe {
mut x := malloc_noscan(n + 1)
vmemcpy(x, &byte(b.data) + start_pos, n)
x[n] = 0
return tos(x, n)
}
}
// cut_last cuts the last `n` bytes from the buffer and returns them
pub fn (mut b Builder) cut_last(n int) string {
cut_pos := b.len - n
x := unsafe { (*&[]byte(b))[cut_pos..] }
res := x.bytestr()
res := b.spart(cut_pos, n)
b.trim(cut_pos)
return res
}
@ -147,8 +156,7 @@ pub fn (b &Builder) last_n(n int) string {
if n > b.len {
return ''
}
x := unsafe { (*&[]byte(b))[b.len - n..] }
return x.bytestr()
return b.spart(b.len - n, n)
}
// after(6) returns 'world'
@ -157,8 +165,7 @@ pub fn (b &Builder) after(n int) string {
if n >= b.len {
return ''
}
x := unsafe { (*&[]byte(b))[n..] }
return x.bytestr()
return b.spart(n, b.len - n)
}
// str returns a copy of all of the accumulated buffer content.