Chromium Code Reviews| Index: src/parsing/parser.cc |
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
| index 119c0164edd87b40de9b1c1742b78556d3bb8eec..e3ca7d688fbf8937d83e282f39f11a9f63abf2b5 100644 |
| --- a/src/parsing/parser.cc |
| +++ b/src/parsing/parser.cc |
| @@ -5054,15 +5054,32 @@ Expression* Parser::RewriteSpreads(ArrayLiteral* lit) { |
| if (spread == nullptr) { |
| // If the element is not a spread, we're adding a single: |
| // %AppendElement($R, value) |
| - ZoneList<Expression*>* append_element_args = NewExpressionList(2); |
| - append_element_args->Add(factory()->NewVariableProxy(result), zone()); |
| - append_element_args->Add(value, zone()); |
| - do_block->statements()->Add( |
| - factory()->NewExpressionStatement( |
| - factory()->NewCallRuntime(Runtime::kAppendElement, |
| - append_element_args, kNoSourcePosition), |
| - kNoSourcePosition), |
| - zone()); |
| + // or, in case of a hole, |
| + // ++($R.length) |
| + if (!value->IsLiteral() || |
| + !value->AsLiteral()->raw_value()->IsTheHole()) { |
| + ZoneList<Expression*>* append_element_args = NewExpressionList(2); |
| + append_element_args->Add(factory()->NewVariableProxy(result), zone()); |
| + append_element_args->Add(value, zone()); |
| + do_block->statements()->Add( |
| + factory()->NewExpressionStatement( |
| + factory()->NewCallRuntime(Runtime::kAppendElement, |
| + append_element_args, |
| + kNoSourcePosition), |
| + kNoSourcePosition), |
| + zone()); |
| + } else { |
| + auto length_property = factory()->NewProperty( |
|
Jakob Kummerow
2016/09/08 09:58:56
nit: I strongly prefer explicit types over "auto".
adamk
2016/09/08 17:43:20
Done, but I wish we could have a style guide somew
|
| + factory()->NewVariableProxy(result), |
| + factory()->NewStringLiteral(ast_value_factory()->length_string(), |
| + kNoSourcePosition), |
| + kNoSourcePosition); |
| + auto count_op = factory()->NewCountOperation( |
| + Token::INC, true /* prefix */, length_property, kNoSourcePosition); |
| + do_block->statements()->Add( |
| + factory()->NewExpressionStatement(count_op, kNoSourcePosition), |
| + zone()); |
| + } |
| } else { |
| // If it's a spread, we're adding a for/of loop iterating through it. |
| Variable* each = NewTemporary(ast_value_factory()->dot_for_string()); |