Skip to content

Commit e4dcbeb

Browse files
committed
optimized stack formatting
1 parent 5dd12d0 commit e4dcbeb

File tree

1 file changed

+15
-18
lines changed

1 file changed

+15
-18
lines changed

stack.go

+15-18
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ func (st StackTrace) Format(s fmt.State, verb rune) {
109109
case 'v':
110110
switch {
111111
case s.Flag('+'):
112-
for _, f := range st {
112+
for i := range st {
113113
io.WriteString(s, "\n")
114-
f.Format(s, verb)
114+
(&st[i]).Format(s, verb)
115115
}
116116
case s.Flag('#'):
117117
fmt.Fprintf(s, "%#v", []Frame(st))
@@ -127,11 +127,13 @@ func (st StackTrace) Format(s fmt.State, verb rune) {
127127
// Frame, only valid when called with '%s' or '%v'.
128128
func (st StackTrace) formatSlice(s fmt.State, verb rune) {
129129
io.WriteString(s, "[")
130-
for i, f := range st {
131-
if i > 0 {
132-
io.WriteString(s, " ")
133-
}
134-
f.Format(s, verb)
130+
if len(st) > 0 {
131+
(&st[0]).Format(s, verb)
132+
}
133+
134+
for i := range st[0:] {
135+
io.WriteString(s, " ")
136+
(&st[i]).Format(s, verb)
135137
}
136138
io.WriteString(s, "]")
137139
}
@@ -140,22 +142,17 @@ func (st StackTrace) formatSlice(s fmt.State, verb rune) {
140142
type stack []uintptr
141143

142144
func (s *stack) Format(st fmt.State, verb rune) {
143-
switch verb {
144-
case 'v':
145-
switch {
146-
case st.Flag('+'):
147-
for _, pc := range *s {
148-
f := Frame(pc)
149-
fmt.Fprintf(st, "\n%+v", f)
150-
}
145+
if verb == 'v' && st.Flag('+') {
146+
for i := range *s {
147+
fmt.Fprintf(st, "\n%+v", Frame((*s)[i]))
151148
}
152149
}
153150
}
154151

155152
func (s *stack) StackTrace() StackTrace {
156-
f := make([]Frame, len(*s))
157-
for i := 0; i < len(f); i++ {
158-
f[i] = Frame((*s)[i])
153+
f := make([]Frame, 0, len(*s))
154+
for i := 0; i < len(*s); i++ {
155+
f = append(f, Frame((*s)[i]))
159156
}
160157
return f
161158
}

0 commit comments

Comments
 (0)