Eliminate tmp buffer from packTxtString (#1429)

This allocation and the copy of s are both pointless.
This commit is contained in:
Tom Thorogood 2023-03-12 20:42:57 +10:30 committed by GitHub
parent 85afa114a5
commit b69c3a2007
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 20 deletions

27
msg.go
View File

@ -448,7 +448,7 @@ Loop:
return string(s), off1, nil return string(s), off1, nil
} }
func packTxt(txt []string, msg []byte, offset int, tmp []byte) (int, error) { func packTxt(txt []string, msg []byte, offset int) (int, error) {
if len(txt) == 0 { if len(txt) == 0 {
if offset >= len(msg) { if offset >= len(msg) {
return offset, ErrBuf return offset, ErrBuf
@ -458,10 +458,7 @@ func packTxt(txt []string, msg []byte, offset int, tmp []byte) (int, error) {
} }
var err error var err error
for _, s := range txt { for _, s := range txt {
if len(s) > len(tmp) { offset, err = packTxtString(s, msg, offset)
return offset, ErrBuf
}
offset, err = packTxtString(s, msg, offset, tmp)
if err != nil { if err != nil {
return offset, err return offset, err
} }
@ -469,32 +466,30 @@ func packTxt(txt []string, msg []byte, offset int, tmp []byte) (int, error) {
return offset, nil return offset, nil
} }
func packTxtString(s string, msg []byte, offset int, tmp []byte) (int, error) { func packTxtString(s string, msg []byte, offset int) (int, error) {
lenByteOffset := offset lenByteOffset := offset
if offset >= len(msg) || len(s) > len(tmp) { if offset >= len(msg) || len(s) > 256*4+1 /* If all \DDD */ {
return offset, ErrBuf return offset, ErrBuf
} }
offset++ offset++
bs := tmp[:len(s)] for i := 0; i < len(s); i++ {
copy(bs, s)
for i := 0; i < len(bs); i++ {
if len(msg) <= offset { if len(msg) <= offset {
return offset, ErrBuf return offset, ErrBuf
} }
if bs[i] == '\\' { if s[i] == '\\' {
i++ i++
if i == len(bs) { if i == len(s) {
break break
} }
// check for \DDD // check for \DDD
if i+2 < len(bs) && isDigit(bs[i]) && isDigit(bs[i+1]) && isDigit(bs[i+2]) { if i+2 < len(s) && isDigit(s[i]) && isDigit(s[i+1]) && isDigit(s[i+2]) {
msg[offset] = dddToByte(bs[i:]) msg[offset] = dddStringToByte(s[i:])
i += 2 i += 2
} else { } else {
msg[offset] = bs[i] msg[offset] = s[i]
} }
} else { } else {
msg[offset] = bs[i] msg[offset] = s[i]
} }
offset++ offset++
} }

View File

@ -299,8 +299,7 @@ func unpackString(msg []byte, off int) (string, int, error) {
} }
func packString(s string, msg []byte, off int) (int, error) { func packString(s string, msg []byte, off int) (int, error) {
txtTmp := make([]byte, 256*4+1) off, err := packTxtString(s, msg, off)
off, err := packTxtString(s, msg, off, txtTmp)
if err != nil { if err != nil {
return len(msg), err return len(msg), err
} }
@ -402,8 +401,7 @@ func unpackStringTxt(msg []byte, off int) ([]string, int, error) {
} }
func packStringTxt(s []string, msg []byte, off int) (int, error) { func packStringTxt(s []string, msg []byte, off int) (int, error) {
txtTmp := make([]byte, 256*4+1) // If the whole string consists out of \DDD we need this many. off, err := packTxt(s, msg, off)
off, err := packTxt(s, msg, off, txtTmp)
if err != nil { if err != nil {
return len(msg), err return len(msg), err
} }