Reviewers: Vyacheslav Egorov,

Message:
Please take a look.

Description:
Mark Code objects as not optimizable if their FunctionLiteral contains
unoptimizable AST nodes.

This ensures that we never try to optimize such functions.


Please review this at https://chromiumcodereview.appspot.com/9700062/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/ast.cc
  M src/full-codegen.cc
  M src/objects.cc


Index: src/ast.cc
diff --git a/src/ast.cc b/src/ast.cc
index 011ce651cd0566e30ceb9a1626b88f3642ba8347..629e4722b5cbe0e89cde4f05f5d6dbbc7570e64f 100644
--- a/src/ast.cc
+++ b/src/ast.cc
@@ -1061,8 +1061,6 @@ void AstConstructionVisitor::VisitForStatement(ForStatement* node) {

 void AstConstructionVisitor::VisitForInStatement(ForInStatement* node) {
   increase_node_count();
-  add_flag(kDontOptimize);
-  add_flag(kDontInline);
   add_flag(kDontSelfOptimize);
 }

Index: src/full-codegen.cc
diff --git a/src/full-codegen.cc b/src/full-codegen.cc
index f77c82df5129019d1f686a6c6e1ccf23491dc882..d963979ad867f0a8bc2d6c649af00383bed442da 100644
--- a/src/full-codegen.cc
+++ b/src/full-codegen.cc
@@ -313,7 +313,8 @@ bool FullCodeGenerator::MakeCode(CompilationInfo* info) {

   Code::Flags flags = Code::ComputeFlags(Code::FUNCTION);
   Handle<Code> code = CodeGenerator::MakeCodeEpilogue(&masm, flags, info);
-  code->set_optimizable(info->IsOptimizable());
+  code->set_optimizable(info->IsOptimizable() &&
+                        !info->function()->flags()->Contains(kDontOptimize));
   code->set_self_optimization_header(cgen.has_self_optimization_header_);
   cgen.PopulateDeoptimizationData(code);
   cgen.PopulateTypeFeedbackInfo(code);
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index a0872c6a2492154f2320c4e9b926c0e4ebf310ec..efcff1dd9c304ff7e0f8b48c6896260f20da1bc6 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -7380,6 +7380,7 @@ void JSFunction::MarkForLazyRecompilation() {
   ASSERT(is_compiled() && !IsOptimized());
   ASSERT(shared()->allows_lazy_compilation() ||
          code()->optimizable());
+  ASSERT(!shared()->optimization_disabled());
   Builtins* builtins = GetIsolate()->builtins();
   ReplaceCode(builtins->builtin(Builtins::kLazyRecompile));
 }


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to