| Age | Commit message (Collapse) | Author |
|
It's what the documentation says, and oddly it already behaves correctly
for right padding, not left. (We never pad with zeros on the right.)
Just don't do it.
Fixes #56486
Change-Id: I2465edea93c69084e33bee0d945d5a1b85e6cd14
Reviewed-on: https://go-review.googlesource.com/c/go/+/555776
Reviewed-by: Russ Cox <rsc@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Rob Pike <r@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
|
|
The unused analyzer handles dot imports now, so a few tests
have picked up vet errors. This CL errors like:
context/x_test.go:524:47: result of context.WithValue call not used
Change-Id: I711a62fd7b50381f8ea45ac526bf0c946a171047
Reviewed-on: https://go-review.googlesource.com/c/go/+/493598
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Alan Donovan <adonovan@google.com>
|
|
This is both simpler and more performant.
The need for fmt.fmtC to manually check for utf8.MaxRune
is subtle to avoid overflow when converting uint64 to rune,
so a test case was added to exercise this edge case.
Change-Id: I0f2e6cce91dcd4cc6b88190c29807ca1c58e999d
Reviewed-on: https://go-review.googlesource.com/c/go/+/412335
Auto-Submit: Joseph Tsai <joetsai@digital-static.net>
Auto-Submit: Robert Griesemer <gri@google.com>
Run-TryBot: Joseph Tsai <joetsai@digital-static.net>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@google.com>
Run-TryBot: Robert Griesemer <gri@google.com>
|
|
Previously when a printer had a large buffer we dropped both
the buffer and the printer. There is no need to drop the printer
in this case, as a printer with a nil buffer is valid. So we
just drop the buffer and recycle the printer anyway.
This saves one allocation in case the buffer is over the limit.
Also tighten some of the tests for other unrelated cases.
Change-Id: Iba1b6a71ca4691464b8c68ab0b6ab0d4d5d6168c
Reviewed-on: https://go-review.googlesource.com/c/go/+/427395
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Rob Pike <r@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Rob Pike <r@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
|
|
These are straightforward variants of the existing Sprintf etc.,
but append the resulting bytes to a provided buffer rather than
returning a string.
Internally, there is potentially some allocation because the package
uses a pool of buffers to build its output. We make no attempt to
override that, so the result is first printed into the pool and
then copied to the output. Since it is a managed pool, asymptotically
there should be no extra allocation.
Fixes #47579
RELNOTE=yes
Change-Id: Icef797f9b6f0c84d03e7035d95c06cdb819e2649
Reviewed-on: https://go-review.googlesource.com/c/go/+/406177
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
|
|
And then revert the bootstrap cmd directories and certain testdata.
And adjust tests as needed.
Not reverting the changes in std that are bootstrapped,
because some of those changes would appear in API docs,
and we want to use any consistently.
Instead, rewrite 'any' to 'interface{}' in cmd/dist for those directories
when preparing the bootstrap copy.
A few files changed as a result of running gofmt -w
not because of interface{} -> any but because they
hadn't been updated for the new //go:build lines.
Fixes #49884.
Change-Id: Ie8045cba995f65bd79c694ec77a1b3d1fe01bb09
Reviewed-on: https://go-review.googlesource.com/c/go/+/368254
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
|
|
Instead of returning a bad verb error format for runes above
utf8.Maxrune return a quoted utf8.RuneError rune (\ufffd).
This makes the behaviour consistent with the "c" verb and
aligns behaviour to not return bad verb error format when
a verb is applied to the correct argument type.
Fixes #14569
Change-Id: I679485f6bb90ebe408423ab68af16cce38816cd0
Reviewed-on: https://go-review.googlesource.com/c/go/+/248759
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Fixes #36562
Change-Id: Id98ae9f7362cfb825b306c36649d505692d6d60e
GitHub-Last-Rev: 405d51b12eb04da8cc3559c92f1546e69a8c1a19
GitHub-Pull-Request: golang/go#36588
Reviewed-on: https://go-review.googlesource.com/c/go/+/215001
Reviewed-by: Rob Pike <r@golang.org>
|
|
Instead use string(r) where r has type rune.
This is in preparation for a vet warning for string(i).
Updates #32479
Change-Id: Ic205269bba1bd41723950219ecfb67ce17a7aa79
Reviewed-on: https://go-review.googlesource.com/c/go/+/220844
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Akhil Indurti <aindurti@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Toshihiro Shiino <shiino.toshihiro@gmail.com>
|
|
This CL modifies fmt's printer to implement %#b and %O
to emit leading 0b and 0o prefixes on binary and octal.
(%#o is already taken and emits "0377"; %O emits "0o377".)
See golang.org/design/19308-number-literals for background.
For #19308.
For #12711.
Vet update is #29986.
Change-Id: I7c38a4484c48a03abe9f6d45c7d981c7c314f583
Reviewed-on: https://go-review.googlesource.com/c/160246
Reviewed-by: Robert Griesemer <gri@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
This CL modifies fmt's printer to implement %x and %X
for formatting floating-point data (floats and complexes)
in standard hexadecimal notation.
See golang.org/design/19308-number-literals for background.
For #29008.
Vet update is #29986.
Change-Id: If2842a11631bc393a1ebcf6914ed07658652af5a
Reviewed-on: https://go-review.googlesource.com/c/160245
Reviewed-by: Robert Griesemer <gri@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Fixes #25707
Change-Id: Idfa379db8cc0e105ea68455ec0b4a0dbc1b3f485
Reviewed-on: https://go-review.googlesource.com/c/153827
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
|
|
fmtBytes is in the top 10 callers of runtime.slicebytetostring according
to Google wide profiling data.
Avoid the string conversion of the input byte slice in fmtBytes by calling
a newly added specialized fmtS function for byte slices.
Expand tests for verb s with widths to test strings and byte slice arguments.
SprintfTruncateString 157ns ± 4% 156ns ± 3% ~ (p=0.122 n=20+20)
SprintfTruncateBytes 188ns ± 2% 155ns ± 3% -18.00% (p=0.000 n=20+19)
name old alloc/op new alloc/op delta
SprintfTruncateString 16.0B ± 0% 16.0B ± 0% ~ (all equal)
SprintfTruncateBytes 64.0B ± 0% 16.0B ± 0% -75.00% (p=0.000 n=20+20)
name old allocs/op new allocs/op delta
SprintfTruncateString 1.00 ± 0% 1.00 ± 0% ~ (all equal)
SprintfTruncateBytes 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=20+20)
Change-Id: I461bf514d4232b39bd9c812f7faa4e5ef693a03b
Reviewed-on: https://go-review.googlesource.com/c/145284
Run-TryBot: Martin Möhrmann <martisch@uos.de>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Numbers without decimals are valid Go representations of whole-number
floats. That is, "var x float64 = 5" is valid Go. Avoid breakage in
tests that expect a certain output from %#v by reverting to it.
To guarantee the right type is generated by a print use %T(%#v) instead.
Added a test to lock in this behavior.
This reverts commit 7c7cecc1846aaaa0ce73931644fe1df2b4559e09.
Fixes #27634
Updates #26363
Change-Id: I544c400a0903777dd216452a7e86dfe60b0b0283
Reviewed-on: https://go-review.googlesource.com/c/142597
Run-TryBot: Filippo Valsorda <filippo@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
|
|
And start using it elsewhere in the standard library, removing the
copies in the process.
While at it, rewrite the io.WriteString godoc to be more clear, since it
can now make reference to the defined interface.
Fixes #27946.
Change-Id: Id5ba223c09c19e5fb49815bd3b1bd3254fc786f3
Reviewed-on: https://go-review.googlesource.com/c/139457
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
|
|
This fixes the unwanted behaviour where printing a zero float with the
#v fmt verb outputs "0" - e.g. missing the trailing decimal. This means
that the output would be interpreted as an int rather than a float when
parsed as Go source. After this change the the output is "0.0".
Fixes #26363
Change-Id: Ic5c060522459cd5ce077675d47c848b22ddc34fa
GitHub-Last-Rev: adfb061363f0566acec134c81be9a3dcb1f4cac8
GitHub-Pull-Request: golang/go#26383
Reviewed-on: https://go-review.googlesource.com/123956
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: Rob Pike <r@golang.org>
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
|
|
Previously fmt would first obtain a list of map keys
and then look up the value for each key. Since NaNs can
be map keys but cannot be fetched directly, the lookup would
fail and return a zero reflect.Value, which formats as <nil>.
golang.org/cl/33572 added a map iterator to the reflect package
that is used in this CL to retrieve the key and value from
the map and prints the correct value even for keys that are not
equal to themselves.
Fixes #14427
Change-Id: I9e1522959760b3de8b7ecf7a6e67cd603339632a
Reviewed-on: https://go-review.googlesource.com/129777
Reviewed-by: Alan Donovan <adonovan@google.com>
|
|
Hide in the source code instead of in the separate whitelist.
Removes the only printf false positive in the standard library.
Change-Id: I99285e67588c7c93bd56d59ee768a03be7c301e7
Reviewed-on: https://go-review.googlesource.com/74590
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
This allows io.WriteString to make use of WriteString method
implemented by pp when writing a string to fmt.State.
Fixes #20786
Change-Id: Ice7a92bf303127ad87f05562217fa076f5c589ad
Reviewed-on: https://go-review.googlesource.com/61430
Reviewed-by: Rob Pike <r@golang.org>
|
|
name old time/op new time/op delta
SprintfSlowParsingPath 108ns ± 4% 103ns ± 4% -4.53% (p=0.000 n=18+18)
Change-Id: I174463f303d1857e8d5b8a6283c025b3546e7b39
Reviewed-on: https://go-review.googlesource.com/44450
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Added an alternate form of printing floats and complex values
by specifying the sharp flag.
Output formatted using the the verbs v, e, E, f, F, g and G in
combination with the sharp flag will always include a decimal point.
The alternate form specified by the sharp flag for %g and %G verbs
will not truncate trailing zeros and assume a default precision of 6.
Fixes #18857.
Change-Id: I4d776239e06d7a6a90f2d8556240a359888cb7c3
Reviewed-on: https://go-review.googlesource.com/37051
Reviewed-by: Rob Pike <r@golang.org>
|
|
Fixes #18282
Change-Id: I024ca4a03bbbcccd48a0a6245bc3ec22c6a90288
Reviewed-on: https://go-review.googlesource.com/34254
TryBot-Result: Gobot Gobot <gobot@golang.org>
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Check for and call the special printing and format methods such as String
at printing depth 0 when printing the concrete value of a reflect.Value.
Fixes: #16015
Change-Id: I23bd2927255b60924e5558321e98dd4a95e11c4c
Reviewed-on: https://go-review.googlesource.com/30753
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Martin Möhrmann <martisch@uos.de>
TryBot-Result: Gobot Gobot <gobot@golang.org>
|
|
Change-Id: Ie7b869892816a171d8c71612998cc32a190aeff9
Reviewed-on: https://go-review.googlesource.com/17227
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
|
|
Ignore the f.zero flag and use spaces for padding instead
when precision is set.
Fixes #15331
Change-Id: I3ac485df24b7bdf4fddf69e3cc17c213c737b5ff
Reviewed-on: https://go-review.googlesource.com/22131
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Move boolean fields to the end of the pp struct for better packing.
Increase the fmt.intbuf size to leave no padding space unused
at the end of the fmt struct on 32 bit architectures.
The size of the pp struct on amd64 is decreased from 192 byte
to 184 byte and on 386 from 132 byte to 128 byte.
Simplify buffer size calculation in fmt_integer.
Consolidate test cases for intbuf overflow checks.
amd64 Haswell:
name old time/op new time/op delta
SprintfPadding-2 227ns ± 2% 227ns ± 1% ~ (p=0.941 n=25+25)
SprintfEmpty-2 38.4ns ± 6% 35.8ns ±23% -6.71% (p=0.030 n=24+25)
SprintfString-2 100ns ± 0% 101ns ± 0% +1.00% (p=0.000 n=19+18)
SprintfTruncateString-2 142ns ± 1% 142ns ± 1% +0.37% (p=0.028 n=25+25)
SprintfQuoteString-2 397ns ± 0% 393ns ± 0% -0.82% (p=0.000 n=21+24)
SprintfInt-2 101ns ± 2% 102ns ± 4% ~ (p=0.159 n=21+24)
SprintfIntInt-2 155ns ± 3% 155ns ± 3% ~ (p=0.934 n=25+25)
SprintfPrefixedInt-2 252ns ± 2% 251ns ± 2% ~ (p=0.198 n=25+25)
SprintfFloat-2 184ns ± 3% 179ns ± 2% -3.07% (p=0.000 n=24+25)
SprintfComplex-2 532ns ± 2% 535ns ± 2% +0.64% (p=0.046 n=25+24)
SprintfBoolean-2 90.5ns ± 3% 91.6ns ± 2% +1.17% (p=0.000 n=22+22)
SprintfHexString-2 164ns ± 2% 165ns ± 3% ~ (p=0.066 n=25+25)
SprintfHexBytes-2 171ns ± 3% 170ns ± 3% ~ (p=0.941 n=25+24)
SprintfBytes-2 320ns ± 1% 313ns ± 1% -2.31% (p=0.000 n=24+21)
SprintfStringer-2 347ns ± 2% 348ns ± 2% ~ (p=0.426 n=24+24)
SprintfStructure-2 753ns ± 1% 742ns ± 1% -1.49% (p=0.000 n=24+25)
FprintInt-2 145ns ± 0% 144ns ± 0% -0.69% (p=0.000 n=24+23)
FprintfBytes-2 163ns ± 0% 163ns ± 0% -0.27% (p=0.000 n=25+25)
FprintIntNoAlloc-2 108ns ± 0% 105ns ± 0% -2.78% (p=0.000 n=25+2
386 Haswell:
name old time/op new time/op delta
SprintfPadding-2 426ns ± 2% 422ns ± 1% -0.89% (p=0.000 n=25+24)
SprintfEmpty-2 24.6ns ± 1% 24.5ns ± 0% -0.39% (p=0.000 n=22+15)
SprintfString-2 99.1ns ± 3% 95.6ns ± 0% -3.52% (p=0.000 n=25+24)
SprintfTruncateString-2 156ns ± 4% 153ns ± 1% -1.65% (p=0.000 n=24+23)
SprintfQuoteString-2 500ns ± 2% 493ns ± 1% -1.49% (p=0.000 n=25+24)
SprintfInt-2 92.6ns ± 9% 88.3ns ± 1% -4.72% (p=0.000 n=25+25)
SprintfIntInt-2 143ns ± 7% 137ns ± 2% -4.01% (p=0.000 n=23+25)
SprintfPrefixedInt-2 268ns ±19% 264ns ±16% ~ (p=0.826 n=24+24)
SprintfFloat-2 242ns ± 4% 246ns ± 2% +1.60% (p=0.000 n=25+25)
SprintfComplex-2 1.04µs ± 3% 1.03µs ± 1% -0.89% (p=0.026 n=25+25)
SprintfBoolean-2 82.2ns ± 9% 80.7ns ± 2% ~ (p=0.163 n=24+24)
SprintfHexString-2 240ns ± 5% 224ns ± 2% -6.94% (p=0.000 n=25+25)
SprintfHexBytes-2 245ns ± 3% 234ns ± 2% -4.55% (p=0.000 n=25+25)
SprintfBytes-2 432ns ±13% 419ns ± 2% ~ (p=0.081 n=23+25)
SprintfStringer-2 356ns ± 4% 356ns ± 4% ~ (p=0.988 n=25+25)
SprintfStructure-2 968ns ± 5% 948ns ± 2% -2.11% (p=0.000 n=25+25)
FprintInt-2 206ns ± 0% 201ns ± 0% -2.43% (p=0.000 n=25+21)
FprintfBytes-2 187ns ± 1% 187ns ± 1% ~ (p=0.420 n=25+25)
FprintIntNoAlloc-2 173ns ± 0% 168ns ± 0% -2.89% (p=0.000 n=25+2
amd64 Ivy Bridge:
name old time/op new time/op delta
SprintfPadding-4 203ns ± 4% 210ns ± 8% +3.27% (p=0.000 n=23+25)
SprintfEmpty-4 24.4ns ± 2% 24.4ns ± 3% ~ (p=0.487 n=24+25)
SprintfString-4 92.4ns ± 2% 93.1ns ± 3% ~ (p=0.087 n=22+25)
SprintfTruncateString-4 137ns ± 3% 136ns ± 2% -1.02% (p=0.002 n=25+25)
SprintfQuoteString-4 378ns ± 1% 373ns ± 1% -1.32% (p=0.000 n=24+22)
SprintfInt-4 89.9ns ± 3% 90.3ns ± 4% ~ (p=0.444 n=25+25)
SprintfIntInt-4 137ns ± 4% 138ns ± 3% ~ (p=0.112 n=25+23)
SprintfPrefixedInt-4 155ns ±14% 154ns ±14% ~ (p=0.791 n=25+25)
SprintfFloat-4 154ns ± 2% 154ns ± 3% ~ (p=0.789 n=25+25)
SprintfComplex-4 396ns ± 2% 402ns ± 3% +1.53% (p=0.001 n=23+25)
SprintfBoolean-4 71.0ns ± 3% 71.2ns ± 2% ~ (p=0.515 n=25+24)
SprintfHexString-4 156ns ± 3% 150ns ± 5% -3.69% (p=0.000 n=24+25)
SprintfHexBytes-4 154ns ± 3% 157ns ± 5% +1.72% (p=0.003 n=24+25)
SprintfBytes-4 297ns ± 4% 291ns ± 3% -1.86% (p=0.000 n=25+25)
SprintfStringer-4 275ns ± 3% 265ns ± 3% -3.51% (p=0.000 n=25+25)
SprintfStructure-4 878ns ± 2% 823ns ± 2% -6.21% (p=0.000 n=25+22)
FprintInt-4 145ns ± 1% 147ns ± 2% +0.94% (p=0.001 n=23+25)
FprintfBytes-4 166ns ± 1% 168ns ± 2% +0.81% (p=0.000 n=24+25)
FprintIntNoAlloc-4 113ns ± 2% 109ns ± 2% -3.79% (p=0.000 n=24+25)
386 Ivy Bridge:
name old time/op new time/op delta
SprintfPadding-4 353ns ± 4% 354ns ± 4% ~ (p=0.769 n=25+24)
SprintfEmpty-4 21.9ns ± 6% 21.1ns ± 3% -3.45% (p=0.000 n=24+25)
SprintfString-4 94.7ns ± 1% 93.0ns ± 3% -1.77% (p=0.000 n=24+23)
SprintfTruncateString-4 150ns ± 2% 147ns ± 0% -1.71% (p=0.000 n=25+21)
SprintfQuoteString-4 472ns ± 1% 479ns ± 1% +1.48% (p=0.000 n=25+23)
SprintfInt-4 87.0ns ± 2% 85.3ns ± 2% -1.95% (p=0.000 n=25+25)
SprintfIntInt-4 137ns ± 2% 134ns ± 2% -1.97% (p=0.000 n=24+23)
SprintfPrefixedInt-4 166ns ± 8% 161ns ± 8% -3.07% (p=0.023 n=24+24)
SprintfFloat-4 226ns ± 1% 219ns ± 1% -2.97% (p=0.000 n=24+25)
SprintfComplex-4 867ns ± 1% 784ns ± 1% -9.47% (p=0.000 n=24+23)
SprintfBoolean-4 77.2ns ± 2% 76.0ns ± 2% -1.63% (p=0.000 n=25+25)
SprintfHexString-4 212ns ± 2% 214ns ± 2% +0.96% (p=0.000 n=25+25)
SprintfHexBytes-4 221ns ± 2% 218ns ± 1% -1.42% (p=0.000 n=25+24)
SprintfBytes-4 423ns ± 3% 417ns ± 1% -1.49% (p=0.000 n=25+24)
SprintfStringer-4 306ns ± 3% 298ns ± 3% -2.57% (p=0.000 n=24+25)
SprintfStructure-4 1.00µs ± 2% 0.98µs ± 2% -1.34% (p=0.000 n=24+24)
FprintInt-4 202ns ± 3% 197ns ± 2% -2.04% (p=0.000 n=25+25)
FprintfBytes-4 186ns ± 2% 184ns ± 2% -0.88% (p=0.000 n=24+25)
FprintIntNoAlloc-4 170ns ± 2% 166ns ± 2% -2.26% (p=0.000 n=24+25)
Change-Id: I46e62bf8b6afa90a24f75b40f1d354b2084b910b
Reviewed-on: https://go-review.googlesource.com/20984
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Fixes #14924
Change-Id: I098ef973e2cad76a121704492758c2971a9b55f3
Reviewed-on: https://go-review.googlesource.com/20920
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Make verbs b,c,o and U work for any array and slice of integer
type including byte and uint8.
Fix a bug that triggers badverb for []uint8 and []byte type
on the slice/array level instead of on each element like for
any other slice or array type.
Add tests that make sure we do not accidentally alter the
behavior of printing []byte for []byte and []uint8 type
if they are used at the top level when formatting with %#v.
name old time/op new time/op delta
SprintfHexBytes-2 177ns ± 2% 176ns ± 2% ~ (p=0.066 n=48+49)
SprintfBytes-2 330ns ± 1% 329ns ± 1% ~ (p=0.118 n=45+47)
Fixes #13478
Change-Id: I99328a184973ae219bcc0f69c3978cb1ff462888
Reviewed-on: https://go-review.googlesource.com/20686
Run-TryBot: Rob Pike <r@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Merge printReflectValue into printValue. Determine if handleMethods
was already called in printArg by checking if depth is 0. Do not
call handleMethods on depth 0 again in printValue to not introduce
a performance regression. handleMethods is called already in printArg
to not introduce a performance penalty for top-level Stringer,
GoStringer, Errors and Formatters by using reflect.ValueOf on them
just to retrieve them again as interface{} values in printValue.
Clear p.arg in printValue after handleMethods to print the type
of the value inside the reflect.Value when a bad verb is encountered
on the top level instead of printing "reflect.Value=" as the type of
the argument. This also fixes a bug that incorrectly prints the
whole map instead of just the value for a key if the returned value
by the map for the key is an invalid reflect value.
name old time/op new time/op delta
SprintfPadding-2 229ns ± 2% 227ns ± 1% -0.50% (p=0.013 n=20+20)
SprintfEmpty-2 36.4ns ± 6% 37.2ns ±14% ~ (p=0.091 n=18+20)
SprintfString-2 102ns ± 1% 102ns ± 0% ~ (p=0.751 n=20+20)
SprintfTruncateString-2 142ns ± 0% 141ns ± 1% -0.95% (p=0.000 n=16+20)
SprintfQuoteString-2 389ns ± 0% 388ns ± 0% -0.12% (p=0.019 n=20+20)
SprintfInt-2 100ns ± 2% 100ns ± 1% ~ (p=0.188 n=20+15)
SprintfIntInt-2 155ns ± 3% 154ns ± 2% ~ (p=0.092 n=20+20)
SprintfPrefixedInt-2 250ns ± 2% 251ns ± 3% ~ (p=0.559 n=20+20)
SprintfFloat-2 177ns ± 2% 175ns ± 1% -1.30% (p=0.000 n=20+20)
SprintfComplex-2 516ns ± 1% 510ns ± 1% -1.13% (p=0.000 n=19+16)
SprintfBoolean-2 90.9ns ± 3% 90.6ns ± 1% ~ (p=0.193 n=19+19)
SprintfHexString-2 171ns ± 1% 169ns ± 1% -1.44% (p=0.000 n=19+20)
SprintfHexBytes-2 180ns ± 1% 180ns ± 1% ~ (p=0.060 n=19+18)
SprintfBytes-2 330ns ± 1% 329ns ± 1% -0.42% (p=0.003 n=20+20)
SprintfStringer-2 354ns ± 3% 352ns ± 3% ~ (p=0.525 n=20+19)
SprintfStructure-2 804ns ± 3% 776ns ± 2% -3.56% (p=0.000 n=20+20)
FprintInt-2 155ns ± 0% 151ns ± 1% -2.35% (p=0.000 n=19+20)
FprintfBytes-2 169ns ± 0% 170ns ± 1% +0.81% (p=0.000 n=18+19)
FprintIntNoAlloc-2 112ns ± 0% 109ns ± 1% -2.28% (p=0.000 n=20+20)
Change-Id: Ib9a39082ed1be0f1f7499ee6fb6c9530f043e43a
Reviewed-on: https://go-review.googlesource.com/20923
Run-TryBot: Rob Pike <r@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Deduplicate the verb switch for signed and unsigned integer formatting.
Make names of integer related functions consistent
with names of other fmt functions.
Consolidate basic integer tests.
Change-Id: I0c19c24f1c2c06a3b1a4d7d377dcdac3b36bb0f5
Reviewed-on: https://go-review.googlesource.com/20831
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Changes the integer function to restore the original f.zero value
and therefore padding type before returning.
Change-Id: I456449259a3d39bd6d62e110553120c31ec63f23
Reviewed-on: https://go-review.googlesource.com/20512
Reviewed-by: Rob Pike <r@golang.org>
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
|
|
Separate unicode formatting into its own fmt_unicode function.
Remove the fmtUnicode wrapper and the f.unicode and f.uniQuote
flags that are not needed anymore. Remove mangling and restoring
of the precision and sharp flags.
Removes the buffer copy needed for %#U by moving
the character encoding before the number encoding.
Changes the behavior of plus and space flag to have
no effect instead of printing a plus or space before "U+".
Always print at least four digits after "U+"
even if precision is set to less than 4.
Change-Id: If9a0ee79e9eca2c76f06a4e0fdd75d98393899ac
Reviewed-on: https://go-review.googlesource.com/20574
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Use The fmt internal buffer for character formatting instead of
the pp Printer rune decoding buffer.
Uses an uint64 instead of int64 argument to fmt_c and fmt_qc for easier
range checks since no valid runes are represented by negative numbers or
are above 0x10ffff.
Add range checks to fmt_c and fmt_qc to guarantee that a RuneError
character is returned by the functions for any invalid code point
in range uint64. For invalid code points in range utf8.MaxRune
the used utf8 and strconv functions already return a RuneError.
Change-Id: I9772f804dfcd79c3826fa7f6c5ebfbf4b5304a51
Reviewed-on: https://go-review.googlesource.com/20373
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Remove check for %p and %T in printValue.
These verbs are not recursive and are handled already in
printArg which is called on any argument before printValue.
Format the type string for %T directly instead of invoking
the more complex printArg with %s on the type string.
Decouple the %T tests from variables declared in scan_test.go.
Change-Id: Ibd51566bd4cc1a260ce6d052f36382ed05020b48
Reviewed-on: https://go-review.googlesource.com/20622
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Do a reset of the fmt flags before printing the extra argument
error message to prevent a malformed printing of extra arguments.
Regroup tests for extra argument error strings.
Change-Id: Ifd97f5ca36f6c97ed5a380d975cf154d17997d3f
Reviewed-on: https://go-review.googlesource.com/20571
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Treat the verb %X in the same special way as %q, %s and %x
are for arrays and slices with byte type elements.
Modify input for tests so the result of %x and %X is distinct.
Change-Id: I38d227755e98c7fad5e4adc2f603c6873aa910fd
Reviewed-on: https://go-review.googlesource.com/20516
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Uses a switch statement for direct format function selection
similar to other types verb handling in fmt.
Applies padding also to nil pointers formatted with %v.
Guards against "slice bounds out of range" panic in TestSprintf
when a pointer test results in a formatted string s
that is shorter than the index i the pointer should appear in.
Adds more and rearranges tests.
Fixes #14712
Fixes #14714
Change-Id: Iaf5ae37b7e6ba7d27d528d199f2b2eb9d5829b8c
Reviewed-on: https://go-review.googlesource.com/20371
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Removes specialized functions for each verb and float/complex size
and replaces them with generic variants fmtFloat and
fmtComplex similar to other generic fmt functions.
Simplifies the complex formatting by relying on fmtFloat
to handle the verb and default precision selection.
Complex imaginary formatting does not need to clear the f.space flag
because the set f.plus flag will force a sign instead of a space.
Sets default precision for %b to -1 (same as %g and %G)
since precision for %b has no affect in strconv.AppendFloat.
Add more tests and group them a bit better.
Use local copies of +Inf,-Inf and NaN instead
of math package functions for testing.
Saves around 8kb in the go binary.
name old time/op new time/op delta
SprintfFloat-2 200ns ± 4% 196ns ± 4% -1.55% (p=0.007 n=20+20)
SprintfComplex-2 569ns ± 4% 570ns ± 3% ~ (p=0.804 n=20+20)
Change-Id: I36d35dab6f835fc2bd2c042ac97705868eb2446f
Reviewed-on: https://go-review.googlesource.com/20252
Reviewed-by: Rob Pike <r@golang.org>
Run-TryBot: Rob Pike <r@golang.org>
|
|
Reuse the internal buffer and use append versions of
the strconv quote functions to avoid some allocations.
Add more tests.
name old time/op new time/op delta
SprintfQuoteString-2 486ns ± 2% 416ns ± 2% -14.42% (p=0.000 n=20+20)
name old allocs/op new allocs/op delta
SprintfQuoteString-2 4.00 ± 0% 2.00 ± 0% -50.00% (p=0.000 n=20+20)
Change-Id: I63795b51fd95c53c5993ec8e6e99b659941f9f54
Reviewed-on: https://go-review.googlesource.com/20251
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Instead of calling printArg in fmtBytes to format each byte call
the byte formatting functions directly since it is known each
element is of type byte.
Add more tests for byte slice and array formatting.
name old time/op new time/op delta
SprintfBytes-2 843ns ±16% 417ns ±11% -50.58% (p=0.000 n=20+20)
Change-Id: I5b907dbf52091e3de9710b09d67649c76f4c17e9
Reviewed-on: https://go-review.googlesource.com/20176
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
formatFloat should restore the original f.wid value before
returning. Callers should not have to save and restore f.wid.
Fixes: #14642
Change-Id: I531dae15c7997fe8909e2ad1ef7c376654afb030
Reviewed-on: https://go-review.googlesource.com/20179
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
No extra buffering is needed to save the encoding
since the left padding can be computed and written out
before the encoding is generated.
Add extra tests to both string and byte slice formatting.
name old time/op new time/op delta
SprintfHexString-2 410ns ± 3% 194ns ± 3% -52.60% (p=0.000 n=20+19)
SprintfHexBytes-2 431ns ± 3% 202ns ± 2% -53.13% (p=0.000 n=18+20)
Change-Id: Ibca4316427c89f834e4faee61614493c7eedb42b
Reviewed-on: https://go-review.googlesource.com/20097
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Count only the runes up to the requested precision
to decide where to truncate a string.
Change the loop within truncate to need fewer jumps.
name old time/op new time/op delta
SprintfTruncateString-2 188ns ± 3% 155ns ± 3% -17.43% (p=0.000 n=20+20)
Change-Id: I17ca9fc0bb8bf7648599df48e4785251bbc31e99
Reviewed-on: https://go-review.googlesource.com/20098
Reviewed-by: Rob Pike <r@golang.org>
|
|
The tree's pretty inconsistent about single space vs double space
after a period in documentation. Make it consistently a single space,
per earlier decisions. This means contributors won't be confused by
misleading precedence.
This CL doesn't use go/doc to parse. It only addresses // comments.
It was generated with:
$ perl -i -npe 's,^(\s*// .+[a-z]\.) +([A-Z]),$1 $2,' $(git grep -l -E '^\s*//(.+\.) +([A-Z])')
$ go test go/doc -update
Change-Id: Iccdb99c37c797ef1f804a94b22ba5ee4b500c4f7
Reviewed-on: https://go-review.googlesource.com/20022
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Dave Day <djd@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
|
|
Do not replace the sign in front of a number with a space if both
f.space and f.plus are both specified for number formatting.
This was already the case for integers but not for floats
and complex numbers.
Updates: #14543.
Change-Id: I07ddeb505003db84a8a7d2c743dc19fc427a00bd
Reviewed-on: https://go-review.googlesource.com/19974
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Once upon a time fmt did use bytes.Buffer for its buffer.
The buffer write methods still mimic the bytes.Buffer signatures.
The current code depends on manipulating the buffer []bytes array directly
which makes going back to bytes.Buffer by only changing the type of buffer
impossible. Since type buffer is not exported the methods can be simplified
to the needs of fmt. This saves space and avoids unnecessary overhead.
Use WriteString instead of Write for known inputs since
WriteString is faster than Write to append the same data.
This also saves space in the binary.
Remove the add method from Printer and depending on the data to be written
use WriteRune or WriteByte directly instead.
In total makes the go binary around 4 kilobyte smaller.
name old time/op new time/op delta
SprintfEmpty-2 24.1ns ± 3% 23.8ns ± 1% -1.14% (p=0.000 n=20+20)
SprintfString-2 114ns ± 2% 114ns ± 4% ~ (p=0.558 n=20+19)
SprintfInt-2 116ns ± 9% 118ns ± 7% ~ (p=0.086 n=20+20)
SprintfIntInt-2 195ns ± 6% 193ns ± 5% ~ (p=0.345 n=20+19)
SprintfPrefixedInt-2 251ns ±16% 241ns ± 9% -3.69% (p=0.024 n=20+19)
SprintfFloat-2 203ns ± 4% 205ns ± 5% ~ (p=0.153 n=20+20)
SprintfBoolean-2 101ns ± 7% 96ns ±11% -5.23% (p=0.005 n=19+20)
ManyArgs-2 651ns ± 7% 628ns ± 7% -3.44% (p=0.002 n=20+20)
FprintInt-2 164ns ± 2% 158ns ± 2% -3.62% (p=0.000 n=20+18)
FprintfBytes-2 215ns ± 1% 216ns ± 1% +0.58% (p=0.000 n=20+20)
FprintIntNoAlloc-2 115ns ± 0% 112ns ± 0% -2.61% (p=0.000 n=20+20)
ScanInts-2 700µs ± 0% 702µs ± 1% +0.38% (p=0.000 n=18+20)
ScanRecursiveInt-2 82.7ms ± 0% 82.7ms ± 0% ~ (p=0.820 n=20+20)
Change-Id: I0409eb170b8a26d9f4eb271f6292e5d39faf2d8b
Reviewed-on: https://go-review.googlesource.com/19955
Reviewed-by: Rob Pike <r@golang.org>
|
|
Move the decision if zero padding is allowed to doPrintf
where the other formatting decisions are made.
Removes some dead code for negative f.wid that was never used
due to f.wid always being positive and f.minus deciding if left
or right padding should be used.
New padding code writes directly into the buffer and is as fast
as the old version but avoids the cost of needing package init.
name old time/op new time/op delta
SprintfPadding-2 246ns ± 5% 245ns ± 4% ~ (p=0.345 n=50+47)
Change-Id: I7dfddbac8e328f4ef0cdee8fafc0d06c784b2711
Reviewed-on: https://go-review.googlesource.com/19957
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
|
|
Makes zero padding of NaN and infinities consistent
by using spaces instead of zeroes to pad NaN.
Adds more tests for NaN formatting.
Fixes #14421
Change-Id: Ia20f8e878cc81ac72a744ec10d65e84b94e09c6a
Reviewed-on: https://go-review.googlesource.com/19723
Reviewed-by: Rob Pike <r@golang.org>
|
|
Remove floating point comparisons and rely only on the information
directly provided by appendFloat.
Make restoring the zero padding flag explicit instead of using a defer.
Rearrange some case distinctions to remove duplicated code.
Add more test cases for zero padded floating point numbers with sign.
benchmark old ns/op new ns/op delta
BenchmarkSprintfFloat-4 187 180 -3.74%
Change-Id: Ifa2ae85257909f40b1b18118c92b516933271729
Reviewed-on: https://go-review.googlesource.com/19721
Reviewed-by: Rob Pike <r@golang.org>
|
|
Factor out duplicated race thunks from sync, syscall net
and fmt packages into a separate package and use it.
Fixes #8593
Change-Id: I156869c50946277809f6b509463752e7f7d28cdb
Reviewed-on: https://go-review.googlesource.com/14870
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
|