OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/api.h" | 9 #include "src/api.h" |
10 #include "src/ast/ast-expression-rewriter.h" | 10 #include "src/ast/ast-expression-rewriter.h" |
(...skipping 3847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3858 CHECK_OK_VOID); | 3858 CHECK_OK_VOID); |
3859 | 3859 |
3860 scope_snapshot.Reparent(parameters->scope); | 3860 scope_snapshot.Reparent(parameters->scope); |
3861 | 3861 |
3862 if (parameters->Arity() > Code::kMaxArguments) { | 3862 if (parameters->Arity() > Code::kMaxArguments) { |
3863 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); | 3863 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); |
3864 *ok = false; | 3864 *ok = false; |
3865 return; | 3865 return; |
3866 } | 3866 } |
3867 | 3867 |
3868 Type::ExpressionClassifier classifier(this); | 3868 ExpressionClassifier classifier(this); |
3869 if (!parameters->is_simple) { | 3869 if (!parameters->is_simple) { |
3870 classifier.RecordNonSimpleParameter(); | 3870 classifier.RecordNonSimpleParameter(); |
3871 } | 3871 } |
3872 for (int i = 0; i < parameters->Arity(); ++i) { | 3872 for (int i = 0; i < parameters->Arity(); ++i) { |
3873 auto parameter = parameters->at(i); | 3873 auto parameter = parameters->at(i); |
3874 DeclareFormalParameter(parameters->scope, parameter, &classifier); | 3874 DeclareFormalParameter(parameters->scope, parameter, &classifier); |
3875 if (!duplicate_loc->IsValid()) { | 3875 if (!duplicate_loc->IsValid()) { |
3876 *duplicate_loc = classifier.duplicate_formal_parameter_error().location; | 3876 *duplicate_loc = classifier.duplicate_formal_parameter_error().location; |
3877 } | 3877 } |
3878 } | 3878 } |
(...skipping 1373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5252 } else { | 5252 } else { |
5253 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); | 5253 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); |
5254 running_hash = StringHasher::ComputeRunningHash(running_hash, data, | 5254 running_hash = StringHasher::ComputeRunningHash(running_hash, data, |
5255 raw_string->length()); | 5255 raw_string->length()); |
5256 } | 5256 } |
5257 } | 5257 } |
5258 | 5258 |
5259 return running_hash; | 5259 return running_hash; |
5260 } | 5260 } |
5261 | 5261 |
5262 | 5262 ZoneList<Expression*>* Parser::PrepareSpreadArguments( |
5263 ZoneList<v8::internal::Expression*>* Parser::PrepareSpreadArguments( | 5263 ZoneList<Expression*>* list) { |
5264 ZoneList<v8::internal::Expression*>* list) { | 5264 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone()); |
5265 ZoneList<v8::internal::Expression*>* args = | |
5266 new (zone()) ZoneList<v8::internal::Expression*>(1, zone()); | |
5267 if (list->length() == 1) { | 5265 if (list->length() == 1) { |
5268 // Spread-call with single spread argument produces an InternalArray | 5266 // Spread-call with single spread argument produces an InternalArray |
5269 // containing the values from the array. | 5267 // containing the values from the array. |
5270 // | 5268 // |
5271 // Function is called or constructed with the produced array of arguments | 5269 // Function is called or constructed with the produced array of arguments |
5272 // | 5270 // |
5273 // EG: Apply(Func, Spread(spread0)) | 5271 // EG: Apply(Func, Spread(spread0)) |
5274 ZoneList<Expression*>* spread_list = | 5272 ZoneList<Expression*>* spread_list = |
5275 new (zone()) ZoneList<Expression*>(0, zone()); | 5273 new (zone()) ZoneList<Expression*>(0, zone()); |
5276 spread_list->Add(list->at(0)->AsSpread()->expression(), zone()); | 5274 spread_list->Add(list->at(0)->AsSpread()->expression(), zone()); |
5277 args->Add(factory()->NewCallRuntime(Context::SPREAD_ITERABLE_INDEX, | 5275 args->Add(factory()->NewCallRuntime(Context::SPREAD_ITERABLE_INDEX, |
5278 spread_list, kNoSourcePosition), | 5276 spread_list, kNoSourcePosition), |
5279 zone()); | 5277 zone()); |
5280 return args; | 5278 return args; |
5281 } else { | 5279 } else { |
5282 // Spread-call with multiple arguments produces array literals for each | 5280 // Spread-call with multiple arguments produces array literals for each |
5283 // sequences of unspread arguments, and converts each spread iterable to | 5281 // sequences of unspread arguments, and converts each spread iterable to |
5284 // an Internal array. Finally, all of these produced arrays are flattened | 5282 // an Internal array. Finally, all of these produced arrays are flattened |
5285 // into a single InternalArray, containing the arguments for the call. | 5283 // into a single InternalArray, containing the arguments for the call. |
5286 // | 5284 // |
5287 // EG: Apply(Func, Flatten([unspread0, unspread1], Spread(spread0), | 5285 // EG: Apply(Func, Flatten([unspread0, unspread1], Spread(spread0), |
5288 // Spread(spread1), [unspread2, unspread3])) | 5286 // Spread(spread1), [unspread2, unspread3])) |
5289 int i = 0; | 5287 int i = 0; |
5290 int n = list->length(); | 5288 int n = list->length(); |
5291 while (i < n) { | 5289 while (i < n) { |
5292 if (!list->at(i)->IsSpread()) { | 5290 if (!list->at(i)->IsSpread()) { |
5293 ZoneList<v8::internal::Expression*>* unspread = | 5291 ZoneList<Expression*>* unspread = |
5294 new (zone()) ZoneList<v8::internal::Expression*>(1, zone()); | 5292 new (zone()) ZoneList<Expression*>(1, zone()); |
5295 | 5293 |
5296 // Push array of unspread parameters | 5294 // Push array of unspread parameters |
5297 while (i < n && !list->at(i)->IsSpread()) { | 5295 while (i < n && !list->at(i)->IsSpread()) { |
5298 unspread->Add(list->at(i++), zone()); | 5296 unspread->Add(list->at(i++), zone()); |
5299 } | 5297 } |
5300 int literal_index = function_state_->NextMaterializedLiteralIndex(); | 5298 int literal_index = function_state_->NextMaterializedLiteralIndex(); |
5301 args->Add(factory()->NewArrayLiteral(unspread, literal_index, | 5299 args->Add(factory()->NewArrayLiteral(unspread, literal_index, |
5302 kNoSourcePosition), | 5300 kNoSourcePosition), |
5303 zone()); | 5301 zone()); |
5304 | 5302 |
5305 if (i == n) break; | 5303 if (i == n) break; |
5306 } | 5304 } |
5307 | 5305 |
5308 // Push eagerly spread argument | 5306 // Push eagerly spread argument |
5309 ZoneList<v8::internal::Expression*>* spread_list = | 5307 ZoneList<Expression*>* spread_list = |
5310 new (zone()) ZoneList<v8::internal::Expression*>(1, zone()); | 5308 new (zone()) ZoneList<Expression*>(1, zone()); |
5311 spread_list->Add(list->at(i++)->AsSpread()->expression(), zone()); | 5309 spread_list->Add(list->at(i++)->AsSpread()->expression(), zone()); |
5312 args->Add(factory()->NewCallRuntime(Context::SPREAD_ITERABLE_INDEX, | 5310 args->Add(factory()->NewCallRuntime(Context::SPREAD_ITERABLE_INDEX, |
5313 spread_list, kNoSourcePosition), | 5311 spread_list, kNoSourcePosition), |
5314 zone()); | 5312 zone()); |
5315 } | 5313 } |
5316 | 5314 |
5317 list = new (zone()) ZoneList<v8::internal::Expression*>(1, zone()); | 5315 list = new (zone()) ZoneList<Expression*>(1, zone()); |
5318 list->Add(factory()->NewCallRuntime(Context::SPREAD_ARGUMENTS_INDEX, args, | 5316 list->Add(factory()->NewCallRuntime(Context::SPREAD_ARGUMENTS_INDEX, args, |
5319 kNoSourcePosition), | 5317 kNoSourcePosition), |
5320 zone()); | 5318 zone()); |
5321 return list; | 5319 return list; |
5322 } | 5320 } |
5323 UNREACHABLE(); | 5321 UNREACHABLE(); |
5324 } | 5322 } |
5325 | 5323 |
5326 | |
5327 Expression* Parser::SpreadCall(Expression* function, | 5324 Expression* Parser::SpreadCall(Expression* function, |
5328 ZoneList<v8::internal::Expression*>* args, | 5325 ZoneList<Expression*>* args, int pos) { |
5329 int pos) { | |
5330 if (function->IsSuperCallReference()) { | 5326 if (function->IsSuperCallReference()) { |
5331 // Super calls | 5327 // Super calls |
5332 // $super_constructor = %_GetSuperConstructor(<this-function>) | 5328 // $super_constructor = %_GetSuperConstructor(<this-function>) |
5333 // %reflect_construct($super_constructor, args, new.target) | 5329 // %reflect_construct($super_constructor, args, new.target) |
5334 ZoneList<Expression*>* tmp = new (zone()) ZoneList<Expression*>(1, zone()); | 5330 ZoneList<Expression*>* tmp = new (zone()) ZoneList<Expression*>(1, zone()); |
5335 tmp->Add(function->AsSuperCallReference()->this_function_var(), zone()); | 5331 tmp->Add(function->AsSuperCallReference()->this_function_var(), zone()); |
5336 Expression* super_constructor = factory()->NewCallRuntime( | 5332 Expression* super_constructor = factory()->NewCallRuntime( |
5337 Runtime::kInlineGetSuperConstructor, tmp, pos); | 5333 Runtime::kInlineGetSuperConstructor, tmp, pos); |
5338 args->InsertAt(0, super_constructor, zone()); | 5334 args->InsertAt(0, super_constructor, zone()); |
5339 args->Add(function->AsSuperCallReference()->new_target_var(), zone()); | 5335 args->Add(function->AsSuperCallReference()->new_target_var(), zone()); |
(...skipping 21 matching lines...) Expand all Loading... |
5361 } else { | 5357 } else { |
5362 // Non-method calls | 5358 // Non-method calls |
5363 args->InsertAt(0, function, zone()); | 5359 args->InsertAt(0, function, zone()); |
5364 args->InsertAt(1, factory()->NewUndefinedLiteral(kNoSourcePosition), | 5360 args->InsertAt(1, factory()->NewUndefinedLiteral(kNoSourcePosition), |
5365 zone()); | 5361 zone()); |
5366 } | 5362 } |
5367 return factory()->NewCallRuntime(Context::REFLECT_APPLY_INDEX, args, pos); | 5363 return factory()->NewCallRuntime(Context::REFLECT_APPLY_INDEX, args, pos); |
5368 } | 5364 } |
5369 } | 5365 } |
5370 | 5366 |
5371 | |
5372 Expression* Parser::SpreadCallNew(Expression* function, | 5367 Expression* Parser::SpreadCallNew(Expression* function, |
5373 ZoneList<v8::internal::Expression*>* args, | 5368 ZoneList<Expression*>* args, int pos) { |
5374 int pos) { | |
5375 args->InsertAt(0, function, zone()); | 5369 args->InsertAt(0, function, zone()); |
5376 | 5370 |
5377 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos); | 5371 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos); |
5378 } | 5372 } |
5379 | 5373 |
5380 | 5374 |
5381 void Parser::SetLanguageMode(Scope* scope, LanguageMode mode) { | 5375 void Parser::SetLanguageMode(Scope* scope, LanguageMode mode) { |
5382 v8::Isolate::UseCounterFeature feature; | 5376 v8::Isolate::UseCounterFeature feature; |
5383 if (is_sloppy(mode)) | 5377 if (is_sloppy(mode)) |
5384 feature = v8::Isolate::kSloppyMode; | 5378 feature = v8::Isolate::kSloppyMode; |
(...skipping 1263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6648 node->Print(Isolate::Current()); | 6642 node->Print(Isolate::Current()); |
6649 } | 6643 } |
6650 #endif // DEBUG | 6644 #endif // DEBUG |
6651 | 6645 |
6652 #undef CHECK_OK | 6646 #undef CHECK_OK |
6653 #undef CHECK_OK_VOID | 6647 #undef CHECK_OK_VOID |
6654 #undef CHECK_FAILED | 6648 #undef CHECK_FAILED |
6655 | 6649 |
6656 } // namespace internal | 6650 } // namespace internal |
6657 } // namespace v8 | 6651 } // namespace v8 |
OLD | NEW |