1 package trace 2 3 import "bytes" 4 5 // Writer is a test trace writer. 6 type Writer struct { 7 bytes.Buffer 8 } 9 10 func NewWriter() *Writer { 11 w := new(Writer) 12 w.Write([]byte("go 1.7 trace\x00\x00\x00\x00")) 13 return w 14 } 15 16 // Emit writes an event record to the trace. 17 // See Event types for valid types and required arguments. 18 func (w *Writer) Emit(typ byte, args ...uint64) { 19 nargs := byte(len(args)) - 1 20 if nargs > 3 { 21 nargs = 3 22 } 23 buf := []byte{typ | nargs<<6} 24 if nargs == 3 { 25 buf = append(buf, 0) 26 } 27 for _, a := range args { 28 buf = appendVarint(buf, a) 29 } 30 if nargs == 3 { 31 buf[1] = byte(len(buf) - 2) 32 } 33 n, err := w.Write(buf) 34 if n != len(buf) || err != nil { 35 panic("failed to write") 36 } 37 } 38 39 func appendVarint(buf []byte, v uint64) []byte { 40 for ; v >= 0x80; v >>= 7 { 41 buf = append(buf, 0x80|byte(v)) 42 } 43 buf = append(buf, byte(v)) 44 return buf 45 } 46