Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 3c361a7e2e6760e4202258c659695c3ae1c8a82d..7bd0cea92f8eea5d28fcf0db59ead15c9ebd4671 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -283,11 +283,6 @@ class TemporaryScope BASE_EMBEDDED { |
void AddLoop() { loop_count_++; } |
bool ContainsLoops() const { return loop_count_ > 0; } |
- bool StrictMode() { return strict_mode_; } |
- void EnableStrictMode() { |
- strict_mode_ = FLAG_strict_mode; |
- } |
- |
private: |
// Captures the number of literals that need materialization in the |
// function. Includes regexp literals, and boilerplate for object |
@@ -305,9 +300,6 @@ class TemporaryScope BASE_EMBEDDED { |
// Captures the number of loops inside the scope. |
int loop_count_; |
- // Parsing strict mode code. |
- bool strict_mode_; |
- |
// Bookkeeping |
TemporaryScope** variable_; |
TemporaryScope* parent_; |
@@ -322,8 +314,6 @@ TemporaryScope::TemporaryScope(TemporaryScope** variable) |
loop_count_(0), |
variable_(variable), |
parent_(*variable) { |
- // Inherit the strict mode from the parent scope. |
- strict_mode_ = (parent_ != NULL) && parent_->strict_mode_; |
*variable = this; |
} |
@@ -665,13 +655,13 @@ FunctionLiteral* Parser::DoParseProgram(Handle<String> source, |
scope); |
TemporaryScope temp_scope(&this->temp_scope_); |
if (strict_mode == kStrictMode) { |
- temp_scope.EnableStrictMode(); |
+ top_scope_->EnableStrictMode(); |
} |
ZoneList<Statement*>* body = new ZoneList<Statement*>(16); |
bool ok = true; |
int beg_loc = scanner().location().beg_pos; |
ParseSourceElements(body, Token::EOS, &ok); |
- if (ok && temp_scope_->StrictMode()) { |
+ if (ok && top_scope_->is_strict_mode()) { |
CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok); |
} |
if (ok) { |
@@ -687,8 +677,7 @@ FunctionLiteral* Parser::DoParseProgram(Handle<String> source, |
0, |
source->length(), |
false, |
- temp_scope.ContainsLoops(), |
- temp_scope.StrictMode()); |
+ temp_scope.ContainsLoops()); |
} else if (stack_overflow_) { |
Top::StackOverflow(); |
} |
@@ -753,7 +742,7 @@ FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info, |
TemporaryScope temp_scope(&this->temp_scope_); |
if (info->strict_mode()) { |
- temp_scope.EnableStrictMode(); |
+ top_scope_->EnableStrictMode(); |
} |
FunctionLiteralType type = |
@@ -1140,11 +1129,11 @@ void* Parser::ParseSourceElements(ZoneList<Statement*>* processor, |
Handle<String> directive = Handle<String>::cast(literal->handle()); |
// Check "use strict" directive (ES5 14.1). |
- if (!temp_scope_->StrictMode() && |
+ if (!top_scope_->is_strict_mode() && |
directive->Equals(Heap::use_strict()) && |
token_loc.end_pos - token_loc.beg_pos == |
Heap::use_strict()->length() + 2) { |
- temp_scope_->EnableStrictMode(); |
+ top_scope_->EnableStrictMode(); |
// "use strict" is the only directive for now. |
directive_prologue = false; |
} |
@@ -1282,7 +1271,7 @@ Statement* Parser::ParseStatement(ZoneStringList* labels, bool* ok) { |
case Token::FUNCTION: { |
// In strict mode, FunctionDeclaration is only allowed in the context |
// of SourceElements. |
- if (temp_scope_->StrictMode()) { |
+ if (top_scope_->is_strict_mode()) { |
ReportMessageAt(scanner().peek_location(), "strict_function", |
Vector<const char*>::empty()); |
*ok = false; |
@@ -1540,7 +1529,7 @@ Block* Parser::ParseVariableDeclarations(bool accept_IN, |
Consume(Token::VAR); |
} else if (peek() == Token::CONST) { |
Consume(Token::CONST); |
- if (temp_scope_->StrictMode()) { |
+ if (top_scope_->is_strict_mode()) { |
ReportMessage("strict_const", Vector<const char*>::empty()); |
*ok = false; |
return NULL; |
@@ -1576,7 +1565,7 @@ Block* Parser::ParseVariableDeclarations(bool accept_IN, |
if (fni_ != NULL) fni_->PushVariableName(name); |
// Strict mode variables may not be named eval or arguments |
- if (temp_scope_->StrictMode() && IsEvalOrArguments(name)) { |
+ if (top_scope_->is_strict_mode() && IsEvalOrArguments(name)) { |
ReportMessage("strict_var_name", Vector<const char*>::empty()); |
*ok = false; |
return NULL; |
@@ -1685,7 +1674,7 @@ Block* Parser::ParseVariableDeclarations(bool accept_IN, |
// Add strict mode. |
// We may want to pass singleton to avoid Literal allocations. |
arguments->Add(NewNumberLiteral( |
- temp_scope_->StrictMode() ? kStrictMode : kNonStrictMode)); |
+ top_scope_->is_strict_mode() ? kStrictMode : kNonStrictMode)); |
// Be careful not to assign a value to the global variable if |
// we're in a with. The initialization value should not |
@@ -1958,7 +1947,7 @@ Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) { |
Expect(Token::WITH, CHECK_OK); |
- if (temp_scope_->StrictMode()) { |
+ if (top_scope_->is_strict_mode()) { |
ReportMessage("strict_mode_with", Vector<const char*>::empty()); |
*ok = false; |
return NULL; |
@@ -2097,7 +2086,7 @@ TryStatement* Parser::ParseTryStatement(bool* ok) { |
Expect(Token::LPAREN, CHECK_OK); |
Handle<String> name = ParseIdentifier(CHECK_OK); |
- if (temp_scope_->StrictMode() && IsEvalOrArguments(name)) { |
+ if (top_scope_->is_strict_mode() && IsEvalOrArguments(name)) { |
ReportMessage("strict_catch_variable", Vector<const char*>::empty()); |
*ok = false; |
return NULL; |
@@ -2348,7 +2337,7 @@ Expression* Parser::ParseAssignmentExpression(bool accept_IN, bool* ok) { |
expression = NewThrowReferenceError(type); |
} |
- if (temp_scope_->StrictMode()) { |
+ if (top_scope_->is_strict_mode()) { |
// Assignment to eval or arguments is disallowed in strict mode. |
CheckStrictModeLValue(expression, "strict_lhs_assignment", CHECK_OK); |
} |
@@ -2567,7 +2556,7 @@ Expression* Parser::ParseUnaryExpression(bool* ok) { |
} |
// "delete identifier" is a syntax error in strict mode. |
- if (op == Token::DELETE && temp_scope_->StrictMode()) { |
+ if (op == Token::DELETE && top_scope_->is_strict_mode()) { |
VariableProxy* operand = expression->AsVariableProxy(); |
if (operand != NULL && !operand->is_this()) { |
ReportMessage("strict_delete", Vector<const char*>::empty()); |
@@ -2590,7 +2579,7 @@ Expression* Parser::ParseUnaryExpression(bool* ok) { |
expression = NewThrowReferenceError(type); |
} |
- if (temp_scope_->StrictMode()) { |
+ if (top_scope_->is_strict_mode()) { |
// Prefix expression operand in strict mode may not be eval or arguments. |
CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); |
} |
@@ -2621,7 +2610,7 @@ Expression* Parser::ParsePostfixExpression(bool* ok) { |
expression = NewThrowReferenceError(type); |
} |
- if (temp_scope_->StrictMode()) { |
+ if (top_scope_->is_strict_mode()) { |
// Postfix expression operand in strict mode may not be eval or arguments. |
CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); |
} |
@@ -2829,7 +2818,7 @@ void Parser::ReportUnexpectedToken(Token::Value token) { |
return ReportMessage("unexpected_token_identifier", |
Vector<const char*>::empty()); |
case Token::FUTURE_RESERVED_WORD: |
- return ReportMessage(temp_scope_->StrictMode() ? |
+ return ReportMessage(top_scope_->is_strict_mode() ? |
"unexpected_strict_reserved" : |
"unexpected_token_identifier", |
Vector<const char*>::empty()); |
@@ -3334,7 +3323,7 @@ Expression* Parser::ParseObjectLiteral(bool* ok) { |
new ZoneList<ObjectLiteral::Property*>(4); |
int number_of_boilerplate_properties = 0; |
- ObjectLiteralPropertyChecker checker(this, temp_scope_->StrictMode()); |
+ ObjectLiteralPropertyChecker checker(this, top_scope_->is_strict_mode()); |
Expect(Token::LBRACE, CHECK_OK); |
Scanner::Location loc = scanner().location(); |
@@ -3631,7 +3620,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
} |
// Validate strict mode. |
- if (temp_scope_->StrictMode()) { |
+ if (top_scope_->is_strict_mode()) { |
if (IsEvalOrArguments(name)) { |
int position = function_token_position != RelocInfo::kNoPosition |
? function_token_position |
@@ -3685,8 +3674,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
start_pos, |
end_pos, |
function_name->length() > 0, |
- temp_scope.ContainsLoops(), |
- temp_scope.StrictMode()); |
+ temp_scope.ContainsLoops()); |
function_literal->set_function_token_position(function_token_position); |
if (fni_ != NULL && !is_named) fni_->AddFunction(function_literal); |
@@ -3815,7 +3803,7 @@ Handle<String> Parser::ParseIdentifier(bool* ok) { |
Handle<String> Parser::ParseIdentifierOrReservedWord(bool* is_reserved, |
bool* ok) { |
*is_reserved = false; |
- if (temp_scope_->StrictMode()) { |
+ if (top_scope_->is_strict_mode()) { |
Expect(Token::IDENTIFIER, ok); |
} else { |
if (!Check(Token::IDENTIFIER)) { |
@@ -3846,7 +3834,7 @@ Handle<String> Parser::ParseIdentifierName(bool* ok) { |
void Parser::CheckStrictModeLValue(Expression* expression, |
const char* error, |
bool* ok) { |
- ASSERT(temp_scope_->StrictMode()); |
+ ASSERT(top_scope_->is_strict_mode()); |
VariableProxy* lhs = expression != NULL |
? expression->AsVariableProxy() |
: NULL; |