aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralandonovan <adonovan@google.com>2018-02-26 17:11:13 -0500
committerGitHub <noreply@github.com>2018-02-26 17:11:13 -0500
commit653c157a7d1b331d43597e65b2f0e0c14286195d (patch)
treebe1f0ca18f3536e562d2652569b9fe2f9efd63b4
parent15b1cb9b233470f186d95baec2bb1d049432c73e (diff)
downloadstarlark-go-653c157a7d1b331d43597e65b2f0e0c14286195d.tar.gz
getattr: return the default value if Attr returns an error (#72)
But return the original error if there was no default. This is analogous to what #69 did for hasattr.
-rw-r--r--library.go16
1 files changed, 13 insertions, 3 deletions
diff --git a/library.go b/library.go
index ae18778..6116d1e 100644
--- a/library.go
+++ b/library.go
@@ -516,10 +516,20 @@ func getattr(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, err
if err := UnpackPositionalArgs("getattr", args, kwargs, 2, &object, &name, &dflt); err != nil {
return nil, err
}
- if o, ok := object.(HasAttrs); ok {
- if v, err := o.Attr(name); v != nil || err != nil {
- return v, err
+ if object, ok := object.(HasAttrs); ok {
+ v, err := object.Attr(name)
+ if err != nil {
+ // An error could mean the field doesn't exist,
+ // or it exists but could not be computed.
+ if dflt != nil {
+ return dflt, nil
+ }
+ return nil, err
+ }
+ if v != nil {
+ return v, nil
}
+ // (nil, nil) => no such field
}
if dflt != nil {
return dflt, nil