1. 01 Apr, 2015 14 commits
    • Mikio Hara's avatar
      net: fix data race in benchmarks · 93553dd2
      Mikio Hara authored
      Fixes #10307.
      
      Change-Id: If70f36a6f1c4e465a47a0bc4d38b318424111106
      Reviewed-on: https://go-review.googlesource.com/8330Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
      93553dd2
    • David Symonds's avatar
      go/scanner: Simplify ErrorList.Sort implementation. · 9b696be0
      David Symonds authored
      It functions exactly the same, but this is the more common
      style for these kinds of multi-key comparison functions,
      and is more regular.
      
      Change-Id: I46630948f893bcc96c05eb3d36eb82e1d97a6fa0
      Reviewed-on: https://go-review.googlesource.com/8358Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
      9b696be0
    • Robert Griesemer's avatar
      math/big: faster Int.Binomial(n, k) for k > n/2 · 919a6fbe
      Robert Griesemer authored
      benchmark             old ns/op     new ns/op     delta
      BenchmarkBinomial     478664        4410          -99.08%
      
      Fixes #10084.
      
      Change-Id: Ib75034428e32c79c9a660ae9f9bd396afc6a7f11
      Reviewed-on: https://go-review.googlesource.com/8351Reviewed-by: 's avatarAlan Donovan <adonovan@google.com>
      919a6fbe
    • Josh Bleecher Snyder's avatar
      cmd/internal/gc: unembed Node.Func · 3ed9e4ca
      Josh Bleecher Snyder authored
      This is a follow-up to CL 7360.
      
      It was generated with eg and gofmt -r.
      
      The only manual changes are the unembedding in syntax.go
      and backporting changes from y.go to go.y.
      
      Passes toolstash -cmp.
      
      Change-Id: I3d6d06ecb659809a4bc8592395d5b9a18967218e
      Reviewed-on: https://go-review.googlesource.com/8053Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      3ed9e4ca
    • Josh Bleecher Snyder's avatar
      cmd/internal/gc: separate func-only Node fields · 57279ba7
      Josh Bleecher Snyder authored
      Nodes dominate gc's memory usage, but many fields are only used
      for a subset of kinds of nodes. This change pulls out fields
      used only for func-like Nodes. This reduces the size of the
      Node struct on a 64-bit machine from 504 bytes to 416 bytes (-17%).
      
      Compiling the runtime, 1.5% of nodes have a non-nil Func.
      In html/template, 2.7% of nodes have a non-nil Func.
      
      This change introduces an extra alloc and associated GC overhead
      when Func is non-nil. However, when Func is nil, as it almost
      always is, it spares the garbage collector scanning some Node fields.
      Empirically, this change appears to be roughly neutral with regard to GC.
      
      To keep the diff readable, this CL uses an embedded Func field.
      A subsequent CL will unembed the field.
      
      Passes toolstash -cmp.
      
      Change-Id: Ide86aa954b097fb8e6154f0811d3691497477004
      Reviewed-on: https://go-review.googlesource.com/7360Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      57279ba7
    • Jan Mercl's avatar
      go/scanner: Stabilize (*ErrorList).Sort · 9fd87bd5
      Jan Mercl authored
      This change stabilizes the result of Sort when the error list contains
      multiple items for same position. To stabilize the result, newly also
      the Msg field is considered.
      
      The motivation is to avoid diffs of sorted scanner.ErrorList output
      in repository tracked logs like:
      
      -testdata/foo.go:19:44: "bar"
       testdata/foo.go:19:44: "qux"
      +testdata/foo.go:19:44: "bar"
      
      The change was approved at [0] before submitting.
      
      As a side effect, one file in go/parser/testdata must be updated as
      well. For this file the parser produces two different errors:
      
      testdata/issue3106.src:22:5: expected ';', found 'if'
      testdata/issue3106.src:22:5: expected operand, found 'if'
      
      Before comparing the actual and expected errors, the former are
      filtered to keep only one error per source line[1]. With the new
      (*ErrorList).Less the outcome is the other error than before which is
      kept after the call to RemoveMultiplies.
      
      [0]: https://groups.google.com/d/msg/golang-nuts/5ChC0XiIwlU/rol_yb2gTj4J
      [1]:
      https://github.com/golang/go/blob/9d0239771a2ddd77be0ba64c2782e1328a378190/src/go/parser/error_test.go#L160
      
      Change-Id: Ib72c98a891cdeef34705c22dfbeb0408dcdfddf8
      Reviewed-on: https://go-review.googlesource.com/8340Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
      9fd87bd5
    • Sebastien Binet's avatar
      cmd/gofmt, go/format: refactor common pieces into internal/format · 9a3ee2d2
      Sebastien Binet authored
      cmd/gofmt and go/format had 3 functions (parse, format and isSpace)
      that had to be kept in-sync.
      
      This CL extracts these 3 functions and refactors them into a new
      internal/format package.
      This CL is just code reorganization with no behavior nor semantic
      change.
      
      Change-Id: I593f24e9d3cadbbd9559a67e3b1d2ff190b4fd90
      Reviewed-on: https://go-review.googlesource.com/6760Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
      9a3ee2d2
    • Josh Bleecher Snyder's avatar
      cmd/5g etc: merge simple case expressions onto fewer lines · b09925b3
      Josh Bleecher Snyder authored
      The c2go translation left a lot of case expressions on separate lines.
      Merge expressions onto single lines subject to these constraints:
      
      * Max 4 clauses, all literals or names
      * Don't move expressions with comments
      
      The change was created by running http://play.golang.org/p/yHajs72h-g:
      
      $ mergecase cmd/internal/{ld,gc,obj}/*.go cmd/internal/obj/*/*.go
      
      Passes toolstash -cmp.
      
      Change-Id: Iba41b390d302e5486e5dc6ba7599a92270676556
      Reviewed-on: https://go-review.googlesource.com/7593Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      b09925b3
    • Preetam Jinka's avatar
      compress/flate: fix typo in comment · 2c20eda1
      Preetam Jinka authored
      Change-Id: I32ec2d8cb838fb850b3779726cf347dac21dff68
      Reviewed-on: https://go-review.googlesource.com/8322Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
      2c20eda1
    • Josh Bleecher Snyder's avatar
      cmd/gc: teach componentgen about string constants · 94410c79
      Josh Bleecher Snyder authored
      This makes it cheaper to copy string literals.
      This happens just about anywhere that they are used.
      
      Example:
      
      func f() string {
      	return "f"
      }
      
      Using 6g, compiler output before:
      
      "".f t=1 size=32 value=0 args=0x10 locals=0x0
      	0x0000 00000 (p.go:3)	TEXT	"".f+0(SB),4,$0-16
      	0x0000 00000 (p.go:3)	FUNCDATA	$0,gclocals·d64e51a4c4bfeaa840e480961ec6b0b3+0(SB)
      	0x0000 00000 (p.go:3)	FUNCDATA	$1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB)
      	0x0000 00000 (p.go:4)	LEAQ	go.string."f"+0(SB),BX
      	0x0007 00007 (p.go:4)	MOVQ	(BX),BP
      	0x000a 00010 (p.go:4)	MOVQ	BP,"".~r0+8(FP)
      	0x000f 00015 (p.go:4)	MOVQ	8(BX),BP
      	0x0013 00019 (p.go:4)	MOVQ	BP,"".~r0+16(FP)
      	0x0018 00024 (p.go:4)	RET	,
      
      After:
      
      "".f t=1 size=32 value=0 args=0x10 locals=0x0
      	0x0000 00000 (p.go:3)	TEXT	"".f+0(SB),4,$0-16
      	0x0000 00000 (p.go:3)	FUNCDATA	$0,gclocals·d64e51a4c4bfeaa840e480961ec6b0b3+0(SB)
      	0x0000 00000 (p.go:3)	FUNCDATA	$1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB)
      	0x0000 00000 (p.go:4)	MOVQ	$go.string."f"+16(SB),BX
      	0x0007 00007 (p.go:4)	MOVQ	BX,"".~r0+8(FP)
      	0x000c 00012 (p.go:4)	MOVQ	$1,"".~r0+16(FP)
      	0x0015 00021 (p.go:4)	RET	,
      
      The leading MOVQ here will be converted into a LEAQ by the linker,
      but there is still a net reduction of two MOVQs.
      
      Before:
      
      TEXT main.f(SB)
              p.go:4  0x2000  488d1d49500500  LEAQ 0x55049(IP), BX
              p.go:4  0x2007  488b2b          MOVQ 0(BX), BP
              p.go:4  0x200a  48896c2408      MOVQ BP, 0x8(SP)
              p.go:4  0x200f  488b6b08        MOVQ 0x8(BX), BP
              p.go:4  0x2013  48896c2410      MOVQ BP, 0x10(SP)
              p.go:4  0x2018  c3              RET
      
      After:
      
      TEXT main.f(SB)
              p.go:4  0x2000  488d1dd94c0500          LEAQ 0x54cd9(IP), BX
              p.go:4  0x2007  48895c2408              MOVQ BX, 0x8(SP)
              p.go:4  0x200c  48c744241001000000      MOVQ $0x1, 0x10(SP)
              p.go:4  0x2015  c3                      RET
      
      The performance improvement is small but widespread.
      
      As a nice small example, net/url's sole benchmark using 6g:
      
      benchmark           old ns/op     new ns/op     delta
      BenchmarkString     16372         16118         -1.55%
      
      And with 8g:
      
      benchmark           old ns/op     new ns/op     delta
      BenchmarkString     22034         21709         -1.47%
      
      Change-Id: I4ce202ee7dbd4057be869e2faaaa638c28a1fff0
      Reviewed-on: https://go-review.googlesource.com/2587Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      94410c79
    • Andrei Korzhevskii's avatar
      database/sql: provide stats on number of open connections to the database. · 297c1d29
      Andrei Korzhevskii authored
      This change provides a convenient way to monitor database connection pool.
      
      Change-Id: I4b3757855b43f3b254acf9312e2a16e2f87840d0
      Reviewed-on: https://go-review.googlesource.com/7950
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
      297c1d29
    • Dave Cheney's avatar
      cmd/go: always link external test packages first when using gccgo · 9d023977
      Dave Cheney authored
      This CL is an amagamation of several fixes Canonical have made on their
      fork of the cmd/go tool (packaged as gccgo-go.deb on Ubuntu 14.04+).
      
      Additionally this CL brings gccgoToolchain.ldi() up to date with the version
      that will ship in gccgo-5.0. As gccgo is most likely to be used with its
      own version of the go tool that it supples it makes good sense that the libgo
      version should dictate the contents of gccgotoolchain.ld()
      
      Please see https://codereview.appspot.com/222890043/ for more details on the
      issues fixed.
      
      Change-Id: Icf7deb43f8e80b424757f1673e6bca7a0aa2a1ac
      Reviewed-on: https://go-review.googlesource.com/8250Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
      9d023977
    • Evan Phoenix's avatar
      text/scanner: Fix EOF reporting on strange Readers · 9c037527
      Evan Phoenix authored
      Currently, scanner uses -1 to represent 2 different states:
      
      1. I haven't yet scanned anything, call it "Beginning of File"
      2. I've reached the end of the input, ie EOF
      
      The result of this behavior is that calling Peek() when next()
      has detected the end of the input and set s.ch to scanner.EOF,
      is that Peek() things "oh, s.ch is < 0, which to me means that
      I haven't scanned any next yet, let me try and clear the BOM
      marker."
      
      When this behavior is run on a typical IO, next() will issue
      a Read and get (0, io.EOF) back for the second time without
      blocking and Peek() will return scanner.EOF.
      
      The bug comes into play when, inside a terminal, hitting Control-D.
      This causes the terminal to return a EOF condition to the reader
      but it does not actually close the fd.
      
      So, combining these 2 situations, we arrive at the bug:
      
      What is expected: hitting Control-D in a terminal will make Peek()
      return scanner.EOF instantly.
      
      What actually happens:
      
      0. Code waiting in Next()
      1. User hits Control-D
      2. fd returns EOF condition
      3. EOF bubbles it's way out to line 249 in scanner.go
      4. next() returns scanner.EOF
      5. Next() saves the scanner.EOF to s.ch and returns the previous value
      6. Peek() runs, sees s.ch < 0, mistakenly thinks it hasn't run yet and
         tries to read the BOM marker.
      7. next() sees the buffer is empty and tries to fill it again, blocking
         on line 249.
      
      The fix is simple: use a different code to indicate that no data
      has been scanned.
      
      Change-Id: Iee8f4da5881682c4d4c36b93b9bf397ac5798179
      Reviewed-on: https://go-review.googlesource.com/7913Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
      9c037527
    • Martin Möhrmann's avatar
      fmt: improve test coverage of %x and %X format variations for strings · 15e66f9d
      Martin Möhrmann authored
      The tests in the basic string section are now covering more code paths
      for encoding a string into the hexadecimal representation of its bytes.
      
      Changed the basic string and basic bytes tests so that they mirror each other.
      
      Change-Id: Ib5dc7b33876769965f9aba2ac270040abc4b2451
      Reviewed-on: https://go-review.googlesource.com/2611Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
      Reviewed-by: 's avatarRob Pike <r@golang.org>
      15e66f9d
  2. 31 Mar, 2015 10 commits
  3. 30 Mar, 2015 16 commits