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/ast.h" | 5 #include "src/ast/ast.h" |
| 6 #include "src/messages.h" | 6 #include "src/messages.h" |
| 7 #include "src/objects-inl.h" | 7 #include "src/objects-inl.h" |
| 8 #include "src/parsing/parameter-initializer-rewriter.h" | 8 #include "src/parsing/parameter-initializer-rewriter.h" |
| 9 #include "src/parsing/parser.h" | 9 #include "src/parsing/parser.h" |
| 10 | 10 |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 325 DCHECK(scope()->outer_scope()->is_function_scope()); | 325 DCHECK(scope()->outer_scope()->is_function_scope()); |
| 326 DCHECK(scope()->calls_sloppy_eval()); | 326 DCHECK(scope()->calls_sloppy_eval()); |
| 327 | 327 |
| 328 ReparentParameterExpressionScope(parser_->stack_limit(), expr, scope()); | 328 ReparentParameterExpressionScope(parser_->stack_limit(), expr, scope()); |
| 329 } | 329 } |
| 330 | 330 |
| 331 void Parser::PatternRewriter::VisitObjectLiteral(ObjectLiteral* pattern, | 331 void Parser::PatternRewriter::VisitObjectLiteral(ObjectLiteral* pattern, |
| 332 Variable** temp_var) { | 332 Variable** temp_var) { |
| 333 auto temp = *temp_var = CreateTempVar(current_value_); | 333 auto temp = *temp_var = CreateTempVar(current_value_); |
| 334 | 334 |
| 335 ZoneList<Expression*>* excluded_properties; | |
| 336 if (pattern->has_rest_property()) { | |
| 337 int non_rest_properties = pattern->properties()->length() - 1; | |
| 338 excluded_properties = | |
| 339 new (zone()) ZoneList<Expression*>(non_rest_properties, zone()); | |
| 340 } else { | |
| 341 excluded_properties = new (zone()) ZoneList<Expression*>(0, zone()); | |
| 342 } | |
| 343 | |
| 335 block_->statements()->Add(parser_->BuildAssertIsCoercible(temp), zone()); | 344 block_->statements()->Add(parser_->BuildAssertIsCoercible(temp), zone()); |
| 336 | 345 |
| 337 for (ObjectLiteralProperty* property : *pattern->properties()) { | 346 for (ObjectLiteralProperty* property : *pattern->properties()) { |
| 338 PatternContext context = SetInitializerContextIfNeeded(property->value()); | 347 PatternContext context = SetInitializerContextIfNeeded(property->value()); |
| 348 Expression* value; | |
| 339 | 349 |
| 340 // Computed property names contain expressions which might require | 350 if (property->kind() == ObjectLiteralProperty::Kind::SPREAD) { |
| 341 // scope rewriting. | 351 // var { a, b, ...c } = temp |
| 342 if (!property->key()->IsLiteral()) RewriteParameterScopes(property->key()); | 352 // becomes |
| 353 // var c; | |
| 354 // c = %CopyDataProperties(temp, [a, b]); | |
|
adamk
2017/01/10 23:22:56
Can you add something about the desugaring of comp
gsathya
2017/01/12 21:27:41
There's a comment below where I handle the compute
adamk
2017/01/12 22:43:08
Yeah, I was thinking that this should basically re
| |
| 355 auto args = new (zone()) ZoneList<Expression*>(2, zone()); | |
| 356 args->Add(factory()->NewVariableProxy(temp), zone()); | |
| 357 args->Add( | |
| 358 factory()->NewArrayLiteral( | |
| 359 excluded_properties, pattern->literal_index(), kNoSourcePosition), | |
| 360 zone()); | |
| 343 | 361 |
| 344 RecurseIntoSubpattern( | 362 value = factory()->NewCallRuntime( |
| 345 property->value(), | 363 Runtime::kCopyDataPropertiesWithExcludedProperties, args, |
| 346 factory()->NewProperty(factory()->NewVariableProxy(temp), | 364 kNoSourcePosition); |
| 347 property->key(), kNoSourcePosition)); | 365 } else { |
| 366 Expression* key = property->key(); | |
| 367 | |
| 368 if (!key->IsLiteral()) { | |
| 369 // Computed property names contain expressions which might require | |
| 370 // scope rewriting. | |
| 371 RewriteParameterScopes(key); | |
| 372 | |
| 373 // We create a temporary variable for a computed property name | |
| 374 // so that we don't evaluate it twice when we include it in | |
| 375 // the excluded_properties list. | |
| 376 key = factory()->NewVariableProxy(CreateTempVar(key)); | |
|
adamk
2017/01/10 23:22:56
You need to assign CreateTempVar to something so t
gsathya
2017/01/12 21:27:41
Done.
| |
| 377 } | |
| 378 | |
| 379 if (pattern->has_rest_property()) { | |
| 380 excluded_properties->Add(key, zone()); | |
|
adamk
2017/01/10 23:22:56
As noted above, this needs to be a NewVariableProx
gsathya
2017/01/12 21:27:41
Done.
| |
| 381 } | |
| 382 | |
| 383 value = factory()->NewProperty(factory()->NewVariableProxy(temp), key, | |
| 384 kNoSourcePosition); | |
| 385 } | |
| 386 | |
| 387 RecurseIntoSubpattern(property->value(), value); | |
| 348 set_context(context); | 388 set_context(context); |
| 349 } | 389 } |
| 350 } | 390 } |
| 351 | 391 |
| 352 | 392 |
| 353 void Parser::PatternRewriter::VisitObjectLiteral(ObjectLiteral* node) { | 393 void Parser::PatternRewriter::VisitObjectLiteral(ObjectLiteral* node) { |
| 354 Variable* temp_var = nullptr; | 394 Variable* temp_var = nullptr; |
| 355 VisitObjectLiteral(node, &temp_var); | 395 VisitObjectLiteral(node, &temp_var); |
| 356 } | 396 } |
| 357 | 397 |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 692 NOT_A_PATTERN(TryFinallyStatement) | 732 NOT_A_PATTERN(TryFinallyStatement) |
| 693 NOT_A_PATTERN(UnaryOperation) | 733 NOT_A_PATTERN(UnaryOperation) |
| 694 NOT_A_PATTERN(VariableDeclaration) | 734 NOT_A_PATTERN(VariableDeclaration) |
| 695 NOT_A_PATTERN(WhileStatement) | 735 NOT_A_PATTERN(WhileStatement) |
| 696 NOT_A_PATTERN(WithStatement) | 736 NOT_A_PATTERN(WithStatement) |
| 697 NOT_A_PATTERN(Yield) | 737 NOT_A_PATTERN(Yield) |
| 698 | 738 |
| 699 #undef NOT_A_PATTERN | 739 #undef NOT_A_PATTERN |
| 700 } // namespace internal | 740 } // namespace internal |
| 701 } // namespace v8 | 741 } // namespace v8 |
| OLD | NEW |