| // Copyright 2023 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 raw |
| |
| import ( |
| "strconv" |
| "strings" |
| |
| "internal/trace/v2/event" |
| "internal/trace/v2/version" |
| ) |
| |
| // Event is a simple representation of a trace event. |
| // |
| // Note that this typically includes much more than just |
| // timestamped events, and it also represents parts of the |
| // trace format's framing. (But not interpreted.) |
| type Event struct { |
| Version version.Version |
| Ev event.Type |
| Args []uint64 |
| Data []byte |
| } |
| |
| // String returns the canonical string representation of the event. |
| // |
| // This format is the same format that is parsed by the TextReader |
| // and emitted by the TextWriter. |
| func (e *Event) String() string { |
| spec := e.Version.Specs()[e.Ev] |
| |
| var s strings.Builder |
| s.WriteString(spec.Name) |
| for i := range spec.Args { |
| s.WriteString(" ") |
| s.WriteString(spec.Args[i]) |
| s.WriteString("=") |
| s.WriteString(strconv.FormatUint(e.Args[i], 10)) |
| } |
| if spec.IsStack { |
| frames := e.Args[len(spec.Args):] |
| for i := 0; i < len(frames); i++ { |
| if i%4 == 0 { |
| s.WriteString("\n\t") |
| } else { |
| s.WriteString(" ") |
| } |
| s.WriteString(frameFields[i%4]) |
| s.WriteString("=") |
| s.WriteString(strconv.FormatUint(frames[i], 10)) |
| } |
| } |
| if e.Data != nil { |
| s.WriteString("\n\tdata=") |
| s.WriteString(strconv.Quote(string(e.Data))) |
| } |
| return s.String() |
| } |