This commit is contained in:
Sky Johnson 2025-03-01 21:23:33 -06:00
parent 3563c0f8ee
commit 4091a45658

View File

@ -6,7 +6,6 @@ import (
"fmt" "fmt"
"io" "io"
"strconv" "strconv"
"strings"
"unicode" "unicode"
) )
@ -393,9 +392,11 @@ func (s *Scanner) ScanString() (any, error) {
return nil, err return nil, err
} }
var builder strings.Builder // Reset buffer while preserving capacity
builder.Grow(64) // Preallocate with reasonable capacity s.buffer = s.buffer[:0]
// Avoid strings.Builder as it creates a new array internally
// and instead use our rune buffer directly
for { for {
r, _, err := s.ReadRune() r, _, err := s.ReadRune()
if err != nil { if err != nil {
@ -414,23 +415,23 @@ func (s *Scanner) ScanString() (any, error) {
} }
switch escaped { switch escaped {
case '"': case '"':
builder.WriteRune('"') s.buffer = append(s.buffer, '"')
case '\\': case '\\':
builder.WriteRune('\\') s.buffer = append(s.buffer, '\\')
case 'n': case 'n':
builder.WriteRune('\n') s.buffer = append(s.buffer, '\n')
case 't': case 't':
builder.WriteRune('\t') s.buffer = append(s.buffer, '\t')
default: default:
builder.WriteRune('\\') s.buffer = append(s.buffer, '\\', escaped)
builder.WriteRune(escaped)
} }
} else { } else {
builder.WriteRune(r) s.buffer = append(s.buffer, r)
} }
} }
return builder.String(), nil // Convert rune slice to string once at the end
return string(s.buffer), nil
} }
// ConvertValue converts string values to their appropriate types // ConvertValue converts string values to their appropriate types