1. 01 Apr, 2015 5 commits
    • 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
  4. 29 Mar, 2015 1 commit
  5. 28 Mar, 2015 8 commits