@@ -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'.
128128func (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) {
140142type stack []uintptr
141143
142144func (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
155152func (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