github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/stdlib/debug/traceback.go (about) 1 package debug 2 3 import ( 4 "bytes" 5 "strconv" 6 7 "github.com/hirochachacha/plua/object" 8 ) 9 10 func writeStackTrace(buf *bytes.Buffer, st *object.StackTrace) { 11 buf.WriteString("\n\t") 12 13 var write bool 14 15 if st.Source != "" { 16 buf.WriteString(st.Source) 17 buf.WriteByte(':') 18 write = true 19 } 20 21 if st.Line > 0 { 22 buf.WriteString(strconv.Itoa(st.Line)) 23 buf.WriteByte(':') 24 write = true 25 } 26 27 if write { 28 buf.WriteString(" in ") 29 } 30 31 buf.WriteString(st.Signature) 32 33 if st.IsTailCall { 34 buf.WriteString("\n\t") 35 buf.WriteString("(...tail calls...)") 36 } 37 } 38 39 func getTraceback(th object.Thread, msg string, level int, hasmsg bool) string { 40 buf := new(bytes.Buffer) 41 42 if hasmsg { 43 buf.WriteString(msg) 44 buf.WriteByte('\n') 45 } 46 47 buf.WriteString("stack traceback:") 48 49 tb := th.Traceback(level) 50 51 if len(tb) <= 22 { 52 for _, st := range tb { 53 writeStackTrace(buf, st) 54 } 55 } else { 56 for _, st := range tb[:10] { 57 writeStackTrace(buf, st) 58 } 59 buf.WriteString("\n\t") 60 buf.WriteString("...") 61 for _, st := range tb[len(tb)-11:] { 62 writeStackTrace(buf, st) 63 } 64 } 65 66 return buf.String() 67 }