| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 } | 79 } |
| 80 | 80 |
| 81 private: | 81 private: |
| 82 Element* top() { return top_; } | 82 Element* top() { return top_; } |
| 83 void set_top(Element* value) { top_ = value; } | 83 void set_top(Element* value) { top_ = value; } |
| 84 Element* top_; | 84 Element* top_; |
| 85 bool* ok_; | 85 bool* ok_; |
| 86 }; | 86 }; |
| 87 | 87 |
| 88 | 88 |
| 89 RegExpBuilder::RegExpBuilder() | 89 RegExpBuilder::RegExpBuilder(Zone* zone) |
| 90 : zone_(Isolate::Current()->zone()), | 90 : zone_(zone), |
| 91 pending_empty_(false), | 91 pending_empty_(false), |
| 92 characters_(NULL), | 92 characters_(NULL), |
| 93 terms_(), | 93 terms_(), |
| 94 alternatives_() | 94 alternatives_() |
| 95 #ifdef DEBUG | 95 #ifdef DEBUG |
| 96 , last_added_(ADD_NONE) | 96 , last_added_(ADD_NONE) |
| 97 #endif | 97 #endif |
| 98 {} | 98 {} |
| 99 | 99 |
| 100 | 100 |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 ((void)0 | 528 ((void)0 |
| 529 #define DUMMY ) // to make indentation work | 529 #define DUMMY ) // to make indentation work |
| 530 #undef DUMMY | 530 #undef DUMMY |
| 531 | 531 |
| 532 // ---------------------------------------------------------------------------- | 532 // ---------------------------------------------------------------------------- |
| 533 // Implementation of Parser | 533 // Implementation of Parser |
| 534 | 534 |
| 535 Parser::Parser(Handle<Script> script, | 535 Parser::Parser(Handle<Script> script, |
| 536 int parser_flags, | 536 int parser_flags, |
| 537 v8::Extension* extension, | 537 v8::Extension* extension, |
| 538 ScriptDataImpl* pre_data) | 538 ScriptDataImpl* pre_data, |
| 539 Zone* zone) |
| 539 : isolate_(script->GetIsolate()), | 540 : isolate_(script->GetIsolate()), |
| 540 symbol_cache_(pre_data ? pre_data->symbol_count() : 0), | 541 symbol_cache_(pre_data ? pre_data->symbol_count() : 0), |
| 541 script_(script), | 542 script_(script), |
| 542 scanner_(isolate_->unicode_cache()), | 543 scanner_(isolate_->unicode_cache()), |
| 543 reusable_preparser_(NULL), | 544 reusable_preparser_(NULL), |
| 544 top_scope_(NULL), | 545 top_scope_(NULL), |
| 545 current_function_state_(NULL), | 546 current_function_state_(NULL), |
| 546 target_stack_(NULL), | 547 target_stack_(NULL), |
| 547 extension_(extension), | 548 extension_(extension), |
| 548 pre_data_(pre_data), | 549 pre_data_(pre_data), |
| 549 fni_(NULL), | 550 fni_(NULL), |
| 550 allow_natives_syntax_((parser_flags & kAllowNativesSyntax) != 0), | 551 allow_natives_syntax_((parser_flags & kAllowNativesSyntax) != 0), |
| 551 allow_lazy_((parser_flags & kAllowLazy) != 0), | 552 allow_lazy_((parser_flags & kAllowLazy) != 0), |
| 552 allow_modules_((parser_flags & kAllowModules) != 0), | 553 allow_modules_((parser_flags & kAllowModules) != 0), |
| 553 stack_overflow_(false), | 554 stack_overflow_(false), |
| 554 parenthesized_function_(false) { | 555 parenthesized_function_(false), |
| 556 zone_(zone) { |
| 555 isolate_->set_ast_node_id(0); | 557 isolate_->set_ast_node_id(0); |
| 556 if ((parser_flags & kLanguageModeMask) == EXTENDED_MODE) { | 558 if ((parser_flags & kLanguageModeMask) == EXTENDED_MODE) { |
| 557 scanner().SetHarmonyScoping(true); | 559 scanner().SetHarmonyScoping(true); |
| 558 } | 560 } |
| 559 if ((parser_flags & kAllowModules) != 0) { | 561 if ((parser_flags & kAllowModules) != 0) { |
| 560 scanner().SetHarmonyModules(true); | 562 scanner().SetHarmonyModules(true); |
| 561 } | 563 } |
| 562 } | 564 } |
| 563 | 565 |
| 564 | 566 |
| (...skipping 753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1318 { | 1320 { |
| 1319 BlockState block_state(this, scope); | 1321 BlockState block_state(this, scope); |
| 1320 TargetCollector collector; | 1322 TargetCollector collector; |
| 1321 Target target(&this->target_stack_, &collector); | 1323 Target target(&this->target_stack_, &collector); |
| 1322 Target target_body(&this->target_stack_, body); | 1324 Target target_body(&this->target_stack_, body); |
| 1323 InitializationBlockFinder block_finder(top_scope_, target_stack_); | 1325 InitializationBlockFinder block_finder(top_scope_, target_stack_); |
| 1324 | 1326 |
| 1325 while (peek() != Token::RBRACE) { | 1327 while (peek() != Token::RBRACE) { |
| 1326 Statement* stat = ParseModuleElement(NULL, CHECK_OK); | 1328 Statement* stat = ParseModuleElement(NULL, CHECK_OK); |
| 1327 if (stat && !stat->IsEmpty()) { | 1329 if (stat && !stat->IsEmpty()) { |
| 1328 body->AddStatement(stat); | 1330 body->AddStatement(stat, zone()); |
| 1329 block_finder.Update(stat); | 1331 block_finder.Update(stat); |
| 1330 } | 1332 } |
| 1331 } | 1333 } |
| 1332 } | 1334 } |
| 1333 | 1335 |
| 1334 Expect(Token::RBRACE, CHECK_OK); | 1336 Expect(Token::RBRACE, CHECK_OK); |
| 1335 scope->set_end_position(scanner().location().end_pos); | 1337 scope->set_end_position(scanner().location().end_pos); |
| 1336 body->set_scope(scope); | 1338 body->set_scope(scope); |
| 1337 | 1339 |
| 1338 // Instance objects have to be created ahead of time (before code generation | 1340 // Instance objects have to be created ahead of time (before code generation |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1670 // try-statements. When breaking out of a try-finally statement, | 1672 // try-statements. When breaking out of a try-finally statement, |
| 1671 // one must take great care not to treat it as a | 1673 // one must take great care not to treat it as a |
| 1672 // fall-through. It is much easier just to wrap the entire | 1674 // fall-through. It is much easier just to wrap the entire |
| 1673 // try-statement in a statement block and put the labels there | 1675 // try-statement in a statement block and put the labels there |
| 1674 Block* result = factory()->NewBlock(labels, 1, false); | 1676 Block* result = factory()->NewBlock(labels, 1, false); |
| 1675 Target target(&this->target_stack_, result); | 1677 Target target(&this->target_stack_, result); |
| 1676 TryStatement* statement = ParseTryStatement(CHECK_OK); | 1678 TryStatement* statement = ParseTryStatement(CHECK_OK); |
| 1677 if (statement) { | 1679 if (statement) { |
| 1678 statement->set_statement_pos(statement_pos); | 1680 statement->set_statement_pos(statement_pos); |
| 1679 } | 1681 } |
| 1680 if (result) result->AddStatement(statement); | 1682 if (result) result->AddStatement(statement, zone()); |
| 1681 return result; | 1683 return result; |
| 1682 } | 1684 } |
| 1683 | 1685 |
| 1684 case Token::FUNCTION: { | 1686 case Token::FUNCTION: { |
| 1685 // FunctionDeclaration is only allowed in the context of SourceElements | 1687 // FunctionDeclaration is only allowed in the context of SourceElements |
| 1686 // (Ecma 262 5th Edition, clause 14): | 1688 // (Ecma 262 5th Edition, clause 14): |
| 1687 // SourceElement: | 1689 // SourceElement: |
| 1688 // Statement | 1690 // Statement |
| 1689 // FunctionDeclaration | 1691 // FunctionDeclaration |
| 1690 // Common language extension is to allow function declaration in place | 1692 // Common language extension is to allow function declaration in place |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1984 // (ECMA-262, 3rd, 12.2) | 1986 // (ECMA-262, 3rd, 12.2) |
| 1985 // | 1987 // |
| 1986 // Construct block expecting 16 statements. | 1988 // Construct block expecting 16 statements. |
| 1987 Block* result = factory()->NewBlock(labels, 16, false); | 1989 Block* result = factory()->NewBlock(labels, 16, false); |
| 1988 Target target(&this->target_stack_, result); | 1990 Target target(&this->target_stack_, result); |
| 1989 Expect(Token::LBRACE, CHECK_OK); | 1991 Expect(Token::LBRACE, CHECK_OK); |
| 1990 InitializationBlockFinder block_finder(top_scope_, target_stack_); | 1992 InitializationBlockFinder block_finder(top_scope_, target_stack_); |
| 1991 while (peek() != Token::RBRACE) { | 1993 while (peek() != Token::RBRACE) { |
| 1992 Statement* stat = ParseStatement(NULL, CHECK_OK); | 1994 Statement* stat = ParseStatement(NULL, CHECK_OK); |
| 1993 if (stat && !stat->IsEmpty()) { | 1995 if (stat && !stat->IsEmpty()) { |
| 1994 result->AddStatement(stat); | 1996 result->AddStatement(stat, zone()); |
| 1995 block_finder.Update(stat); | 1997 block_finder.Update(stat); |
| 1996 } | 1998 } |
| 1997 } | 1999 } |
| 1998 Expect(Token::RBRACE, CHECK_OK); | 2000 Expect(Token::RBRACE, CHECK_OK); |
| 1999 return result; | 2001 return result; |
| 2000 } | 2002 } |
| 2001 | 2003 |
| 2002 | 2004 |
| 2003 Block* Parser::ParseScopedBlock(ZoneStringList* labels, bool* ok) { | 2005 Block* Parser::ParseScopedBlock(ZoneStringList* labels, bool* ok) { |
| 2004 // The harmony mode uses block elements instead of statements. | 2006 // The harmony mode uses block elements instead of statements. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2015 block_scope->set_start_position(scanner().location().beg_pos); | 2017 block_scope->set_start_position(scanner().location().beg_pos); |
| 2016 { BlockState block_state(this, block_scope); | 2018 { BlockState block_state(this, block_scope); |
| 2017 TargetCollector collector; | 2019 TargetCollector collector; |
| 2018 Target target(&this->target_stack_, &collector); | 2020 Target target(&this->target_stack_, &collector); |
| 2019 Target target_body(&this->target_stack_, body); | 2021 Target target_body(&this->target_stack_, body); |
| 2020 InitializationBlockFinder block_finder(top_scope_, target_stack_); | 2022 InitializationBlockFinder block_finder(top_scope_, target_stack_); |
| 2021 | 2023 |
| 2022 while (peek() != Token::RBRACE) { | 2024 while (peek() != Token::RBRACE) { |
| 2023 Statement* stat = ParseBlockElement(NULL, CHECK_OK); | 2025 Statement* stat = ParseBlockElement(NULL, CHECK_OK); |
| 2024 if (stat && !stat->IsEmpty()) { | 2026 if (stat && !stat->IsEmpty()) { |
| 2025 body->AddStatement(stat); | 2027 body->AddStatement(stat, zone()); |
| 2026 block_finder.Update(stat); | 2028 block_finder.Update(stat); |
| 2027 } | 2029 } |
| 2028 } | 2030 } |
| 2029 } | 2031 } |
| 2030 Expect(Token::RBRACE, CHECK_OK); | 2032 Expect(Token::RBRACE, CHECK_OK); |
| 2031 block_scope->set_end_position(scanner().location().end_pos); | 2033 block_scope->set_end_position(scanner().location().end_pos); |
| 2032 block_scope = block_scope->FinalizeBlockScope(); | 2034 block_scope = block_scope->FinalizeBlockScope(); |
| 2033 body->set_scope(block_scope); | 2035 body->set_scope(block_scope); |
| 2034 return body; | 2036 return body; |
| 2035 } | 2037 } |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2322 // Construct the call to Runtime_InitializeVarGlobal | 2324 // Construct the call to Runtime_InitializeVarGlobal |
| 2323 // and add it to the initialization statement block. | 2325 // and add it to the initialization statement block. |
| 2324 // Note that the function does different things depending on | 2326 // Note that the function does different things depending on |
| 2325 // the number of arguments (2 or 3). | 2327 // the number of arguments (2 or 3). |
| 2326 initialize = factory()->NewCallRuntime( | 2328 initialize = factory()->NewCallRuntime( |
| 2327 isolate()->factory()->InitializeVarGlobal_symbol(), | 2329 isolate()->factory()->InitializeVarGlobal_symbol(), |
| 2328 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), | 2330 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), |
| 2329 arguments); | 2331 arguments); |
| 2330 } | 2332 } |
| 2331 | 2333 |
| 2332 block->AddStatement(factory()->NewExpressionStatement(initialize)); | 2334 block->AddStatement(factory()->NewExpressionStatement(initialize), |
| 2335 zone()); |
| 2333 } else if (needs_init) { | 2336 } else if (needs_init) { |
| 2334 // Constant initializations always assign to the declared constant which | 2337 // Constant initializations always assign to the declared constant which |
| 2335 // is always at the function scope level. This is only relevant for | 2338 // is always at the function scope level. This is only relevant for |
| 2336 // dynamically looked-up variables and constants (the start context for | 2339 // dynamically looked-up variables and constants (the start context for |
| 2337 // constant lookups is always the function context, while it is the top | 2340 // constant lookups is always the function context, while it is the top |
| 2338 // context for var declared variables). Sigh... | 2341 // context for var declared variables). Sigh... |
| 2339 // For 'let' and 'const' declared variables in harmony mode the | 2342 // For 'let' and 'const' declared variables in harmony mode the |
| 2340 // initialization also always assigns to the declared variable. | 2343 // initialization also always assigns to the declared variable. |
| 2341 ASSERT(proxy != NULL); | 2344 ASSERT(proxy != NULL); |
| 2342 ASSERT(proxy->var() != NULL); | 2345 ASSERT(proxy->var() != NULL); |
| 2343 ASSERT(value != NULL); | 2346 ASSERT(value != NULL); |
| 2344 Assignment* assignment = | 2347 Assignment* assignment = |
| 2345 factory()->NewAssignment(init_op, proxy, value, position); | 2348 factory()->NewAssignment(init_op, proxy, value, position); |
| 2346 block->AddStatement(factory()->NewExpressionStatement(assignment)); | 2349 block->AddStatement(factory()->NewExpressionStatement(assignment), |
| 2350 zone()); |
| 2347 value = NULL; | 2351 value = NULL; |
| 2348 } | 2352 } |
| 2349 | 2353 |
| 2350 // Add an assignment node to the initialization statement block if we still | 2354 // Add an assignment node to the initialization statement block if we still |
| 2351 // have a pending initialization value. | 2355 // have a pending initialization value. |
| 2352 if (value != NULL) { | 2356 if (value != NULL) { |
| 2353 ASSERT(mode == VAR); | 2357 ASSERT(mode == VAR); |
| 2354 // 'var' initializations are simply assignments (with all the consequences | 2358 // 'var' initializations are simply assignments (with all the consequences |
| 2355 // if they are inside a 'with' statement - they may change a 'with' object | 2359 // if they are inside a 'with' statement - they may change a 'with' object |
| 2356 // property). | 2360 // property). |
| 2357 VariableProxy* proxy = | 2361 VariableProxy* proxy = |
| 2358 initialization_scope->NewUnresolved(factory(), name); | 2362 initialization_scope->NewUnresolved(factory(), name); |
| 2359 Assignment* assignment = | 2363 Assignment* assignment = |
| 2360 factory()->NewAssignment(init_op, proxy, value, position); | 2364 factory()->NewAssignment(init_op, proxy, value, position); |
| 2361 block->AddStatement(factory()->NewExpressionStatement(assignment)); | 2365 block->AddStatement(factory()->NewExpressionStatement(assignment), |
| 2366 zone()); |
| 2362 } | 2367 } |
| 2363 | 2368 |
| 2364 if (fni_ != NULL) fni_->Leave(); | 2369 if (fni_ != NULL) fni_->Leave(); |
| 2365 } while (peek() == Token::COMMA); | 2370 } while (peek() == Token::COMMA); |
| 2366 | 2371 |
| 2367 // If there was a single non-const declaration, return it in the output | 2372 // If there was a single non-const declaration, return it in the output |
| 2368 // parameter for possible use by for/in. | 2373 // parameter for possible use by for/in. |
| 2369 if (nvars == 1 && !is_const) { | 2374 if (nvars == 1 && !is_const) { |
| 2370 *out = name; | 2375 *out = name; |
| 2371 } | 2376 } |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2762 // 'try { try B0 catch B1 } finally B2' | 2767 // 'try { try B0 catch B1 } finally B2' |
| 2763 | 2768 |
| 2764 if (catch_block != NULL && finally_block != NULL) { | 2769 if (catch_block != NULL && finally_block != NULL) { |
| 2765 // If we have both, create an inner try/catch. | 2770 // If we have both, create an inner try/catch. |
| 2766 ASSERT(catch_scope != NULL && catch_variable != NULL); | 2771 ASSERT(catch_scope != NULL && catch_variable != NULL); |
| 2767 int index = current_function_state_->NextHandlerIndex(); | 2772 int index = current_function_state_->NextHandlerIndex(); |
| 2768 TryCatchStatement* statement = factory()->NewTryCatchStatement( | 2773 TryCatchStatement* statement = factory()->NewTryCatchStatement( |
| 2769 index, try_block, catch_scope, catch_variable, catch_block); | 2774 index, try_block, catch_scope, catch_variable, catch_block); |
| 2770 statement->set_escaping_targets(try_collector.targets()); | 2775 statement->set_escaping_targets(try_collector.targets()); |
| 2771 try_block = factory()->NewBlock(NULL, 1, false); | 2776 try_block = factory()->NewBlock(NULL, 1, false); |
| 2772 try_block->AddStatement(statement); | 2777 try_block->AddStatement(statement, zone()); |
| 2773 catch_block = NULL; // Clear to indicate it's been handled. | 2778 catch_block = NULL; // Clear to indicate it's been handled. |
| 2774 } | 2779 } |
| 2775 | 2780 |
| 2776 TryStatement* result = NULL; | 2781 TryStatement* result = NULL; |
| 2777 if (catch_block != NULL) { | 2782 if (catch_block != NULL) { |
| 2778 ASSERT(finally_block == NULL); | 2783 ASSERT(finally_block == NULL); |
| 2779 ASSERT(catch_scope != NULL && catch_variable != NULL); | 2784 ASSERT(catch_scope != NULL && catch_variable != NULL); |
| 2780 int index = current_function_state_->NextHandlerIndex(); | 2785 int index = current_function_state_->NextHandlerIndex(); |
| 2781 result = factory()->NewTryCatchStatement( | 2786 result = factory()->NewTryCatchStatement( |
| 2782 index, try_block, catch_scope, catch_variable, catch_block); | 2787 index, try_block, catch_scope, catch_variable, catch_block); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2868 ForInStatement* loop = factory()->NewForInStatement(labels); | 2873 ForInStatement* loop = factory()->NewForInStatement(labels); |
| 2869 Target target(&this->target_stack_, loop); | 2874 Target target(&this->target_stack_, loop); |
| 2870 | 2875 |
| 2871 Expect(Token::IN, CHECK_OK); | 2876 Expect(Token::IN, CHECK_OK); |
| 2872 Expression* enumerable = ParseExpression(true, CHECK_OK); | 2877 Expression* enumerable = ParseExpression(true, CHECK_OK); |
| 2873 Expect(Token::RPAREN, CHECK_OK); | 2878 Expect(Token::RPAREN, CHECK_OK); |
| 2874 | 2879 |
| 2875 Statement* body = ParseStatement(NULL, CHECK_OK); | 2880 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2876 loop->Initialize(each, enumerable, body); | 2881 loop->Initialize(each, enumerable, body); |
| 2877 Block* result = factory()->NewBlock(NULL, 2, false); | 2882 Block* result = factory()->NewBlock(NULL, 2, false); |
| 2878 result->AddStatement(variable_statement); | 2883 result->AddStatement(variable_statement, zone()); |
| 2879 result->AddStatement(loop); | 2884 result->AddStatement(loop, zone()); |
| 2880 top_scope_ = saved_scope; | 2885 top_scope_ = saved_scope; |
| 2881 for_scope->set_end_position(scanner().location().end_pos); | 2886 for_scope->set_end_position(scanner().location().end_pos); |
| 2882 for_scope = for_scope->FinalizeBlockScope(); | 2887 for_scope = for_scope->FinalizeBlockScope(); |
| 2883 ASSERT(for_scope == NULL); | 2888 ASSERT(for_scope == NULL); |
| 2884 // Parsed for-in loop w/ variable/const declaration. | 2889 // Parsed for-in loop w/ variable/const declaration. |
| 2885 return result; | 2890 return result; |
| 2886 } else { | 2891 } else { |
| 2887 init = variable_statement; | 2892 init = variable_statement; |
| 2888 } | 2893 } |
| 2889 } else if (peek() == Token::LET) { | 2894 } else if (peek() == Token::LET) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2918 Expect(Token::IN, CHECK_OK); | 2923 Expect(Token::IN, CHECK_OK); |
| 2919 Expression* enumerable = ParseExpression(true, CHECK_OK); | 2924 Expression* enumerable = ParseExpression(true, CHECK_OK); |
| 2920 Expect(Token::RPAREN, CHECK_OK); | 2925 Expect(Token::RPAREN, CHECK_OK); |
| 2921 | 2926 |
| 2922 Statement* body = ParseStatement(NULL, CHECK_OK); | 2927 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2923 Block* body_block = factory()->NewBlock(NULL, 3, false); | 2928 Block* body_block = factory()->NewBlock(NULL, 3, false); |
| 2924 Assignment* assignment = factory()->NewAssignment( | 2929 Assignment* assignment = factory()->NewAssignment( |
| 2925 Token::ASSIGN, each, temp_proxy, RelocInfo::kNoPosition); | 2930 Token::ASSIGN, each, temp_proxy, RelocInfo::kNoPosition); |
| 2926 Statement* assignment_statement = | 2931 Statement* assignment_statement = |
| 2927 factory()->NewExpressionStatement(assignment); | 2932 factory()->NewExpressionStatement(assignment); |
| 2928 body_block->AddStatement(variable_statement); | 2933 body_block->AddStatement(variable_statement, zone()); |
| 2929 body_block->AddStatement(assignment_statement); | 2934 body_block->AddStatement(assignment_statement, zone()); |
| 2930 body_block->AddStatement(body); | 2935 body_block->AddStatement(body, zone()); |
| 2931 loop->Initialize(temp_proxy, enumerable, body_block); | 2936 loop->Initialize(temp_proxy, enumerable, body_block); |
| 2932 top_scope_ = saved_scope; | 2937 top_scope_ = saved_scope; |
| 2933 for_scope->set_end_position(scanner().location().end_pos); | 2938 for_scope->set_end_position(scanner().location().end_pos); |
| 2934 for_scope = for_scope->FinalizeBlockScope(); | 2939 for_scope = for_scope->FinalizeBlockScope(); |
| 2935 body_block->set_scope(for_scope); | 2940 body_block->set_scope(for_scope); |
| 2936 // Parsed for-in loop w/ let declaration. | 2941 // Parsed for-in loop w/ let declaration. |
| 2937 return loop; | 2942 return loop; |
| 2938 | 2943 |
| 2939 } else { | 2944 } else { |
| 2940 init = variable_statement; | 2945 init = variable_statement; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3003 // for (let x = i; c; n) b | 3008 // for (let x = i; c; n) b |
| 3004 // | 3009 // |
| 3005 // into | 3010 // into |
| 3006 // | 3011 // |
| 3007 // { | 3012 // { |
| 3008 // let x = i; | 3013 // let x = i; |
| 3009 // for (; c; n) b | 3014 // for (; c; n) b |
| 3010 // } | 3015 // } |
| 3011 ASSERT(init != NULL); | 3016 ASSERT(init != NULL); |
| 3012 Block* result = factory()->NewBlock(NULL, 2, false); | 3017 Block* result = factory()->NewBlock(NULL, 2, false); |
| 3013 result->AddStatement(init); | 3018 result->AddStatement(init, zone()); |
| 3014 result->AddStatement(loop); | 3019 result->AddStatement(loop, zone()); |
| 3015 result->set_scope(for_scope); | 3020 result->set_scope(for_scope); |
| 3016 if (loop) loop->Initialize(NULL, cond, next, body); | 3021 if (loop) loop->Initialize(NULL, cond, next, body); |
| 3017 return result; | 3022 return result; |
| 3018 } else { | 3023 } else { |
| 3019 if (loop) loop->Initialize(init, cond, next, body); | 3024 if (loop) loop->Initialize(init, cond, next, body); |
| 3020 return loop; | 3025 return loop; |
| 3021 } | 3026 } |
| 3022 } | 3027 } |
| 3023 | 3028 |
| 3024 | 3029 |
| (...skipping 2114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5139 // Alternative | Disjunction | 5144 // Alternative | Disjunction |
| 5140 // Alternative :: | 5145 // Alternative :: |
| 5141 // [empty] | 5146 // [empty] |
| 5142 // Term Alternative | 5147 // Term Alternative |
| 5143 // Term :: | 5148 // Term :: |
| 5144 // Assertion | 5149 // Assertion |
| 5145 // Atom | 5150 // Atom |
| 5146 // Atom Quantifier | 5151 // Atom Quantifier |
| 5147 RegExpTree* RegExpParser::ParseDisjunction() { | 5152 RegExpTree* RegExpParser::ParseDisjunction() { |
| 5148 // Used to store current state while parsing subexpressions. | 5153 // Used to store current state while parsing subexpressions. |
| 5149 RegExpParserState initial_state(NULL, INITIAL, 0); | 5154 RegExpParserState initial_state(NULL, INITIAL, 0, zone()); |
| 5150 RegExpParserState* stored_state = &initial_state; | 5155 RegExpParserState* stored_state = &initial_state; |
| 5151 // Cache the builder in a local variable for quick access. | 5156 // Cache the builder in a local variable for quick access. |
| 5152 RegExpBuilder* builder = initial_state.builder(); | 5157 RegExpBuilder* builder = initial_state.builder(); |
| 5153 while (true) { | 5158 while (true) { |
| 5154 switch (current()) { | 5159 switch (current()) { |
| 5155 case kEndMarker: | 5160 case kEndMarker: |
| 5156 if (stored_state->IsSubexpression()) { | 5161 if (stored_state->IsSubexpression()) { |
| 5157 // Inside a parenthesized group when hitting end of input. | 5162 // Inside a parenthesized group when hitting end of input. |
| 5158 ReportError(CStrVector("Unterminated group") CHECK_FAILED); | 5163 ReportError(CStrVector("Unterminated group") CHECK_FAILED); |
| 5159 } | 5164 } |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5259 } else { | 5264 } else { |
| 5260 if (captures_ == NULL) { | 5265 if (captures_ == NULL) { |
| 5261 captures_ = new(zone()) ZoneList<RegExpCapture*>(2); | 5266 captures_ = new(zone()) ZoneList<RegExpCapture*>(2); |
| 5262 } | 5267 } |
| 5263 if (captures_started() >= kMaxCaptures) { | 5268 if (captures_started() >= kMaxCaptures) { |
| 5264 ReportError(CStrVector("Too many captures") CHECK_FAILED); | 5269 ReportError(CStrVector("Too many captures") CHECK_FAILED); |
| 5265 } | 5270 } |
| 5266 captures_->Add(NULL); | 5271 captures_->Add(NULL); |
| 5267 } | 5272 } |
| 5268 // Store current state and begin new disjunction parsing. | 5273 // Store current state and begin new disjunction parsing. |
| 5269 stored_state = new(zone()) RegExpParserState(stored_state, | 5274 stored_state = new(zone()) RegExpParserState(stored_state, type, |
| 5270 type, | 5275 captures_started(), zone()); |
| 5271 captures_started()); | |
| 5272 builder = stored_state->builder(); | 5276 builder = stored_state->builder(); |
| 5273 continue; | 5277 continue; |
| 5274 } | 5278 } |
| 5275 case '[': { | 5279 case '[': { |
| 5276 RegExpTree* atom = ParseCharacterClass(CHECK_FAILED); | 5280 RegExpTree* atom = ParseCharacterClass(CHECK_FAILED); |
| 5277 builder->AddAtom(atom); | 5281 builder->AddAtom(atom); |
| 5278 break; | 5282 break; |
| 5279 } | 5283 } |
| 5280 // Atom :: | 5284 // Atom :: |
| 5281 // \ AtomEscape | 5285 // \ AtomEscape |
| (...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6013 } | 6017 } |
| 6014 if (!info->is_native() && FLAG_harmony_modules) { | 6018 if (!info->is_native() && FLAG_harmony_modules) { |
| 6015 parsing_flags |= kAllowModules; | 6019 parsing_flags |= kAllowModules; |
| 6016 } | 6020 } |
| 6017 if (FLAG_allow_natives_syntax || info->is_native()) { | 6021 if (FLAG_allow_natives_syntax || info->is_native()) { |
| 6018 // We require %identifier(..) syntax. | 6022 // We require %identifier(..) syntax. |
| 6019 parsing_flags |= kAllowNativesSyntax; | 6023 parsing_flags |= kAllowNativesSyntax; |
| 6020 } | 6024 } |
| 6021 if (info->is_lazy()) { | 6025 if (info->is_lazy()) { |
| 6022 ASSERT(!info->is_eval()); | 6026 ASSERT(!info->is_eval()); |
| 6023 Parser parser(script, parsing_flags, NULL, NULL); | 6027 Parser parser(script, parsing_flags, NULL, NULL, info->isolate()->zone()); |
| 6024 if (info->shared_info()->is_function()) { | 6028 if (info->shared_info()->is_function()) { |
| 6025 result = parser.ParseLazy(info); | 6029 result = parser.ParseLazy(info); |
| 6026 } else { | 6030 } else { |
| 6027 result = parser.ParseProgram(info); | 6031 result = parser.ParseProgram(info); |
| 6028 } | 6032 } |
| 6029 } else { | 6033 } else { |
| 6030 ScriptDataImpl* pre_data = info->pre_parse_data(); | 6034 ScriptDataImpl* pre_data = info->pre_parse_data(); |
| 6031 Parser parser(script, parsing_flags, info->extension(), pre_data); | 6035 Parser parser(script, parsing_flags, info->extension(), pre_data, |
| 6036 info->isolate()->zone()); |
| 6032 if (pre_data != NULL && pre_data->has_error()) { | 6037 if (pre_data != NULL && pre_data->has_error()) { |
| 6033 Scanner::Location loc = pre_data->MessageLocation(); | 6038 Scanner::Location loc = pre_data->MessageLocation(); |
| 6034 const char* message = pre_data->BuildMessage(); | 6039 const char* message = pre_data->BuildMessage(); |
| 6035 Vector<const char*> args = pre_data->BuildArgs(); | 6040 Vector<const char*> args = pre_data->BuildArgs(); |
| 6036 parser.ReportMessageAt(loc, message, args); | 6041 parser.ReportMessageAt(loc, message, args); |
| 6037 DeleteArray(message); | 6042 DeleteArray(message); |
| 6038 for (int i = 0; i < args.length(); i++) { | 6043 for (int i = 0; i < args.length(); i++) { |
| 6039 DeleteArray(args[i]); | 6044 DeleteArray(args[i]); |
| 6040 } | 6045 } |
| 6041 DeleteArray(args.start()); | 6046 DeleteArray(args.start()); |
| 6042 ASSERT(info->isolate()->has_pending_exception()); | 6047 ASSERT(info->isolate()->has_pending_exception()); |
| 6043 } else { | 6048 } else { |
| 6044 result = parser.ParseProgram(info); | 6049 result = parser.ParseProgram(info); |
| 6045 } | 6050 } |
| 6046 } | 6051 } |
| 6047 info->SetFunction(result); | 6052 info->SetFunction(result); |
| 6048 return (result != NULL); | 6053 return (result != NULL); |
| 6049 } | 6054 } |
| 6050 | 6055 |
| 6051 } } // namespace v8::internal | 6056 } } // namespace v8::internal |
| OLD | NEW |