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.7 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 }