func (loc *AddrLocationSpec) Find(d *Debugger, scope *proc.EvalScope, locStr string) ([]api.Location, error) { if scope == nil { addr, err := strconv.ParseInt(loc.AddrExpr, 0, 64) if err != nil { return nil, fmt.Errorf("could not determine current location (scope is nil)") } return []api.Location{{PC: uint64(addr)}}, nil } else { v, err := scope.EvalExpression(loc.AddrExpr) if err != nil { return nil, err } if v.Unreadable != nil { return nil, v.Unreadable } switch v.Kind { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: addr, _ := constant.Uint64Val(v.Value) return []api.Location{{PC: addr}}, nil case reflect.Func: pc, err := d.process.FunctionEntryToFirstLine(uint64(v.Base)) if err != nil { return nil, err } return []api.Location{{PC: uint64(pc)}}, nil default: return nil, fmt.Errorf("wrong expression kind: %v", v.Kind) } } }
func functionArguments(s *proc.EvalScope) ([]api.Variable, error) { pv, err := s.FunctionArguments() if err != nil { return nil, err } vars := make([]api.Variable, 0, len(pv)) for _, v := range pv { vars = append(vars, api.ConvertVar(v)) } return vars, nil }