conversions.go 1.9 KB
Newer Older
1 2
package api

A
aarzilli 已提交
3 4
import (
	"debug/gosym"
5
	"strconv"
D
Derek Parker 已提交
6

A
aarzilli 已提交
7 8
	"github.com/derekparker/delve/proc"
)
9 10 11

// convertBreakpoint converts an internal breakpoint to an API Breakpoint.
func ConvertBreakpoint(bp *proc.Breakpoint) *Breakpoint {
12 13 14 15 16 17 18 19 20 21 22
	b := &Breakpoint{
		ID:            bp.ID,
		FunctionName:  bp.FunctionName,
		File:          bp.File,
		Line:          bp.Line,
		Addr:          bp.Addr,
		Tracepoint:    bp.Tracepoint,
		Stacktrace:    bp.Stacktrace,
		Goroutine:     bp.Goroutine,
		Variables:     bp.Variables,
		TotalHitCount: bp.TotalHitCount,
23
	}
24 25 26 27 28 29 30

	b.HitCount = map[string]uint64{}
	for idx := range bp.HitCount {
		b.HitCount[strconv.Itoa(idx)] = bp.HitCount[idx]
	}

	return b
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
}

// convertThread converts an internal thread to an API Thread.
func ConvertThread(th *proc.Thread) *Thread {
	var (
		function *Function
		file     string
		line     int
		pc       uint64
	)

	loc, err := th.Location()
	if err == nil {
		pc = loc.PC
		file = loc.File
		line = loc.Line
A
aarzilli 已提交
47
		function = ConvertFunction(loc.Fn)
48 49 50 51 52
	}

	return &Thread{
		ID:       th.Id,
		PC:       pc,
53
		File:     file,
54 55 56 57 58 59 60 61 62 63 64 65 66 67
		Line:     line,
		Function: function,
	}
}

// convertVar converts an internal variable to an API Variable.
func ConvertVar(v *proc.Variable) Variable {
	return Variable{
		Name:  v.Name,
		Value: v.Value,
		Type:  v.Type,
	}
}

A
aarzilli 已提交
68 69 70 71 72 73 74 75 76 77
func ConvertFunction(fn *gosym.Func) *Function {
	if fn == nil {
		return nil
	}

	return &Function{
		Name:   fn.Name,
		Type:   fn.Type,
		Value:  fn.Value,
		GoType: fn.GoType,
78
	}
A
aarzilli 已提交
79
}
80

A
aarzilli 已提交
81 82
// convertGoroutine converts an internal Goroutine to an API Goroutine.
func ConvertGoroutine(g *proc.G) *Goroutine {
83 84 85
	return &Goroutine{
		ID:       g.Id,
		PC:       g.PC,
86
		File:     g.File,
87
		Line:     g.Line,
A
aarzilli 已提交
88 89 90 91 92 93 94
		Function: ConvertFunction(g.Func),
	}
}

func ConvertLocation(loc proc.Location) Location {
	return Location{
		PC:       loc.PC,
95
		File:     loc.File,
A
aarzilli 已提交
96 97
		Line:     loc.Line,
		Function: ConvertFunction(loc.Fn),
98 99
	}
}