Allow inlining of functions containing function literals.
authormstarzinger@chromium.org <mstarzinger@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 16 Feb 2012 14:01:41 +0000 (14:01 +0000)
committermstarzinger@chromium.org <mstarzinger@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 16 Feb 2012 14:01:41 +0000 (14:01 +0000)
R=fschneider@chromium.org
BUG=v8:1322
TEST=mjsunit/compiler/inline-literals

Review URL: https://chromiumcodereview.appspot.com/9419005

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10721 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/ast.cc
test/mjsunit/compiler/inline-literals.js

index 7e886fa..43f1ed9 100644 (file)
@@ -1010,6 +1010,7 @@ INCREASE_NODE_COUNT(ReturnStatement)
 INCREASE_NODE_COUNT(Conditional)
 INCREASE_NODE_COUNT(Literal)
 INCREASE_NODE_COUNT(ObjectLiteral)
+INCREASE_NODE_COUNT(FunctionLiteral)
 INCREASE_NODE_COUNT(Assignment)
 INCREASE_NODE_COUNT(Throw)
 INCREASE_NODE_COUNT(Property)
@@ -1083,12 +1084,6 @@ void AstConstructionVisitor::VisitDebuggerStatement(DebuggerStatement* node) {
 }
 
 
-void AstConstructionVisitor::VisitFunctionLiteral(FunctionLiteral* node) {
-  increase_node_count();
-  add_flag(kDontInline);
-}
-
-
 void AstConstructionVisitor::VisitSharedFunctionInfoLiteral(
     SharedFunctionInfoLiteral* node) {
   increase_node_count();
index f78abe8..33d15f5 100644 (file)
@@ -45,6 +45,26 @@ function TestObjectLiteral(a, b, c) {
 
 TestObjectLiteral(1, 2, 3);
 TestObjectLiteral(1, 2, 3);
-%OptimizeFunctionOnNextCall(TestObjectLiteral);
+%OptimizeFunctionOnNextCall(o1);
 TestObjectLiteral(1, 2, 3);
 TestObjectLiteral('a', 'b', 'c');
+
+function f2() {
+  return function(b, c) { return b + c; };
+}
+
+function f1(a, b, c) {
+  return a + f2()(b, c);
+}
+
+function TestFunctionLiteral(a, b, c) {
+  var expected = a + b + c;
+  var result = f1(a, b, c);
+  assertEquals(expected, result, "TestFunctionLiteral");
+}
+
+TestFunctionLiteral(1, 2, 3);
+TestFunctionLiteral(1, 2, 3);
+%OptimizeFunctionOnNextCall(f1);
+TestFunctionLiteral(1, 2, 3);
+TestFunctionLiteral('a', 'b', 'c');