1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
func (ci *Frames) Next() (frame Frame, more bool) { for len(ci.frames) < 2 { if len(ci.callers) == 0 { break } pc := ci.callers[0] ci.callers = ci.callers[1:] funcInfo := findfunc(pc) if !funcInfo.valid() { if cgoSymbolizer != nil { ci.frames = append(ci.frames, expandCgoFrames(pc)...) } continue } f := funcInfo._Func() entry := f.Entry() if pc > entry { pc-- } name := funcname(funcInfo) if inldata := funcdata(funcInfo, _FUNCDATA_InlTree); inldata != nil { inltree := (*[1 << 20]inlinedCall)(inldata) ix := pcdatavalue1(funcInfo, _PCDATA_InlTreeIndex, pc, nil, false) if ix >= 0 { f = nil name = funcnameFromNameoff(funcInfo, inltree[ix].func_) } } ci.frames = append(ci.frames, Frame{ PC: pc, Func: f, Function: name, Entry: entry, funcInfo: funcInfo, }) }
switch len(ci.frames) { case 0: return case 1: frame = ci.frames[0] ci.frames = ci.frameStore[:0] case 2: frame = ci.frames[0] ci.frameStore[0] = ci.frames[1] ci.frames = ci.frameStore[:1] default: frame = ci.frames[0] ci.frames = ci.frames[1:] } more = len(ci.frames) > 0 if frame.funcInfo.valid() { file, line := funcline1(frame.funcInfo, frame.PC, false) frame.File, frame.Line = file, int(line) } return }
|