aboutsummaryrefslogtreecommitdiff
path: root/src/strconv/atoi.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/strconv/atoi.go')
-rw-r--r--src/strconv/atoi.go23
1 files changed, 9 insertions, 14 deletions
diff --git a/src/strconv/atoi.go b/src/strconv/atoi.go
index 45341820cd..599ad9b895 100644
--- a/src/strconv/atoi.go
+++ b/src/strconv/atoi.go
@@ -4,7 +4,10 @@
package strconv
-import "errors"
+import (
+ "errors"
+ "internal/stringslite"
+)
// lower(c) is a lower-case letter if and only if
// c is either that lower-case letter or the equivalent upper-case letter.
@@ -33,8 +36,6 @@ func (e *NumError) Error() string {
func (e *NumError) Unwrap() error { return e.Err }
-// cloneString returns a string copy of x.
-//
// All ParseXXX functions allow the input string to escape to the error value.
// This hurts strconv.ParseXXX(string(b)) calls where b is []byte since
// the conversion from []byte must allocate a string on the heap.
@@ -42,27 +43,21 @@ func (e *NumError) Unwrap() error { return e.Err }
// back to the output by copying it first. This allows the compiler to call
// strconv.ParseXXX without a heap allocation for most []byte to string
// conversions, since it can now prove that the string cannot escape Parse.
-//
-// TODO: Use strings.Clone instead? However, we cannot depend on "strings"
-// since it incurs a transitive dependency on "unicode".
-// Either move strings.Clone to an internal/bytealg or make the
-// "strings" to "unicode" dependency lighter (see https://go.dev/issue/54098).
-func cloneString(x string) string { return string([]byte(x)) }
func syntaxError(fn, str string) *NumError {
- return &NumError{fn, cloneString(str), ErrSyntax}
+ return &NumError{fn, stringslite.Clone(str), ErrSyntax}
}
func rangeError(fn, str string) *NumError {
- return &NumError{fn, cloneString(str), ErrRange}
+ return &NumError{fn, stringslite.Clone(str), ErrRange}
}
func baseError(fn, str string, base int) *NumError {
- return &NumError{fn, cloneString(str), errors.New("invalid base " + Itoa(base))}
+ return &NumError{fn, stringslite.Clone(str), errors.New("invalid base " + Itoa(base))}
}
func bitSizeError(fn, str string, bitSize int) *NumError {
- return &NumError{fn, cloneString(str), errors.New("invalid bit size " + Itoa(bitSize))}
+ return &NumError{fn, stringslite.Clone(str), errors.New("invalid bit size " + Itoa(bitSize))}
}
const intSize = 32 << (^uint(0) >> 63)
@@ -221,7 +216,7 @@ func ParseInt(s string, base int, bitSize int) (i int64, err error) {
un, err = ParseUint(s, base, bitSize)
if err != nil && err.(*NumError).Err != ErrRange {
err.(*NumError).Func = fnParseInt
- err.(*NumError).Num = cloneString(s0)
+ err.(*NumError).Num = stringslite.Clone(s0)
return 0, err
}