Change getattr() behavior so 3-arg form doesn't fail when field is a method
RELNOTES: getattr()'s 3-arg form no longer raises an error when the retrieved field is a built-in method.
--
MOS_MIGRATED_REVID=137390666
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
index 4245775..ee00adb 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
@@ -2060,10 +2060,10 @@
name = "getattr",
doc =
"Returns the struct's field of the given name if it exists. If not, it either returns "
- + "<code>default</code> (if specified) or raises an error. However, if there is a "
- + "method of the given name, this method always raises an error, regardless of the "
- + "presence of a default value. <code>getattr(x, \"foobar\")</code> is equivalent to "
- + "<code>x.foobar</code>."
+ + "<code>default</code> (if specified) or raises an error. Built-in methods cannot "
+ + "currently be retrieved in this way; doing so will result in an error if a "
+ + "<code>default</code> is not given. <code>getattr(x, \"foobar\")</code> is "
+ + "equivalent to <code>x.foobar</code>."
+ "<pre class=\"language-python\">getattr(ctx.attr, \"myattr\")\n"
+ "getattr(ctx.attr, \"myattr\", \"mydefault\")</pre>",
parameters = {
@@ -2091,7 +2091,7 @@
// 'Real' describes methods with structField() == false. Because DotExpression.eval
// returned null in this case, we know that structField() cannot return true.
boolean isRealMethod = hasMethod(obj, name, loc);
- if (defaultValue != Runtime.UNBOUND && !isRealMethod) {
+ if (defaultValue != Runtime.UNBOUND) {
return defaultValue;
}
throw new EvalException(