OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 text_.Get(i)->AppendToText(text); | 120 text_.Get(i)->AppendToText(text); |
121 terms_.Add(text); | 121 terms_.Add(text); |
122 } | 122 } |
123 text_.Clear(); | 123 text_.Clear(); |
124 } | 124 } |
125 | 125 |
126 | 126 |
127 void RegExpBuilder::AddCharacter(uc16 c) { | 127 void RegExpBuilder::AddCharacter(uc16 c) { |
128 pending_empty_ = false; | 128 pending_empty_ = false; |
129 if (characters_ == NULL) { | 129 if (characters_ == NULL) { |
130 characters_ = new ZoneList<uc16>(4); | 130 characters_ = new(zone()) ZoneList<uc16>(4); |
131 } | 131 } |
132 characters_->Add(c); | 132 characters_->Add(c); |
133 LAST(ADD_CHAR); | 133 LAST(ADD_CHAR); |
134 } | 134 } |
135 | 135 |
136 | 136 |
137 void RegExpBuilder::AddEmpty() { | 137 void RegExpBuilder::AddEmpty() { |
138 pending_empty_ = true; | 138 pending_empty_ = true; |
139 } | 139 } |
140 | 140 |
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
632 ? Scope::GLOBAL_SCOPE | 632 ? Scope::GLOBAL_SCOPE |
633 : Scope::EVAL_SCOPE; | 633 : Scope::EVAL_SCOPE; |
634 Handle<String> no_name = isolate()->factory()->empty_symbol(); | 634 Handle<String> no_name = isolate()->factory()->empty_symbol(); |
635 | 635 |
636 FunctionLiteral* result = NULL; | 636 FunctionLiteral* result = NULL; |
637 { Scope* scope = NewScope(top_scope_, type, inside_with()); | 637 { Scope* scope = NewScope(top_scope_, type, inside_with()); |
638 LexicalScope lexical_scope(this, scope, isolate()); | 638 LexicalScope lexical_scope(this, scope, isolate()); |
639 if (strict_mode == kStrictMode) { | 639 if (strict_mode == kStrictMode) { |
640 top_scope_->EnableStrictMode(); | 640 top_scope_->EnableStrictMode(); |
641 } | 641 } |
642 ZoneList<Statement*>* body = new ZoneList<Statement*>(16); | 642 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16); |
643 bool ok = true; | 643 bool ok = true; |
644 int beg_loc = scanner().location().beg_pos; | 644 int beg_loc = scanner().location().beg_pos; |
645 ParseSourceElements(body, Token::EOS, &ok); | 645 ParseSourceElements(body, Token::EOS, &ok); |
646 if (ok && top_scope_->is_strict_mode()) { | 646 if (ok && top_scope_->is_strict_mode()) { |
647 CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok); | 647 CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok); |
648 } | 648 } |
649 if (ok) { | 649 if (ok) { |
650 result = new(zone()) FunctionLiteral( | 650 result = new(zone()) FunctionLiteral( |
651 no_name, | 651 no_name, |
652 top_scope_, | 652 top_scope_, |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1042 | 1042 |
1043 void AssignmentFromSomethingElse() { | 1043 void AssignmentFromSomethingElse() { |
1044 // The this assignment is not a simple one. | 1044 // The this assignment is not a simple one. |
1045 only_simple_this_property_assignments_ = false; | 1045 only_simple_this_property_assignments_ = false; |
1046 } | 1046 } |
1047 | 1047 |
1048 void EnsureAllocation() { | 1048 void EnsureAllocation() { |
1049 if (names_ == NULL) { | 1049 if (names_ == NULL) { |
1050 ASSERT(assigned_arguments_ == NULL); | 1050 ASSERT(assigned_arguments_ == NULL); |
1051 ASSERT(assigned_constants_ == NULL); | 1051 ASSERT(assigned_constants_ == NULL); |
1052 names_ = new ZoneStringList(4); | 1052 Zone* zone = isolate_->zone(); |
1053 assigned_arguments_ = new ZoneList<int>(4); | 1053 names_ = new(zone) ZoneStringList(4); |
1054 assigned_constants_ = new ZoneObjectList(4); | 1054 assigned_arguments_ = new(zone) ZoneList<int>(4); |
| 1055 assigned_constants_ = new(zone) ZoneObjectList(4); |
1055 } | 1056 } |
1056 } | 1057 } |
1057 | 1058 |
1058 Isolate* isolate_; | 1059 Isolate* isolate_; |
1059 bool only_simple_this_property_assignments_; | 1060 bool only_simple_this_property_assignments_; |
1060 ZoneStringList* names_; | 1061 ZoneStringList* names_; |
1061 ZoneList<int>* assigned_arguments_; | 1062 ZoneList<int>* assigned_arguments_; |
1062 ZoneObjectList* assigned_constants_; | 1063 ZoneObjectList* assigned_constants_; |
1063 }; | 1064 }; |
1064 | 1065 |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1646 // guarantee to give the global object a "local" variable; a | 1647 // guarantee to give the global object a "local" variable; a |
1647 // variable defined in the global object and not in any | 1648 // variable defined in the global object and not in any |
1648 // prototype. This way, global variable declarations can shadow | 1649 // prototype. This way, global variable declarations can shadow |
1649 // properties in the prototype chain, but only after the variable | 1650 // properties in the prototype chain, but only after the variable |
1650 // declaration statement has been executed. This is important in | 1651 // declaration statement has been executed. This is important in |
1651 // browsers where the global object (window) has lots of | 1652 // browsers where the global object (window) has lots of |
1652 // properties defined in prototype objects. | 1653 // properties defined in prototype objects. |
1653 | 1654 |
1654 if (top_scope_->is_global_scope()) { | 1655 if (top_scope_->is_global_scope()) { |
1655 // Compute the arguments for the runtime call. | 1656 // Compute the arguments for the runtime call. |
1656 ZoneList<Expression*>* arguments = new ZoneList<Expression*>(3); | 1657 ZoneList<Expression*>* arguments = new(zone()) ZoneList<Expression*>(3); |
1657 // We have at least 1 parameter. | 1658 // We have at least 1 parameter. |
1658 arguments->Add(new(zone()) Literal(name)); | 1659 arguments->Add(new(zone()) Literal(name)); |
1659 CallRuntime* initialize; | 1660 CallRuntime* initialize; |
1660 | 1661 |
1661 if (is_const) { | 1662 if (is_const) { |
1662 arguments->Add(value); | 1663 arguments->Add(value); |
1663 value = NULL; // zap the value to avoid the unnecessary assignment | 1664 value = NULL; // zap the value to avoid the unnecessary assignment |
1664 | 1665 |
1665 // Construct the call to Runtime_InitializeConstGlobal | 1666 // Construct the call to Runtime_InitializeConstGlobal |
1666 // and add it to the initialization statement block. | 1667 // and add it to the initialization statement block. |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1763 // structured. However, these are probably changes we want to | 1764 // structured. However, these are probably changes we want to |
1764 // make later anyway so we should go back and fix this then. | 1765 // make later anyway so we should go back and fix this then. |
1765 if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) { | 1766 if (ContainsLabel(labels, label) || TargetStackContainsLabel(label)) { |
1766 SmartPointer<char> c_string = label->ToCString(DISALLOW_NULLS); | 1767 SmartPointer<char> c_string = label->ToCString(DISALLOW_NULLS); |
1767 const char* elms[2] = { "Label", *c_string }; | 1768 const char* elms[2] = { "Label", *c_string }; |
1768 Vector<const char*> args(elms, 2); | 1769 Vector<const char*> args(elms, 2); |
1769 ReportMessage("redeclaration", args); | 1770 ReportMessage("redeclaration", args); |
1770 *ok = false; | 1771 *ok = false; |
1771 return NULL; | 1772 return NULL; |
1772 } | 1773 } |
1773 if (labels == NULL) labels = new ZoneStringList(4); | 1774 if (labels == NULL) labels = new(zone()) ZoneStringList(4); |
1774 labels->Add(label); | 1775 labels->Add(label); |
1775 // Remove the "ghost" variable that turned out to be a label | 1776 // Remove the "ghost" variable that turned out to be a label |
1776 // from the top scope. This way, we don't try to resolve it | 1777 // from the top scope. This way, we don't try to resolve it |
1777 // during the scope processing. | 1778 // during the scope processing. |
1778 top_scope_->RemoveUnresolved(var); | 1779 top_scope_->RemoveUnresolved(var); |
1779 Expect(Token::COLON, CHECK_OK); | 1780 Expect(Token::COLON, CHECK_OK); |
1780 return ParseStatement(labels, ok); | 1781 return ParseStatement(labels, ok); |
1781 } | 1782 } |
1782 | 1783 |
1783 // Parsed expression statement. | 1784 // Parsed expression statement. |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1904 ExpectSemicolon(CHECK_OK); | 1905 ExpectSemicolon(CHECK_OK); |
1905 return new(zone()) ReturnStatement(expr); | 1906 return new(zone()) ReturnStatement(expr); |
1906 } | 1907 } |
1907 | 1908 |
1908 | 1909 |
1909 Block* Parser::WithHelper(Expression* obj, | 1910 Block* Parser::WithHelper(Expression* obj, |
1910 ZoneStringList* labels, | 1911 ZoneStringList* labels, |
1911 bool is_catch_block, | 1912 bool is_catch_block, |
1912 bool* ok) { | 1913 bool* ok) { |
1913 // Parse the statement and collect escaping labels. | 1914 // Parse the statement and collect escaping labels. |
1914 ZoneList<Label*>* target_list = new ZoneList<Label*>(0); | 1915 ZoneList<Label*>* target_list = new(zone()) ZoneList<Label*>(0); |
1915 TargetCollector collector(target_list); | 1916 TargetCollector collector(target_list); |
1916 Statement* stat; | 1917 Statement* stat; |
1917 { Target target(&this->target_stack_, &collector); | 1918 { Target target(&this->target_stack_, &collector); |
1918 with_nesting_level_++; | 1919 with_nesting_level_++; |
1919 top_scope_->RecordWithStatement(); | 1920 top_scope_->RecordWithStatement(); |
1920 stat = ParseStatement(labels, CHECK_OK); | 1921 stat = ParseStatement(labels, CHECK_OK); |
1921 with_nesting_level_--; | 1922 with_nesting_level_--; |
1922 } | 1923 } |
1923 // Create resulting block with two statements. | 1924 // Create resulting block with two statements. |
1924 // 1: Evaluate the with expression. | 1925 // 1: Evaluate the with expression. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1979 if (*default_seen_ptr) { | 1980 if (*default_seen_ptr) { |
1980 ReportMessage("multiple_defaults_in_switch", | 1981 ReportMessage("multiple_defaults_in_switch", |
1981 Vector<const char*>::empty()); | 1982 Vector<const char*>::empty()); |
1982 *ok = false; | 1983 *ok = false; |
1983 return NULL; | 1984 return NULL; |
1984 } | 1985 } |
1985 *default_seen_ptr = true; | 1986 *default_seen_ptr = true; |
1986 } | 1987 } |
1987 Expect(Token::COLON, CHECK_OK); | 1988 Expect(Token::COLON, CHECK_OK); |
1988 int pos = scanner().location().beg_pos; | 1989 int pos = scanner().location().beg_pos; |
1989 ZoneList<Statement*>* statements = new ZoneList<Statement*>(5); | 1990 ZoneList<Statement*>* statements = new(zone()) ZoneList<Statement*>(5); |
1990 while (peek() != Token::CASE && | 1991 while (peek() != Token::CASE && |
1991 peek() != Token::DEFAULT && | 1992 peek() != Token::DEFAULT && |
1992 peek() != Token::RBRACE) { | 1993 peek() != Token::RBRACE) { |
1993 Statement* stat = ParseStatement(NULL, CHECK_OK); | 1994 Statement* stat = ParseStatement(NULL, CHECK_OK); |
1994 statements->Add(stat); | 1995 statements->Add(stat); |
1995 } | 1996 } |
1996 | 1997 |
1997 return new(zone()) CaseClause(label, statements, pos); | 1998 return new(zone()) CaseClause(label, statements, pos); |
1998 } | 1999 } |
1999 | 2000 |
2000 | 2001 |
2001 SwitchStatement* Parser::ParseSwitchStatement(ZoneStringList* labels, | 2002 SwitchStatement* Parser::ParseSwitchStatement(ZoneStringList* labels, |
2002 bool* ok) { | 2003 bool* ok) { |
2003 // SwitchStatement :: | 2004 // SwitchStatement :: |
2004 // 'switch' '(' Expression ')' '{' CaseClause* '}' | 2005 // 'switch' '(' Expression ')' '{' CaseClause* '}' |
2005 | 2006 |
2006 SwitchStatement* statement = new(zone()) SwitchStatement(labels); | 2007 SwitchStatement* statement = new(zone()) SwitchStatement(labels); |
2007 Target target(&this->target_stack_, statement); | 2008 Target target(&this->target_stack_, statement); |
2008 | 2009 |
2009 Expect(Token::SWITCH, CHECK_OK); | 2010 Expect(Token::SWITCH, CHECK_OK); |
2010 Expect(Token::LPAREN, CHECK_OK); | 2011 Expect(Token::LPAREN, CHECK_OK); |
2011 Expression* tag = ParseExpression(true, CHECK_OK); | 2012 Expression* tag = ParseExpression(true, CHECK_OK); |
2012 Expect(Token::RPAREN, CHECK_OK); | 2013 Expect(Token::RPAREN, CHECK_OK); |
2013 | 2014 |
2014 bool default_seen = false; | 2015 bool default_seen = false; |
2015 ZoneList<CaseClause*>* cases = new ZoneList<CaseClause*>(4); | 2016 ZoneList<CaseClause*>* cases = new(zone()) ZoneList<CaseClause*>(4); |
2016 Expect(Token::LBRACE, CHECK_OK); | 2017 Expect(Token::LBRACE, CHECK_OK); |
2017 while (peek() != Token::RBRACE) { | 2018 while (peek() != Token::RBRACE) { |
2018 CaseClause* clause = ParseCaseClause(&default_seen, CHECK_OK); | 2019 CaseClause* clause = ParseCaseClause(&default_seen, CHECK_OK); |
2019 cases->Add(clause); | 2020 cases->Add(clause); |
2020 } | 2021 } |
2021 Expect(Token::RBRACE, CHECK_OK); | 2022 Expect(Token::RBRACE, CHECK_OK); |
2022 | 2023 |
2023 if (statement) statement->Initialize(tag, cases); | 2024 if (statement) statement->Initialize(tag, cases); |
2024 return statement; | 2025 return statement; |
2025 } | 2026 } |
(...skipping 24 matching lines...) Expand all Loading... |
2050 // 'try' Block Catch Finally | 2051 // 'try' Block Catch Finally |
2051 // | 2052 // |
2052 // Catch :: | 2053 // Catch :: |
2053 // 'catch' '(' Identifier ')' Block | 2054 // 'catch' '(' Identifier ')' Block |
2054 // | 2055 // |
2055 // Finally :: | 2056 // Finally :: |
2056 // 'finally' Block | 2057 // 'finally' Block |
2057 | 2058 |
2058 Expect(Token::TRY, CHECK_OK); | 2059 Expect(Token::TRY, CHECK_OK); |
2059 | 2060 |
2060 ZoneList<Label*>* target_list = new ZoneList<Label*>(0); | 2061 ZoneList<Label*>* target_list = new(zone()) ZoneList<Label*>(0); |
2061 TargetCollector collector(target_list); | 2062 TargetCollector collector(target_list); |
2062 Block* try_block; | 2063 Block* try_block; |
2063 | 2064 |
2064 { Target target(&this->target_stack_, &collector); | 2065 { Target target(&this->target_stack_, &collector); |
2065 try_block = ParseBlock(NULL, CHECK_OK); | 2066 try_block = ParseBlock(NULL, CHECK_OK); |
2066 } | 2067 } |
2067 | 2068 |
2068 Block* catch_block = NULL; | 2069 Block* catch_block = NULL; |
2069 Variable* catch_var = NULL; | 2070 Variable* catch_var = NULL; |
2070 Block* finally_block = NULL; | 2071 Block* finally_block = NULL; |
2071 | 2072 |
2072 Token::Value tok = peek(); | 2073 Token::Value tok = peek(); |
2073 if (tok != Token::CATCH && tok != Token::FINALLY) { | 2074 if (tok != Token::CATCH && tok != Token::FINALLY) { |
2074 ReportMessage("no_catch_or_finally", Vector<const char*>::empty()); | 2075 ReportMessage("no_catch_or_finally", Vector<const char*>::empty()); |
2075 *ok = false; | 2076 *ok = false; |
2076 return NULL; | 2077 return NULL; |
2077 } | 2078 } |
2078 | 2079 |
2079 // If we can break out from the catch block and there is a finally block, | 2080 // If we can break out from the catch block and there is a finally block, |
2080 // then we will need to collect jump targets from the catch block. Since | 2081 // then we will need to collect jump targets from the catch block. Since |
2081 // we don't know yet if there will be a finally block, we always collect | 2082 // we don't know yet if there will be a finally block, we always collect |
2082 // the jump targets. | 2083 // the jump targets. |
2083 ZoneList<Label*>* catch_target_list = new ZoneList<Label*>(0); | 2084 ZoneList<Label*>* catch_target_list = new(zone()) ZoneList<Label*>(0); |
2084 TargetCollector catch_collector(catch_target_list); | 2085 TargetCollector catch_collector(catch_target_list); |
2085 bool has_catch = false; | 2086 bool has_catch = false; |
2086 if (tok == Token::CATCH) { | 2087 if (tok == Token::CATCH) { |
2087 has_catch = true; | 2088 has_catch = true; |
2088 Consume(Token::CATCH); | 2089 Consume(Token::CATCH); |
2089 | 2090 |
2090 Expect(Token::LPAREN, CHECK_OK); | 2091 Expect(Token::LPAREN, CHECK_OK); |
2091 Handle<String> name = ParseIdentifier(CHECK_OK); | 2092 Handle<String> name = ParseIdentifier(CHECK_OK); |
2092 | 2093 |
2093 if (top_scope_->is_strict_mode() && IsEvalOrArguments(name)) { | 2094 if (top_scope_->is_strict_mode() && IsEvalOrArguments(name)) { |
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2719 | 2720 |
2720 Expression* result; | 2721 Expression* result; |
2721 if (peek() == Token::NEW) { | 2722 if (peek() == Token::NEW) { |
2722 result = ParseNewPrefix(stack, CHECK_OK); | 2723 result = ParseNewPrefix(stack, CHECK_OK); |
2723 } else { | 2724 } else { |
2724 result = ParseMemberWithNewPrefixesExpression(stack, CHECK_OK); | 2725 result = ParseMemberWithNewPrefixesExpression(stack, CHECK_OK); |
2725 } | 2726 } |
2726 | 2727 |
2727 if (!stack->is_empty()) { | 2728 if (!stack->is_empty()) { |
2728 int last = stack->pop(); | 2729 int last = stack->pop(); |
2729 result = new(zone()) CallNew(result, new ZoneList<Expression*>(0), last); | 2730 result = new(zone()) CallNew(result, |
| 2731 new(zone()) ZoneList<Expression*>(0), |
| 2732 last); |
2730 } | 2733 } |
2731 return result; | 2734 return result; |
2732 } | 2735 } |
2733 | 2736 |
2734 | 2737 |
2735 Expression* Parser::ParseNewExpression(bool* ok) { | 2738 Expression* Parser::ParseNewExpression(bool* ok) { |
2736 PositionStack stack(ok); | 2739 PositionStack stack(ok); |
2737 return ParseNewPrefix(&stack, ok); | 2740 return ParseNewPrefix(&stack, ok); |
2738 } | 2741 } |
2739 | 2742 |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2986 | 2989 |
2987 *is_simple = is_simple_acc; | 2990 *is_simple = is_simple_acc; |
2988 *depth = depth_acc; | 2991 *depth = depth_acc; |
2989 } | 2992 } |
2990 | 2993 |
2991 | 2994 |
2992 Expression* Parser::ParseArrayLiteral(bool* ok) { | 2995 Expression* Parser::ParseArrayLiteral(bool* ok) { |
2993 // ArrayLiteral :: | 2996 // ArrayLiteral :: |
2994 // '[' Expression? (',' Expression?)* ']' | 2997 // '[' Expression? (',' Expression?)* ']' |
2995 | 2998 |
2996 ZoneList<Expression*>* values = new ZoneList<Expression*>(4); | 2999 ZoneList<Expression*>* values = new(zone()) ZoneList<Expression*>(4); |
2997 Expect(Token::LBRACK, CHECK_OK); | 3000 Expect(Token::LBRACK, CHECK_OK); |
2998 while (peek() != Token::RBRACK) { | 3001 while (peek() != Token::RBRACK) { |
2999 Expression* elem; | 3002 Expression* elem; |
3000 if (peek() == Token::COMMA) { | 3003 if (peek() == Token::COMMA) { |
3001 elem = GetLiteralTheHole(); | 3004 elem = GetLiteralTheHole(); |
3002 } else { | 3005 } else { |
3003 elem = ParseAssignmentExpression(true, CHECK_OK); | 3006 elem = ParseAssignmentExpression(true, CHECK_OK); |
3004 } | 3007 } |
3005 values->Add(elem); | 3008 values->Add(elem); |
3006 if (peek() != Token::RBRACK) { | 3009 if (peek() != Token::RBRACK) { |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3328 | 3331 |
3329 | 3332 |
3330 Expression* Parser::ParseObjectLiteral(bool* ok) { | 3333 Expression* Parser::ParseObjectLiteral(bool* ok) { |
3331 // ObjectLiteral :: | 3334 // ObjectLiteral :: |
3332 // '{' ( | 3335 // '{' ( |
3333 // ((IdentifierName | String | Number) ':' AssignmentExpression) | 3336 // ((IdentifierName | String | Number) ':' AssignmentExpression) |
3334 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) | 3337 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) |
3335 // )*[','] '}' | 3338 // )*[','] '}' |
3336 | 3339 |
3337 ZoneList<ObjectLiteral::Property*>* properties = | 3340 ZoneList<ObjectLiteral::Property*>* properties = |
3338 new ZoneList<ObjectLiteral::Property*>(4); | 3341 new(zone()) ZoneList<ObjectLiteral::Property*>(4); |
3339 int number_of_boilerplate_properties = 0; | 3342 int number_of_boilerplate_properties = 0; |
3340 bool has_function = false; | 3343 bool has_function = false; |
3341 | 3344 |
3342 ObjectLiteralPropertyChecker checker(this, top_scope_->is_strict_mode()); | 3345 ObjectLiteralPropertyChecker checker(this, top_scope_->is_strict_mode()); |
3343 | 3346 |
3344 Expect(Token::LBRACE, CHECK_OK); | 3347 Expect(Token::LBRACE, CHECK_OK); |
3345 Scanner::Location loc = scanner().location(); | 3348 Scanner::Location loc = scanner().location(); |
3346 | 3349 |
3347 while (peek() != Token::RBRACE) { | 3350 while (peek() != Token::RBRACE) { |
3348 if (fni_ != NULL) fni_->Enter(); | 3351 if (fni_ != NULL) fni_->Enter(); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3490 Next(); | 3493 Next(); |
3491 | 3494 |
3492 return new(zone()) RegExpLiteral(js_pattern, js_flags, literal_index); | 3495 return new(zone()) RegExpLiteral(js_pattern, js_flags, literal_index); |
3493 } | 3496 } |
3494 | 3497 |
3495 | 3498 |
3496 ZoneList<Expression*>* Parser::ParseArguments(bool* ok) { | 3499 ZoneList<Expression*>* Parser::ParseArguments(bool* ok) { |
3497 // Arguments :: | 3500 // Arguments :: |
3498 // '(' (AssignmentExpression)*[','] ')' | 3501 // '(' (AssignmentExpression)*[','] ')' |
3499 | 3502 |
3500 ZoneList<Expression*>* result = new ZoneList<Expression*>(4); | 3503 ZoneList<Expression*>* result = new(zone()) ZoneList<Expression*>(4); |
3501 Expect(Token::LPAREN, CHECK_OK); | 3504 Expect(Token::LPAREN, CHECK_OK); |
3502 bool done = (peek() == Token::RPAREN); | 3505 bool done = (peek() == Token::RPAREN); |
3503 while (!done) { | 3506 while (!done) { |
3504 Expression* argument = ParseAssignmentExpression(true, CHECK_OK); | 3507 Expression* argument = ParseAssignmentExpression(true, CHECK_OK); |
3505 result->Add(argument); | 3508 result->Add(argument); |
3506 done = (peek() == Token::RPAREN); | 3509 done = (peek() == Token::RPAREN); |
3507 if (!done) Expect(Token::COMMA, CHECK_OK); | 3510 if (!done) Expect(Token::COMMA, CHECK_OK); |
3508 } | 3511 } |
3509 Expect(Token::RPAREN, CHECK_OK); | 3512 Expect(Token::RPAREN, CHECK_OK); |
3510 return result; | 3513 return result; |
(...skipping 16 matching lines...) Expand all Loading... |
3527 Handle<String> name = | 3530 Handle<String> name = |
3528 is_named ? var_name : isolate()->factory()->empty_symbol(); | 3531 is_named ? var_name : isolate()->factory()->empty_symbol(); |
3529 // The function name, if any. | 3532 // The function name, if any. |
3530 Handle<String> function_name = isolate()->factory()->empty_symbol(); | 3533 Handle<String> function_name = isolate()->factory()->empty_symbol(); |
3531 if (is_named && (type == EXPRESSION || type == NESTED)) { | 3534 if (is_named && (type == EXPRESSION || type == NESTED)) { |
3532 function_name = name; | 3535 function_name = name; |
3533 } | 3536 } |
3534 | 3537 |
3535 int num_parameters = 0; | 3538 int num_parameters = 0; |
3536 Scope* scope = NewScope(top_scope_, Scope::FUNCTION_SCOPE, inside_with()); | 3539 Scope* scope = NewScope(top_scope_, Scope::FUNCTION_SCOPE, inside_with()); |
3537 ZoneList<Statement*>* body = new ZoneList<Statement*>(8); | 3540 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8); |
3538 int materialized_literal_count; | 3541 int materialized_literal_count; |
3539 int expected_property_count; | 3542 int expected_property_count; |
3540 int start_pos; | 3543 int start_pos; |
3541 int end_pos; | 3544 int end_pos; |
3542 bool only_simple_this_property_assignments; | 3545 bool only_simple_this_property_assignments; |
3543 Handle<FixedArray> this_property_assignments; | 3546 Handle<FixedArray> this_property_assignments; |
3544 // Parse function body. | 3547 // Parse function body. |
3545 { LexicalScope lexical_scope(this, scope, isolate()); | 3548 { LexicalScope lexical_scope(this, scope, isolate()); |
3546 top_scope_->SetScopeName(name); | 3549 top_scope_->SetScopeName(name); |
3547 | 3550 |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4000 TENURED); | 4003 TENURED); |
4001 for (int i = 0; i < argc; i++) { | 4004 for (int i = 0; i < argc; i++) { |
4002 Handle<Object> element = arguments[i]; | 4005 Handle<Object> element = arguments[i]; |
4003 if (!element.is_null()) { | 4006 if (!element.is_null()) { |
4004 elements->set(i, *element); | 4007 elements->set(i, *element); |
4005 } | 4008 } |
4006 } | 4009 } |
4007 Handle<JSArray> array = isolate()->factory()->NewJSArrayWithElements(elements, | 4010 Handle<JSArray> array = isolate()->factory()->NewJSArrayWithElements(elements, |
4008 TENURED); | 4011 TENURED); |
4009 | 4012 |
4010 ZoneList<Expression*>* args = new ZoneList<Expression*>(2); | 4013 ZoneList<Expression*>* args = new(zone()) ZoneList<Expression*>(2); |
4011 args->Add(new(zone()) Literal(type)); | 4014 args->Add(new(zone()) Literal(type)); |
4012 args->Add(new(zone()) Literal(array)); | 4015 args->Add(new(zone()) Literal(array)); |
4013 return new(zone()) Throw(new(zone()) CallRuntime(constructor, NULL, args), | 4016 return new(zone()) Throw(new(zone()) CallRuntime(constructor, NULL, args), |
4014 scanner().location().beg_pos); | 4017 scanner().location().beg_pos); |
4015 } | 4018 } |
4016 | 4019 |
4017 // ---------------------------------------------------------------------------- | 4020 // ---------------------------------------------------------------------------- |
4018 // JSON | 4021 // JSON |
4019 | 4022 |
4020 Handle<Object> JsonParser::ParseJson(Handle<String> script, | 4023 Handle<Object> JsonParser::ParseJson(Handle<String> script, |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4389 Advance(); | 4392 Advance(); |
4390 RegExpAssertion::Type type = | 4393 RegExpAssertion::Type type = |
4391 multiline_ ? RegExpAssertion::END_OF_LINE : | 4394 multiline_ ? RegExpAssertion::END_OF_LINE : |
4392 RegExpAssertion::END_OF_INPUT; | 4395 RegExpAssertion::END_OF_INPUT; |
4393 builder->AddAssertion(new(zone()) RegExpAssertion(type)); | 4396 builder->AddAssertion(new(zone()) RegExpAssertion(type)); |
4394 continue; | 4397 continue; |
4395 } | 4398 } |
4396 case '.': { | 4399 case '.': { |
4397 Advance(); | 4400 Advance(); |
4398 // everything except \x0a, \x0d, \u2028 and \u2029 | 4401 // everything except \x0a, \x0d, \u2028 and \u2029 |
4399 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2); | 4402 ZoneList<CharacterRange>* ranges = |
| 4403 new(zone()) ZoneList<CharacterRange>(2); |
4400 CharacterRange::AddClassEscape('.', ranges); | 4404 CharacterRange::AddClassEscape('.', ranges); |
4401 RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false); | 4405 RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false); |
4402 builder->AddAtom(atom); | 4406 builder->AddAtom(atom); |
4403 break; | 4407 break; |
4404 } | 4408 } |
4405 case '(': { | 4409 case '(': { |
4406 SubexpressionType type = CAPTURE; | 4410 SubexpressionType type = CAPTURE; |
4407 Advance(); | 4411 Advance(); |
4408 if (current() == '?') { | 4412 if (current() == '?') { |
4409 switch (Next()) { | 4413 switch (Next()) { |
4410 case ':': | 4414 case ':': |
4411 type = GROUPING; | 4415 type = GROUPING; |
4412 break; | 4416 break; |
4413 case '=': | 4417 case '=': |
4414 type = POSITIVE_LOOKAHEAD; | 4418 type = POSITIVE_LOOKAHEAD; |
4415 break; | 4419 break; |
4416 case '!': | 4420 case '!': |
4417 type = NEGATIVE_LOOKAHEAD; | 4421 type = NEGATIVE_LOOKAHEAD; |
4418 break; | 4422 break; |
4419 default: | 4423 default: |
4420 ReportError(CStrVector("Invalid group") CHECK_FAILED); | 4424 ReportError(CStrVector("Invalid group") CHECK_FAILED); |
4421 break; | 4425 break; |
4422 } | 4426 } |
4423 Advance(2); | 4427 Advance(2); |
4424 } else { | 4428 } else { |
4425 if (captures_ == NULL) { | 4429 if (captures_ == NULL) { |
4426 captures_ = new ZoneList<RegExpCapture*>(2); | 4430 captures_ = new(zone()) ZoneList<RegExpCapture*>(2); |
4427 } | 4431 } |
4428 if (captures_started() >= kMaxCaptures) { | 4432 if (captures_started() >= kMaxCaptures) { |
4429 ReportError(CStrVector("Too many captures") CHECK_FAILED); | 4433 ReportError(CStrVector("Too many captures") CHECK_FAILED); |
4430 } | 4434 } |
4431 captures_->Add(NULL); | 4435 captures_->Add(NULL); |
4432 } | 4436 } |
4433 // Store current state and begin new disjunction parsing. | 4437 // Store current state and begin new disjunction parsing. |
4434 stored_state = new(zone()) RegExpParserState(stored_state, | 4438 stored_state = new(zone()) RegExpParserState(stored_state, |
4435 type, | 4439 type, |
4436 captures_started()); | 4440 captures_started()); |
(...skipping 22 matching lines...) Expand all Loading... |
4459 new(zone()) RegExpAssertion(RegExpAssertion::NON_BOUNDARY)); | 4463 new(zone()) RegExpAssertion(RegExpAssertion::NON_BOUNDARY)); |
4460 continue; | 4464 continue; |
4461 // AtomEscape :: | 4465 // AtomEscape :: |
4462 // CharacterClassEscape | 4466 // CharacterClassEscape |
4463 // | 4467 // |
4464 // CharacterClassEscape :: one of | 4468 // CharacterClassEscape :: one of |
4465 // d D s S w W | 4469 // d D s S w W |
4466 case 'd': case 'D': case 's': case 'S': case 'w': case 'W': { | 4470 case 'd': case 'D': case 's': case 'S': case 'w': case 'W': { |
4467 uc32 c = Next(); | 4471 uc32 c = Next(); |
4468 Advance(2); | 4472 Advance(2); |
4469 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2); | 4473 ZoneList<CharacterRange>* ranges = |
| 4474 new(zone()) ZoneList<CharacterRange>(2); |
4470 CharacterRange::AddClassEscape(c, ranges); | 4475 CharacterRange::AddClassEscape(c, ranges); |
4471 RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false); | 4476 RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false); |
4472 builder->AddAtom(atom); | 4477 builder->AddAtom(atom); |
4473 break; | 4478 break; |
4474 } | 4479 } |
4475 case '1': case '2': case '3': case '4': case '5': case '6': | 4480 case '1': case '2': case '3': case '4': case '5': case '6': |
4476 case '7': case '8': case '9': { | 4481 case '7': case '8': case '9': { |
4477 int index = 0; | 4482 int index = 0; |
4478 if (ParseBackReferenceIndex(&index)) { | 4483 if (ParseBackReferenceIndex(&index)) { |
4479 RegExpCapture* capture = NULL; | 4484 RegExpCapture* capture = NULL; |
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4955 static const char* kUnterminated = "Unterminated character class"; | 4960 static const char* kUnterminated = "Unterminated character class"; |
4956 static const char* kRangeOutOfOrder = "Range out of order in character class"; | 4961 static const char* kRangeOutOfOrder = "Range out of order in character class"; |
4957 | 4962 |
4958 ASSERT_EQ(current(), '['); | 4963 ASSERT_EQ(current(), '['); |
4959 Advance(); | 4964 Advance(); |
4960 bool is_negated = false; | 4965 bool is_negated = false; |
4961 if (current() == '^') { | 4966 if (current() == '^') { |
4962 is_negated = true; | 4967 is_negated = true; |
4963 Advance(); | 4968 Advance(); |
4964 } | 4969 } |
4965 ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2); | 4970 ZoneList<CharacterRange>* ranges = new(zone()) ZoneList<CharacterRange>(2); |
4966 while (has_more() && current() != ']') { | 4971 while (has_more() && current() != ']') { |
4967 uc16 char_class = kNoCharClass; | 4972 uc16 char_class = kNoCharClass; |
4968 CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED); | 4973 CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED); |
4969 if (current() == '-') { | 4974 if (current() == '-') { |
4970 Advance(); | 4975 Advance(); |
4971 if (current() == kEndMarker) { | 4976 if (current() == kEndMarker) { |
4972 // If we reach the end we break out of the loop and let the | 4977 // If we reach the end we break out of the loop and let the |
4973 // following code report an error. | 4978 // following code report an error. |
4974 break; | 4979 break; |
4975 } else if (current() == ']') { | 4980 } else if (current() == ']') { |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5178 info->is_global(), | 5183 info->is_global(), |
5179 info->StrictMode()); | 5184 info->StrictMode()); |
5180 } | 5185 } |
5181 } | 5186 } |
5182 | 5187 |
5183 info->SetFunction(result); | 5188 info->SetFunction(result); |
5184 return (result != NULL); | 5189 return (result != NULL); |
5185 } | 5190 } |
5186 | 5191 |
5187 } } // namespace v8::internal | 5192 } } // namespace v8::internal |
OLD | NEW |