Skip to content

Commit 9cc62fa

Browse files
brad4dTyler Breisacher
authored and
Tyler Breisacher
committed
Honor @noinline in InlineFunctions.
Related to #2751 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=179759191
1 parent 5698304 commit 9cc62fa

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

Diff for: src/com/google/javascript/jscomp/InlineFunctions.java

+12
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.google.javascript.jscomp.FunctionInjector.CanInlineResult;
2929
import com.google.javascript.jscomp.FunctionInjector.InliningMode;
3030
import com.google.javascript.jscomp.NodeTraversal.AbstractPostOrderCallback;
31+
import com.google.javascript.rhino.JSDocInfo;
3132
import com.google.javascript.rhino.Node;
3233
import java.util.Collection;
3334
import java.util.Collections;
@@ -262,6 +263,12 @@ void maybeAddFunction(Function fn, JSModule module) {
262263
return;
263264
}
264265
Node fnNode = fn.getFunctionNode();
266+
267+
if (hasNoInlineAnnotation(fnNode)) {
268+
functionState.setInline(false);
269+
return;
270+
}
271+
265272
if (enforceMaxSizeAfterInlining
266273
&& !isAlwaysInlinable(fnNode)
267274
&& maxSizeAfterInlining <= NodeUtil.countAstSizeUpToLimit(fnNode, maxSizeAfterInlining)) {
@@ -328,6 +335,11 @@ void maybeAddFunction(Function fn, JSModule module) {
328335
}
329336
}
330337

338+
private boolean hasNoInlineAnnotation(Node fnNode) {
339+
JSDocInfo jsDocInfo = NodeUtil.getBestJSDocInfo(fnNode);
340+
return jsDocInfo != null && jsDocInfo.isNoInline();
341+
}
342+
331343
/**
332344
* @param fnNode The function to inspect.
333345
* @return Whether the function has parameters, var/const/let, class, or function declarations.

Diff for: test/com/google/javascript/jscomp/InlineFunctionsTest.java

+5
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ protected int getNumRepetitions() {
7777
return 3;
7878
}
7979

80+
public void testNoInline() {
81+
testSame("/** @noinline */ function foo(){} foo();foo();foo();");
82+
testSame("/** @noinline */ var foo = function(){}; foo();foo();foo();");
83+
}
84+
8085
public void testInlineEmptyFunction1() {
8186
// Empty function, no params.
8287
test("function foo(){}" +

0 commit comments

Comments
 (0)