diff --git a/src/cmd/asm/main.go b/src/cmd/asm/main.go index 40e1d9c4a9..c612583e6b 100644 --- a/src/cmd/asm/main.go +++ b/src/cmd/asm/main.go @@ -44,12 +44,15 @@ func main() { defer ctxt.Bso.Flush() // Create object file, write header. - output, err := bio.Create(*flags.OutputFile) + out, err := os.Create(*flags.OutputFile) if err != nil { log.Fatal(err) } - fmt.Fprintf(output, "go object %s %s %s\n", obj.Getgoos(), obj.Getgoarch(), obj.Getgoversion()) - fmt.Fprintf(output, "!\n") + defer bio.MustClose(out) + buf := bufio.NewWriter(bio.MustWriter(out)) + + fmt.Fprintf(buf, "go object %s %s %s\n", obj.Getgoos(), obj.Getgoarch(), obj.Getgoversion()) + fmt.Fprintf(buf, "!\n") lexer := lex.NewLexer(flag.Arg(0), ctxt) parser := asm.NewParser(ctxt, architecture, lexer) @@ -63,12 +66,12 @@ func main() { pList.Firstpc, ok = parser.Parse() if ok { // reports errors to parser.Errorf - obj.Writeobjdirect(ctxt, output) + obj.Writeobjdirect(ctxt, buf) } if !ok || diag { log.Printf("assembly of %s failed", flag.Arg(0)) os.Remove(*flags.OutputFile) os.Exit(1) } - output.Flush() + buf.Flush() } diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index 59ce0547c8..b60f78f638 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -88,7 +88,7 @@ func dumpobj() { externdcl = tmp dumpdata() - obj.Writeobjdirect(Ctxt, bout) + obj.Writeobjdirect(Ctxt, bout.Writer) if writearchive { bout.Flush() diff --git a/src/cmd/internal/bio/buf.go b/src/cmd/internal/bio/buf.go index 7a077041c2..54ce3c7681 100644 --- a/src/cmd/internal/bio/buf.go +++ b/src/cmd/internal/bio/buf.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package bio implements seekable buffered I/O. +// Package bio implements common I/O abstractions used within the Go toolchain. package bio import ( diff --git a/src/cmd/internal/bio/must.go b/src/cmd/internal/bio/must.go new file mode 100644 index 0000000000..3604b29175 --- /dev/null +++ b/src/cmd/internal/bio/must.go @@ -0,0 +1,43 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package bio + +import ( + "io" + "log" +) + +// MustClose closes Closer c and calls log.Fatal if it returns a non-nil error. +func MustClose(c io.Closer) { + if err := c.Close(); err != nil { + log.Fatal(err) + } +} + +// MustWriter returns a Writer that wraps the provided Writer, +// except that it calls log.Fatal instead of returning a non-nil error. +func MustWriter(w io.Writer) io.Writer { + return mustWriter{w} +} + +type mustWriter struct { + w io.Writer +} + +func (w mustWriter) Write(b []byte) (int, error) { + n, err := w.w.Write(b) + if err != nil { + log.Fatal(err) + } + return n, nil +} + +func (w mustWriter) WriteString(s string) (int, error) { + n, err := io.WriteString(w.w, s) + if err != nil { + log.Fatal(err) + } + return n, nil +} diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index 7d88db2bcc..60505dfbb5 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -109,7 +109,6 @@ package obj import ( "bufio" - "cmd/internal/bio" "cmd/internal/sys" "fmt" "log" @@ -120,7 +119,7 @@ import ( // The Go and C compilers, and the assembler, call writeobj to write // out a Go object file. The linker does not call this; the linker // does not write out object files. -func Writeobjdirect(ctxt *Link, b *bio.Writer) { +func Writeobjdirect(ctxt *Link, b *bufio.Writer) { Flushplist(ctxt) WriteObjFile(ctxt, b) } @@ -187,16 +186,16 @@ func (w *objWriter) writeLengths() { w.writeInt(int64(w.nFile)) } -func newObjWriter(ctxt *Link, b *bio.Writer) *objWriter { +func newObjWriter(ctxt *Link, b *bufio.Writer) *objWriter { return &objWriter{ ctxt: ctxt, - wr: b.Writer, + wr: b, vrefIdx: make(map[string]int), refIdx: make(map[string]int), } } -func WriteObjFile(ctxt *Link, b *bio.Writer) { +func WriteObjFile(ctxt *Link, b *bufio.Writer) { w := newObjWriter(ctxt, b) // Magic header