proc/variables: Support for nested struct members

Fixes #220
This commit is contained in:
Luke Hoban 2015-09-29 10:15:31 -07:00 committed by Derek Parker
parent 80107dba8d
commit e0519dd540
2 changed files with 8 additions and 9 deletions

@ -295,19 +295,15 @@ func parseG(thread *Thread, gaddr uint64, deref bool) (*G, error) {
// Returns information for the named variable.
func (scope *EvalScope) ExtractVariableInfo(name string) (*Variable, error) {
varName := name
memberName := ""
if strings.Contains(name, ".") {
idx := strings.Index(name, ".")
varName = name[:idx]
memberName = name[idx+1:]
}
parts := strings.Split(name, ".")
varName := parts[0]
memberNames := parts[1:]
v, err := scope.extractVarInfo(varName)
if err != nil {
origErr := err
// Attempt to evaluate name as a package variable.
if memberName != "" {
if len(memberNames) > 0 {
v, err = scope.packageVarAddr(name)
} else {
_, _, fn := scope.Thread.dbp.PCToLine(scope.PC)
@ -320,7 +316,7 @@ func (scope *EvalScope) ExtractVariableInfo(name string) (*Variable, error) {
}
v.Name = name
} else {
if len(memberName) > 0 {
for _, memberName := range memberNames {
v, err = v.structMember(memberName)
if err != nil {
return nil, err

@ -97,6 +97,9 @@ func TestVariableEvaluation(t *testing.T) {
{"f", "main.barfoo", "", "func()", nil},
{"ba", "[]int len: 200, cap: 200, [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...+136 more]", "", "struct []int", nil},
{"ms", "main.Nest {Level: 0, Nest: *main.Nest {Level: 1, Nest: *main.Nest {...}}}", "", "main.Nest", nil},
{"ms.Nest.Nest", "*main.Nest {Level: 2, Nest: *main.Nest {Level: 3, Nest: *main.Nest {...}}}", "", "*main.Nest", nil},
{"ms.Nest.Nest.Nest.Nest.Nest", "*main.Nest nil", "", "*main.Nest", nil},
{"ms.Nest.Nest.Nest.Nest.Nest.Nest", "", "", "*main.Nest", fmt.Errorf("ms.Nest.Nest.Nest.Nest.Nest is nil")},
{"main.p1", "10", "12", "int", nil},
{"p1", "10", "13", "int", nil},
{"NonExistent", "", "", "", fmt.Errorf("could not find symbol value for NonExistent")},