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 | 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...) Loading... |
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(Handle<String> name, | 608 void FunctionInfoWrapper::SetInitialProperties( |
609 int start_position, | 609 Handle<String> name, int start_position, int end_position, int param_num, |
610 int end_position, | 610 int literal_count, int slot_count, int ic_slot_count, int parent_index) { |
611 int param_num, | |
612 int literal_count, | |
613 int slot_count, | |
614 int parent_index) { | |
615 HandleScope scope(isolate()); | 611 HandleScope scope(isolate()); |
616 this->SetField(kFunctionNameOffset_, name); | 612 this->SetField(kFunctionNameOffset_, name); |
617 this->SetSmiValueField(kStartPositionOffset_, start_position); | 613 this->SetSmiValueField(kStartPositionOffset_, start_position); |
618 this->SetSmiValueField(kEndPositionOffset_, end_position); | 614 this->SetSmiValueField(kEndPositionOffset_, end_position); |
619 this->SetSmiValueField(kParamNumOffset_, param_num); | 615 this->SetSmiValueField(kParamNumOffset_, param_num); |
620 this->SetSmiValueField(kLiteralNumOffset_, literal_count); | 616 this->SetSmiValueField(kLiteralNumOffset_, literal_count); |
621 this->SetSmiValueField(kSlotNumOffset_, slot_count); | 617 this->SetSmiValueField(kSlotNumOffset_, slot_count); |
| 618 this->SetSmiValueField(kICSlotNumOffset_, ic_slot_count); |
622 this->SetSmiValueField(kParentIndexOffset_, parent_index); | 619 this->SetSmiValueField(kParentIndexOffset_, parent_index); |
623 } | 620 } |
624 | 621 |
625 | 622 |
626 void FunctionInfoWrapper::SetFunctionCode(Handle<Code> function_code, | 623 void FunctionInfoWrapper::SetFunctionCode(Handle<Code> function_code, |
627 Handle<HeapObject> code_scope_info) { | 624 Handle<HeapObject> code_scope_info) { |
628 Handle<JSValue> code_wrapper = WrapInJSValue(function_code); | 625 Handle<JSValue> code_wrapper = WrapInJSValue(function_code); |
629 this->SetField(kCodeOffset_, code_wrapper); | 626 this->SetField(kCodeOffset_, code_wrapper); |
630 | 627 |
631 Handle<JSValue> scope_wrapper = WrapInJSValue(code_scope_info); | 628 Handle<JSValue> scope_wrapper = WrapInJSValue(code_scope_info); |
(...skipping 19 matching lines...) Loading... |
651 | 648 |
652 Handle<TypeFeedbackVector> FunctionInfoWrapper::GetFeedbackVector() { | 649 Handle<TypeFeedbackVector> FunctionInfoWrapper::GetFeedbackVector() { |
653 Handle<Object> element = this->GetField(kSharedFunctionInfoOffset_); | 650 Handle<Object> element = this->GetField(kSharedFunctionInfoOffset_); |
654 Handle<TypeFeedbackVector> result; | 651 Handle<TypeFeedbackVector> result; |
655 if (element->IsJSValue()) { | 652 if (element->IsJSValue()) { |
656 Handle<JSValue> value_wrapper = Handle<JSValue>::cast(element); | 653 Handle<JSValue> value_wrapper = Handle<JSValue>::cast(element); |
657 Handle<Object> raw_result = UnwrapJSValue(value_wrapper); | 654 Handle<Object> raw_result = UnwrapJSValue(value_wrapper); |
658 Handle<SharedFunctionInfo> shared = | 655 Handle<SharedFunctionInfo> shared = |
659 Handle<SharedFunctionInfo>::cast(raw_result); | 656 Handle<SharedFunctionInfo>::cast(raw_result); |
660 result = Handle<TypeFeedbackVector>(shared->feedback_vector(), isolate()); | 657 result = Handle<TypeFeedbackVector>(shared->feedback_vector(), isolate()); |
661 CHECK_EQ(result->length(), GetSlotCount()); | 658 CHECK_EQ(result->Slots(), GetSlotCount()); |
| 659 CHECK_EQ(result->ICSlots(), GetICSlotCount()); |
662 } else { | 660 } else { |
663 // Scripts may never have a SharedFunctionInfo created, so | 661 // Scripts may never have a SharedFunctionInfo created, so |
664 // create a type feedback vector here. | 662 // create a type feedback vector here. |
665 int slot_count = GetSlotCount(); | 663 int slot_count = GetSlotCount(); |
666 result = isolate()->factory()->NewTypeFeedbackVector(slot_count); | 664 int ic_slot_count = GetICSlotCount(); |
| 665 result = |
| 666 isolate()->factory()->NewTypeFeedbackVector(slot_count, ic_slot_count); |
667 } | 667 } |
668 return result; | 668 return result; |
669 } | 669 } |
670 | 670 |
671 | 671 |
672 Handle<Object> FunctionInfoWrapper::GetCodeScopeInfo() { | 672 Handle<Object> FunctionInfoWrapper::GetCodeScopeInfo() { |
673 Handle<Object> element = this->GetField(kCodeScopeInfoOffset_); | 673 Handle<Object> element = this->GetField(kCodeScopeInfoOffset_); |
674 return UnwrapJSValue(Handle<JSValue>::cast(element)); | 674 return UnwrapJSValue(Handle<JSValue>::cast(element)); |
675 } | 675 } |
676 | 676 |
(...skipping 22 matching lines...) Loading... |
699 public: | 699 public: |
700 explicit FunctionInfoListener(Isolate* isolate) { | 700 explicit FunctionInfoListener(Isolate* isolate) { |
701 current_parent_index_ = -1; | 701 current_parent_index_ = -1; |
702 len_ = 0; | 702 len_ = 0; |
703 result_ = isolate->factory()->NewJSArray(10); | 703 result_ = isolate->factory()->NewJSArray(10); |
704 } | 704 } |
705 | 705 |
706 void FunctionStarted(FunctionLiteral* fun) { | 706 void FunctionStarted(FunctionLiteral* fun) { |
707 HandleScope scope(isolate()); | 707 HandleScope scope(isolate()); |
708 FunctionInfoWrapper info = FunctionInfoWrapper::Create(isolate()); | 708 FunctionInfoWrapper info = FunctionInfoWrapper::Create(isolate()); |
709 info.SetInitialProperties(fun->name(), fun->start_position(), | 709 info.SetInitialProperties( |
710 fun->end_position(), fun->parameter_count(), | 710 fun->name(), fun->start_position(), fun->end_position(), |
711 fun->materialized_literal_count(), | 711 fun->parameter_count(), fun->materialized_literal_count(), |
712 fun->slot_count(), | 712 fun->slot_count(), fun->ic_slot_count(), current_parent_index_); |
713 current_parent_index_); | |
714 current_parent_index_ = len_; | 713 current_parent_index_ = len_; |
715 SetElementSloppy(result_, len_, info.GetJSArray()); | 714 SetElementSloppy(result_, len_, info.GetJSArray()); |
716 len_++; | 715 len_++; |
717 } | 716 } |
718 | 717 |
719 void FunctionDone() { | 718 void FunctionDone() { |
720 HandleScope scope(isolate()); | 719 HandleScope scope(isolate()); |
721 FunctionInfoWrapper info = | 720 FunctionInfoWrapper info = |
722 FunctionInfoWrapper::cast( | 721 FunctionInfoWrapper::cast( |
723 *Object::GetElement( | 722 *Object::GetElement( |
(...skipping 1354 matching lines...) Loading... |
2078 void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) { | 2077 void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) { |
2079 isolate_->active_function_info_listener()->FunctionCode(code); | 2078 isolate_->active_function_info_listener()->FunctionCode(code); |
2080 } | 2079 } |
2081 | 2080 |
2082 | 2081 |
2083 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { | 2082 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { |
2084 return isolate->active_function_info_listener() != NULL; | 2083 return isolate->active_function_info_listener() != NULL; |
2085 } | 2084 } |
2086 | 2085 |
2087 } } // namespace v8::internal | 2086 } } // namespace v8::internal |
OLD | NEW |