diff --git a/proc/variables.go b/proc/variables.go index c409afd0..6b99de75 100644 --- a/proc/variables.go +++ b/proc/variables.go @@ -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 diff --git a/proc/variables_test.go b/proc/variables_test.go index c0d303fd..0de579f5 100644 --- a/proc/variables_test.go +++ b/proc/variables_test.go @@ -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")},