Handle stack overflow errors correctly when rewriting the AST
authoriposva@chromium.org <iposva@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 5 Nov 2008 20:39:41 +0000 (20:39 +0000)
committeriposva@chromium.org <iposva@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 5 Nov 2008 20:39:41 +0000 (20:39 +0000)
for likely Smis.

Review URL: http://codereview.chromium.org/9429

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

src/compiler.cc
src/rewriter.cc
src/rewriter.h

index 2a2bb87..2078985 100644 (file)
@@ -66,7 +66,11 @@ static Handle<Code> MakeCode(FunctionLiteral* literal,
 #endif
 
   // Optimize the AST.
-  Rewriter::Optimize(literal);
+  if (!Rewriter::Optimize(literal)) {
+    // Signal a stack overflow by returning a null handle.  The stack
+    // overflow exception will be thrown by the caller.
+    return Handle<Code>::null();
+  }
 
   // Generate code and return it.
   Handle<Code> result = CodeGenerator::MakeCode(literal, script, is_eval);
index d391d5d..c5ca7cd 100644 (file)
@@ -761,17 +761,20 @@ bool Rewriter::Process(FunctionLiteral* function) {
 }
 
 
-void Rewriter::Optimize(FunctionLiteral* function) {
+bool Rewriter::Optimize(FunctionLiteral* function) {
   ZoneList<Statement*>* body = function->body();
-  if (body->is_empty()) return;
 
-  if (FLAG_optimize_ast) {
+  if (FLAG_optimize_ast && !body->is_empty()) {
     Scope* scope = function->scope();
     if (!scope->is_global_scope()) {
       AstOptimizer optimizer;
       optimizer.Optimize(body);
+      if (optimizer.HasStackOverflow()) {
+        return false;
+      }
     }
   }
+  return true;
 }
 
 
index d69ad5a..aa2f981 100644 (file)
@@ -44,7 +44,7 @@ namespace v8 { namespace internal {
 class Rewriter {
  public:
   static bool Process(FunctionLiteral* function);
-  static void Optimize(FunctionLiteral* function);
+  static bool Optimize(FunctionLiteral* function);
 };