Chromium Code Reviews| 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 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 239 } | 239 } |
| 240 | 240 |
| 241 | 241 |
| 242 void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node) { | 242 void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node) { |
| 243 auto iterator = CreateTempVar( | 243 auto iterator = CreateTempVar( |
| 244 descriptor_->parser->GetIterator(current_value_, factory())); | 244 descriptor_->parser->GetIterator(current_value_, factory())); |
| 245 auto done = CreateTempVar( | 245 auto done = CreateTempVar( |
| 246 factory()->NewBooleanLiteral(false, RelocInfo::kNoPosition)); | 246 factory()->NewBooleanLiteral(false, RelocInfo::kNoPosition)); |
| 247 auto result = CreateTempVar(); | 247 auto result = CreateTempVar(); |
| 248 auto v = CreateTempVar(); | 248 auto v = CreateTempVar(); |
| 249 | |
| 250 Spread* spread = nullptr; | |
| 249 for (Expression* value : *node->values()) { | 251 for (Expression* value : *node->values()) { |
| 252 if (value->IsSpread()) { | |
| 253 spread = value->AsSpread(); | |
| 254 break; | |
| 255 } | |
| 256 | |
| 250 // if (!done) { | 257 // if (!done) { |
| 251 // result = IteratorNext(iterator); | 258 // result = IteratorNext(iterator); |
| 252 // v = (done = result.done) ? undefined : result.value; | 259 // v = (done = result.done) ? undefined : result.value; |
| 253 // } | 260 // } |
| 254 auto next_block = | 261 auto next_block = |
| 255 factory()->NewBlock(nullptr, 2, true, RelocInfo::kNoPosition); | 262 factory()->NewBlock(nullptr, 2, true, RelocInfo::kNoPosition); |
| 256 next_block->AddStatement(factory()->NewExpressionStatement( | 263 next_block->AddStatement(factory()->NewExpressionStatement( |
| 257 descriptor_->parser->BuildIteratorNextResult( | 264 descriptor_->parser->BuildIteratorNextResult( |
| 258 factory()->NewVariableProxy(iterator), | 265 factory()->NewVariableProxy(iterator), |
| 259 result, RelocInfo::kNoPosition), | 266 result, RelocInfo::kNoPosition), |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 289 factory()->NewVariableProxy(done), | 296 factory()->NewVariableProxy(done), |
| 290 RelocInfo::kNoPosition), | 297 RelocInfo::kNoPosition), |
| 291 next_block, factory()->NewEmptyStatement(RelocInfo::kNoPosition), | 298 next_block, factory()->NewEmptyStatement(RelocInfo::kNoPosition), |
| 292 RelocInfo::kNoPosition); | 299 RelocInfo::kNoPosition); |
| 293 block_->AddStatement(if_statement, zone()); | 300 block_->AddStatement(if_statement, zone()); |
| 294 | 301 |
| 295 if (!(value->IsLiteral() && value->AsLiteral()->raw_value()->IsTheHole())) { | 302 if (!(value->IsLiteral() && value->AsLiteral()->raw_value()->IsTheHole())) { |
| 296 RecurseIntoSubpattern(value, factory()->NewVariableProxy(v)); | 303 RecurseIntoSubpattern(value, factory()->NewVariableProxy(v)); |
| 297 } | 304 } |
| 298 } | 305 } |
| 306 | |
| 307 if (spread != nullptr) { | |
| 308 // array = []; | |
| 309 // if (!done) $concatIterableToArray(array, iterator); | |
| 310 auto empty_exprs = new (zone()) ZoneList<Expression*>(0, zone()); | |
| 311 auto array = CreateTempVar(factory()->NewArrayLiteral( | |
| 312 empty_exprs, | |
| 313 // Reuse pattern's literal index - it is unused since there is no | |
|
arv (Not doing code reviews)
2015/05/20 14:40:50
nice.
| |
| 314 // actual literal allocated. | |
| 315 node->literal_index(), is_strong(descriptor_->parser->language_mode()), | |
| 316 RelocInfo::kNoPosition)); | |
| 317 | |
| 318 auto arguments = new (zone()) ZoneList<Expression*>(2, zone()); | |
| 319 arguments->Add(factory()->NewVariableProxy(array), zone()); | |
| 320 arguments->Add(factory()->NewVariableProxy(iterator), zone()); | |
| 321 auto spread_into_array_call = factory()->NewCallRuntime( | |
| 322 ast_value_factory()->concat_iterable_to_array_string(), nullptr, | |
| 323 arguments, RelocInfo::kNoPosition); | |
| 324 | |
| 325 auto if_statement = factory()->NewIfStatement( | |
| 326 factory()->NewUnaryOperation(Token::NOT, | |
| 327 factory()->NewVariableProxy(done), | |
| 328 RelocInfo::kNoPosition), | |
| 329 factory()->NewExpressionStatement(spread_into_array_call, | |
| 330 RelocInfo::kNoPosition), | |
| 331 factory()->NewEmptyStatement(RelocInfo::kNoPosition), | |
| 332 RelocInfo::kNoPosition); | |
| 333 block_->AddStatement(if_statement, zone()); | |
| 334 | |
| 335 | |
| 336 RecurseIntoSubpattern(spread->expression(), | |
| 337 factory()->NewVariableProxy(array)); | |
| 338 } | |
| 299 } | 339 } |
| 300 | 340 |
| 301 | 341 |
| 302 void Parser::PatternRewriter::VisitAssignment(Assignment* node) { | 342 void Parser::PatternRewriter::VisitAssignment(Assignment* node) { |
| 303 // let {<pattern> = <init>} = <value> | 343 // let {<pattern> = <init>} = <value> |
| 304 // becomes | 344 // becomes |
| 305 // temp = <value>; | 345 // temp = <value>; |
| 306 // <pattern> = temp === undefined ? <init> : temp; | 346 // <pattern> = temp === undefined ? <init> : temp; |
| 307 DCHECK(node->op() == Token::ASSIGN); | 347 DCHECK(node->op() == Token::ASSIGN); |
| 308 auto temp = CreateTempVar(current_value_); | 348 auto temp = CreateTempVar(current_value_); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 368 NOT_A_PATTERN(TryFinallyStatement) | 408 NOT_A_PATTERN(TryFinallyStatement) |
| 369 NOT_A_PATTERN(UnaryOperation) | 409 NOT_A_PATTERN(UnaryOperation) |
| 370 NOT_A_PATTERN(VariableDeclaration) | 410 NOT_A_PATTERN(VariableDeclaration) |
| 371 NOT_A_PATTERN(WhileStatement) | 411 NOT_A_PATTERN(WhileStatement) |
| 372 NOT_A_PATTERN(WithStatement) | 412 NOT_A_PATTERN(WithStatement) |
| 373 NOT_A_PATTERN(Yield) | 413 NOT_A_PATTERN(Yield) |
| 374 | 414 |
| 375 #undef NOT_A_PATTERN | 415 #undef NOT_A_PATTERN |
| 376 } | 416 } |
| 377 } // namespace v8::internal | 417 } // namespace v8::internal |
| OLD | NEW |