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)
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()
}
externdcl = tmp
dumpdata()
- obj.Writeobjdirect(Ctxt, bout)
+ obj.Writeobjdirect(Ctxt, bout.Writer)
if writearchive {
bout.Flush()
// 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 (
--- /dev/null
+// 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
+}
import (
"bufio"
- "cmd/internal/bio"
"cmd/internal/sys"
"fmt"
"log"
// 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)
}
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