proc: Move nil check into toField

This commit is contained in:
Luke Hoban 2015-10-06 16:34:18 -07:00 committed by Derek Parker
parent e18aa9da01
commit a8512ba11a

@ -134,6 +134,9 @@ func (v *Variable) toField(field *dwarf.StructField) (*Variable, error) {
name = fmt.Sprintf("%s.%s", v.Name, field.Name) name = fmt.Sprintf("%s.%s", v.Name, field.Name)
} }
} }
if v.Addr == 0 {
return nil, fmt.Errorf("%s is nil", v.Name)
}
return newVariable(name, uintptr(int64(v.Addr)+field.ByteOffset), field.Type, v.thread) return newVariable(name, uintptr(int64(v.Addr)+field.ByteOffset), field.Type, v.thread)
} }
@ -447,13 +450,6 @@ func (scope *EvalScope) packageVarAddr(name string) (*Variable, error) {
return nil, fmt.Errorf("could not find symbol value for %s", name) return nil, fmt.Errorf("could not find symbol value for %s", name)
} }
func (v *Variable) toFieldNilChecked(field *dwarf.StructField, name string) (*Variable, error) {
if v.Addr == 0 {
return nil, fmt.Errorf("%s is nil", name)
}
return v.toField(field)
}
func (v *Variable) structMember(memberName string) (*Variable, error) { func (v *Variable) structMember(memberName string) (*Variable, error) {
structVar, err := v.maybeDereference() structVar, err := v.maybeDereference()
structVar.Name = v.Name structVar.Name = v.Name
@ -467,7 +463,7 @@ func (v *Variable) structMember(memberName string) (*Variable, error) {
if field.Name != memberName { if field.Name != memberName {
continue continue
} }
return structVar.toFieldNilChecked(field, v.Name) return structVar.toField(field)
} }
// Check for embedded field only if field was // Check for embedded field only if field was
// not a regular struct member // not a regular struct member
@ -483,14 +479,14 @@ func (v *Variable) structMember(memberName string) (*Variable, error) {
// Check for embedded field referenced by type name // Check for embedded field referenced by type name
parts := strings.Split(field.Name, ".") parts := strings.Split(field.Name, ".")
if len(parts) > 1 && parts[1] == memberName { if len(parts) > 1 && parts[1] == memberName {
embeddedVar, err := structVar.toFieldNilChecked(field, v.Name) embeddedVar, err := structVar.toField(field)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return embeddedVar, nil return embeddedVar, nil
} }
// Recursively check for promoted fields on the embedded field // Recursively check for promoted fields on the embedded field
embeddedVar, err := structVar.toFieldNilChecked(field, v.Name) embeddedVar, err := structVar.toField(field)
if err != nil { if err != nil {
return nil, err return nil, err
} }