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/interpreter/bytecode-generator.h" | 5 #include "src/interpreter/bytecode-generator.h" |
6 | 6 |
7 #include "src/ast/compile-time-value.h" | 7 #include "src/ast/compile-time-value.h" |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/compilation-info.h" | 10 #include "src/compilation-info.h" |
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 void AddFunctionDeclaration(FeedbackVectorSlot slot, FunctionLiteral* func) { | 498 void AddFunctionDeclaration(FeedbackVectorSlot slot, FunctionLiteral* func) { |
499 DCHECK(!slot.IsInvalid()); | 499 DCHECK(!slot.IsInvalid()); |
500 declarations_.push_back(std::make_pair(slot, func)); | 500 declarations_.push_back(std::make_pair(slot, func)); |
501 } | 501 } |
502 | 502 |
503 void AddUndefinedDeclaration(FeedbackVectorSlot slot) { | 503 void AddUndefinedDeclaration(FeedbackVectorSlot slot) { |
504 DCHECK(!slot.IsInvalid()); | 504 DCHECK(!slot.IsInvalid()); |
505 declarations_.push_back(std::make_pair(slot, nullptr)); | 505 declarations_.push_back(std::make_pair(slot, nullptr)); |
506 } | 506 } |
507 | 507 |
508 Handle<FixedArray> AllocateDeclarationPairs(CompilationInfo* info) { | 508 Handle<FixedArray> AllocateDeclarationPairs(CompilationInfo* info, |
| 509 ShouldCompile should_compile) { |
509 DCHECK(has_constant_pool_entry_); | 510 DCHECK(has_constant_pool_entry_); |
510 int array_index = 0; | 511 int array_index = 0; |
511 Handle<FixedArray> pairs = info->isolate()->factory()->NewFixedArray( | 512 Handle<FixedArray> pairs = info->isolate()->factory()->NewFixedArray( |
512 static_cast<int>(declarations_.size() * 2), TENURED); | 513 static_cast<int>(declarations_.size() * 2), TENURED); |
513 for (std::pair<FeedbackVectorSlot, FunctionLiteral*> declaration : | 514 for (std::pair<FeedbackVectorSlot, FunctionLiteral*> declaration : |
514 declarations_) { | 515 declarations_) { |
515 FunctionLiteral* func = declaration.second; | 516 FunctionLiteral* func = declaration.second; |
516 Handle<Object> initial_value; | 517 Handle<Object> initial_value; |
517 if (func == nullptr) { | 518 if (func == nullptr) { |
518 initial_value = info->isolate()->factory()->undefined_value(); | 519 initial_value = info->isolate()->factory()->undefined_value(); |
519 } else { | 520 } else { |
520 initial_value = | 521 initial_value = Compiler::GetSharedFunctionInfo(func, info->script(), |
521 Compiler::GetSharedFunctionInfo(func, info->script(), info); | 522 info, should_compile); |
522 } | 523 } |
523 | 524 |
524 // Return a null handle if any initial values can't be created. Caller | 525 // Return a null handle if any initial values can't be created. Caller |
525 // will set stack overflow. | 526 // will set stack overflow. |
526 if (initial_value.is_null()) return Handle<FixedArray>(); | 527 if (initial_value.is_null()) return Handle<FixedArray>(); |
527 | 528 |
528 pairs->set(array_index++, Smi::FromInt(declaration.first.ToInt())); | 529 pairs->set(array_index++, Smi::FromInt(declaration.first.ToInt())); |
529 pairs->set(array_index++, *initial_value); | 530 pairs->set(array_index++, *initial_value); |
530 } | 531 } |
531 return pairs; | 532 return pairs; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 execution_control_(nullptr), | 568 execution_control_(nullptr), |
568 execution_context_(nullptr), | 569 execution_context_(nullptr), |
569 execution_result_(nullptr), | 570 execution_result_(nullptr), |
570 generator_resume_points_(info->literal()->yield_count(), info->zone()), | 571 generator_resume_points_(info->literal()->yield_count(), info->zone()), |
571 generator_state_(), | 572 generator_state_(), |
572 loop_depth_(0), | 573 loop_depth_(0), |
573 home_object_symbol_(info->isolate()->factory()->home_object_symbol()), | 574 home_object_symbol_(info->isolate()->factory()->home_object_symbol()), |
574 prototype_string_(info->isolate()->factory()->prototype_string()) { | 575 prototype_string_(info->isolate()->factory()->prototype_string()) { |
575 } | 576 } |
576 | 577 |
577 Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode(Isolate* isolate) { | 578 Handle<BytecodeArray> BytecodeGenerator::FinalizeBytecode( |
578 AllocateDeferredConstants(); | 579 Isolate* isolate, ShouldCompile should_compile) { |
| 580 AllocateDeferredConstants(should_compile); |
579 if (HasStackOverflow()) return Handle<BytecodeArray>(); | 581 if (HasStackOverflow()) return Handle<BytecodeArray>(); |
580 return builder()->ToBytecodeArray(isolate); | 582 return builder()->ToBytecodeArray(isolate); |
581 } | 583 } |
582 | 584 |
583 void BytecodeGenerator::AllocateDeferredConstants() { | 585 void BytecodeGenerator::AllocateDeferredConstants( |
| 586 ShouldCompile should_compile) { |
584 // Build global declaration pair arrays. | 587 // Build global declaration pair arrays. |
585 for (GlobalDeclarationsBuilder* globals_builder : global_declarations_) { | 588 for (GlobalDeclarationsBuilder* globals_builder : global_declarations_) { |
586 Handle<FixedArray> declarations = | 589 Handle<FixedArray> declarations = |
587 globals_builder->AllocateDeclarationPairs(info()); | 590 globals_builder->AllocateDeclarationPairs(info(), should_compile); |
588 if (declarations.is_null()) return SetStackOverflow(); | 591 if (declarations.is_null()) return SetStackOverflow(); |
589 builder()->InsertConstantPoolEntryAt(globals_builder->constant_pool_entry(), | 592 builder()->InsertConstantPoolEntryAt(globals_builder->constant_pool_entry(), |
590 declarations); | 593 declarations); |
591 } | 594 } |
592 | 595 |
593 // Find or build shared function infos. | 596 // Find or build shared function infos. |
594 for (std::pair<FunctionLiteral*, size_t> literal : function_literals_) { | 597 for (std::pair<FunctionLiteral*, size_t> literal : function_literals_) { |
595 FunctionLiteral* expr = literal.first; | 598 FunctionLiteral* expr = literal.first; |
596 Handle<SharedFunctionInfo> shared_info = | 599 Handle<SharedFunctionInfo> shared_info = Compiler::GetSharedFunctionInfo( |
597 Compiler::GetSharedFunctionInfo(expr, info()->script(), info()); | 600 expr, info()->script(), info(), should_compile); |
598 if (shared_info.is_null()) return SetStackOverflow(); | 601 if (shared_info.is_null()) return SetStackOverflow(); |
599 builder()->InsertConstantPoolEntryAt(literal.second, shared_info); | 602 builder()->InsertConstantPoolEntryAt(literal.second, shared_info); |
600 } | 603 } |
601 | 604 |
602 // Find or build shared function infos for the native function templates. | 605 // Find or build shared function infos for the native function templates. |
603 for (std::pair<NativeFunctionLiteral*, size_t> literal : | 606 for (std::pair<NativeFunctionLiteral*, size_t> literal : |
604 native_function_literals_) { | 607 native_function_literals_) { |
605 NativeFunctionLiteral* expr = literal.first; | 608 NativeFunctionLiteral* expr = literal.first; |
606 Handle<SharedFunctionInfo> shared_info = | 609 Handle<SharedFunctionInfo> shared_info = |
607 Compiler::GetSharedFunctionInfoForNative(expr->extension(), | 610 Compiler::GetSharedFunctionInfoForNative(expr->extension(), |
(...skipping 2578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3186 } | 3189 } |
3187 | 3190 |
3188 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { | 3191 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { |
3189 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict | 3192 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict |
3190 : Runtime::kStoreKeyedToSuper_Sloppy; | 3193 : Runtime::kStoreKeyedToSuper_Sloppy; |
3191 } | 3194 } |
3192 | 3195 |
3193 } // namespace interpreter | 3196 } // namespace interpreter |
3194 } // namespace internal | 3197 } // namespace internal |
3195 } // namespace v8 | 3198 } // namespace v8 |
OLD | NEW |