aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/json/encode.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/encoding/json/encode.go')
-rw-r--r--src/encoding/json/encode.go50
1 files changed, 28 insertions, 22 deletions
diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go
index 9d59b0ff2b..da936173da 100644
--- a/src/encoding/json/encode.go
+++ b/src/encoding/json/encode.go
@@ -652,14 +652,20 @@ func isValidNumber(s string) bool {
// See https://tools.ietf.org/html/rfc7159#section-6
// and https://www.json.org/img/number.png
- if s == "" {
+ if len(s) == 0 {
return false
}
+ // We use an index instead of reslicing the string because
+ // reslicing a string updates both the data and length fields
+ // instead of just the one index variable.
+
+ var i int
+
// Optional -
- if s[0] == '-' {
- s = s[1:]
- if s == "" {
+ if s[i] == '-' {
+ i++
+ if len(s) == i {
return false
}
}
@@ -669,41 +675,41 @@ func isValidNumber(s string) bool {
default:
return false
- case s[0] == '0':
- s = s[1:]
+ case s[i] == '0':
+ i++
- case '1' <= s[0] && s[0] <= '9':
- s = s[1:]
- for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
- s = s[1:]
+ case '1' <= s[i] && s[i] <= '9':
+ i++
+ for len(s) > i && '0' <= s[i] && s[i] <= '9' {
+ i++
}
}
// . followed by 1 or more digits.
- if len(s) >= 2 && s[0] == '.' && '0' <= s[1] && s[1] <= '9' {
- s = s[2:]
- for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
- s = s[1:]
+ if len(s)-i >= 2 && s[i] == '.' && '0' <= s[i+1] && s[i+1] <= '9' {
+ i += 2
+ for len(s) > i && '0' <= s[i] && s[i] <= '9' {
+ i++
}
}
// e or E followed by an optional - or + and
// 1 or more digits.
- if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') {
- s = s[1:]
- if s[0] == '+' || s[0] == '-' {
- s = s[1:]
- if s == "" {
+ if len(s)-i >= 2 && (s[i] == 'e' || s[i] == 'E') {
+ i++
+ if s[i] == '+' || s[i] == '-' {
+ i++
+ if len(s) == i {
return false
}
}
- for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
- s = s[1:]
+ for len(s) > i && '0' <= s[i] && s[i] <= '9' {
+ i++
}
}
// Make sure we are at the end.
- return s == ""
+ return len(s) == i
}
func interfaceEncoder(e *encodeState, v reflect.Value, opts encOpts) {