Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 05ae11e4291ae8c169d962dad7531b05cc0fc1bd..8b467e939e03675fa0d38f09090358813a3f0575 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -652,10 +652,10 @@ FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, |
top_scope_->SetLanguageMode(info->language_mode()); |
ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); |
bool ok = true; |
- int beg_loc = scanner().location().beg_pos; |
+ int beg_pos = scanner().location().beg_pos; |
Yang
2013/09/24 16:04:16
you could just use position() here, right?
|
ParseSourceElements(body, Token::EOS, info->is_eval(), true, &ok); |
if (ok && !top_scope_->is_classic_mode()) { |
- CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok); |
+ CheckOctalLiteral(beg_pos, scanner().location().end_pos, &ok); |
} |
if (ok && is_extended_mode()) { |
@@ -685,7 +685,8 @@ FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, |
FunctionLiteral::ANONYMOUS_EXPRESSION, |
FunctionLiteral::kGlobalOrEval, |
FunctionLiteral::kNotParenthesized, |
- FunctionLiteral::kNotGenerator); |
+ FunctionLiteral::kNotGenerator, |
+ 0); |
result->set_ast_properties(factory()->visitor()->ast_properties()); |
result->set_dont_optimize_reason( |
factory()->visitor()->dont_optimize_reason()); |
@@ -984,6 +985,7 @@ Statement* Parser::ParseModuleDeclaration(ZoneStringList* names, bool* ok) { |
// ModuleDeclaration: |
// 'module' Identifier Module |
+ int pos = peek_position(); |
Handle<String> name = ParseIdentifier(CHECK_OK); |
#ifdef DEBUG |
@@ -994,7 +996,7 @@ Statement* Parser::ParseModuleDeclaration(ZoneStringList* names, bool* ok) { |
Module* module = ParseModule(CHECK_OK); |
VariableProxy* proxy = NewUnresolved(name, MODULE, module->interface()); |
Declaration* declaration = |
- factory()->NewModuleDeclaration(proxy, module, top_scope_); |
+ factory()->NewModuleDeclaration(proxy, module, top_scope_, pos); |
Declare(declaration, true, CHECK_OK); |
#ifdef DEBUG |
@@ -1009,9 +1011,9 @@ Statement* Parser::ParseModuleDeclaration(ZoneStringList* names, bool* ok) { |
if (names) names->Add(name, zone()); |
if (module->body() == NULL) |
- return factory()->NewEmptyStatement(); |
+ return factory()->NewEmptyStatement(pos); |
else |
- return factory()->NewModuleStatement(proxy, module->body()); |
+ return factory()->NewModuleStatement(proxy, module->body(), pos); |
} |
@@ -1046,8 +1048,9 @@ Module* Parser::ParseModuleLiteral(bool* ok) { |
// Module: |
// '{' ModuleElement '}' |
+ int pos = peek_position(); |
// Construct block expecting 16 statements. |
- Block* body = factory()->NewBlock(NULL, 16, false); |
+ Block* body = factory()->NewBlock(NULL, 16, false, RelocInfo::kNoPosition); |
#ifdef DEBUG |
if (FLAG_print_interface_details) PrintF("# Literal "); |
#endif |
@@ -1092,7 +1095,7 @@ Module* Parser::ParseModuleLiteral(bool* ok) { |
ASSERT(*ok); |
interface->Freeze(ok); |
ASSERT(*ok); |
- return factory()->NewModuleLiteral(body, interface); |
+ return factory()->NewModuleLiteral(body, interface, pos); |
} |
@@ -1101,6 +1104,7 @@ Module* Parser::ParseModulePath(bool* ok) { |
// Identifier |
// ModulePath '.' Identifier |
+ int pos = peek_position(); |
Module* result = ParseModuleVariable(CHECK_OK); |
while (Check(Token::PERIOD)) { |
Handle<String> name = ParseIdentifierName(CHECK_OK); |
@@ -1108,7 +1112,7 @@ Module* Parser::ParseModulePath(bool* ok) { |
if (FLAG_print_interface_details) |
PrintF("# Path .%s ", name->ToAsciiArray()); |
#endif |
- Module* member = factory()->NewModulePath(result, name); |
+ Module* member = factory()->NewModulePath(result, name, pos); |
result->interface()->Add(name, member->interface(), zone(), ok); |
if (!*ok) { |
#ifdef DEBUG |
@@ -1134,6 +1138,7 @@ Module* Parser::ParseModuleVariable(bool* ok) { |
// ModulePath: |
// Identifier |
+ int pos = peek_position(); |
Handle<String> name = ParseIdentifier(CHECK_OK); |
#ifdef DEBUG |
if (FLAG_print_interface_details) |
@@ -1143,7 +1148,7 @@ Module* Parser::ParseModuleVariable(bool* ok) { |
factory(), name, Interface::NewModule(zone()), |
scanner().location().beg_pos); |
- return factory()->NewModuleVariable(proxy); |
+ return factory()->NewModuleVariable(proxy, pos); |
} |
@@ -1151,6 +1156,7 @@ Module* Parser::ParseModuleUrl(bool* ok) { |
// Module: |
// String |
+ int pos = peek_position(); |
Expect(Token::STRING, CHECK_OK); |
Handle<String> symbol = GetSymbol(); |
@@ -1163,10 +1169,10 @@ Module* Parser::ParseModuleUrl(bool* ok) { |
// Create an empty literal as long as the feature isn't finished. |
USE(symbol); |
Scope* scope = NewScope(top_scope_, MODULE_SCOPE); |
- Block* body = factory()->NewBlock(NULL, 1, false); |
+ Block* body = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); |
body->set_scope(scope); |
Interface* interface = scope->interface(); |
- Module* result = factory()->NewModuleLiteral(body, interface); |
+ Module* result = factory()->NewModuleLiteral(body, interface, pos); |
interface->Freeze(ok); |
ASSERT(*ok); |
interface->Unify(scope->interface(), zone(), ok); |
@@ -1194,6 +1200,7 @@ Block* Parser::ParseImportDeclaration(bool* ok) { |
// |
// TODO(ES6): implement destructuring ImportSpecifiers |
+ int pos = peek_position(); |
Expect(Token::IMPORT, CHECK_OK); |
ZoneStringList names(1, zone()); |
@@ -1211,7 +1218,7 @@ Block* Parser::ParseImportDeclaration(bool* ok) { |
// Generate a separate declaration for each identifier. |
// TODO(ES6): once we implement destructuring, make that one declaration. |
- Block* block = factory()->NewBlock(NULL, 1, true); |
+ Block* block = factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition); |
for (int i = 0; i < names.length(); ++i) { |
#ifdef DEBUG |
if (FLAG_print_interface_details) |
@@ -1232,7 +1239,7 @@ Block* Parser::ParseImportDeclaration(bool* ok) { |
} |
VariableProxy* proxy = NewUnresolved(names[i], LET, interface); |
Declaration* declaration = |
- factory()->NewImportDeclaration(proxy, module, top_scope_); |
+ factory()->NewImportDeclaration(proxy, module, top_scope_, pos); |
Declare(declaration, true, CHECK_OK); |
} |
@@ -1256,6 +1263,7 @@ Statement* Parser::ParseExportDeclaration(bool* ok) { |
ZoneStringList names(1, zone()); |
switch (peek()) { |
case Token::IDENTIFIER: { |
+ int pos = position(); |
Handle<String> name = ParseIdentifier(CHECK_OK); |
// Handle 'module' as a context-sensitive keyword. |
if (!name->IsOneByteEqualTo(STATIC_ASCII_VECTOR("module"))) { |
@@ -1266,7 +1274,7 @@ Statement* Parser::ParseExportDeclaration(bool* ok) { |
names.Add(name, zone()); |
} |
ExpectSemicolon(CHECK_OK); |
- result = factory()->NewEmptyStatement(); |
+ result = factory()->NewEmptyStatement(pos); |
} else { |
result = ParseModuleDeclaration(&names, CHECK_OK); |
} |
@@ -1305,7 +1313,7 @@ Statement* Parser::ParseExportDeclaration(bool* ok) { |
// TODO(rossberg): Rethink whether we actually need to store export |
// declarations (for compilation?). |
// ExportDeclaration* declaration = |
- // factory()->NewExportDeclaration(proxy, top_scope_); |
+ // factory()->NewExportDeclaration(proxy, top_scope_, position); |
// top_scope_->AddDeclaration(declaration); |
} |
@@ -1363,10 +1371,6 @@ Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) { |
// labels can be simply ignored in all other cases; except for |
// trivial labeled break statements 'label: break label' which is |
// parsed into an empty statement. |
- |
- // Keep the source position of the statement |
- int statement_pos = scanner().peek_location().beg_pos; |
- Statement* stmt = NULL; |
switch (peek()) { |
case Token::LBRACE: |
return ParseBlock(labels, ok); |
@@ -1374,52 +1378,41 @@ Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) { |
case Token::CONST: // fall through |
case Token::LET: |
case Token::VAR: |
- stmt = ParseVariableStatement(kStatement, NULL, ok); |
- break; |
+ return ParseVariableStatement(kStatement, NULL, ok); |
case Token::SEMICOLON: |
Next(); |
- return factory()->NewEmptyStatement(); |
+ return factory()->NewEmptyStatement(RelocInfo::kNoPosition); |
case Token::IF: |
- stmt = ParseIfStatement(labels, ok); |
- break; |
+ return ParseIfStatement(labels, ok); |
case Token::DO: |
- stmt = ParseDoWhileStatement(labels, ok); |
- break; |
+ return ParseDoWhileStatement(labels, ok); |
case Token::WHILE: |
- stmt = ParseWhileStatement(labels, ok); |
- break; |
+ return ParseWhileStatement(labels, ok); |
case Token::FOR: |
- stmt = ParseForStatement(labels, ok); |
- break; |
+ return ParseForStatement(labels, ok); |
case Token::CONTINUE: |
- stmt = ParseContinueStatement(ok); |
- break; |
+ return ParseContinueStatement(ok); |
case Token::BREAK: |
- stmt = ParseBreakStatement(labels, ok); |
- break; |
+ return ParseBreakStatement(labels, ok); |
case Token::RETURN: |
- stmt = ParseReturnStatement(ok); |
- break; |
+ return ParseReturnStatement(ok); |
case Token::WITH: |
- stmt = ParseWithStatement(labels, ok); |
- break; |
+ return ParseWithStatement(labels, ok); |
case Token::SWITCH: |
- stmt = ParseSwitchStatement(labels, ok); |
- break; |
+ return ParseSwitchStatement(labels, ok); |
case Token::THROW: |
- stmt = ParseThrowStatement(ok); |
- break; |
+ return ParseThrowStatement(ok); |
case Token::TRY: { |
// NOTE: It is somewhat complicated to have labels on |
@@ -1427,12 +1420,10 @@ Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) { |
// one must take great care not to treat it as a |
// fall-through. It is much easier just to wrap the entire |
// try-statement in a statement block and put the labels there |
- Block* result = factory()->NewBlock(labels, 1, false); |
+ Block* result = |
+ factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition); |
Target target(&this->target_stack_, result); |
TryStatement* statement = ParseTryStatement(CHECK_OK); |
- if (statement) { |
- statement->set_statement_pos(statement_pos); |
- } |
if (result) result->AddStatement(statement, zone()); |
return result; |
} |
@@ -1459,16 +1450,11 @@ Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) { |
} |
case Token::DEBUGGER: |
- stmt = ParseDebuggerStatement(ok); |
- break; |
+ return ParseDebuggerStatement(ok); |
default: |
- stmt = ParseExpressionOrLabelledStatement(labels, ok); |
+ return ParseExpressionOrLabelledStatement(labels, ok); |
} |
- |
- // Store the source position of the statement |
- if (stmt != NULL) stmt->set_statement_pos(statement_pos); |
- return stmt; |
} |
@@ -1480,7 +1466,7 @@ VariableProxy* Parser::NewUnresolved( |
// Let/const variables in harmony mode are always added to the immediately |
// enclosing scope. |
return DeclarationScope(mode)->NewUnresolved( |
- factory(), name, interface, scanner().location().beg_pos); |
+ factory(), name, interface, position()); |
} |
@@ -1647,6 +1633,7 @@ void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) { |
// declaration is resolved by looking up the function through a |
// callback provided by the extension. |
Statement* Parser::ParseNativeDeclaration(bool* ok) { |
+ int pos = peek_position(); |
Expect(Token::FUNCTION, CHECK_OK); |
Handle<String> name = ParseIdentifier(CHECK_OK); |
Expect(Token::LPAREN, CHECK_OK); |
@@ -1693,13 +1680,14 @@ Statement* Parser::ParseNativeDeclaration(bool* ok) { |
// other functions are set up when entering the surrounding scope. |
VariableProxy* proxy = NewUnresolved(name, VAR, Interface::NewValue()); |
Declaration* declaration = |
- factory()->NewVariableDeclaration(proxy, VAR, top_scope_); |
+ factory()->NewVariableDeclaration(proxy, VAR, top_scope_, pos); |
Declare(declaration, true, CHECK_OK); |
SharedFunctionInfoLiteral* lit = |
- factory()->NewSharedFunctionInfoLiteral(shared); |
+ factory()->NewSharedFunctionInfoLiteral(shared, RelocInfo::kNoPosition); |
return factory()->NewExpressionStatement( |
factory()->NewAssignment( |
- Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition)); |
+ Token::INIT_VAR, proxy, lit, RelocInfo::kNoPosition), |
+ pos); |
} |
@@ -1710,7 +1698,7 @@ Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) { |
// 'function' '*' Identifier '(' FormalParameterListopt ')' |
// '{' FunctionBody '}' |
Expect(Token::FUNCTION, CHECK_OK); |
- int function_token_position = scanner().location().beg_pos; |
+ int pos = position(); |
bool is_generator = allow_generators() && Check(Token::MUL); |
bool is_strict_reserved = false; |
Handle<String> name = ParseIdentifierOrStrictReservedWord( |
@@ -1718,7 +1706,7 @@ Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) { |
FunctionLiteral* fun = ParseFunctionLiteral(name, |
is_strict_reserved, |
is_generator, |
- function_token_position, |
+ pos, |
FunctionLiteral::DECLARATION, |
CHECK_OK); |
// Even if we're not at the top-level of the global or a function |
@@ -1730,10 +1718,10 @@ Statement* Parser::ParseFunctionDeclaration(ZoneStringList* names, bool* ok) { |
is_extended_mode() && !top_scope_->is_global_scope() ? LET : VAR; |
VariableProxy* proxy = NewUnresolved(name, mode, Interface::NewValue()); |
Declaration* declaration = |
- factory()->NewFunctionDeclaration(proxy, mode, fun, top_scope_); |
+ factory()->NewFunctionDeclaration(proxy, mode, fun, top_scope_, pos); |
Declare(declaration, true, CHECK_OK); |
if (names) names->Add(name, zone()); |
- return factory()->NewEmptyStatement(); |
+ return factory()->NewEmptyStatement(RelocInfo::kNoPosition); |
} |
@@ -1747,7 +1735,8 @@ Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) { |
// (ECMA-262, 3rd, 12.2) |
// |
// Construct block expecting 16 statements. |
- Block* result = factory()->NewBlock(labels, 16, false); |
+ Block* result = |
+ factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition); |
Target target(&this->target_stack_, result); |
Expect(Token::LBRACE, CHECK_OK); |
while (peek() != Token::RBRACE) { |
@@ -1768,7 +1757,8 @@ Block* Parser::ParseScopedBlock(ZoneStringList* labels, bool* ok) { |
// '{' BlockElement* '}' |
// Construct block expecting 16 statements. |
- Block* body = factory()->NewBlock(labels, 16, false); |
+ Block* body = |
+ factory()->NewBlock(labels, 16, false, RelocInfo::kNoPosition); |
Scope* block_scope = NewScope(top_scope_, BLOCK_SCOPE); |
// Parse the statements and collect escaping labels. |
@@ -1838,6 +1828,8 @@ Block* Parser::ParseVariableDeclarations( |
// TODO(ES6): |
// ConstBinding :: |
// BindingPattern '=' AssignmentExpression |
+ |
+ int pos = peek_position(); |
VariableMode mode = VAR; |
// True if the binding needs initialization. 'let' and 'const' declared |
// bindings are created uninitialized by their declaration nodes and |
@@ -1923,7 +1915,7 @@ Block* Parser::ParseVariableDeclarations( |
// is inside an initializer block, it is ignored. |
// |
// Create new block with one expected declaration. |
- Block* block = factory()->NewBlock(NULL, 1, true); |
+ Block* block = factory()->NewBlock(NULL, 1, true, pos); |
int nvars = 0; // the number of variables declared |
Handle<String> name; |
do { |
@@ -1960,7 +1952,7 @@ Block* Parser::ParseVariableDeclarations( |
is_const ? Interface::NewConst() : Interface::NewValue(); |
VariableProxy* proxy = NewUnresolved(name, mode, interface); |
Declaration* declaration = |
- factory()->NewVariableDeclaration(proxy, mode, top_scope_); |
+ factory()->NewVariableDeclaration(proxy, mode, top_scope_, pos); |
Declare(declaration, mode != VAR, CHECK_OK); |
nvars++; |
if (declaration_scope->num_var_or_const() > kMaxNumFunctionLocals) { |
@@ -2000,11 +1992,11 @@ Block* Parser::ParseVariableDeclarations( |
Scope* initialization_scope = is_const ? declaration_scope : top_scope_; |
Expression* value = NULL; |
- int position = -1; |
+ int pos = -1; |
// Harmony consts have non-optional initializers. |
if (peek() == Token::ASSIGN || mode == CONST_HARMONY) { |
Expect(Token::ASSIGN, CHECK_OK); |
- position = scanner().location().beg_pos; |
+ pos = position(); |
value = ParseAssignmentExpression(var_context != kForStatement, CHECK_OK); |
// Don't infer if it is "a = function(){...}();"-like expression. |
if (fni_ != NULL && |
@@ -2019,12 +2011,12 @@ Block* Parser::ParseVariableDeclarations( |
// Record the end position of the initializer. |
if (proxy->var() != NULL) { |
- proxy->var()->set_initializer_position(scanner().location().end_pos); |
+ proxy->var()->set_initializer_position(position()); |
} |
// Make sure that 'const x' and 'let x' initialize 'x' to undefined. |
if (value == NULL && needs_init) { |
- value = GetLiteralUndefined(); |
+ value = GetLiteralUndefined(position()); |
} |
// Global variable declarations must be compiled in a specific |
@@ -2052,7 +2044,7 @@ Block* Parser::ParseVariableDeclarations( |
ZoneList<Expression*>* arguments = |
new(zone()) ZoneList<Expression*>(3, zone()); |
// We have at least 1 parameter. |
- arguments->Add(factory()->NewLiteral(name), zone()); |
+ arguments->Add(factory()->NewLiteral(name, pos), zone()); |
CallRuntime* initialize; |
if (is_const) { |
@@ -2066,12 +2058,12 @@ Block* Parser::ParseVariableDeclarations( |
initialize = factory()->NewCallRuntime( |
isolate()->factory()->InitializeConstGlobal_string(), |
Runtime::FunctionForId(Runtime::kInitializeConstGlobal), |
- arguments); |
+ arguments, pos); |
} else { |
// Add strict mode. |
// We may want to pass singleton to avoid Literal allocations. |
LanguageMode language_mode = initialization_scope->language_mode(); |
- arguments->Add(factory()->NewNumberLiteral(language_mode), zone()); |
+ arguments->Add(factory()->NewNumberLiteral(language_mode, pos), zone()); |
// Be careful not to assign a value to the global variable if |
// we're in a with. The initialization value should not |
@@ -2089,11 +2081,12 @@ Block* Parser::ParseVariableDeclarations( |
initialize = factory()->NewCallRuntime( |
isolate()->factory()->InitializeVarGlobal_string(), |
Runtime::FunctionForId(Runtime::kInitializeVarGlobal), |
- arguments); |
+ arguments, pos); |
} |
- block->AddStatement(factory()->NewExpressionStatement(initialize), |
- zone()); |
+ block->AddStatement( |
+ factory()->NewExpressionStatement(initialize, RelocInfo::kNoPosition), |
+ 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 |
@@ -2106,9 +2099,10 @@ Block* Parser::ParseVariableDeclarations( |
ASSERT(proxy->var() != NULL); |
ASSERT(value != NULL); |
Assignment* assignment = |
- factory()->NewAssignment(init_op, proxy, value, position); |
- block->AddStatement(factory()->NewExpressionStatement(assignment), |
- zone()); |
+ factory()->NewAssignment(init_op, proxy, value, pos); |
+ block->AddStatement( |
+ factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), |
+ zone()); |
value = NULL; |
} |
@@ -2122,9 +2116,10 @@ Block* Parser::ParseVariableDeclarations( |
VariableProxy* proxy = |
initialization_scope->NewUnresolved(factory(), name, interface); |
Assignment* assignment = |
- factory()->NewAssignment(init_op, proxy, value, position); |
- block->AddStatement(factory()->NewExpressionStatement(assignment), |
- zone()); |
+ factory()->NewAssignment(init_op, proxy, value, pos); |
+ block->AddStatement( |
+ factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), |
+ zone()); |
} |
if (fni_ != NULL) fni_->Leave(); |
@@ -2156,6 +2151,7 @@ Statement* Parser::ParseExpressionOrLabelledStatement(ZoneStringList* labels, |
// ExpressionStatement | LabelledStatement :: |
// Expression ';' |
// Identifier ':' Statement |
+ int pos = peek_position(); |
bool starts_with_idenfifier = peek_any_identifier(); |
Expression* expr = ParseExpression(true, CHECK_OK); |
if (peek() == Token::COLON && starts_with_idenfifier && expr != NULL && |
@@ -2215,7 +2211,7 @@ Statement* Parser::ParseExpressionOrLabelledStatement(ZoneStringList* labels, |
scanner().literal_contains_escapes()) { |
ExpectSemicolon(CHECK_OK); |
} |
- return factory()->NewExpressionStatement(expr); |
+ return factory()->NewExpressionStatement(expr, pos); |
} |
@@ -2223,6 +2219,7 @@ IfStatement* Parser::ParseIfStatement(ZoneStringList* labels, bool* ok) { |
// IfStatement :: |
// 'if' '(' Expression ')' Statement ('else' Statement)? |
+ int pos = peek_position(); |
Expect(Token::IF, CHECK_OK); |
Expect(Token::LPAREN, CHECK_OK); |
Expression* condition = ParseExpression(true, CHECK_OK); |
@@ -2233,9 +2230,10 @@ IfStatement* Parser::ParseIfStatement(ZoneStringList* labels, bool* ok) { |
Next(); |
else_statement = ParseStatement(labels, CHECK_OK); |
} else { |
- else_statement = factory()->NewEmptyStatement(); |
+ else_statement = factory()->NewEmptyStatement(RelocInfo::kNoPosition); |
} |
- return factory()->NewIfStatement(condition, then_statement, else_statement); |
+ return factory()->NewIfStatement( |
+ condition, then_statement, else_statement, pos); |
} |
@@ -2243,6 +2241,7 @@ Statement* Parser::ParseContinueStatement(bool* ok) { |
// ContinueStatement :: |
// 'continue' Identifier? ';' |
+ int pos = peek_position(); |
Expect(Token::CONTINUE, CHECK_OK); |
Handle<String> label = Handle<String>::null(); |
Token::Value tok = peek(); |
@@ -2265,7 +2264,7 @@ Statement* Parser::ParseContinueStatement(bool* ok) { |
return NULL; |
} |
ExpectSemicolon(CHECK_OK); |
- return factory()->NewContinueStatement(target); |
+ return factory()->NewContinueStatement(target, pos); |
} |
@@ -2273,6 +2272,7 @@ Statement* Parser::ParseBreakStatement(ZoneStringList* labels, bool* ok) { |
// BreakStatement :: |
// 'break' Identifier? ';' |
+ int pos = peek_position(); |
Expect(Token::BREAK, CHECK_OK); |
Handle<String> label; |
Token::Value tok = peek(); |
@@ -2284,7 +2284,7 @@ Statement* Parser::ParseBreakStatement(ZoneStringList* labels, bool* ok) { |
// empty statements, e.g. 'l1: l2: l3: break l2;' |
if (!label.is_null() && ContainsLabel(labels, label)) { |
ExpectSemicolon(CHECK_OK); |
- return factory()->NewEmptyStatement(); |
+ return factory()->NewEmptyStatement(pos); |
} |
BreakableStatement* target = NULL; |
target = LookupBreakTarget(label, CHECK_OK); |
@@ -2301,7 +2301,7 @@ Statement* Parser::ParseBreakStatement(ZoneStringList* labels, bool* ok) { |
return NULL; |
} |
ExpectSemicolon(CHECK_OK); |
- return factory()->NewBreakStatement(target); |
+ return factory()->NewBreakStatement(target, pos); |
} |
@@ -2309,10 +2309,11 @@ Statement* Parser::ParseReturnStatement(bool* ok) { |
// ReturnStatement :: |
// 'return' Expression? ';' |
- // Consume the return token. It is necessary to do the before |
+ // Consume the return token. It is necessary to do that before |
// reporting any errors on it, because of the way errors are |
// reported (underlining). |
Expect(Token::RETURN, CHECK_OK); |
+ int pos = position(); |
Token::Value tok = peek(); |
Statement* result; |
@@ -2321,7 +2322,7 @@ Statement* Parser::ParseReturnStatement(bool* ok) { |
tok == Token::SEMICOLON || |
tok == Token::RBRACE || |
tok == Token::EOS) { |
- return_value = GetLiteralUndefined(); |
+ return_value = GetLiteralUndefined(position()); |
} else { |
return_value = ParseExpression(true, CHECK_OK); |
} |
@@ -2330,10 +2331,10 @@ Statement* Parser::ParseReturnStatement(bool* ok) { |
Expression* generator = factory()->NewVariableProxy( |
current_function_state_->generator_object_variable()); |
Expression* yield = factory()->NewYield( |
- generator, return_value, Yield::FINAL, RelocInfo::kNoPosition); |
- result = factory()->NewExpressionStatement(yield); |
+ generator, return_value, Yield::FINAL, pos); |
+ result = factory()->NewExpressionStatement(yield, pos); |
} else { |
- result = factory()->NewReturnStatement(return_value); |
+ result = factory()->NewReturnStatement(return_value, pos); |
} |
// An ECMAScript program is considered syntactically incorrect if it |
@@ -2347,7 +2348,7 @@ Statement* Parser::ParseReturnStatement(bool* ok) { |
Handle<String> message = isolate()->factory()->illegal_return_string(); |
Expression* throw_error = |
NewThrowSyntaxError(message, Handle<Object>::null()); |
- return factory()->NewExpressionStatement(throw_error); |
+ return factory()->NewExpressionStatement(throw_error, pos); |
} |
return result; |
} |
@@ -2358,6 +2359,7 @@ Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) { |
// 'with' '(' Expression ')' Statement |
Expect(Token::WITH, CHECK_OK); |
+ int pos = position(); |
if (!top_scope_->is_classic_mode()) { |
ReportMessage("strict_mode_with", Vector<const char*>::empty()); |
@@ -2377,7 +2379,7 @@ Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) { |
stmt = ParseStatement(labels, CHECK_OK); |
with_scope->set_end_position(scanner().location().end_pos); |
} |
- return factory()->NewWithStatement(with_scope, expr, stmt); |
+ return factory()->NewWithStatement(with_scope, expr, stmt, pos); |
} |
@@ -2401,7 +2403,7 @@ CaseClause* Parser::ParseCaseClause(bool* default_seen_ptr, bool* ok) { |
*default_seen_ptr = true; |
} |
Expect(Token::COLON, CHECK_OK); |
- int pos = scanner().location().beg_pos; |
+ int pos = position(); |
ZoneList<Statement*>* statements = |
new(zone()) ZoneList<Statement*>(5, zone()); |
while (peek() != Token::CASE && |
@@ -2420,7 +2422,8 @@ SwitchStatement* Parser::ParseSwitchStatement(ZoneStringList* labels, |
// SwitchStatement :: |
// 'switch' '(' Expression ')' '{' CaseClause* '}' |
- SwitchStatement* statement = factory()->NewSwitchStatement(labels); |
+ SwitchStatement* statement = |
+ factory()->NewSwitchStatement(labels, peek_position()); |
Target target(&this->target_stack_, statement); |
Expect(Token::SWITCH, CHECK_OK); |
@@ -2447,7 +2450,7 @@ Statement* Parser::ParseThrowStatement(bool* ok) { |
// 'throw' Expression ';' |
Expect(Token::THROW, CHECK_OK); |
- int pos = scanner().location().beg_pos; |
+ int pos = position(); |
if (scanner().HasAnyLineTerminatorBeforeNext()) { |
ReportMessage("newline_after_throw", Vector<const char*>::empty()); |
*ok = false; |
@@ -2456,7 +2459,8 @@ Statement* Parser::ParseThrowStatement(bool* ok) { |
Expression* exception = ParseExpression(true, CHECK_OK); |
ExpectSemicolon(CHECK_OK); |
- return factory()->NewExpressionStatement(factory()->NewThrow(exception, pos)); |
+ return factory()->NewExpressionStatement( |
+ factory()->NewThrow(exception, pos), pos); |
} |
@@ -2473,6 +2477,7 @@ TryStatement* Parser::ParseTryStatement(bool* ok) { |
// 'finally' Block |
Expect(Token::TRY, CHECK_OK); |
+ int pos = position(); |
TargetCollector try_collector(zone()); |
Block* try_block; |
@@ -2544,9 +2549,10 @@ TryStatement* Parser::ParseTryStatement(bool* ok) { |
ASSERT(catch_scope != NULL && catch_variable != NULL); |
int index = current_function_state_->NextHandlerIndex(); |
TryCatchStatement* statement = factory()->NewTryCatchStatement( |
- index, try_block, catch_scope, catch_variable, catch_block); |
+ index, try_block, catch_scope, catch_variable, catch_block, |
+ RelocInfo::kNoPosition); |
statement->set_escaping_targets(try_collector.targets()); |
- try_block = factory()->NewBlock(NULL, 1, false); |
+ try_block = factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); |
try_block->AddStatement(statement, zone()); |
catch_block = NULL; // Clear to indicate it's been handled. |
} |
@@ -2557,11 +2563,12 @@ TryStatement* Parser::ParseTryStatement(bool* ok) { |
ASSERT(catch_scope != NULL && catch_variable != NULL); |
int index = current_function_state_->NextHandlerIndex(); |
result = factory()->NewTryCatchStatement( |
- index, try_block, catch_scope, catch_variable, catch_block); |
+ index, try_block, catch_scope, catch_variable, catch_block, pos); |
} else { |
ASSERT(finally_block != NULL); |
int index = current_function_state_->NextHandlerIndex(); |
- result = factory()->NewTryFinallyStatement(index, try_block, finally_block); |
+ result = factory()->NewTryFinallyStatement( |
+ index, try_block, finally_block, pos); |
// Combine the jump targets of the try block and the possible catch block. |
try_collector.targets()->AddAll(*catch_collector.targets(), zone()); |
} |
@@ -2576,7 +2583,8 @@ DoWhileStatement* Parser::ParseDoWhileStatement(ZoneStringList* labels, |
// DoStatement :: |
// 'do' Statement 'while' '(' Expression ')' ';' |
- DoWhileStatement* loop = factory()->NewDoWhileStatement(labels); |
+ DoWhileStatement* loop = |
+ factory()->NewDoWhileStatement(labels, peek_position()); |
Target target(&this->target_stack_, loop); |
Expect(Token::DO, CHECK_OK); |
@@ -2584,10 +2592,7 @@ DoWhileStatement* Parser::ParseDoWhileStatement(ZoneStringList* labels, |
Expect(Token::WHILE, CHECK_OK); |
Expect(Token::LPAREN, CHECK_OK); |
- if (loop != NULL) { |
- int position = scanner().location().beg_pos; |
- loop->set_condition_position(position); |
- } |
+ if (loop != NULL) loop->set_condition_position(position()); |
Expression* cond = ParseExpression(true, CHECK_OK); |
Expect(Token::RPAREN, CHECK_OK); |
@@ -2607,7 +2612,7 @@ WhileStatement* Parser::ParseWhileStatement(ZoneStringList* labels, bool* ok) { |
// WhileStatement :: |
// 'while' '(' Expression ')' Statement |
- WhileStatement* loop = factory()->NewWhileStatement(labels); |
+ WhileStatement* loop = factory()->NewWhileStatement(labels, peek_position()); |
Target target(&this->target_stack_, loop); |
Expect(Token::WHILE, CHECK_OK); |
@@ -2666,8 +2671,8 @@ void Parser::InitializeForEachStatement(ForEachStatement* stmt, |
// var result = iterator.next(); |
{ |
Expression* iterator_proxy = factory()->NewVariableProxy(iterator); |
- Expression* next_literal = |
- factory()->NewLiteral(heap_factory->next_string()); |
+ Expression* next_literal = factory()->NewLiteral( |
+ heap_factory->next_string(), RelocInfo::kNoPosition); |
Expression* next_property = factory()->NewProperty( |
iterator_proxy, next_literal, RelocInfo::kNoPosition); |
ZoneList<Expression*>* next_arguments = |
@@ -2681,8 +2686,8 @@ void Parser::InitializeForEachStatement(ForEachStatement* stmt, |
// result.done |
{ |
- Expression* done_literal = |
- factory()->NewLiteral(heap_factory->done_string()); |
+ Expression* done_literal = factory()->NewLiteral( |
+ heap_factory->done_string(), RelocInfo::kNoPosition); |
Expression* result_proxy = factory()->NewVariableProxy(result); |
result_done = factory()->NewProperty( |
result_proxy, done_literal, RelocInfo::kNoPosition); |
@@ -2690,8 +2695,8 @@ void Parser::InitializeForEachStatement(ForEachStatement* stmt, |
// each = result.value |
{ |
- Expression* value_literal = |
- factory()->NewLiteral(heap_factory->value_string()); |
+ Expression* value_literal = factory()->NewLiteral( |
+ heap_factory->value_string(), RelocInfo::kNoPosition); |
Expression* result_proxy = factory()->NewVariableProxy(result); |
Expression* result_value = factory()->NewProperty( |
result_proxy, value_literal, RelocInfo::kNoPosition); |
@@ -2711,6 +2716,7 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
// ForStatement :: |
// 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement |
+ int pos = peek_position(); |
Statement* init = NULL; |
// Create an in-between scope for let-bound iteration variables. |
@@ -2735,7 +2741,8 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
if (!name.is_null() && CheckInOrOf(accept_OF, &mode)) { |
Interface* interface = |
is_const ? Interface::NewConst() : Interface::NewValue(); |
- ForEachStatement* loop = factory()->NewForEachStatement(mode, labels); |
+ ForEachStatement* loop = |
+ factory()->NewForEachStatement(mode, labels, pos); |
Target target(&this->target_stack_, loop); |
Expression* enumerable = ParseExpression(true, CHECK_OK); |
@@ -2745,7 +2752,8 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
top_scope_->NewUnresolved(factory(), name, interface); |
Statement* body = ParseStatement(NULL, CHECK_OK); |
InitializeForEachStatement(loop, each, enumerable, body); |
- Block* result = factory()->NewBlock(NULL, 2, false); |
+ Block* result = |
+ factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition); |
result->AddStatement(variable_statement, zone()); |
result->AddStatement(loop, zone()); |
top_scope_ = saved_scope; |
@@ -2789,7 +2797,8 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
Handle<String> tempname = heap_factory->InternalizeString(tempstr); |
Variable* temp = top_scope_->DeclarationScope()->NewTemporary(tempname); |
VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); |
- ForEachStatement* loop = factory()->NewForEachStatement(mode, labels); |
+ ForEachStatement* loop = |
+ factory()->NewForEachStatement(mode, labels, pos); |
Target target(&this->target_stack_, loop); |
// The expression does not see the loop variable. |
@@ -2801,11 +2810,12 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
VariableProxy* each = |
top_scope_->NewUnresolved(factory(), name, Interface::NewValue()); |
Statement* body = ParseStatement(NULL, CHECK_OK); |
- Block* body_block = factory()->NewBlock(NULL, 3, false); |
+ Block* body_block = |
+ factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition); |
Assignment* assignment = factory()->NewAssignment( |
Token::ASSIGN, each, temp_proxy, RelocInfo::kNoPosition); |
- Statement* assignment_statement = |
- factory()->NewExpressionStatement(assignment); |
+ Statement* assignment_statement = factory()->NewExpressionStatement( |
+ assignment, RelocInfo::kNoPosition); |
body_block->AddStatement(variable_statement, zone()); |
body_block->AddStatement(assignment_statement, zone()); |
body_block->AddStatement(body, zone()); |
@@ -2835,7 +2845,8 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
isolate()->factory()->invalid_lhs_in_for_in_string(); |
expression = NewThrowReferenceError(message); |
} |
- ForEachStatement* loop = factory()->NewForEachStatement(mode, labels); |
+ ForEachStatement* loop = |
+ factory()->NewForEachStatement(mode, labels, pos); |
Target target(&this->target_stack_, loop); |
Expression* enumerable = ParseExpression(true, CHECK_OK); |
@@ -2851,13 +2862,14 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
return loop; |
} else { |
- init = factory()->NewExpressionStatement(expression); |
+ init = factory()->NewExpressionStatement( |
+ expression, RelocInfo::kNoPosition); |
} |
} |
} |
// Standard 'for' loop |
- ForStatement* loop = factory()->NewForStatement(labels); |
+ ForStatement* loop = factory()->NewForStatement(labels, pos); |
Target target(&this->target_stack_, loop); |
// Parsed initializer at this point. |
@@ -2872,7 +2884,7 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
Statement* next = NULL; |
if (peek() != Token::RPAREN) { |
Expression* exp = ParseExpression(true, CHECK_OK); |
- next = factory()->NewExpressionStatement(exp); |
+ next = factory()->NewExpressionStatement(exp, RelocInfo::kNoPosition); |
} |
Expect(Token::RPAREN, CHECK_OK); |
@@ -2892,7 +2904,7 @@ Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
// for (; c; n) b |
// } |
ASSERT(init != NULL); |
- Block* result = factory()->NewBlock(NULL, 2, false); |
+ Block* result = factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition); |
result->AddStatement(init, zone()); |
result->AddStatement(loop, zone()); |
result->set_scope(for_scope); |
@@ -2914,10 +2926,9 @@ Expression* Parser::ParseExpression(bool accept_IN, bool* ok) { |
Expression* result = ParseAssignmentExpression(accept_IN, CHECK_OK); |
while (peek() == Token::COMMA) { |
Expect(Token::COMMA, CHECK_OK); |
- int position = scanner().location().beg_pos; |
+ int pos = position(); |
Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); |
- result = |
- factory()->NewBinaryOperation(Token::COMMA, result, right, position); |
+ result = factory()->NewBinaryOperation(Token::COMMA, result, right, pos); |
} |
return result; |
} |
@@ -2961,7 +2972,7 @@ Expression* Parser::ParseAssignmentExpression(bool accept_IN, bool* ok) { |
MarkAsLValue(expression); |
Token::Value op = Next(); // Get assignment operator. |
- int pos = scanner().location().beg_pos; |
+ int pos = position(); |
Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); |
// TODO(1231235): We try to estimate the set of properties set by |
@@ -3005,15 +3016,14 @@ Expression* Parser::ParseAssignmentExpression(bool accept_IN, bool* ok) { |
Expression* Parser::ParseYieldExpression(bool* ok) { |
// YieldExpression :: |
// 'yield' '*'? AssignmentExpression |
- int position = scanner().peek_location().beg_pos; |
+ int pos = peek_position(); |
Expect(Token::YIELD, CHECK_OK); |
Yield::Kind kind = |
Check(Token::MUL) ? Yield::DELEGATING : Yield::SUSPEND; |
Expression* generator_object = factory()->NewVariableProxy( |
current_function_state_->generator_object_variable()); |
Expression* expression = ParseAssignmentExpression(false, CHECK_OK); |
- Yield* yield = |
- factory()->NewYield(generator_object, expression, kind, position); |
+ Yield* yield = factory()->NewYield(generator_object, expression, kind, pos); |
if (kind == Yield::DELEGATING) { |
yield->set_index(current_function_state_->NextHandlerIndex()); |
} |
@@ -3027,6 +3037,7 @@ Expression* Parser::ParseConditionalExpression(bool accept_IN, bool* ok) { |
// LogicalOrExpression |
// LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression |
+ int pos = peek_position(); |
// We start using the binary expression parser for prec >= 4 only! |
Expression* expression = ParseBinaryExpression(4, accept_IN, CHECK_OK); |
if (peek() != Token::CONDITIONAL) return expression; |
@@ -3034,13 +3045,13 @@ Expression* Parser::ParseConditionalExpression(bool accept_IN, bool* ok) { |
// In parsing the first assignment expression in conditional |
// expressions we always accept the 'in' keyword; see ECMA-262, |
// section 11.12, page 58. |
- int left_position = scanner().peek_location().beg_pos; |
+ int left_position = peek_position(); |
Expression* left = ParseAssignmentExpression(true, CHECK_OK); |
Expect(Token::COLON, CHECK_OK); |
- int right_position = scanner().peek_location().beg_pos; |
+ int right_position = peek_position(); |
Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); |
return factory()->NewConditional( |
- expression, left, right, left_position, right_position); |
+ expression, left, right, left_position, right_position, pos); |
} |
@@ -3060,7 +3071,7 @@ Expression* Parser::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) { |
// prec1 >= 4 |
while (Precedence(peek(), accept_IN) == prec1) { |
Token::Value op = Next(); |
- int position = scanner().location().beg_pos; |
+ int pos = position(); |
Expression* y = ParseBinaryExpression(prec1 + 1, accept_IN, CHECK_OK); |
// Compute some expressions involving only number literals. |
@@ -3071,47 +3082,47 @@ Expression* Parser::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) { |
switch (op) { |
case Token::ADD: |
- x = factory()->NewNumberLiteral(x_val + y_val); |
+ x = factory()->NewNumberLiteral(x_val + y_val, pos); |
continue; |
case Token::SUB: |
- x = factory()->NewNumberLiteral(x_val - y_val); |
+ x = factory()->NewNumberLiteral(x_val - y_val, pos); |
continue; |
case Token::MUL: |
- x = factory()->NewNumberLiteral(x_val * y_val); |
+ x = factory()->NewNumberLiteral(x_val * y_val, pos); |
continue; |
case Token::DIV: |
- x = factory()->NewNumberLiteral(x_val / y_val); |
+ x = factory()->NewNumberLiteral(x_val / y_val, pos); |
continue; |
case Token::BIT_OR: { |
int value = DoubleToInt32(x_val) | DoubleToInt32(y_val); |
- x = factory()->NewNumberLiteral(value); |
+ x = factory()->NewNumberLiteral(value, pos); |
continue; |
} |
case Token::BIT_AND: { |
int value = DoubleToInt32(x_val) & DoubleToInt32(y_val); |
- x = factory()->NewNumberLiteral(value); |
+ x = factory()->NewNumberLiteral(value, pos); |
continue; |
} |
case Token::BIT_XOR: { |
int value = DoubleToInt32(x_val) ^ DoubleToInt32(y_val); |
- x = factory()->NewNumberLiteral(value); |
+ x = factory()->NewNumberLiteral(value, pos); |
continue; |
} |
case Token::SHL: { |
int value = DoubleToInt32(x_val) << (DoubleToInt32(y_val) & 0x1f); |
- x = factory()->NewNumberLiteral(value); |
+ x = factory()->NewNumberLiteral(value, pos); |
continue; |
} |
case Token::SHR: { |
uint32_t shift = DoubleToInt32(y_val) & 0x1f; |
uint32_t value = DoubleToUint32(x_val) >> shift; |
- x = factory()->NewNumberLiteral(value); |
+ x = factory()->NewNumberLiteral(value, pos); |
continue; |
} |
case Token::SAR: { |
uint32_t shift = DoubleToInt32(y_val) & 0x1f; |
int value = ArithmeticShiftRight(DoubleToInt32(x_val), shift); |
- x = factory()->NewNumberLiteral(value); |
+ x = factory()->NewNumberLiteral(value, pos); |
continue; |
} |
default: |
@@ -3130,15 +3141,15 @@ Expression* Parser::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) { |
case Token::NE_STRICT: cmp = Token::EQ_STRICT; break; |
default: break; |
} |
- x = factory()->NewCompareOperation(cmp, x, y, position); |
+ x = factory()->NewCompareOperation(cmp, x, y, pos); |
if (cmp != op) { |
// The comparison was negated - add a NOT. |
- x = factory()->NewUnaryOperation(Token::NOT, x, position); |
+ x = factory()->NewUnaryOperation(Token::NOT, x, pos); |
} |
} else { |
// We have a "normal" binary operation. |
- x = factory()->NewBinaryOperation(op, x, y, position); |
+ x = factory()->NewBinaryOperation(op, x, y, pos); |
} |
} |
} |
@@ -3162,7 +3173,7 @@ Expression* Parser::ParseUnaryExpression(bool* ok) { |
Token::Value op = peek(); |
if (Token::IsUnaryOp(op)) { |
op = Next(); |
- int position = scanner().location().beg_pos; |
+ int pos = position(); |
Expression* expression = ParseUnaryExpression(CHECK_OK); |
if (expression != NULL && (expression->AsLiteral() != NULL)) { |
@@ -3172,7 +3183,7 @@ Expression* Parser::ParseUnaryExpression(bool* ok) { |
bool condition = literal->BooleanValue(); |
Handle<Object> result(isolate()->heap()->ToBoolean(!condition), |
isolate()); |
- return factory()->NewLiteral(result); |
+ return factory()->NewLiteral(result, pos); |
} else if (literal->IsNumber()) { |
// Compute some expressions involving only number literals. |
double value = literal->Number(); |
@@ -3180,9 +3191,9 @@ Expression* Parser::ParseUnaryExpression(bool* ok) { |
case Token::ADD: |
return expression; |
case Token::SUB: |
- return factory()->NewNumberLiteral(-value); |
+ return factory()->NewNumberLiteral(-value, pos); |
case Token::BIT_NOT: |
- return factory()->NewNumberLiteral(~DoubleToInt32(value)); |
+ return factory()->NewNumberLiteral(~DoubleToInt32(value), pos); |
default: |
break; |
} |
@@ -3205,25 +3216,25 @@ Expression* Parser::ParseUnaryExpression(bool* ok) { |
if (op == Token::ADD) { |
return factory()->NewBinaryOperation(Token::MUL, |
expression, |
- factory()->NewNumberLiteral(1), |
- position); |
+ factory()->NewNumberLiteral(1, pos), |
+ pos); |
} |
// The same idea for '-foo' => 'foo*(-1)'. |
if (op == Token::SUB) { |
return factory()->NewBinaryOperation(Token::MUL, |
expression, |
- factory()->NewNumberLiteral(-1), |
- position); |
+ factory()->NewNumberLiteral(-1, pos), |
+ pos); |
} |
// ...and one more time for '~foo' => 'foo^(~0)'. |
if (op == Token::BIT_NOT) { |
return factory()->NewBinaryOperation(Token::BIT_XOR, |
expression, |
- factory()->NewNumberLiteral(~0), |
- position); |
+ factory()->NewNumberLiteral(~0, pos), |
+ pos); |
} |
- return factory()->NewUnaryOperation(op, expression, position); |
+ return factory()->NewUnaryOperation(op, expression, pos); |
} else if (Token::IsCountOp(op)) { |
op = Next(); |
@@ -3244,11 +3255,10 @@ Expression* Parser::ParseUnaryExpression(bool* ok) { |
} |
MarkAsLValue(expression); |
- int position = scanner().location().beg_pos; |
return factory()->NewCountOperation(op, |
true /* prefix */, |
expression, |
- position); |
+ position()); // TODO(rossberg): ??? |
Yang
2013/09/24 16:04:16
What does this mean?
|
} else { |
return ParsePostfixExpression(ok); |
@@ -3280,12 +3290,11 @@ Expression* Parser::ParsePostfixExpression(bool* ok) { |
MarkAsLValue(expression); |
Token::Value next = Next(); |
- int position = scanner().location().beg_pos; |
expression = |
factory()->NewCountOperation(next, |
false /* postfix */, |
expression, |
- position); |
+ position()); // TODO(rossberg): ??? |
Yang
2013/09/24 16:04:16
Ditto.
|
} |
return expression; |
} |
@@ -3306,7 +3315,7 @@ Expression* Parser::ParseLeftHandSideExpression(bool* ok) { |
switch (peek()) { |
case Token::LBRACK: { |
Consume(Token::LBRACK); |
- int pos = scanner().location().beg_pos; |
+ int pos = position(); |
Expression* index = ParseExpression(true, CHECK_OK); |
result = factory()->NewProperty(result, index, pos); |
Expect(Token::RBRACK, CHECK_OK); |
@@ -3318,14 +3327,14 @@ Expression* Parser::ParseLeftHandSideExpression(bool* ok) { |
if (scanner().current_token() == Token::IDENTIFIER) { |
// For call of an identifier we want to report position of |
// the identifier as position of the call in the stack trace. |
- pos = scanner().location().beg_pos; |
+ pos = position(); |
} else { |
// For other kinds of calls we record position of the parenthesis as |
// position of the call. Note that this is extremely important for |
// expressions of the form function(){...}() for which call position |
// should not point to the closing brace otherwise it will intersect |
// with positions recorded for function literal and confuse debugger. |
- pos = scanner().peek_location().beg_pos; |
+ pos = peek_position(); |
// Also the trailing parenthesis are a hint that the function will |
// be called immediately. If we happen to have parsed a preceding |
// function literal eagerly, we can also compile it eagerly. |
@@ -3354,10 +3363,10 @@ Expression* Parser::ParseLeftHandSideExpression(bool* ok) { |
case Token::PERIOD: { |
Consume(Token::PERIOD); |
- int pos = scanner().location().beg_pos; |
+ int pos = position(); |
Handle<String> name = ParseIdentifierName(CHECK_OK); |
- result = |
- factory()->NewProperty(result, factory()->NewLiteral(name), pos); |
+ result = factory()->NewProperty( |
+ result, factory()->NewLiteral(name, pos), pos); |
if (fni_ != NULL) fni_->PushLiteralName(name); |
break; |
} |
@@ -3382,7 +3391,7 @@ Expression* Parser::ParseNewPrefix(PositionStack* stack, bool* ok) { |
// member expression parser, which is only allowed to match argument |
// lists as long as it has 'new' prefixes left |
Expect(Token::NEW, CHECK_OK); |
- PositionStack::Element pos(stack, scanner().location().beg_pos); |
+ PositionStack::Element pos(stack, position()); |
Expression* result; |
if (peek() == Token::NEW) { |
@@ -3421,7 +3430,7 @@ Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack, |
Expression* result = NULL; |
if (peek() == Token::FUNCTION) { |
Expect(Token::FUNCTION, CHECK_OK); |
- int function_token_position = scanner().location().beg_pos; |
+ int function_token_position = position(); |
bool is_generator = allow_generators() && Check(Token::MUL); |
Handle<String> name; |
bool is_strict_reserved_name = false; |
@@ -3446,7 +3455,7 @@ Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack, |
switch (peek()) { |
case Token::LBRACK: { |
Consume(Token::LBRACK); |
- int pos = scanner().location().beg_pos; |
+ int pos = position(); |
Expression* index = ParseExpression(true, CHECK_OK); |
result = factory()->NewProperty(result, index, pos); |
if (fni_ != NULL) { |
@@ -3462,10 +3471,10 @@ Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack, |
} |
case Token::PERIOD: { |
Consume(Token::PERIOD); |
- int pos = scanner().location().beg_pos; |
+ int pos = position(); |
Handle<String> name = ParseIdentifierName(CHECK_OK); |
- result = |
- factory()->NewProperty(result, factory()->NewLiteral(name), pos); |
+ result = factory()->NewProperty( |
+ result, factory()->NewLiteral(name, pos), pos); |
if (fni_ != NULL) fni_->PushLiteralName(name); |
break; |
} |
@@ -3473,8 +3482,8 @@ Expression* Parser::ParseMemberWithNewPrefixesExpression(PositionStack* stack, |
if ((stack == NULL) || stack->is_empty()) return result; |
// Consume one of the new prefixes (already parsed). |
ZoneList<Expression*>* args = ParseArguments(CHECK_OK); |
- int last = stack->pop(); |
- result = factory()->NewCallNew(result, args, last); |
+ int pos = stack->pop(); |
+ result = factory()->NewCallNew(result, args, pos); |
break; |
} |
default: |
@@ -3491,9 +3500,10 @@ DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) { |
// DebuggerStatement :: |
// 'debugger' ';' |
+ int pos = peek_position(); |
Expect(Token::DEBUGGER, CHECK_OK); |
ExpectSemicolon(CHECK_OK); |
- return factory()->NewDebuggerStatement(); |
+ return factory()->NewDebuggerStatement(pos); |
} |
@@ -3555,6 +3565,7 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) { |
// RegExpLiteral |
// '(' Expression ')' |
+ int pos = peek_position(); |
Expression* result = NULL; |
switch (peek()) { |
case Token::THIS: { |
@@ -3565,17 +3576,17 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) { |
case Token::NULL_LITERAL: |
Consume(Token::NULL_LITERAL); |
- result = factory()->NewLiteral(isolate()->factory()->null_value()); |
+ result = factory()->NewLiteral(isolate()->factory()->null_value(), pos); |
break; |
case Token::TRUE_LITERAL: |
Consume(Token::TRUE_LITERAL); |
- result = factory()->NewLiteral(isolate()->factory()->true_value()); |
+ result = factory()->NewLiteral(isolate()->factory()->true_value(), pos); |
break; |
case Token::FALSE_LITERAL: |
Consume(Token::FALSE_LITERAL); |
- result = factory()->NewLiteral(isolate()->factory()->false_value()); |
+ result = factory()->NewLiteral(isolate()->factory()->false_value(), pos); |
break; |
case Token::IDENTIFIER: |
@@ -3589,8 +3600,7 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) { |
PrintF("# Variable %s ", name->ToAsciiArray()); |
#endif |
Interface* interface = Interface::NewUnknown(zone()); |
- result = top_scope_->NewUnresolved( |
- factory(), name, interface, scanner().location().beg_pos); |
+ result = top_scope_->NewUnresolved(factory(), name, interface, pos); |
break; |
} |
@@ -3601,14 +3611,14 @@ Expression* Parser::ParsePrimaryExpression(bool* ok) { |
scanner().literal_ascii_string(), |
ALLOW_HEX | ALLOW_OCTAL | |
ALLOW_IMPLICIT_OCTAL | ALLOW_BINARY); |
- result = factory()->NewNumberLiteral(value); |
+ result = factory()->NewNumberLiteral(value, pos); |
break; |
} |
case Token::STRING: { |
Consume(Token::STRING); |
Handle<String> symbol = GetSymbol(); |
- result = factory()->NewLiteral(symbol); |
+ result = factory()->NewLiteral(symbol, pos); |
if (fni_ != NULL) fni_->PushLiteralName(symbol); |
break; |
} |
@@ -3662,12 +3672,13 @@ Expression* Parser::ParseArrayLiteral(bool* ok) { |
// ArrayLiteral :: |
// '[' Expression? (',' Expression?)* ']' |
+ int pos = peek_position(); |
ZoneList<Expression*>* values = new(zone()) ZoneList<Expression*>(4, zone()); |
Expect(Token::LBRACK, CHECK_OK); |
while (peek() != Token::RBRACK) { |
Expression* elem; |
if (peek() == Token::COMMA) { |
- elem = GetLiteralTheHole(); |
+ elem = GetLiteralTheHole(peek_position()); |
} else { |
elem = ParseAssignmentExpression(true, CHECK_OK); |
} |
@@ -3729,7 +3740,7 @@ Expression* Parser::ParseArrayLiteral(bool* ok) { |
literals->set(1, *element_values); |
return factory()->NewArrayLiteral( |
- literals, values, literal_index, is_simple, depth); |
+ literals, values, literal_index, is_simple, depth, pos); |
} |
@@ -3949,6 +3960,7 @@ ObjectLiteral::Property* Parser::ParseObjectLiteralGetSet(bool is_getter, |
// { ... , get foo() { ... }, ... , set foo(v) { ... v ... } , ... } |
// We have already read the "get" or "set" keyword. |
Token::Value next = Next(); |
+ int pos = position(); |
bool is_keyword = Token::IsKeyword(next); |
if (next == Token::IDENTIFIER || next == Token::NUMBER || |
next == Token::FUTURE_RESERVED_WORD || |
@@ -3969,7 +3981,7 @@ ObjectLiteral::Property* Parser::ParseObjectLiteralGetSet(bool is_getter, |
CHECK_OK); |
// Allow any number of parameters for compatibilty with JSC. |
// Specification only allows zero parameters for get and one for set. |
- return factory()->NewObjectLiteralProperty(is_getter, value); |
+ return factory()->NewObjectLiteralProperty(is_getter, value, pos); |
} else { |
ReportUnexpectedToken(next); |
*ok = false; |
@@ -3985,6 +3997,7 @@ Expression* Parser::ParseObjectLiteral(bool* ok) { |
// | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) |
// )*[','] '}' |
+ int pos = peek_position(); |
ZoneList<ObjectLiteral::Property*>* properties = |
new(zone()) ZoneList<ObjectLiteral::Property*>(4, zone()); |
int number_of_boilerplate_properties = 0; |
@@ -4034,7 +4047,7 @@ Expression* Parser::ParseObjectLiteral(bool* ok) { |
} |
// Failed to parse as get/set property, so it's just a property |
// called "get" or "set". |
- key = factory()->NewLiteral(id); |
+ key = factory()->NewLiteral(id, loc.beg_pos); |
break; |
} |
case Token::STRING: { |
@@ -4043,10 +4056,10 @@ Expression* Parser::ParseObjectLiteral(bool* ok) { |
if (fni_ != NULL) fni_->PushLiteralName(string); |
uint32_t index; |
if (!string.is_null() && string->AsArrayIndex(&index)) { |
- key = factory()->NewNumberLiteral(index); |
+ key = factory()->NewNumberLiteral(index, loc.beg_pos); |
break; |
} |
- key = factory()->NewLiteral(string); |
+ key = factory()->NewLiteral(string, loc.beg_pos); |
break; |
} |
case Token::NUMBER: { |
@@ -4056,14 +4069,14 @@ Expression* Parser::ParseObjectLiteral(bool* ok) { |
scanner().literal_ascii_string(), |
ALLOW_HEX | ALLOW_OCTAL | |
ALLOW_IMPLICIT_OCTAL | ALLOW_BINARY); |
- key = factory()->NewNumberLiteral(value); |
+ key = factory()->NewNumberLiteral(value, loc.beg_pos); |
break; |
} |
default: |
if (Token::IsKeyword(next)) { |
Consume(next); |
Handle<String> string = GetSymbol(); |
- key = factory()->NewLiteral(string); |
+ key = factory()->NewLiteral(string, loc.beg_pos); |
} else { |
// Unexpected token. |
Token::Value next = Next(); |
@@ -4127,11 +4140,13 @@ Expression* Parser::ParseObjectLiteral(bool* ok) { |
fast_elements, |
depth, |
may_store_doubles, |
- has_function); |
+ has_function, |
+ pos); |
} |
Expression* Parser::ParseRegExpLiteral(bool seen_equal, bool* ok) { |
+ int pos = peek_position(); |
if (!scanner().ScanRegExpPattern(seen_equal)) { |
Next(); |
ReportMessage("unterminated_regexp", Vector<const char*>::empty()); |
@@ -4146,7 +4161,7 @@ Expression* Parser::ParseRegExpLiteral(bool seen_equal, bool* ok) { |
Handle<String> js_flags = NextLiteralString(TENURED); |
Next(); |
- return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index); |
+ return factory()->NewRegExpLiteral(js_pattern, js_flags, literal_index, pos); |
} |
@@ -4271,12 +4286,15 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
Handle<String> function_name, |
bool name_is_strict_reserved, |
bool is_generator, |
- int function_token_position, |
+ int function_token_pos, |
FunctionLiteral::FunctionType function_type, |
bool* ok) { |
// Function :: |
// '(' FormalParameterList? ')' '{' FunctionBody '}' |
+ int pos = function_token_pos == RelocInfo::kNoPosition |
+ ? peek_position() : function_token_pos; |
+ |
// Anonymous functions were passed either the empty symbol or a null |
// handle as the function name. Remember if we were passed a non-empty |
// handle to decide whether to invoke function name inference. |
@@ -4414,8 +4432,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
function_name, fvar_mode, true /* is valid LHS */, |
Variable::NORMAL, kCreatedInitialized, Interface::NewConst()); |
VariableProxy* proxy = factory()->NewVariableProxy(fvar); |
- VariableDeclaration* fvar_declaration = |
- factory()->NewVariableDeclaration(proxy, fvar_mode, top_scope_); |
+ VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration( |
+ proxy, fvar_mode, top_scope_, RelocInfo::kNoPosition); |
top_scope_->DeclareFunctionVar(fvar_declaration); |
} |
@@ -4436,7 +4454,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
parenthesized_function_ = false; // The bit was set for this function only. |
if (is_lazily_compiled) { |
- int function_block_pos = scanner().location().beg_pos; |
+ int function_block_pos = position(); |
FunctionEntry entry; |
if (pre_parse_data_ != NULL) { |
// If we have pre_parse_data_, we use it to skip parsing the function |
@@ -4505,9 +4523,9 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
body->Add(factory()->NewExpressionStatement( |
factory()->NewAssignment(fvar_init_op, |
fproxy, |
- factory()->NewThisFunction(), |
- RelocInfo::kNoPosition)), |
- zone()); |
+ factory()->NewThisFunction(pos), |
+ RelocInfo::kNoPosition), |
+ RelocInfo::kNoPosition), zone()); |
} |
// For generators, allocate and yield an iterator on function entry. |
@@ -4517,7 +4535,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
CallRuntime* allocation = factory()->NewCallRuntime( |
isolate()->factory()->empty_string(), |
Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject), |
- arguments); |
+ arguments, pos); |
VariableProxy* init_proxy = factory()->NewVariableProxy( |
current_function_state_->generator_object_variable()); |
Assignment* assignment = factory()->NewAssignment( |
@@ -4526,7 +4544,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
current_function_state_->generator_object_variable()); |
Yield* yield = factory()->NewYield( |
get_proxy, assignment, Yield::INITIAL, RelocInfo::kNoPosition); |
- body->Add(factory()->NewExpressionStatement(yield), zone()); |
+ body->Add(factory()->NewExpressionStatement( |
+ yield, RelocInfo::kNoPosition), zone()); |
} |
ParseSourceElements(body, Token::RBRACE, false, false, CHECK_OK); |
@@ -4535,10 +4554,11 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
VariableProxy* get_proxy = factory()->NewVariableProxy( |
current_function_state_->generator_object_variable()); |
Expression *undefined = factory()->NewLiteral( |
- isolate()->factory()->undefined_value()); |
+ isolate()->factory()->undefined_value(), RelocInfo::kNoPosition); |
Yield* yield = factory()->NewYield( |
get_proxy, undefined, Yield::FINAL, RelocInfo::kNoPosition); |
- body->Add(factory()->NewExpressionStatement(yield), zone()); |
+ body->Add(factory()->NewExpressionStatement( |
+ yield, RelocInfo::kNoPosition), zone()); |
} |
materialized_literal_count = function_state.materialized_literal_count(); |
@@ -4553,9 +4573,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
if (!top_scope_->is_classic_mode()) { |
if (IsEvalOrArguments(function_name)) { |
int start_pos = scope->start_position(); |
- int position = function_token_position != RelocInfo::kNoPosition |
- ? function_token_position |
- : (start_pos > 0 ? start_pos - 1 : start_pos); |
+ int position = function_token_pos != RelocInfo::kNoPosition |
+ ? function_token_pos : (start_pos > 0 ? start_pos - 1 : start_pos); |
Scanner::Location location = Scanner::Location(position, start_pos); |
ReportMessageAt(location, |
"strict_function_name", Vector<const char*>::empty()); |
@@ -4576,9 +4595,8 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
} |
if (name_is_strict_reserved) { |
int start_pos = scope->start_position(); |
- int position = function_token_position != RelocInfo::kNoPosition |
- ? function_token_position |
- : (start_pos > 0 ? start_pos - 1 : start_pos); |
+ int position = function_token_pos != RelocInfo::kNoPosition |
+ ? function_token_pos : (start_pos > 0 ? start_pos - 1 : start_pos); |
Scanner::Location location = Scanner::Location(position, start_pos); |
ReportMessageAt(location, "strict_reserved_word", |
Vector<const char*>::empty()); |
@@ -4615,8 +4633,9 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
function_type, |
FunctionLiteral::kIsFunction, |
parenthesized, |
- generator); |
- function_literal->set_function_token_position(function_token_position); |
+ generator, |
+ pos); |
+ function_literal->set_function_token_position(function_token_pos); |
function_literal->set_ast_properties(&ast_properties); |
function_literal->set_dont_optimize_reason(dont_optimize_reason); |
@@ -4656,6 +4675,7 @@ Expression* Parser::ParseV8Intrinsic(bool* ok) { |
// CallRuntime :: |
// '%' Identifier Arguments |
+ int pos = peek_position(); |
Expect(Token::MOD, CHECK_OK); |
Handle<String> name = ParseIdentifier(CHECK_OK); |
ZoneList<Expression*>* args = ParseArguments(CHECK_OK); |
@@ -4701,7 +4721,7 @@ Expression* Parser::ParseV8Intrinsic(bool* ok) { |
} |
// We have a valid intrinsics call or a call to a builtin. |
- return factory()->NewCallRuntime(name, function, args); |
+ return factory()->NewCallRuntime(name, function, args, pos); |
} |
@@ -4777,13 +4797,15 @@ void Parser::ExpectContextualKeyword(Vector<const char> keyword, bool* ok) { |
} |
-Literal* Parser::GetLiteralUndefined() { |
- return factory()->NewLiteral(isolate()->factory()->undefined_value()); |
+Literal* Parser::GetLiteralUndefined(int position) { |
+ return factory()->NewLiteral( |
+ isolate()->factory()->undefined_value(), position); |
} |
-Literal* Parser::GetLiteralTheHole() { |
- return factory()->NewLiteral(isolate()->factory()->the_hole_value()); |
+Literal* Parser::GetLiteralTheHole(int position) { |
+ return factory()->NewLiteral( |
+ isolate()->factory()->the_hole_value(), RelocInfo::kNoPosition); |
} |
@@ -5012,12 +5034,13 @@ Expression* Parser::NewThrowError(Handle<String> constructor, |
Handle<JSArray> array = isolate()->factory()->NewJSArrayWithElements( |
elements, FAST_ELEMENTS, TENURED); |
+ int pos = position(); |
ZoneList<Expression*>* args = new(zone()) ZoneList<Expression*>(2, zone()); |
- args->Add(factory()->NewLiteral(message), zone()); |
- args->Add(factory()->NewLiteral(array), zone()); |
+ args->Add(factory()->NewLiteral(message, pos), zone()); |
+ args->Add(factory()->NewLiteral(array, pos), zone()); |
CallRuntime* call_constructor = |
- factory()->NewCallRuntime(constructor, NULL, args); |
- return factory()->NewThrow(call_constructor, scanner().location().beg_pos); |
+ factory()->NewCallRuntime(constructor, NULL, args, pos); |
+ return factory()->NewThrow(call_constructor, pos); |
} |