| 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 1994 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2005 ExpectSemicolon(CHECK_OK); | 2005 ExpectSemicolon(CHECK_OK); |
| 2006 return new(zone()) ReturnStatement(GetLiteralUndefined()); | 2006 return new(zone()) ReturnStatement(GetLiteralUndefined()); |
| 2007 } | 2007 } |
| 2008 | 2008 |
| 2009 Expression* expr = ParseExpression(true, CHECK_OK); | 2009 Expression* expr = ParseExpression(true, CHECK_OK); |
| 2010 ExpectSemicolon(CHECK_OK); | 2010 ExpectSemicolon(CHECK_OK); |
| 2011 return new(zone()) ReturnStatement(expr); | 2011 return new(zone()) ReturnStatement(expr); |
| 2012 } | 2012 } |
| 2013 | 2013 |
| 2014 | 2014 |
| 2015 Block* Parser::WithHelper(Expression* obj, ZoneStringList* labels, bool* ok) { | |
| 2016 // Parse the statement and collect escaping labels. | |
| 2017 TargetCollector collector; | |
| 2018 Statement* stat; | |
| 2019 { Target target(&this->target_stack_, &collector); | |
| 2020 with_nesting_level_++; | |
| 2021 top_scope_->DeclarationScope()->RecordWithStatement(); | |
| 2022 stat = ParseStatement(labels, CHECK_OK); | |
| 2023 with_nesting_level_--; | |
| 2024 } | |
| 2025 // Create resulting block with two statements. | |
| 2026 // 1: Evaluate the with expression. | |
| 2027 // 2: The try-finally block evaluating the body. | |
| 2028 Block* result = new(zone()) Block(isolate(), NULL, 2, false); | |
| 2029 | |
| 2030 if (result != NULL) { | |
| 2031 result->AddStatement(new(zone()) EnterWithContextStatement(obj)); | |
| 2032 | |
| 2033 // Create body block. | |
| 2034 Block* body = new(zone()) Block(isolate(), NULL, 1, false); | |
| 2035 body->AddStatement(stat); | |
| 2036 | |
| 2037 // Create exit block. | |
| 2038 Block* exit = new(zone()) Block(isolate(), NULL, 1, false); | |
| 2039 exit->AddStatement(new(zone()) ExitContextStatement()); | |
| 2040 | |
| 2041 // Return a try-finally statement. | |
| 2042 TryFinallyStatement* wrapper = new(zone()) TryFinallyStatement(body, exit); | |
| 2043 wrapper->set_escaping_targets(collector.targets()); | |
| 2044 result->AddStatement(wrapper); | |
| 2045 } | |
| 2046 return result; | |
| 2047 } | |
| 2048 | |
| 2049 | |
| 2050 Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) { | 2015 Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) { |
| 2051 // WithStatement :: | 2016 // WithStatement :: |
| 2052 // 'with' '(' Expression ')' Statement | 2017 // 'with' '(' Expression ')' Statement |
| 2053 | 2018 |
| 2054 Expect(Token::WITH, CHECK_OK); | 2019 Expect(Token::WITH, CHECK_OK); |
| 2055 | 2020 |
| 2056 if (top_scope_->is_strict_mode()) { | 2021 if (top_scope_->is_strict_mode()) { |
| 2057 ReportMessage("strict_mode_with", Vector<const char*>::empty()); | 2022 ReportMessage("strict_mode_with", Vector<const char*>::empty()); |
| 2058 *ok = false; | 2023 *ok = false; |
| 2059 return NULL; | 2024 return NULL; |
| 2060 } | 2025 } |
| 2061 | 2026 |
| 2062 Expect(Token::LPAREN, CHECK_OK); | 2027 Expect(Token::LPAREN, CHECK_OK); |
| 2063 Expression* expr = ParseExpression(true, CHECK_OK); | 2028 Expression* expr = ParseExpression(true, CHECK_OK); |
| 2064 Expect(Token::RPAREN, CHECK_OK); | 2029 Expect(Token::RPAREN, CHECK_OK); |
| 2065 | 2030 |
| 2066 return WithHelper(expr, labels, CHECK_OK); | 2031 ++with_nesting_level_; |
| 2032 top_scope_->DeclarationScope()->RecordWithStatement(); |
| 2033 Statement* stmt = ParseStatement(labels, CHECK_OK); |
| 2034 --with_nesting_level_; |
| 2035 return new(zone()) WithStatement(expr, stmt); |
| 2067 } | 2036 } |
| 2068 | 2037 |
| 2069 | 2038 |
| 2070 CaseClause* Parser::ParseCaseClause(bool* default_seen_ptr, bool* ok) { | 2039 CaseClause* Parser::ParseCaseClause(bool* default_seen_ptr, bool* ok) { |
| 2071 // CaseClause :: | 2040 // CaseClause :: |
| 2072 // 'case' Expression ':' Statement* | 2041 // 'case' Expression ':' Statement* |
| 2073 // 'default' ':' Statement* | 2042 // 'default' ':' Statement* |
| 2074 | 2043 |
| 2075 Expression* label = NULL; // NULL expression indicates default case | 2044 Expression* label = NULL; // NULL expression indicates default case |
| 2076 if (peek() == Token::CASE) { | 2045 if (peek() == Token::CASE) { |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2191 | 2160 |
| 2192 if (top_scope_->is_strict_mode() && IsEvalOrArguments(name)) { | 2161 if (top_scope_->is_strict_mode() && IsEvalOrArguments(name)) { |
| 2193 ReportMessage("strict_catch_variable", Vector<const char*>::empty()); | 2162 ReportMessage("strict_catch_variable", Vector<const char*>::empty()); |
| 2194 *ok = false; | 2163 *ok = false; |
| 2195 return NULL; | 2164 return NULL; |
| 2196 } | 2165 } |
| 2197 | 2166 |
| 2198 Expect(Token::RPAREN, CHECK_OK); | 2167 Expect(Token::RPAREN, CHECK_OK); |
| 2199 | 2168 |
| 2200 if (peek() == Token::LBRACE) { | 2169 if (peek() == Token::LBRACE) { |
| 2201 // Rewrite the catch body B to a single statement block | 2170 // Rewrite the catch body { B } to a block: |
| 2202 // { try B finally { PopContext }}. | 2171 // { { B } ExitContext; }. |
| 2203 Block* inner_body; | 2172 Target target(&this->target_stack_, &catch_collector); |
| 2204 // We need to collect escapes from the body for both the inner | 2173 catch_scope = NewScope(top_scope_, Scope::CATCH_SCOPE, inside_with()); |
| 2205 // try/finally used to pop the catch context and any possible outer | 2174 if (top_scope_->is_strict_mode()) { |
| 2206 // try/finally. | 2175 catch_scope->EnableStrictMode(); |
| 2207 TargetCollector inner_collector; | 2176 } |
| 2208 { Target target(&this->target_stack_, &catch_collector); | 2177 catch_variable = catch_scope->DeclareLocal(name, Variable::VAR); |
| 2209 { Target target(&this->target_stack_, &inner_collector); | 2178 catch_block = new(zone()) Block(isolate(), NULL, 2, false); |
| 2210 catch_scope = NewScope(top_scope_, Scope::CATCH_SCOPE, inside_with()); | |
| 2211 if (top_scope_->is_strict_mode()) { | |
| 2212 catch_scope->EnableStrictMode(); | |
| 2213 } | |
| 2214 catch_variable = catch_scope->DeclareLocal(name, Variable::VAR); | |
| 2215 | 2179 |
| 2216 Scope* saved_scope = top_scope_; | 2180 Scope* saved_scope = top_scope_; |
| 2217 top_scope_ = catch_scope; | 2181 top_scope_ = catch_scope; |
| 2218 inner_body = ParseBlock(NULL, CHECK_OK); | 2182 Block* catch_body = ParseBlock(NULL, CHECK_OK); |
| 2219 top_scope_ = saved_scope; | 2183 top_scope_ = saved_scope; |
| 2220 } | 2184 catch_block->AddStatement(catch_body); |
| 2221 } | 2185 catch_block->AddStatement(new(zone()) ExitContextStatement()); |
| 2222 | |
| 2223 // Create exit block. | |
| 2224 Block* inner_finally = new(zone()) Block(isolate(), NULL, 1, false); | |
| 2225 inner_finally->AddStatement(new(zone()) ExitContextStatement()); | |
| 2226 | |
| 2227 // Create a try/finally statement. | |
| 2228 TryFinallyStatement* inner_try_finally = | |
| 2229 new(zone()) TryFinallyStatement(inner_body, inner_finally); | |
| 2230 inner_try_finally->set_escaping_targets(inner_collector.targets()); | |
| 2231 | |
| 2232 catch_block = new(zone()) Block(isolate(), NULL, 1, false); | |
| 2233 catch_block->AddStatement(inner_try_finally); | |
| 2234 } else { | 2186 } else { |
| 2235 Expect(Token::LBRACE, CHECK_OK); | 2187 Expect(Token::LBRACE, CHECK_OK); |
| 2236 } | 2188 } |
| 2237 | 2189 |
| 2238 tok = peek(); | 2190 tok = peek(); |
| 2239 } | 2191 } |
| 2240 | 2192 |
| 2241 Block* finally_block = NULL; | 2193 Block* finally_block = NULL; |
| 2242 if (tok == Token::FINALLY || catch_block == NULL) { | 2194 if (tok == Token::FINALLY || catch_block == NULL) { |
| 2243 Consume(Token::FINALLY); | 2195 Consume(Token::FINALLY); |
| (...skipping 2944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5188 result = parser.ParseProgram(source, | 5140 result = parser.ParseProgram(source, |
| 5189 info->is_global(), | 5141 info->is_global(), |
| 5190 info->StrictMode()); | 5142 info->StrictMode()); |
| 5191 } | 5143 } |
| 5192 } | 5144 } |
| 5193 info->SetFunction(result); | 5145 info->SetFunction(result); |
| 5194 return (result != NULL); | 5146 return (result != NULL); |
| 5195 } | 5147 } |
| 5196 | 5148 |
| 5197 } } // namespace v8::internal | 5149 } } // namespace v8::internal |
| OLD | NEW |