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  }