Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(384)

Side by Side Diff: src/interpreter/bytecode-generator.cc

Issue 2579973002: Don't compile inner functions when compiling via the dispatcher (Closed)
Patch Set: added comment Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 473 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 BytecodeLabels* else_labels_; 484 BytecodeLabels* else_labels_;
485 TestFallthrough fallthrough_; 485 TestFallthrough fallthrough_;
486 bool result_consumed_by_test_; 486 bool result_consumed_by_test_;
487 487
488 DISALLOW_COPY_AND_ASSIGN(TestResultScope); 488 DISALLOW_COPY_AND_ASSIGN(TestResultScope);
489 }; 489 };
490 490
491 // Used to build a list of global declaration initial value pairs. 491 // Used to build a list of global declaration initial value pairs.
492 class BytecodeGenerator::GlobalDeclarationsBuilder final : public ZoneObject { 492 class BytecodeGenerator::GlobalDeclarationsBuilder final : public ZoneObject {
493 public: 493 public:
494 explicit GlobalDeclarationsBuilder(Zone* zone) 494 GlobalDeclarationsBuilder(Zone* zone, LazyCompilationMode mode)
495 : declarations_(0, zone), 495 : declarations_(0, zone),
496 constant_pool_entry_(0), 496 constant_pool_entry_(0),
497 has_constant_pool_entry_(false) {} 497 has_constant_pool_entry_(false),
498 compilation_mode_(mode) {}
498 499
499 void AddFunctionDeclaration(Handle<String> name, FeedbackVectorSlot slot, 500 void AddFunctionDeclaration(Handle<String> name, FeedbackVectorSlot slot,
500 FunctionLiteral* func) { 501 FunctionLiteral* func) {
501 DCHECK(!slot.IsInvalid()); 502 DCHECK(!slot.IsInvalid());
502 declarations_.push_back(Declaration(name, slot, func)); 503 declarations_.push_back(Declaration(name, slot, func));
503 } 504 }
504 505
505 void AddUndefinedDeclaration(Handle<String> name, FeedbackVectorSlot slot) { 506 void AddUndefinedDeclaration(Handle<String> name, FeedbackVectorSlot slot) {
506 DCHECK(!slot.IsInvalid()); 507 DCHECK(!slot.IsInvalid());
507 declarations_.push_back(Declaration(name, slot, nullptr)); 508 declarations_.push_back(Declaration(name, slot, nullptr));
508 } 509 }
509 510
510 Handle<FixedArray> AllocateDeclarations(CompilationInfo* info) { 511 Handle<FixedArray> AllocateDeclarations(CompilationInfo* info) {
511 DCHECK(has_constant_pool_entry_); 512 DCHECK(has_constant_pool_entry_);
512 int array_index = 0; 513 int array_index = 0;
513 Handle<FixedArray> data = info->isolate()->factory()->NewFixedArray( 514 Handle<FixedArray> data = info->isolate()->factory()->NewFixedArray(
514 static_cast<int>(declarations_.size() * 3), TENURED); 515 static_cast<int>(declarations_.size() * 3), TENURED);
515 for (const Declaration& declaration : declarations_) { 516 for (const Declaration& declaration : declarations_) {
516 FunctionLiteral* func = declaration.func; 517 FunctionLiteral* func = declaration.func;
517 Handle<Object> initial_value; 518 Handle<Object> initial_value;
518 if (func == nullptr) { 519 if (func == nullptr) {
519 initial_value = info->isolate()->factory()->undefined_value(); 520 initial_value = info->isolate()->factory()->undefined_value();
520 } else { 521 } else {
521 initial_value = 522 initial_value = Compiler::GetSharedFunctionInfo(
522 Compiler::GetSharedFunctionInfo(func, info->script(), info); 523 func, info->script(), info, compilation_mode_);
523 } 524 }
524 525
525 // Return a null handle if any initial values can't be created. Caller 526 // Return a null handle if any initial values can't be created. Caller
526 // will set stack overflow. 527 // will set stack overflow.
527 if (initial_value.is_null()) return Handle<FixedArray>(); 528 if (initial_value.is_null()) return Handle<FixedArray>();
528 529
529 data->set(array_index++, *declaration.name); 530 data->set(array_index++, *declaration.name);
530 data->set(array_index++, Smi::FromInt(declaration.slot.ToInt())); 531 data->set(array_index++, Smi::FromInt(declaration.slot.ToInt()));
531 data->set(array_index++, *initial_value); 532 data->set(array_index++, *initial_value);
532 } 533 }
(...skipping 21 matching lines...) Expand all
554 FunctionLiteral* func) 555 FunctionLiteral* func)
555 : name(name), slot(slot), func(func) {} 556 : name(name), slot(slot), func(func) {}
556 557
557 Handle<String> name; 558 Handle<String> name;
558 FeedbackVectorSlot slot; 559 FeedbackVectorSlot slot;
559 FunctionLiteral* func; 560 FunctionLiteral* func;
560 }; 561 };
561 ZoneVector<Declaration> declarations_; 562 ZoneVector<Declaration> declarations_;
562 size_t constant_pool_entry_; 563 size_t constant_pool_entry_;
563 bool has_constant_pool_entry_; 564 bool has_constant_pool_entry_;
565 LazyCompilationMode compilation_mode_;
564 }; 566 };
565 567
566 BytecodeGenerator::BytecodeGenerator(CompilationInfo* info) 568 BytecodeGenerator::BytecodeGenerator(CompilationInfo* info,
569 LazyCompilationMode mode)
567 : zone_(info->zone()), 570 : zone_(info->zone()),
568 builder_(new (zone()) BytecodeArrayBuilder( 571 builder_(new (zone()) BytecodeArrayBuilder(
569 info->isolate(), info->zone(), info->num_parameters_including_this(), 572 info->isolate(), info->zone(), info->num_parameters_including_this(),
570 info->scope()->MaxNestedContextChainLength(), 573 info->scope()->MaxNestedContextChainLength(),
571 info->scope()->num_stack_slots(), info->literal(), 574 info->scope()->num_stack_slots(), info->literal(),
572 info->SourcePositionRecordingMode())), 575 info->SourcePositionRecordingMode())),
573 info_(info), 576 info_(info),
574 scope_(info->scope()), 577 scope_(info->scope()),
575 globals_builder_(new (zone()) GlobalDeclarationsBuilder(info->zone())), 578 compilation_mode_(mode),
579 globals_builder_(new (zone())
580 GlobalDeclarationsBuilder(info->zone(), mode)),
576 global_declarations_(0, info->zone()), 581 global_declarations_(0, info->zone()),
577 function_literals_(0, info->zone()), 582 function_literals_(0, info->zone()),
578 native_function_literals_(0, info->zone()), 583 native_function_literals_(0, info->zone()),
579 execution_control_(nullptr), 584 execution_control_(nullptr),
580 execution_context_(nullptr), 585 execution_context_(nullptr),
581 execution_result_(nullptr), 586 execution_result_(nullptr),
582 generator_resume_points_(info->literal()->yield_count(), info->zone()), 587 generator_resume_points_(info->literal()->yield_count(), info->zone()),
583 generator_state_(), 588 generator_state_(),
584 loop_depth_(0), 589 loop_depth_(0),
585 home_object_symbol_(info->isolate()->factory()->home_object_symbol()), 590 home_object_symbol_(info->isolate()->factory()->home_object_symbol()),
(...skipping 18 matching lines...) Expand all
604 Handle<FixedArray> declarations = 609 Handle<FixedArray> declarations =
605 globals_builder->AllocateDeclarations(info()); 610 globals_builder->AllocateDeclarations(info());
606 if (declarations.is_null()) return SetStackOverflow(); 611 if (declarations.is_null()) return SetStackOverflow();
607 builder()->InsertConstantPoolEntryAt(globals_builder->constant_pool_entry(), 612 builder()->InsertConstantPoolEntryAt(globals_builder->constant_pool_entry(),
608 declarations); 613 declarations);
609 } 614 }
610 615
611 // Find or build shared function infos. 616 // Find or build shared function infos.
612 for (std::pair<FunctionLiteral*, size_t> literal : function_literals_) { 617 for (std::pair<FunctionLiteral*, size_t> literal : function_literals_) {
613 FunctionLiteral* expr = literal.first; 618 FunctionLiteral* expr = literal.first;
614 Handle<SharedFunctionInfo> shared_info = 619 Handle<SharedFunctionInfo> shared_info = Compiler::GetSharedFunctionInfo(
615 Compiler::GetSharedFunctionInfo(expr, info()->script(), info()); 620 expr, info()->script(), info(), compilation_mode_);
616 if (shared_info.is_null()) return SetStackOverflow(); 621 if (shared_info.is_null()) return SetStackOverflow();
617 builder()->InsertConstantPoolEntryAt(literal.second, shared_info); 622 builder()->InsertConstantPoolEntryAt(literal.second, shared_info);
618 } 623 }
619 624
620 // Find or build shared function infos for the native function templates. 625 // Find or build shared function infos for the native function templates.
621 for (std::pair<NativeFunctionLiteral*, size_t> literal : 626 for (std::pair<NativeFunctionLiteral*, size_t> literal :
622 native_function_literals_) { 627 native_function_literals_) {
623 NativeFunctionLiteral* expr = literal.first; 628 NativeFunctionLiteral* expr = literal.first;
624 Handle<SharedFunctionInfo> shared_info = 629 Handle<SharedFunctionInfo> shared_info =
625 Compiler::GetSharedFunctionInfoForNative(expr->extension(), 630 Compiler::GetSharedFunctionInfoForNative(expr->extension(),
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
942 builder() 947 builder()
943 ->LoadConstantPoolEntry(globals_builder()->constant_pool_entry()) 948 ->LoadConstantPoolEntry(globals_builder()->constant_pool_entry())
944 .StoreAccumulatorInRegister(args[0]) 949 .StoreAccumulatorInRegister(args[0])
945 .LoadLiteral(Smi::FromInt(encoded_flags)) 950 .LoadLiteral(Smi::FromInt(encoded_flags))
946 .StoreAccumulatorInRegister(args[1]) 951 .StoreAccumulatorInRegister(args[1])
947 .MoveRegister(Register::function_closure(), args[2]) 952 .MoveRegister(Register::function_closure(), args[2])
948 .CallRuntime(Runtime::kDeclareGlobalsForInterpreter, args); 953 .CallRuntime(Runtime::kDeclareGlobalsForInterpreter, args);
949 954
950 // Push and reset globals builder. 955 // Push and reset globals builder.
951 global_declarations_.push_back(globals_builder()); 956 global_declarations_.push_back(globals_builder());
952 globals_builder_ = new (zone()) GlobalDeclarationsBuilder(zone()); 957 globals_builder_ =
958 new (zone()) GlobalDeclarationsBuilder(zone(), compilation_mode_);
953 } 959 }
954 960
955 void BytecodeGenerator::VisitStatements(ZoneList<Statement*>* statements) { 961 void BytecodeGenerator::VisitStatements(ZoneList<Statement*>* statements) {
956 for (int i = 0; i < statements->length(); i++) { 962 for (int i = 0; i < statements->length(); i++) {
957 // Allocate an outer register allocations scope for the statement. 963 // Allocate an outer register allocations scope for the statement.
958 RegisterAllocationScope allocation_scope(this); 964 RegisterAllocationScope allocation_scope(this);
959 Statement* stmt = statements->at(i); 965 Statement* stmt = statements->at(i);
960 Visit(stmt); 966 Visit(stmt);
961 if (stmt->IsJump()) break; 967 if (stmt->IsJump()) break;
962 } 968 }
(...skipping 2322 matching lines...) Expand 10 before | Expand all | Expand 10 after
3285 } 3291 }
3286 3292
3287 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { 3293 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() {
3288 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict 3294 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict
3289 : Runtime::kStoreKeyedToSuper_Sloppy; 3295 : Runtime::kStoreKeyedToSuper_Sloppy;
3290 } 3296 }
3291 3297
3292 } // namespace interpreter 3298 } // namespace interpreter
3293 } // namespace internal 3299 } // namespace internal
3294 } // namespace v8 3300 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698