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

Side by Side Diff: src/liveedit.cc

Issue 670953003: Move feedback slot allocation to post-pass (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased patch Created 6 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « src/liveedit.h ('k') | src/parser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 5
6 #include "src/v8.h" 6 #include "src/v8.h"
7 7
8 #include "src/liveedit.h" 8 #include "src/liveedit.h"
9 9
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 } 598 }
599 599
600 600
601 static int GetArrayLength(Handle<JSArray> array) { 601 static int GetArrayLength(Handle<JSArray> array) {
602 Object* length = array->length(); 602 Object* length = array->length();
603 CHECK(length->IsSmi()); 603 CHECK(length->IsSmi());
604 return Smi::cast(length)->value(); 604 return Smi::cast(length)->value();
605 } 605 }
606 606
607 607
608 void FunctionInfoWrapper::SetInitialProperties( 608 void FunctionInfoWrapper::SetInitialProperties(Handle<String> name,
609 Handle<String> name, int start_position, int end_position, int param_num, 609 int start_position,
610 int literal_count, int slot_count, int ic_slot_count, int parent_index) { 610 int end_position, int param_num,
611 int literal_count,
612 int parent_index) {
611 HandleScope scope(isolate()); 613 HandleScope scope(isolate());
612 this->SetField(kFunctionNameOffset_, name); 614 this->SetField(kFunctionNameOffset_, name);
613 this->SetSmiValueField(kStartPositionOffset_, start_position); 615 this->SetSmiValueField(kStartPositionOffset_, start_position);
614 this->SetSmiValueField(kEndPositionOffset_, end_position); 616 this->SetSmiValueField(kEndPositionOffset_, end_position);
615 this->SetSmiValueField(kParamNumOffset_, param_num); 617 this->SetSmiValueField(kParamNumOffset_, param_num);
616 this->SetSmiValueField(kLiteralNumOffset_, literal_count); 618 this->SetSmiValueField(kLiteralNumOffset_, literal_count);
617 this->SetSmiValueField(kSlotNumOffset_, slot_count);
618 this->SetSmiValueField(kICSlotNumOffset_, ic_slot_count);
619 this->SetSmiValueField(kParentIndexOffset_, parent_index); 619 this->SetSmiValueField(kParentIndexOffset_, parent_index);
620 } 620 }
621 621
622 622
623 void FunctionInfoWrapper::SetFunctionCode(Handle<Code> function_code, 623 void FunctionInfoWrapper::SetFunctionCode(Handle<Code> function_code,
624 Handle<HeapObject> code_scope_info) { 624 Handle<HeapObject> code_scope_info) {
625 Handle<JSValue> code_wrapper = WrapInJSValue(function_code); 625 Handle<JSValue> code_wrapper = WrapInJSValue(function_code);
626 this->SetField(kCodeOffset_, code_wrapper); 626 this->SetField(kCodeOffset_, code_wrapper);
627 627
628 Handle<JSValue> scope_wrapper = WrapInJSValue(code_scope_info); 628 Handle<JSValue> scope_wrapper = WrapInJSValue(code_scope_info);
(...skipping 10 matching lines...) Expand all
639 639
640 Handle<Code> FunctionInfoWrapper::GetFunctionCode() { 640 Handle<Code> FunctionInfoWrapper::GetFunctionCode() {
641 Handle<Object> element = this->GetField(kCodeOffset_); 641 Handle<Object> element = this->GetField(kCodeOffset_);
642 Handle<JSValue> value_wrapper = Handle<JSValue>::cast(element); 642 Handle<JSValue> value_wrapper = Handle<JSValue>::cast(element);
643 Handle<Object> raw_result = UnwrapJSValue(value_wrapper); 643 Handle<Object> raw_result = UnwrapJSValue(value_wrapper);
644 CHECK(raw_result->IsCode()); 644 CHECK(raw_result->IsCode());
645 return Handle<Code>::cast(raw_result); 645 return Handle<Code>::cast(raw_result);
646 } 646 }
647 647
648 648
649 Handle<TypeFeedbackVector> FunctionInfoWrapper::GetFeedbackVector() { 649 MaybeHandle<TypeFeedbackVector> FunctionInfoWrapper::GetFeedbackVector() {
650 Handle<Object> element = this->GetField(kSharedFunctionInfoOffset_); 650 Handle<Object> element = this->GetField(kSharedFunctionInfoOffset_);
651 Handle<TypeFeedbackVector> result;
652 if (element->IsJSValue()) { 651 if (element->IsJSValue()) {
653 Handle<JSValue> value_wrapper = Handle<JSValue>::cast(element); 652 Handle<JSValue> value_wrapper = Handle<JSValue>::cast(element);
654 Handle<Object> raw_result = UnwrapJSValue(value_wrapper); 653 Handle<Object> raw_result = UnwrapJSValue(value_wrapper);
655 Handle<SharedFunctionInfo> shared = 654 Handle<SharedFunctionInfo> shared =
656 Handle<SharedFunctionInfo>::cast(raw_result); 655 Handle<SharedFunctionInfo>::cast(raw_result);
657 result = Handle<TypeFeedbackVector>(shared->feedback_vector(), isolate()); 656 return Handle<TypeFeedbackVector>(shared->feedback_vector(), isolate());
658 CHECK_EQ(result->Slots(), GetSlotCount());
659 CHECK_EQ(result->ICSlots(), GetICSlotCount());
660 } else { 657 } else {
661 // Scripts may never have a SharedFunctionInfo created, so 658 // Scripts may never have a SharedFunctionInfo created.
662 // create a type feedback vector here. 659 return MaybeHandle<TypeFeedbackVector>();
663 int slot_count = GetSlotCount();
664 int ic_slot_count = GetICSlotCount();
665 result =
666 isolate()->factory()->NewTypeFeedbackVector(slot_count, ic_slot_count);
667 } 660 }
668 return result;
669 } 661 }
670 662
671 663
672 Handle<Object> FunctionInfoWrapper::GetCodeScopeInfo() { 664 Handle<Object> FunctionInfoWrapper::GetCodeScopeInfo() {
673 Handle<Object> element = this->GetField(kCodeScopeInfoOffset_); 665 Handle<Object> element = this->GetField(kCodeScopeInfoOffset_);
674 return UnwrapJSValue(Handle<JSValue>::cast(element)); 666 return UnwrapJSValue(Handle<JSValue>::cast(element));
675 } 667 }
676 668
677 669
678 void SharedInfoWrapper::SetProperties(Handle<String> name, 670 void SharedInfoWrapper::SetProperties(Handle<String> name,
(...skipping 20 matching lines...) Expand all
699 public: 691 public:
700 explicit FunctionInfoListener(Isolate* isolate) { 692 explicit FunctionInfoListener(Isolate* isolate) {
701 current_parent_index_ = -1; 693 current_parent_index_ = -1;
702 len_ = 0; 694 len_ = 0;
703 result_ = isolate->factory()->NewJSArray(10); 695 result_ = isolate->factory()->NewJSArray(10);
704 } 696 }
705 697
706 void FunctionStarted(FunctionLiteral* fun) { 698 void FunctionStarted(FunctionLiteral* fun) {
707 HandleScope scope(isolate()); 699 HandleScope scope(isolate());
708 FunctionInfoWrapper info = FunctionInfoWrapper::Create(isolate()); 700 FunctionInfoWrapper info = FunctionInfoWrapper::Create(isolate());
709 info.SetInitialProperties( 701 info.SetInitialProperties(fun->name(), fun->start_position(),
710 fun->name(), fun->start_position(), fun->end_position(), 702 fun->end_position(), fun->parameter_count(),
711 fun->parameter_count(), fun->materialized_literal_count(), 703 fun->materialized_literal_count(),
712 fun->slot_count(), fun->ic_slot_count(), current_parent_index_); 704 current_parent_index_);
713 current_parent_index_ = len_; 705 current_parent_index_ = len_;
714 SetElementSloppy(result_, len_, info.GetJSArray()); 706 SetElementSloppy(result_, len_, info.GetJSArray());
715 len_++; 707 len_++;
716 } 708 }
717 709
718 void FunctionDone() { 710 void FunctionDone() {
719 HandleScope scope(isolate()); 711 HandleScope scope(isolate());
720 FunctionInfoWrapper info = 712 FunctionInfoWrapper info =
721 FunctionInfoWrapper::cast( 713 FunctionInfoWrapper::cast(
722 *Object::GetElement( 714 *Object::GetElement(
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
1194 Handle<SharedFunctionInfo> shared_info = shared_info_wrapper.GetInfo(); 1186 Handle<SharedFunctionInfo> shared_info = shared_info_wrapper.GetInfo();
1195 1187
1196 if (IsJSFunctionCode(shared_info->code())) { 1188 if (IsJSFunctionCode(shared_info->code())) {
1197 Handle<Code> code = compile_info_wrapper.GetFunctionCode(); 1189 Handle<Code> code = compile_info_wrapper.GetFunctionCode();
1198 ReplaceCodeObject(Handle<Code>(shared_info->code()), code); 1190 ReplaceCodeObject(Handle<Code>(shared_info->code()), code);
1199 Handle<Object> code_scope_info = compile_info_wrapper.GetCodeScopeInfo(); 1191 Handle<Object> code_scope_info = compile_info_wrapper.GetCodeScopeInfo();
1200 if (code_scope_info->IsFixedArray()) { 1192 if (code_scope_info->IsFixedArray()) {
1201 shared_info->set_scope_info(ScopeInfo::cast(*code_scope_info)); 1193 shared_info->set_scope_info(ScopeInfo::cast(*code_scope_info));
1202 } 1194 }
1203 shared_info->DisableOptimization(kLiveEdit); 1195 shared_info->DisableOptimization(kLiveEdit);
1204 // Update the type feedback vector 1196 // Update the type feedback vector, if needed.
1205 Handle<TypeFeedbackVector> feedback_vector = 1197 MaybeHandle<TypeFeedbackVector> feedback_vector =
1206 compile_info_wrapper.GetFeedbackVector(); 1198 compile_info_wrapper.GetFeedbackVector();
1207 shared_info->set_feedback_vector(*feedback_vector); 1199 if (!feedback_vector.is_null()) {
1200 shared_info->set_feedback_vector(*feedback_vector.ToHandleChecked());
1201 }
1208 } 1202 }
1209 1203
1210 if (shared_info->debug_info()->IsDebugInfo()) { 1204 if (shared_info->debug_info()->IsDebugInfo()) {
1211 Handle<DebugInfo> debug_info(DebugInfo::cast(shared_info->debug_info())); 1205 Handle<DebugInfo> debug_info(DebugInfo::cast(shared_info->debug_info()));
1212 Handle<Code> new_original_code = 1206 Handle<Code> new_original_code =
1213 isolate->factory()->CopyCode(compile_info_wrapper.GetFunctionCode()); 1207 isolate->factory()->CopyCode(compile_info_wrapper.GetFunctionCode());
1214 debug_info->set_original_code(*new_original_code); 1208 debug_info->set_original_code(*new_original_code);
1215 } 1209 }
1216 1210
1217 int start_position = compile_info_wrapper.GetStartPosition(); 1211 int start_position = compile_info_wrapper.GetStartPosition();
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after
2077 void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) { 2071 void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) {
2078 isolate_->active_function_info_listener()->FunctionCode(code); 2072 isolate_->active_function_info_listener()->FunctionCode(code);
2079 } 2073 }
2080 2074
2081 2075
2082 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { 2076 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) {
2083 return isolate->active_function_info_listener() != NULL; 2077 return isolate->active_function_info_listener() != NULL;
2084 } 2078 }
2085 2079
2086 } } // namespace v8::internal 2080 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/liveedit.h ('k') | src/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698