Commit b53088a6 authored by Joe Tsai's avatar Joe Tsai Committed by Joe Tsai

Revert "go/printer: forbid empty line before first comment in block"

This reverts commit 08f19bbd.

Reason for revert:
The changed transformation takes effect on a larger set
of code snippets than expected.

For example, this:
    func foo() {

        // Comment
        bar()

    }
becomes:
    func foo() {
        // Comment
        bar()

    }

This is an unintended consequence.

Change-Id: Ifca88d6267dab8a8170791f7205124712bf8ace8
Reviewed-on: https://go-review.googlesource.com/81335Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Joe Tsai <joetsai@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 20656856
...@@ -39,6 +39,7 @@ func testBuildID(t *testing.T) { ...@@ -39,6 +39,7 @@ func testBuildID(t *testing.T) {
} }
for len(d) > 0 { for len(d) > 0 {
// ELF standards differ as to the sizes in // ELF standards differ as to the sizes in
// note sections. Both the GNU linker and // note sections. Both the GNU linker and
// gold always generate 32-bit sizes, so that // gold always generate 32-bit sizes, so that
......
...@@ -659,6 +659,7 @@ func extract(val string) (op string, typ string, auxint string, aux string, args ...@@ -659,6 +659,7 @@ func extract(val string) (op string, typ string, auxint string, aux string, args
// It returns the op and unparsed strings for typ, auxint, and aux restrictions and for all args. // It returns the op and unparsed strings for typ, auxint, and aux restrictions and for all args.
// oparch is the architecture that op is located in, or "" for generic. // oparch is the architecture that op is located in, or "" for generic.
func parseValue(val string, arch arch, loc string) (op opData, oparch string, typ string, auxint string, aux string, args []string) { func parseValue(val string, arch arch, loc string) (op opData, oparch string, typ string, auxint string, aux string, args []string) {
// Resolve the op. // Resolve the op.
var s string var s string
s, typ, auxint, aux, args = extract(val) s, typ, auxint, aux, args = extract(val)
......
...@@ -2474,6 +2474,7 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { ...@@ -2474,6 +2474,7 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) {
d := c.vregoff(p.GetFrom3()) d := c.vregoff(p.GetFrom3())
var a int var a int
switch p.As { switch p.As {
// These opcodes expect a mask operand that has to be converted into the // These opcodes expect a mask operand that has to be converted into the
// appropriate operand. The way these were defined, not all valid masks are possible. // appropriate operand. The way these were defined, not all valid masks are possible.
// Left here for compatibility in case they were used or generated. // Left here for compatibility in case they were used or generated.
......
...@@ -2051,6 +2051,7 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { ...@@ -2051,6 +2051,7 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) {
c = 0 c = 0
for p := s.Func.Text; p != nil; p = p.Link { for p := s.Func.Text; p != nil; p = p.Link {
if ctxt.Headtype == objabi.Hnacl && p.Isize > 0 { if ctxt.Headtype == objabi.Hnacl && p.Isize > 0 {
// pad everything to avoid crossing 32-byte boundary // pad everything to avoid crossing 32-byte boundary
if c>>5 != (c+int32(p.Isize)-1)>>5 { if c>>5 != (c+int32(p.Isize)-1)>>5 {
c = naclpad(ctxt, s, c, -c&31) c = naclpad(ctxt, s, c, -c&31)
......
...@@ -1859,6 +1859,7 @@ func assignAddress(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint6 ...@@ -1859,6 +1859,7 @@ func assignAddress(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint6
// Only break at outermost syms. // Only break at outermost syms.
if ctxt.Arch.InFamily(sys.PPC64) && s.Outer == nil && ctxt.IsELF && ctxt.LinkMode == LinkExternal && va-sect.Vaddr+funcsize+maxSizeTrampolinesPPC64(s, isTramp) > 0x1c00000 { if ctxt.Arch.InFamily(sys.PPC64) && s.Outer == nil && ctxt.IsELF && ctxt.LinkMode == LinkExternal && va-sect.Vaddr+funcsize+maxSizeTrampolinesPPC64(s, isTramp) > 0x1c00000 {
// Set the length for the previous text section // Set the length for the previous text section
sect.Length = va - sect.Vaddr sect.Length = va - sect.Vaddr
......
...@@ -523,6 +523,7 @@ func archrelocaddr(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val *int64) bool ...@@ -523,6 +523,7 @@ func archrelocaddr(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val *int64) bool
// resolve direct jump relocation r in s, and add trampoline if necessary // resolve direct jump relocation r in s, and add trampoline if necessary
func trampoline(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol) { func trampoline(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol) {
// Trampolines are created if the branch offset is too large and the linker cannot insert a call stub to handle it. // Trampolines are created if the branch offset is too large and the linker cannot insert a call stub to handle it.
// For internal linking, trampolines are always created for long calls. // For internal linking, trampolines are always created for long calls.
// For external linking, the linker can insert a call stub to handle a long call, but depends on having the TOC address in // For external linking, the linker can insert a call stub to handle a long call, but depends on having the TOC address in
...@@ -541,6 +542,7 @@ func trampoline(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol) { ...@@ -541,6 +542,7 @@ func trampoline(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol) {
if (ctxt.LinkMode == ld.LinkExternal && s.Sect != r.Sym.Sect) || (ctxt.LinkMode == ld.LinkInternal && int64(int32(t<<6)>>6) != t) || (*ld.FlagDebugTramp > 1 && s.File != r.Sym.File) { if (ctxt.LinkMode == ld.LinkExternal && s.Sect != r.Sym.Sect) || (ctxt.LinkMode == ld.LinkInternal && int64(int32(t<<6)>>6) != t) || (*ld.FlagDebugTramp > 1 && s.File != r.Sym.File) {
var tramp *sym.Symbol var tramp *sym.Symbol
for i := 0; ; i++ { for i := 0; ; i++ {
// Using r.Add as part of the name is significant in functions like duffzero where the call // Using r.Add as part of the name is significant in functions like duffzero where the call
// target is at some offset within the function. Calls to duff+8 and duff+256 must appear as // target is at some offset within the function. Calls to duff+8 and duff+256 must appear as
// distinct trampolines. // distinct trampolines.
......
...@@ -290,6 +290,7 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) { ...@@ -290,6 +290,7 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
dlen := 8 dlen := 8
for j := 0; j < 8; { for j := 0; j < 8; {
// We have reached the end and are missing padding // We have reached the end and are missing padding
if len(src) == 0 && enc.padChar != NoPadding { if len(src) == 0 && enc.padChar != NoPadding {
return n, false, CorruptInputError(olen - len(src) - j) return n, false, CorruptInputError(olen - len(src) - j)
......
...@@ -48,7 +48,6 @@ TYPES ...@@ -48,7 +48,6 @@ TYPES
H uint32 H uint32
A uint8 A uint8
// contains filtered or unexported fields // contains filtered or unexported fields
} }
......
...@@ -48,7 +48,6 @@ TYPES ...@@ -48,7 +48,6 @@ TYPES
H uint32 H uint32
A uint8 A uint8
// contains filtered or unexported fields // contains filtered or unexported fields
} }
......
...@@ -42,7 +42,6 @@ TYPES ...@@ -42,7 +42,6 @@ TYPES
// B is a type passed to Benchmark functions to manage benchmark ... // B is a type passed to Benchmark functions to manage benchmark ...
type B struct { type B struct {
N int N int
// contains filtered or unexported fields // contains filtered or unexported fields
} }
......
...@@ -42,7 +42,6 @@ TYPES ...@@ -42,7 +42,6 @@ TYPES
// B is a type passed to Benchmark functions to manage benchmark ... // B is a type passed to Benchmark functions to manage benchmark ...
type B struct { type B struct {
N int N int
// contains filtered or unexported fields // contains filtered or unexported fields
} }
......
...@@ -479,7 +479,6 @@ func (p *printer) fieldList(fields *ast.FieldList, isStruct, isIncomplete bool) ...@@ -479,7 +479,6 @@ func (p *printer) fieldList(fields *ast.FieldList, isStruct, isIncomplete bool)
if isIncomplete { if isIncomplete {
if len(list) > 0 { if len(list) > 0 {
p.print(formfeed) p.print(formfeed)
p.print(newline)
} }
p.flush(p.posFor(rbrace), token.RBRACE) // make sure we don't lose the last line comment p.flush(p.posFor(rbrace), token.RBRACE) // make sure we don't lose the last line comment
p.setLineComment("// contains filtered or unexported fields") p.setLineComment("// contains filtered or unexported fields")
...@@ -507,7 +506,6 @@ func (p *printer) fieldList(fields *ast.FieldList, isStruct, isIncomplete bool) ...@@ -507,7 +506,6 @@ func (p *printer) fieldList(fields *ast.FieldList, isStruct, isIncomplete bool)
if isIncomplete { if isIncomplete {
if len(list) > 0 { if len(list) > 0 {
p.print(formfeed) p.print(formfeed)
p.print(newline)
} }
p.flush(p.posFor(rbrace), token.RBRACE) // make sure we don't lose the last line comment p.flush(p.posFor(rbrace), token.RBRACE) // make sure we don't lose the last line comment
p.setLineComment("// contains filtered or unexported methods") p.setLineComment("// contains filtered or unexported methods")
......
...@@ -62,7 +62,7 @@ type printer struct { ...@@ -62,7 +62,7 @@ type printer struct {
mode pmode // current printer mode mode pmode // current printer mode
impliedSemi bool // if set, a linebreak implies a semicolon impliedSemi bool // if set, a linebreak implies a semicolon
lastTok token.Token // last token printed (token.ILLEGAL if it's whitespace) lastTok token.Token // last token printed (token.ILLEGAL if it's whitespace)
prevOpen token.Token // previous "open" token: (, [, {, or token.ILLEGAL prevOpen token.Token // previous non-brace "open" token (, [, or token.ILLEGAL
wsbuf []whiteSpace // delayed white space wsbuf []whiteSpace // delayed white space
// Positions // Positions
...@@ -426,11 +426,6 @@ func (p *printer) writeCommentPrefix(pos, next token.Position, prev *ast.Comment ...@@ -426,11 +426,6 @@ func (p *printer) writeCommentPrefix(pos, next token.Position, prev *ast.Comment
n := 0 n := 0
if pos.IsValid() && p.last.IsValid() { if pos.IsValid() && p.last.IsValid() {
n = pos.Line - p.last.Line n = pos.Line - p.last.Line
if n > 1 && p.prevOpen != token.ILLEGAL && prev == nil {
// Forbid multiple empty lines from appearing immediately
// following some type of open paren, bracket, or brace.
n = 1
}
if n < 0 { // should never happen if n < 0 { // should never happen
n = 0 n = 0
} }
...@@ -884,7 +879,7 @@ func (p *printer) print(args ...interface{}) { ...@@ -884,7 +879,7 @@ func (p *printer) print(args ...interface{}) {
switch p.lastTok { switch p.lastTok {
case token.ILLEGAL: case token.ILLEGAL:
// ignore (white space) // ignore (white space)
case token.LPAREN, token.LBRACK, token.LBRACE: case token.LPAREN, token.LBRACK:
p.prevOpen = p.lastTok p.prevOpen = p.lastTok
default: default:
// other tokens followed any opening token // other tokens followed any opening token
......
...@@ -97,109 +97,6 @@ type S3 struct { ...@@ -97,109 +97,6 @@ type S3 struct {
f3 int // f3 is not exported f3 int // f3 is not exported
} }
type T struct { // foo
// bar
x int
X int
}
type T struct { /* foo */
// bar
x int
}
type T struct { // foo
x int
X int
}
type T struct { /* foo */
x int
}
type T struct {
x int
}
type T struct {
x int
}
type T struct{ x int }
type T struct {
x int
}
type T struct {
x int
X int
x int
}
type T struct {
// Comment
x int
// X.
X int
// Comment
x int
}
const ( // foo
// bar
x int = 0
X int = 0
)
const ( /* foo */
// bar
x int = 0
)
const ( // foo
x int = 0
X int = 0
)
const ( /* foo */
x int = 0
)
const (
x int = 0
)
const (
x int = 0
X int = 0
)
const (
x int = 0
X int = 0
x int = 0
)
const (
// Comment
x int = 0
// X.
X int = 0
// Comment
x int = 0
)
// This comment group should be separated // This comment group should be separated
// with a newline from the next comment // with a newline from the next comment
// group. // group.
......
...@@ -97,113 +97,6 @@ type S3 struct { ...@@ -97,113 +97,6 @@ type S3 struct {
f3 int // f3 is not exported f3 int // f3 is not exported
} }
type T struct { // foo
// bar
x int
X int
}
type T struct { /* foo */
// bar
x int
}
type T struct { // foo
x int
X int
}
type T struct { /* foo */
x int
}
type T struct {x int
}
type T struct {
x int}
type T struct {x int}
type T struct {
x int
}
type T struct {
x int
X int
x int
}
type T struct {
// Comment
x int
// X.
X int
// Comment
x int
}
const ( // foo
// bar
x int = 0
X int = 0
)
const ( /* foo */
// bar
x int = 0
)
const ( // foo
x int = 0
X int = 0
)
const ( /* foo */
x int = 0
)
const (
x int = 0
)
const (
x int = 0
X int = 0
)
const (
x int = 0
X int = 0
x int = 0
)
const (
// Comment
x int = 0
// X.
X int = 0
// Comment
x int = 0
)
// This comment group should be separated // This comment group should be separated
// with a newline from the next comment // with a newline from the next comment
// group. // group.
......
...@@ -54,73 +54,3 @@ type S3 struct { ...@@ -54,73 +54,3 @@ type S3 struct {
F2 int // line comment for F2 F2 int // line comment for F2
// contains filtered or unexported fields // contains filtered or unexported fields
} }
type T struct {
X int
// contains filtered or unexported fields
}
type T struct {
// contains filtered or unexported fields
}
type T struct {
X int
// contains filtered or unexported fields
}
type T struct {
// contains filtered or unexported fields
}
type T struct {
// contains filtered or unexported fields
}
type T struct {
// contains filtered or unexported fields
}
type T struct {
// contains filtered or unexported fields
}
type T struct {
// contains filtered or unexported fields
}
type T struct {
X int
// contains filtered or unexported fields
}
type T struct {
// X.
X int
// contains filtered or unexported fields
}
const (
X int = 0
)
const (
X int = 0
)
const (
X int = 0
)
const (
X int = 0
)
const (
// X.
X int = 0
)
...@@ -65,6 +65,7 @@ func archInitIEEE() { ...@@ -65,6 +65,7 @@ func archInitIEEE() {
// archUpdateIEEE calculates the checksum of p using vectorizedIEEE. // archUpdateIEEE calculates the checksum of p using vectorizedIEEE.
func archUpdateIEEE(crc uint32, p []byte) uint32 { func archUpdateIEEE(crc uint32, p []byte) uint32 {
// Check if vector code should be used. If not aligned, then handle those // Check if vector code should be used. If not aligned, then handle those
// first up to the aligned bytes. // first up to the aligned bytes.
......
...@@ -42,6 +42,7 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po ...@@ -42,6 +42,7 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po
ci := (sy-src.Rect.Min.Y)*src.CStride + (sp.X - src.Rect.Min.X) ci := (sy-src.Rect.Min.Y)*src.CStride + (sp.X - src.Rect.Min.X)
for x := x0; x != x1; x, yi, ci = x+4, yi+1, ci+1 { for x := x0; x != x1; x, yi, ci = x+4, yi+1, ci+1 {
// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB. // This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
yy1 := int32(src.Y[yi]) * 0x10101 yy1 := int32(src.Y[yi]) * 0x10101
cb1 := int32(src.Cb[ci]) - 128 cb1 := int32(src.Cb[ci]) - 128
...@@ -211,6 +212,7 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po ...@@ -211,6 +212,7 @@ func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Po
ci := (sy/2-src.Rect.Min.Y/2)*src.CStride + (sp.X - src.Rect.Min.X) ci := (sy/2-src.Rect.Min.Y/2)*src.CStride + (sp.X - src.Rect.Min.X)
for x := x0; x != x1; x, yi, ci = x+4, yi+1, ci+1 { for x := x0; x != x1; x, yi, ci = x+4, yi+1, ci+1 {
// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB. // This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
yy1 := int32(src.Y[yi]) * 0x10101 yy1 := int32(src.Y[yi]) * 0x10101
cb1 := int32(src.Cb[ci]) - 128 cb1 := int32(src.Cb[ci]) - 128
......
...@@ -27,6 +27,7 @@ type dumpTest struct { ...@@ -27,6 +27,7 @@ type dumpTest struct {
} }
var dumpTests = []dumpTest{ var dumpTests = []dumpTest{
// HTTP/1.1 => chunked coding; body; empty trailer // HTTP/1.1 => chunked coding; body; empty trailer
{ {
Req: http.Request{ Req: http.Request{
......
...@@ -173,6 +173,7 @@ func (sc *ServerConn) Pending() int { ...@@ -173,6 +173,7 @@ func (sc *ServerConn) Pending() int {
// Response.Close field to true. Write should be considered operational until // Response.Close field to true. Write should be considered operational until
// it returns an error, regardless of any errors returned on the Read side. // it returns an error, regardless of any errors returned on the Read side.
func (sc *ServerConn) Write(req *http.Request, resp *http.Response) error { func (sc *ServerConn) Write(req *http.Request, resp *http.Response) error {
// Retrieve the pipeline ID of this request/response pair // Retrieve the pipeline ID of this request/response pair
sc.mu.Lock() sc.mu.Lock()
id, ok := sc.pipereq[req] id, ok := sc.pipereq[req]
......
...@@ -192,6 +192,7 @@ type chunkedWriter struct { ...@@ -192,6 +192,7 @@ type chunkedWriter struct {
// NOTE: Note that the corresponding chunk-writing procedure in Conn.Write has // NOTE: Note that the corresponding chunk-writing procedure in Conn.Write has
// a bug since it does not check for success of io.WriteString // a bug since it does not check for success of io.WriteString
func (cw *chunkedWriter) Write(data []byte) (n int, err error) { func (cw *chunkedWriter) Write(data []byte) (n int, err error) {
// Don't send 0-length data. It looks like EOF for chunked encoding. // Don't send 0-length data. It looks like EOF for chunked encoding.
if len(data) == 0 { if len(data) == 0 {
return 0, nil return 0, nil
......
...@@ -813,6 +813,7 @@ func TestRequestWriteError(t *testing.T) { ...@@ -813,6 +813,7 @@ func TestRequestWriteError(t *testing.T) {
// try to restore it. It always dumps the whole body. // try to restore it. It always dumps the whole body.
// And it doesn't support https. // And it doesn't support https.
func dumpRequestOut(req *Request, onReadHeaders func()) ([]byte, error) { func dumpRequestOut(req *Request, onReadHeaders func()) ([]byte, error) {
// Use the actual Transport code to record what we would send // Use the actual Transport code to record what we would send
// on the wire, but not using TCP. Use a Transport with a // on the wire, but not using TCP. Use a Transport with a
// custom dialer that returns a fake net.Conn that waits // custom dialer that returns a fake net.Conn that waits
......
...@@ -2249,6 +2249,7 @@ func (mux *ServeMux) shouldRedirect(path string) bool { ...@@ -2249,6 +2249,7 @@ func (mux *ServeMux) shouldRedirect(path string) bool {
// If there is no registered handler that applies to the request, // If there is no registered handler that applies to the request,
// Handler returns a ``page not found'' handler and an empty pattern. // Handler returns a ``page not found'' handler and an empty pattern.
func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string) { func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string) {
// CONNECT requests are not canonicalized. // CONNECT requests are not canonicalized.
if r.Method == "CONNECT" { if r.Method == "CONNECT" {
// If r.URL.Path is /tree and its handler is not registered, // If r.URL.Path is /tree and its handler is not registered,
......
...@@ -787,6 +787,7 @@ func TestAddressString(t *testing.T) { ...@@ -787,6 +787,7 @@ func TestAddressString(t *testing.T) {
// Check if all valid addresses can be parsed, formatted and parsed again // Check if all valid addresses can be parsed, formatted and parsed again
func TestAddressParsingAndFormatting(t *testing.T) { func TestAddressParsingAndFormatting(t *testing.T) {
// Should pass // Should pass
tests := []string{ tests := []string{
`<Bob@example.com>`, `<Bob@example.com>`,
......
...@@ -1626,6 +1626,7 @@ func (p *parser) parseClass(s string) (rest string, err error) { ...@@ -1626,6 +1626,7 @@ func (p *parser) parseClass(s string) (rest string, err error) {
// cleanClass sorts the ranges (pairs of elements of r), // cleanClass sorts the ranges (pairs of elements of r),
// merges them, and eliminates duplicates. // merges them, and eliminates duplicates.
func cleanClass(rp *[]rune) []rune { func cleanClass(rp *[]rune) []rune {
// Sort by lo increasing, hi decreasing to break ties. // Sort by lo increasing, hi decreasing to break ties.
sort.Sort(ranges{rp}) sort.Sort(ranges{rp})
......
...@@ -648,6 +648,7 @@ func findfunc(pc uintptr) funcInfo { ...@@ -648,6 +648,7 @@ func findfunc(pc uintptr) funcInfo {
idx = uint32(len(datap.ftab) - 1) idx = uint32(len(datap.ftab) - 1)
} }
if pc < datap.ftab[idx].entry { if pc < datap.ftab[idx].entry {
// With multiple text sections, the idx might reference a function address that // With multiple text sections, the idx might reference a function address that
// is higher than the pc being searched, so search backward until the matching address is found. // is higher than the pc being searched, so search backward until the matching address is found.
...@@ -658,6 +659,7 @@ func findfunc(pc uintptr) funcInfo { ...@@ -658,6 +659,7 @@ func findfunc(pc uintptr) funcInfo {
throw("findfunc: bad findfunctab entry idx") throw("findfunc: bad findfunctab entry idx")
} }
} else { } else {
// linear search to find func with pc >= entry. // linear search to find func with pc >= entry.
for datap.ftab[idx+1].entry <= pc { for datap.ftab[idx+1].entry <= pc {
idx++ idx++
......
...@@ -52,6 +52,7 @@ func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) { ...@@ -52,6 +52,7 @@ func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) {
} }
func nametomib(name string) (mib []_C_int, err error) { func nametomib(name string) (mib []_C_int, err error) {
// Split name into components. // Split name into components.
var parts []string var parts []string
last := 0 last := 0
......
...@@ -29,6 +29,7 @@ type SockaddrDatalink struct { ...@@ -29,6 +29,7 @@ type SockaddrDatalink struct {
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno)
func nametomib(name string) (mib []_C_int, err error) { func nametomib(name string) (mib []_C_int, err error) {
// Perform lookup via a binary search // Perform lookup via a binary search
left := 0 left := 0
right := len(sysctlMib) - 1 right := len(sysctlMib) - 1
......
...@@ -82,6 +82,7 @@ func TestAfterStress(t *testing.T) { ...@@ -82,6 +82,7 @@ func TestAfterStress(t *testing.T) {
} }
func benchmark(b *testing.B, bench func(n int)) { func benchmark(b *testing.B, bench func(n int)) {
// Create equal number of garbage timers on each P before starting // Create equal number of garbage timers on each P before starting
// the benchmark. // the benchmark.
var wg sync.WaitGroup var wg sync.WaitGroup
......
...@@ -12,6 +12,7 @@ import ( ...@@ -12,6 +12,7 @@ import (
// Functions starting with "Is" can be used to inspect which table of range a // Functions starting with "Is" can be used to inspect which table of range a
// rune belongs to. Note that runes may fit into more than one range. // rune belongs to. Note that runes may fit into more than one range.
func Example_is() { func Example_is() {
// constant with mixed type runes // constant with mixed type runes
const mixed = "\b5Ὂg̀9! ℃ᾭG" const mixed = "\b5Ὂg̀9! ℃ᾭG"
for _, c := range mixed { for _, c := range mixed {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment