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 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 CallRuntime* initialize; | 135 CallRuntime* initialize; |
136 | 136 |
137 if (descriptor_->is_const) { | 137 if (descriptor_->is_const) { |
138 arguments->Add(value, zone()); | 138 arguments->Add(value, zone()); |
139 value = NULL; // zap the value to avoid the unnecessary assignment | 139 value = NULL; // zap the value to avoid the unnecessary assignment |
140 | 140 |
141 // Construct the call to Runtime_InitializeConstGlobal | 141 // Construct the call to Runtime_InitializeConstGlobal |
142 // and add it to the initialization statement block. | 142 // and add it to the initialization statement block. |
143 // Note that the function does different things depending on | 143 // Note that the function does different things depending on |
144 // the number of arguments (1 or 2). | 144 // the number of arguments (1 or 2). |
145 initialize = factory()->NewCallRuntime( | 145 initialize = |
146 ast_value_factory()->initialize_const_global_string(), | 146 factory()->NewCallRuntime(Runtime::kInitializeConstGlobal, arguments, |
147 Runtime::FunctionForId(Runtime::kInitializeConstGlobal), arguments, | 147 descriptor_->initialization_pos); |
148 descriptor_->initialization_pos); | |
149 } else { | 148 } else { |
150 // Add language mode. | 149 // Add language mode. |
151 // We may want to pass singleton to avoid Literal allocations. | 150 // We may want to pass singleton to avoid Literal allocations. |
152 LanguageMode language_mode = initialization_scope->language_mode(); | 151 LanguageMode language_mode = initialization_scope->language_mode(); |
153 arguments->Add(factory()->NewNumberLiteral(language_mode, | 152 arguments->Add(factory()->NewNumberLiteral(language_mode, |
154 descriptor_->declaration_pos), | 153 descriptor_->declaration_pos), |
155 zone()); | 154 zone()); |
156 | 155 |
157 // Be careful not to assign a value to the global variable if | 156 // Be careful not to assign a value to the global variable if |
158 // we're in a with. The initialization value should not | 157 // we're in a with. The initialization value should not |
159 // necessarily be stored in the global object in that case, | 158 // necessarily be stored in the global object in that case, |
160 // which is why we need to generate a separate assignment node. | 159 // which is why we need to generate a separate assignment node. |
161 if (value != NULL && !inside_with()) { | 160 if (value != NULL && !inside_with()) { |
162 arguments->Add(value, zone()); | 161 arguments->Add(value, zone()); |
163 value = NULL; // zap the value to avoid the unnecessary assignment | 162 value = NULL; // zap the value to avoid the unnecessary assignment |
164 // Construct the call to Runtime_InitializeVarGlobal | 163 // Construct the call to Runtime_InitializeVarGlobal |
165 // and add it to the initialization statement block. | 164 // and add it to the initialization statement block. |
166 initialize = factory()->NewCallRuntime( | 165 initialize = |
167 ast_value_factory()->initialize_var_global_string(), | 166 factory()->NewCallRuntime(Runtime::kInitializeVarGlobal, arguments, |
168 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), arguments, | 167 descriptor_->declaration_pos); |
169 descriptor_->declaration_pos); | |
170 } else { | 168 } else { |
171 initialize = NULL; | 169 initialize = NULL; |
172 } | 170 } |
173 } | 171 } |
174 | 172 |
175 if (initialize != NULL) { | 173 if (initialize != NULL) { |
176 block_->AddStatement( | 174 block_->AddStatement( |
177 factory()->NewExpressionStatement(initialize, RelocInfo::kNoPosition), | 175 factory()->NewExpressionStatement(initialize, RelocInfo::kNoPosition), |
178 zone()); | 176 zone()); |
179 } | 177 } |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 RelocInfo::kNoPosition); | 303 RelocInfo::kNoPosition); |
306 block_->AddStatement(if_statement, zone()); | 304 block_->AddStatement(if_statement, zone()); |
307 | 305 |
308 if (!(value->IsLiteral() && value->AsLiteral()->raw_value()->IsTheHole())) { | 306 if (!(value->IsLiteral() && value->AsLiteral()->raw_value()->IsTheHole())) { |
309 RecurseIntoSubpattern(value, factory()->NewVariableProxy(v)); | 307 RecurseIntoSubpattern(value, factory()->NewVariableProxy(v)); |
310 } | 308 } |
311 } | 309 } |
312 | 310 |
313 if (spread != nullptr) { | 311 if (spread != nullptr) { |
314 // array = []; | 312 // array = []; |
315 // if (!done) $concatIterableToArray(array, iterator); | 313 // if (!done) %concat_iterable_to_array(array, iterator); |
316 auto empty_exprs = new (zone()) ZoneList<Expression*>(0, zone()); | 314 auto empty_exprs = new (zone()) ZoneList<Expression*>(0, zone()); |
317 auto array = CreateTempVar(factory()->NewArrayLiteral( | 315 auto array = CreateTempVar(factory()->NewArrayLiteral( |
318 empty_exprs, | 316 empty_exprs, |
319 // Reuse pattern's literal index - it is unused since there is no | 317 // Reuse pattern's literal index - it is unused since there is no |
320 // actual literal allocated. | 318 // actual literal allocated. |
321 node->literal_index(), is_strong(descriptor_->parser->language_mode()), | 319 node->literal_index(), is_strong(descriptor_->parser->language_mode()), |
322 RelocInfo::kNoPosition)); | 320 RelocInfo::kNoPosition)); |
323 | 321 |
324 auto arguments = new (zone()) ZoneList<Expression*>(2, zone()); | 322 auto arguments = new (zone()) ZoneList<Expression*>(2, zone()); |
325 arguments->Add(factory()->NewVariableProxy(array), zone()); | 323 arguments->Add(factory()->NewVariableProxy(array), zone()); |
326 arguments->Add(factory()->NewVariableProxy(iterator), zone()); | 324 arguments->Add(factory()->NewVariableProxy(iterator), zone()); |
327 auto spread_into_array_call = factory()->NewCallRuntime( | 325 auto spread_into_array_call = |
328 ast_value_factory()->concat_iterable_to_array_string(), nullptr, | 326 factory()->NewCallRuntime(Context::CONCAT_ITERABLE_TO_ARRAY_INDEX, |
329 arguments, RelocInfo::kNoPosition); | 327 arguments, RelocInfo::kNoPosition); |
330 | 328 |
331 auto if_statement = factory()->NewIfStatement( | 329 auto if_statement = factory()->NewIfStatement( |
332 factory()->NewUnaryOperation(Token::NOT, | 330 factory()->NewUnaryOperation(Token::NOT, |
333 factory()->NewVariableProxy(done), | 331 factory()->NewVariableProxy(done), |
334 RelocInfo::kNoPosition), | 332 RelocInfo::kNoPosition), |
335 factory()->NewExpressionStatement(spread_into_array_call, | 333 factory()->NewExpressionStatement(spread_into_array_call, |
336 RelocInfo::kNoPosition), | 334 RelocInfo::kNoPosition), |
337 factory()->NewEmptyStatement(RelocInfo::kNoPosition), | 335 factory()->NewEmptyStatement(RelocInfo::kNoPosition), |
338 RelocInfo::kNoPosition); | 336 RelocInfo::kNoPosition); |
339 block_->AddStatement(if_statement, zone()); | 337 block_->AddStatement(if_statement, zone()); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 NOT_A_PATTERN(TryFinallyStatement) | 418 NOT_A_PATTERN(TryFinallyStatement) |
421 NOT_A_PATTERN(UnaryOperation) | 419 NOT_A_PATTERN(UnaryOperation) |
422 NOT_A_PATTERN(VariableDeclaration) | 420 NOT_A_PATTERN(VariableDeclaration) |
423 NOT_A_PATTERN(WhileStatement) | 421 NOT_A_PATTERN(WhileStatement) |
424 NOT_A_PATTERN(WithStatement) | 422 NOT_A_PATTERN(WithStatement) |
425 NOT_A_PATTERN(Yield) | 423 NOT_A_PATTERN(Yield) |
426 | 424 |
427 #undef NOT_A_PATTERN | 425 #undef NOT_A_PATTERN |
428 } // namespace internal | 426 } // namespace internal |
429 } // namespace v8 | 427 } // namespace v8 |
OLD | NEW |