Properly handle stack overflows in the AST graph builder.

R=jarin@chromium.org
BUG=chromium:429159
TEST=mjsunit/regress/regress-crbug-429159
LOG=N

Review URL: https://codereview.chromium.org/697473006

Cr-Commit-Position: refs/heads/master@{#25037}
git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25037 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent b4a49dfb
......@@ -339,24 +339,40 @@ void AstGraphBuilder::VisitForValues(ZoneList<Expression*>* exprs) {
void AstGraphBuilder::VisitForValue(Expression* expr) {
AstValueContext for_value(this);
if (!HasStackOverflow()) {
if (!CheckStackOverflow()) {
expr->Accept(this);
} else {
ast_context()->ProduceValue(jsgraph()->UndefinedConstant());
}
}
void AstGraphBuilder::VisitForEffect(Expression* expr) {
AstEffectContext for_effect(this);
if (!HasStackOverflow()) {
if (!CheckStackOverflow()) {
expr->Accept(this);
} else {
ast_context()->ProduceValue(jsgraph()->UndefinedConstant());
}
}
void AstGraphBuilder::VisitForTest(Expression* expr) {
AstTestContext for_condition(this);
if (!HasStackOverflow()) {
if (!CheckStackOverflow()) {
expr->Accept(this);
} else {
ast_context()->ProduceValue(jsgraph()->UndefinedConstant());
}
}
void AstGraphBuilder::Visit(Expression* expr) {
// Reuses enclosing AstContext.
if (!CheckStackOverflow()) {
expr->Accept(this);
} else {
ast_context()->ProduceValue(jsgraph()->UndefinedConstant());
}
}
......
......@@ -159,6 +159,7 @@ class AstGraphBuilder : public StructuredGraphBuilder, public AstVisitor {
void VisitIfNotNull(Statement* stmt);
// Visit expressions.
void Visit(Expression* expr);
void VisitForTest(Expression* expr);
void VisitForEffect(Expression* expr);
void VisitForValue(Expression* expr);
......
......@@ -319,7 +319,7 @@ Handle<Code> Pipeline::GenerateCode() {
ZonePool::Scope zone_scope(data.zone_pool());
AstGraphBuilderWithPositions graph_builder(
zone_scope.zone(), info(), data.jsgraph(), data.source_positions());
graph_builder.CreateGraph();
if (!graph_builder.CreateGraph()) return Handle<Code>::null();
context_node = graph_builder.GetFunctionContext();
}
......
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
try {
var src = "return " + Array(12000).join("src,") + "src";
var fun = Function(src);
assertEquals(src, fun());
} catch (e) {
// Some architectures throw a RangeError, that is fine.
assertInstanceof(e, RangeError);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment