| // Copyright 2017 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 trace | |
| import "bytes" | |
| // Writer is a test trace writer. | |
| type Writer struct { | |
| bytes.Buffer | |
| } | |
| func NewWriter() *Writer { | |
| w := new(Writer) | |
| w.Write([]byte("go 1.9 trace\x00\x00\x00\x00")) | |
| return w | |
| } | |
| // Emit writes an event record to the trace. | |
| // See Event types for valid types and required arguments. | |
| func (w *Writer) Emit(typ byte, args ...uint64) { | |
| nargs := byte(len(args)) - 1 | |
| if nargs > 3 { | |
| nargs = 3 | |
| } | |
| buf := []byte{typ | nargs<<6} | |
| if nargs == 3 { | |
| buf = append(buf, 0) | |
| } | |
| for _, a := range args { | |
| buf = appendVarint(buf, a) | |
| } | |
| if nargs == 3 { | |
| buf[1] = byte(len(buf) - 2) | |
| } | |
| n, err := w.Write(buf) | |
| if n != len(buf) || err != nil { | |
| panic("failed to write") | |
| } | |
| } | |
| func appendVarint(buf []byte, v uint64) []byte { | |
| for ; v >= 0x80; v >>= 7 { | |
| buf = append(buf, 0x80|byte(v)) | |
| } | |
| buf = append(buf, byte(v)) | |
| return buf | |
| } |