OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/ast.h" | 5 #include "src/ast.h" |
6 #include "src/messages.h" | 6 #include "src/messages.h" |
7 #include "src/parser.h" | 7 #include "src/parser.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 | 10 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 block_->AddStatement( | 204 block_->AddStatement( |
205 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), | 205 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), |
206 zone()); | 206 zone()); |
207 } | 207 } |
208 } | 208 } |
209 | 209 |
210 | 210 |
211 Variable* Parser::PatternRewriter::CreateTempVar(Expression* value) { | 211 Variable* Parser::PatternRewriter::CreateTempVar(Expression* value) { |
212 auto temp_scope = descriptor_->parser->scope_->DeclarationScope(); | 212 auto temp_scope = descriptor_->parser->scope_->DeclarationScope(); |
213 auto temp = temp_scope->NewTemporary(ast_value_factory()->empty_string()); | 213 auto temp = temp_scope->NewTemporary(ast_value_factory()->empty_string()); |
214 auto assignment = | 214 if (value != nullptr) { |
215 factory()->NewAssignment(Token::ASSIGN, factory()->NewVariableProxy(temp), | 215 auto assignment = factory()->NewAssignment( |
216 value, RelocInfo::kNoPosition); | 216 Token::ASSIGN, factory()->NewVariableProxy(temp), value, |
| 217 RelocInfo::kNoPosition); |
217 | 218 |
218 block_->AddStatement( | 219 block_->AddStatement( |
219 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), | 220 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), |
220 zone()); | 221 zone()); |
| 222 } |
221 return temp; | 223 return temp; |
222 } | 224 } |
223 | 225 |
224 | 226 |
225 void Parser::PatternRewriter::VisitObjectLiteral(ObjectLiteral* pattern) { | 227 void Parser::PatternRewriter::VisitObjectLiteral(ObjectLiteral* pattern) { |
226 auto temp = CreateTempVar(current_value_); | 228 auto temp = CreateTempVar(current_value_); |
227 | 229 |
228 block_->AddStatement(descriptor_->parser->BuildAssertIsCoercible(temp), | 230 block_->AddStatement(descriptor_->parser->BuildAssertIsCoercible(temp), |
229 zone()); | 231 zone()); |
230 | 232 |
231 for (ObjectLiteralProperty* property : *pattern->properties()) { | 233 for (ObjectLiteralProperty* property : *pattern->properties()) { |
232 RecurseIntoSubpattern( | 234 RecurseIntoSubpattern( |
233 property->value(), | 235 property->value(), |
234 factory()->NewProperty(factory()->NewVariableProxy(temp), | 236 factory()->NewProperty(factory()->NewVariableProxy(temp), |
235 property->key(), RelocInfo::kNoPosition)); | 237 property->key(), RelocInfo::kNoPosition)); |
236 } | 238 } |
237 } | 239 } |
238 | 240 |
239 | 241 |
240 void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node) { | 242 void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node) { |
241 // TODO(dslomov): implement. | 243 auto iterator = CreateTempVar( |
| 244 descriptor_->parser->GetIterator(current_value_, factory())); |
| 245 auto done = CreateTempVar( |
| 246 factory()->NewBooleanLiteral(false, RelocInfo::kNoPosition)); |
| 247 auto result = CreateTempVar(); |
| 248 auto v = CreateTempVar(); |
| 249 for (Expression* value : *node->values()) { |
| 250 // if (!done) { |
| 251 // result = IteratorNext(iterator); |
| 252 // v = (done = result.done) ? undefined : result.value; |
| 253 // } |
| 254 auto next_block = |
| 255 factory()->NewBlock(nullptr, 2, true, RelocInfo::kNoPosition); |
| 256 next_block->AddStatement(factory()->NewExpressionStatement( |
| 257 descriptor_->parser->BuildIteratorNextResult( |
| 258 factory()->NewVariableProxy(iterator), |
| 259 result, RelocInfo::kNoPosition), |
| 260 RelocInfo::kNoPosition), |
| 261 zone()); |
| 262 |
| 263 auto assign_to_done = factory()->NewAssignment( |
| 264 Token::ASSIGN, factory()->NewVariableProxy(done), |
| 265 factory()->NewProperty( |
| 266 factory()->NewVariableProxy(result), |
| 267 factory()->NewStringLiteral(ast_value_factory()->done_string(), |
| 268 RelocInfo::kNoPosition), |
| 269 RelocInfo::kNoPosition), |
| 270 RelocInfo::kNoPosition); |
| 271 auto next_value = factory()->NewConditional( |
| 272 assign_to_done, factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), |
| 273 factory()->NewProperty( |
| 274 factory()->NewVariableProxy(result), |
| 275 factory()->NewStringLiteral(ast_value_factory()->value_string(), |
| 276 RelocInfo::kNoPosition), |
| 277 RelocInfo::kNoPosition), |
| 278 RelocInfo::kNoPosition); |
| 279 next_block->AddStatement( |
| 280 factory()->NewExpressionStatement( |
| 281 factory()->NewAssignment(Token::ASSIGN, |
| 282 factory()->NewVariableProxy(v), next_value, |
| 283 RelocInfo::kNoPosition), |
| 284 RelocInfo::kNoPosition), |
| 285 zone()); |
| 286 |
| 287 auto if_statement = factory()->NewIfStatement( |
| 288 factory()->NewUnaryOperation(Token::NOT, |
| 289 factory()->NewVariableProxy(done), |
| 290 RelocInfo::kNoPosition), |
| 291 next_block, factory()->NewEmptyStatement(RelocInfo::kNoPosition), |
| 292 RelocInfo::kNoPosition); |
| 293 block_->AddStatement(if_statement, zone()); |
| 294 |
| 295 if (!(value->IsLiteral() && value->AsLiteral()->raw_value()->IsTheHole())) { |
| 296 RecurseIntoSubpattern(value, factory()->NewVariableProxy(v)); |
| 297 } |
| 298 } |
242 } | 299 } |
243 | 300 |
244 | 301 |
245 void Parser::PatternRewriter::VisitAssignment(Assignment* node) { | 302 void Parser::PatternRewriter::VisitAssignment(Assignment* node) { |
246 // let {<pattern> = <init>} = <value> | 303 // let {<pattern> = <init>} = <value> |
247 // becomes | 304 // becomes |
248 // temp = <value>; | 305 // temp = <value>; |
249 // <pattern> = temp === undefined ? <init> : temp; | 306 // <pattern> = temp === undefined ? <init> : temp; |
250 DCHECK(node->op() == Token::ASSIGN); | 307 DCHECK(node->op() == Token::ASSIGN); |
251 auto temp = CreateTempVar(current_value_); | 308 auto temp = CreateTempVar(current_value_); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 NOT_A_PATTERN(TryFinallyStatement) | 368 NOT_A_PATTERN(TryFinallyStatement) |
312 NOT_A_PATTERN(UnaryOperation) | 369 NOT_A_PATTERN(UnaryOperation) |
313 NOT_A_PATTERN(VariableDeclaration) | 370 NOT_A_PATTERN(VariableDeclaration) |
314 NOT_A_PATTERN(WhileStatement) | 371 NOT_A_PATTERN(WhileStatement) |
315 NOT_A_PATTERN(WithStatement) | 372 NOT_A_PATTERN(WithStatement) |
316 NOT_A_PATTERN(Yield) | 373 NOT_A_PATTERN(Yield) |
317 | 374 |
318 #undef NOT_A_PATTERN | 375 #undef NOT_A_PATTERN |
319 } | 376 } |
320 } // namespace v8::internal | 377 } // namespace v8::internal |
OLD | NEW |