aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar Laurent Le Brun <laurentlb@google.com>2015-10-28 12:42:09 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2015-10-28 16:04:50 +0000
commitb655167905dfac773b09c3f53185d8269fb47077 (patch)
treeba9ebd8154a5e934abdd54fc8e27deeee3d3c1d6 /src/main/java/com
parent1ffbbdd10f48660f834fd29da80b730ff276af6a (diff)
Skylark interpreter optimization
Special-case the return statement to avoid throwing an exception. -- MOS_MIGRATED_REVID=106488391
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
index 88b5c4b3e6..df0c1977ab 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
@@ -73,7 +73,13 @@ public class UserDefinedFunction extends BaseFunction {
try {
for (Statement stmt : statements) {
- stmt.exec(env);
+ if (stmt instanceof ReturnStatement) {
+ // Performance optimization.
+ // Executing the statement would throw an exception, which is slow.
+ return ((ReturnStatement) stmt).getReturnExpression().eval(env);
+ } else {
+ stmt.exec(env);
+ }
}
} catch (ReturnStatement.ReturnException e) {
return e.getValue();