| Index: src/preparser.cc
|
| diff --git a/src/preparser.cc b/src/preparser.cc
|
| index 3c184901aeab37220334305898214abe542ea0b3..4963aa1139a1b3b1dfadb3a986661b46d76bab36 100644
|
| --- a/src/preparser.cc
|
| +++ b/src/preparser.cc
|
| @@ -61,12 +61,12 @@ bool PreParserTraits::is_classic_mode() const {
|
|
|
|
|
| bool PreParserTraits::is_generator() const {
|
| - return pre_parser_->scope_->is_generator();
|
| + return pre_parser_->function_state_->is_generator();
|
| }
|
|
|
|
|
| int PreParserTraits::NextMaterializedLiteralIndex() {
|
| - return pre_parser_->scope_->NextMaterializedLiteralIndex();
|
| + return pre_parser_->function_state_->NextMaterializedLiteralIndex();
|
| }
|
|
|
|
|
| @@ -126,9 +126,9 @@ PreParser::PreParseResult PreParser::PreParseLazyFunction(
|
| LanguageMode mode, bool is_generator, ParserRecorder* log) {
|
| log_ = log;
|
| // Lazy functions always have trivial outer scopes (no with/catch scopes).
|
| - Scope top_scope(&scope_, kTopLevelScope);
|
| - set_language_mode(mode);
|
| - Scope function_scope(&scope_, kFunctionScope);
|
| + FunctionState top_scope(&function_state_, &scope_, GLOBAL_SCOPE);
|
| + scope_->SetLanguageMode(mode);
|
| + FunctionState function_scope(&function_state_, &scope_, FUNCTION_SCOPE);
|
| function_scope.set_is_generator(is_generator);
|
| ASSERT_EQ(Token::LBRACE, scanner()->current_token());
|
| bool ok = true;
|
| @@ -206,8 +206,8 @@ PreParser::SourceElements PreParser::ParseSourceElements(int end_token,
|
| Statement statement = ParseSourceElement(CHECK_OK);
|
| if (directive_prologue) {
|
| if (statement.IsUseStrictLiteral()) {
|
| - set_language_mode(allow_harmony_scoping() ?
|
| - EXTENDED_MODE : STRICT_MODE);
|
| + scope_->SetLanguageMode(allow_harmony_scoping() ?
|
| + EXTENDED_MODE : STRICT_MODE);
|
| } else if (!statement.IsStringLiteral()) {
|
| directive_prologue = false;
|
| }
|
| @@ -352,7 +352,7 @@ PreParser::Statement PreParser::ParseBlock(bool* ok) {
|
| //
|
| Expect(Token::LBRACE, CHECK_OK);
|
| while (peek() != Token::RBRACE) {
|
| - if (is_extended_mode()) {
|
| + if (scope_->is_extended_mode()) {
|
| ParseSourceElement(CHECK_OK);
|
| } else {
|
| ParseStatement(CHECK_OK);
|
| @@ -416,7 +416,7 @@ PreParser::Statement PreParser::ParseVariableDeclarations(
|
| // existing pages. Therefore we keep allowing const with the old
|
| // non-harmony semantics in classic mode.
|
| Consume(Token::CONST);
|
| - switch (language_mode()) {
|
| + switch (scope_->language_mode()) {
|
| case CLASSIC_MODE:
|
| break;
|
| case STRICT_MODE: {
|
| @@ -442,7 +442,7 @@ PreParser::Statement PreParser::ParseVariableDeclarations(
|
| //
|
| // * It is a Syntax Error if the code that matches this production is not
|
| // contained in extended code.
|
| - if (!is_extended_mode()) {
|
| + if (!scope_->is_extended_mode()) {
|
| ReportMessageAt(scanner()->peek_location(), "illegal_let");
|
| *ok = false;
|
| return Statement::Default();
|
| @@ -602,7 +602,7 @@ PreParser::Statement PreParser::ParseWithStatement(bool* ok) {
|
| ParseExpression(true, CHECK_OK);
|
| Expect(Token::RPAREN, CHECK_OK);
|
|
|
| - Scope::InsideWith iw(scope_);
|
| + BlockState block_state(&scope_, WITH_SCOPE);
|
| ParseStatement(CHECK_OK);
|
| return Statement::Default();
|
| }
|
| @@ -775,7 +775,8 @@ PreParser::Statement PreParser::ParseTryStatement(bool* ok) {
|
| Expect(Token::LPAREN, CHECK_OK);
|
| ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
|
| Expect(Token::RPAREN, CHECK_OK);
|
| - { Scope::InsideWith iw(scope_);
|
| + {
|
| + BlockState block_state(&scope_, WITH_SCOPE);
|
| ParseBlock(CHECK_OK);
|
| }
|
| tok = peek();
|
| @@ -833,7 +834,7 @@ PreParser::Expression PreParser::ParseAssignmentExpression(bool accept_IN,
|
| // YieldExpression
|
| // LeftHandSideExpression AssignmentOperator AssignmentExpression
|
|
|
| - if (scope_->is_generator() && peek() == Token::YIELD) {
|
| + if (function_state_->is_generator() && peek() == Token::YIELD) {
|
| return ParseYieldExpression(ok);
|
| }
|
|
|
| @@ -859,7 +860,7 @@ PreParser::Expression PreParser::ParseAssignmentExpression(bool accept_IN,
|
| ParseAssignmentExpression(accept_IN, CHECK_OK);
|
|
|
| if ((op == Token::ASSIGN) && expression.IsThisProperty()) {
|
| - scope_->AddProperty();
|
| + function_state_->AddProperty();
|
| }
|
|
|
| return Expression::Default();
|
| @@ -1219,7 +1220,7 @@ PreParser::Expression PreParser::ParseArrayLiteral(bool* ok) {
|
| }
|
| Expect(Token::RBRACK, CHECK_OK);
|
|
|
| - scope_->NextMaterializedLiteralIndex();
|
| + function_state_->NextMaterializedLiteralIndex();
|
| return Expression::Default();
|
| }
|
|
|
| @@ -1231,7 +1232,7 @@ PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) {
|
| // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral)
|
| // )*[','] '}'
|
|
|
| - ObjectLiteralChecker checker(this, language_mode());
|
| + ObjectLiteralChecker checker(this, scope_->language_mode());
|
|
|
| Expect(Token::LBRACE, CHECK_OK);
|
| while (peek() != Token::RBRACE) {
|
| @@ -1301,7 +1302,7 @@ PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) {
|
| }
|
| Expect(Token::RBRACE, CHECK_OK);
|
|
|
| - scope_->NextMaterializedLiteralIndex();
|
| + function_state_->NextMaterializedLiteralIndex();
|
| return Expression::Default();
|
| }
|
|
|
| @@ -1339,8 +1340,8 @@ PreParser::Expression PreParser::ParseFunctionLiteral(
|
|
|
| // Parse function body.
|
| ScopeType outer_scope_type = scope_->type();
|
| - bool inside_with = scope_->IsInsideWith();
|
| - Scope function_scope(&scope_, kFunctionScope);
|
| + bool inside_with = scope_->inside_with();
|
| + FunctionState function_scope(&function_state_, &scope_, FUNCTION_SCOPE);
|
| function_scope.set_is_generator(is_generator);
|
| // FormalParameterList ::
|
| // '(' (Identifier)*[','] ')'
|
| @@ -1388,7 +1389,7 @@ PreParser::Expression PreParser::ParseFunctionLiteral(
|
| // Determine if the function will be lazily compiled.
|
| // Currently only happens to top-level functions.
|
| // Optimistically assume that all top-level functions are lazily compiled.
|
| - bool is_lazily_compiled = (outer_scope_type == kTopLevelScope &&
|
| + bool is_lazily_compiled = (outer_scope_type == GLOBAL_SCOPE &&
|
| !inside_with && allow_lazy() &&
|
| !parenthesized_function_);
|
| parenthesized_function_ = false;
|
| @@ -1450,9 +1451,9 @@ void PreParser::ParseLazyFunctionLiteralBody(bool* ok) {
|
| ASSERT_EQ(Token::RBRACE, scanner()->peek());
|
| int body_end = scanner()->peek_location().end_pos;
|
| log_->LogFunction(body_start, body_end,
|
| - scope_->materialized_literal_count(),
|
| - scope_->expected_properties(),
|
| - language_mode());
|
| + function_state_->materialized_literal_count(),
|
| + function_state_->expected_properties(),
|
| + scope_->language_mode());
|
| }
|
|
|
|
|
|
|