@@ -109,9 +109,9 @@ func (st StackTrace) Format(s fmt.State, verb rune) {
109
109
case 'v' :
110
110
switch {
111
111
case s .Flag ('+' ):
112
- for _ , f := range st {
112
+ for i := range st {
113
113
io .WriteString (s , "\n " )
114
- f .Format (s , verb )
114
+ ( & st [ i ]) .Format (s , verb )
115
115
}
116
116
case s .Flag ('#' ):
117
117
fmt .Fprintf (s , "%#v" , []Frame (st ))
@@ -127,11 +127,13 @@ func (st StackTrace) Format(s fmt.State, verb rune) {
127
127
// Frame, only valid when called with '%s' or '%v'.
128
128
func (st StackTrace ) formatSlice (s fmt.State , verb rune ) {
129
129
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 )
135
137
}
136
138
io .WriteString (s , "]" )
137
139
}
@@ -140,22 +142,17 @@ func (st StackTrace) formatSlice(s fmt.State, verb rune) {
140
142
type stack []uintptr
141
143
142
144
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 ]))
151
148
}
152
149
}
153
150
}
154
151
155
152
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 ]) )
159
156
}
160
157
return f
161
158
}
0 commit comments