Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 3a7a973d406c812d3e08465ae77ee81d93ed13ff..778527ff548b4be1eb0377da38e579f1dc73a50d 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -86,8 +86,8 @@ class PositionStack { |
}; |
-RegExpBuilder::RegExpBuilder() |
- : zone_(Isolate::Current()->zone()), |
+RegExpBuilder::RegExpBuilder(Zone* zone) |
+ : zone_(zone), |
pending_empty_(false), |
characters_(NULL), |
terms_(), |
@@ -535,7 +535,8 @@ Parser::FunctionState::~FunctionState() { |
Parser::Parser(Handle<Script> script, |
int parser_flags, |
v8::Extension* extension, |
- ScriptDataImpl* pre_data) |
+ ScriptDataImpl* pre_data, |
+ Zone* zone) |
: isolate_(script->GetIsolate()), |
symbol_cache_(pre_data ? pre_data->symbol_count() : 0), |
script_(script), |
@@ -551,7 +552,8 @@ Parser::Parser(Handle<Script> script, |
allow_lazy_((parser_flags & kAllowLazy) != 0), |
allow_modules_((parser_flags & kAllowModules) != 0), |
stack_overflow_(false), |
- parenthesized_function_(false) { |
+ parenthesized_function_(false), |
+ zone_(zone) { |
isolate_->set_ast_node_id(0); |
if ((parser_flags & kLanguageModeMask) == EXTENDED_MODE) { |
scanner().SetHarmonyScoping(true); |
@@ -1325,7 +1327,7 @@ Module* Parser::ParseModuleLiteral(bool* ok) { |
while (peek() != Token::RBRACE) { |
Statement* stat = ParseModuleElement(NULL, CHECK_OK); |
if (stat && !stat->IsEmpty()) { |
- body->AddStatement(stat); |
+ body->AddStatement(stat, zone()); |
block_finder.Update(stat); |
} |
} |
@@ -1677,7 +1679,7 @@ Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) { |
if (statement) { |
statement->set_statement_pos(statement_pos); |
} |
- if (result) result->AddStatement(statement); |
+ if (result) result->AddStatement(statement, zone()); |
return result; |
} |
@@ -1991,7 +1993,7 @@ Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) { |
while (peek() != Token::RBRACE) { |
Statement* stat = ParseStatement(NULL, CHECK_OK); |
if (stat && !stat->IsEmpty()) { |
- result->AddStatement(stat); |
+ result->AddStatement(stat, zone()); |
block_finder.Update(stat); |
} |
} |
@@ -2022,7 +2024,7 @@ Block* Parser::ParseScopedBlock(ZoneStringList* labels, bool* ok) { |
while (peek() != Token::RBRACE) { |
Statement* stat = ParseBlockElement(NULL, CHECK_OK); |
if (stat && !stat->IsEmpty()) { |
- body->AddStatement(stat); |
+ body->AddStatement(stat, zone()); |
block_finder.Update(stat); |
} |
} |
@@ -2329,7 +2331,8 @@ Block* Parser::ParseVariableDeclarations( |
arguments); |
} |
- block->AddStatement(factory()->NewExpressionStatement(initialize)); |
+ block->AddStatement(factory()->NewExpressionStatement(initialize), |
+ zone()); |
} else if (needs_init) { |
// Constant initializations always assign to the declared constant which |
// is always at the function scope level. This is only relevant for |
@@ -2343,7 +2346,8 @@ Block* Parser::ParseVariableDeclarations( |
ASSERT(value != NULL); |
Assignment* assignment = |
factory()->NewAssignment(init_op, proxy, value, position); |
- block->AddStatement(factory()->NewExpressionStatement(assignment)); |
+ block->AddStatement(factory()->NewExpressionStatement(assignment), |
+ zone()); |
value = NULL; |
} |
@@ -2358,7 +2362,8 @@ Block* Parser::ParseVariableDeclarations( |
initialization_scope->NewUnresolved(factory(), name); |
Assignment* assignment = |
factory()->NewAssignment(init_op, proxy, value, position); |
- block->AddStatement(factory()->NewExpressionStatement(assignment)); |
+ block->AddStatement(factory()->NewExpressionStatement(assignment), |
+ zone()); |
} |
if (fni_ != NULL) fni_->Leave(); |
@@ -2769,7 +2774,7 @@ TryStatement* Parser::ParseTryStatement(bool* ok) { |
index, try_block, catch_scope, catch_variable, catch_block); |
statement->set_escaping_targets(try_collector.targets()); |
try_block = factory()->NewBlock(NULL, 1, false); |
- try_block->AddStatement(statement); |
+ try_block->AddStatement(statement, zone()); |
catch_block = NULL; // Clear to indicate it's been handled. |
} |
@@ -2875,8 +2880,8 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
Statement* body = ParseStatement(NULL, CHECK_OK); |
loop->Initialize(each, enumerable, body); |
Block* result = factory()->NewBlock(NULL, 2, false); |
- result->AddStatement(variable_statement); |
- result->AddStatement(loop); |
+ result->AddStatement(variable_statement, zone()); |
+ result->AddStatement(loop, zone()); |
top_scope_ = saved_scope; |
for_scope->set_end_position(scanner().location().end_pos); |
for_scope = for_scope->FinalizeBlockScope(); |
@@ -2925,9 +2930,9 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
Token::ASSIGN, each, temp_proxy, RelocInfo::kNoPosition); |
Statement* assignment_statement = |
factory()->NewExpressionStatement(assignment); |
- body_block->AddStatement(variable_statement); |
- body_block->AddStatement(assignment_statement); |
- body_block->AddStatement(body); |
+ body_block->AddStatement(variable_statement, zone()); |
+ body_block->AddStatement(assignment_statement, zone()); |
+ body_block->AddStatement(body, zone()); |
loop->Initialize(temp_proxy, enumerable, body_block); |
top_scope_ = saved_scope; |
for_scope->set_end_position(scanner().location().end_pos); |
@@ -3010,8 +3015,8 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
// } |
ASSERT(init != NULL); |
Block* result = factory()->NewBlock(NULL, 2, false); |
- result->AddStatement(init); |
- result->AddStatement(loop); |
+ result->AddStatement(init, zone()); |
+ result->AddStatement(loop, zone()); |
result->set_scope(for_scope); |
if (loop) loop->Initialize(NULL, cond, next, body); |
return result; |
@@ -5146,7 +5151,7 @@ RegExpTree* RegExpParser::ParsePattern() { |
// Atom Quantifier |
RegExpTree* RegExpParser::ParseDisjunction() { |
// Used to store current state while parsing subexpressions. |
- RegExpParserState initial_state(NULL, INITIAL, 0); |
+ RegExpParserState initial_state(NULL, INITIAL, 0, zone()); |
RegExpParserState* stored_state = &initial_state; |
// Cache the builder in a local variable for quick access. |
RegExpBuilder* builder = initial_state.builder(); |
@@ -5266,9 +5271,8 @@ RegExpTree* RegExpParser::ParseDisjunction() { |
captures_->Add(NULL); |
} |
// Store current state and begin new disjunction parsing. |
- stored_state = new(zone()) RegExpParserState(stored_state, |
- type, |
- captures_started()); |
+ stored_state = new(zone()) RegExpParserState(stored_state, type, |
+ captures_started(), zone()); |
builder = stored_state->builder(); |
continue; |
} |
@@ -6020,7 +6024,7 @@ bool ParserApi::Parse(CompilationInfo* info, int parsing_flags) { |
} |
if (info->is_lazy()) { |
ASSERT(!info->is_eval()); |
- Parser parser(script, parsing_flags, NULL, NULL); |
+ Parser parser(script, parsing_flags, NULL, NULL, info->isolate()->zone()); |
if (info->shared_info()->is_function()) { |
result = parser.ParseLazy(info); |
} else { |
@@ -6028,7 +6032,8 @@ bool ParserApi::Parse(CompilationInfo* info, int parsing_flags) { |
} |
} else { |
ScriptDataImpl* pre_data = info->pre_parse_data(); |
- Parser parser(script, parsing_flags, info->extension(), pre_data); |
+ Parser parser(script, parsing_flags, info->extension(), pre_data, |
+ info->isolate()->zone()); |
if (pre_data != NULL && pre_data->has_error()) { |
Scanner::Location loc = pre_data->MessageLocation(); |
const char* message = pre_data->BuildMessage(); |