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

Side by Side Diff: src/runtime.cc

Issue 9304001: Implement inlining of constructor calls. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed moar comments by Vyacheslav Egorov. Created 8 years, 9 months 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/objects.cc ('k') | src/type-info.h » ('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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 Object* V = args[1]; 869 Object* V = args[1];
870 while (true) { 870 while (true) {
871 Object* prototype = V->GetPrototype(); 871 Object* prototype = V->GetPrototype();
872 if (prototype->IsNull()) return isolate->heap()->false_value(); 872 if (prototype->IsNull()) return isolate->heap()->false_value();
873 if (O == prototype) return isolate->heap()->true_value(); 873 if (O == prototype) return isolate->heap()->true_value();
874 V = prototype; 874 V = prototype;
875 } 875 }
876 } 876 }
877 877
878 878
879 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsConstructCall) {
880 NoHandleAllocation ha;
881 ASSERT(args.length() == 0);
882 JavaScriptFrameIterator it(isolate);
883 return isolate->heap()->ToBoolean(it.frame()->IsConstructor());
884 }
885
886
887 // Recursively traverses hidden prototypes if property is not found 879 // Recursively traverses hidden prototypes if property is not found
888 static void GetOwnPropertyImplementation(JSObject* obj, 880 static void GetOwnPropertyImplementation(JSObject* obj,
889 String* name, 881 String* name,
890 LookupResult* result) { 882 LookupResult* result) {
891 obj->LocalLookupRealNamedProperty(name, result); 883 obj->LocalLookupRealNamedProperty(name, result);
892 884
893 if (!result->IsProperty()) { 885 if (!result->IsProperty()) {
894 Object* proto = obj->GetPrototype(); 886 Object* proto = obj->GetPrototype();
895 if (proto->IsJSObject() && 887 if (proto->IsJSObject() &&
896 JSObject::cast(proto)->map()->is_hidden_prototype()) 888 JSObject::cast(proto)->map()->is_hidden_prototype())
(...skipping 9811 matching lines...) Expand 10 before | Expand all | Expand 10 after
10708 FrameInspector(JavaScriptFrame* frame, 10700 FrameInspector(JavaScriptFrame* frame,
10709 int inlined_jsframe_index, 10701 int inlined_jsframe_index,
10710 Isolate* isolate) 10702 Isolate* isolate)
10711 : frame_(frame), deoptimized_frame_(NULL), isolate_(isolate) { 10703 : frame_(frame), deoptimized_frame_(NULL), isolate_(isolate) {
10712 // Calculate the deoptimized frame. 10704 // Calculate the deoptimized frame.
10713 if (frame->is_optimized()) { 10705 if (frame->is_optimized()) {
10714 deoptimized_frame_ = Deoptimizer::DebuggerInspectableFrame( 10706 deoptimized_frame_ = Deoptimizer::DebuggerInspectableFrame(
10715 frame, inlined_jsframe_index, isolate); 10707 frame, inlined_jsframe_index, isolate);
10716 } 10708 }
10717 has_adapted_arguments_ = frame_->has_adapted_arguments(); 10709 has_adapted_arguments_ = frame_->has_adapted_arguments();
10710 is_bottommost_ = inlined_jsframe_index == 0;
10718 is_optimized_ = frame_->is_optimized(); 10711 is_optimized_ = frame_->is_optimized();
10719 } 10712 }
10720 10713
10721 ~FrameInspector() { 10714 ~FrameInspector() {
10722 // Get rid of the calculated deoptimized frame if any. 10715 // Get rid of the calculated deoptimized frame if any.
10723 if (deoptimized_frame_ != NULL) { 10716 if (deoptimized_frame_ != NULL) {
10724 Deoptimizer::DeleteDebuggerInspectableFrame(deoptimized_frame_, 10717 Deoptimizer::DeleteDebuggerInspectableFrame(deoptimized_frame_,
10725 isolate_); 10718 isolate_);
10726 } 10719 }
10727 } 10720 }
(...skipping 17 matching lines...) Expand all
10745 Object* GetExpression(int index) { 10738 Object* GetExpression(int index) {
10746 return is_optimized_ 10739 return is_optimized_
10747 ? deoptimized_frame_->GetExpression(index) 10740 ? deoptimized_frame_->GetExpression(index)
10748 : frame_->GetExpression(index); 10741 : frame_->GetExpression(index);
10749 } 10742 }
10750 Address GetPc() { 10743 Address GetPc() {
10751 return is_optimized_ 10744 return is_optimized_
10752 ? deoptimized_frame_->GetPc() 10745 ? deoptimized_frame_->GetPc()
10753 : frame_->pc(); 10746 : frame_->pc();
10754 } 10747 }
10748 bool IsConstructor() {
10749 return is_optimized_ && !is_bottommost_
10750 ? deoptimized_frame_->HasConstructStub()
10751 : frame_->IsConstructor();
10752 }
10755 10753
10756 // To inspect all the provided arguments the frame might need to be 10754 // To inspect all the provided arguments the frame might need to be
10757 // replaced with the arguments frame. 10755 // replaced with the arguments frame.
10758 void SetArgumentsFrame(JavaScriptFrame* frame) { 10756 void SetArgumentsFrame(JavaScriptFrame* frame) {
10759 ASSERT(has_adapted_arguments_); 10757 ASSERT(has_adapted_arguments_);
10760 frame_ = frame; 10758 frame_ = frame;
10761 is_optimized_ = frame_->is_optimized(); 10759 is_optimized_ = frame_->is_optimized();
10762 ASSERT(!is_optimized_); 10760 ASSERT(!is_optimized_);
10763 } 10761 }
10764 10762
10765 private: 10763 private:
10766 JavaScriptFrame* frame_; 10764 JavaScriptFrame* frame_;
10767 DeoptimizedFrameInfo* deoptimized_frame_; 10765 DeoptimizedFrameInfo* deoptimized_frame_;
10768 Isolate* isolate_; 10766 Isolate* isolate_;
10769 bool is_optimized_; 10767 bool is_optimized_;
10768 bool is_bottommost_;
10770 bool has_adapted_arguments_; 10769 bool has_adapted_arguments_;
10771 10770
10772 DISALLOW_COPY_AND_ASSIGN(FrameInspector); 10771 DISALLOW_COPY_AND_ASSIGN(FrameInspector);
10773 }; 10772 };
10774 10773
10775 10774
10776 static const int kFrameDetailsFrameIdIndex = 0; 10775 static const int kFrameDetailsFrameIdIndex = 0;
10777 static const int kFrameDetailsReceiverIndex = 1; 10776 static const int kFrameDetailsReceiverIndex = 1;
10778 static const int kFrameDetailsFunctionIndex = 2; 10777 static const int kFrameDetailsFunctionIndex = 2;
10779 static const int kFrameDetailsArgumentCountIndex = 3; 10778 static const int kFrameDetailsArgumentCountIndex = 3;
10780 static const int kFrameDetailsLocalCountIndex = 4; 10779 static const int kFrameDetailsLocalCountIndex = 4;
10781 static const int kFrameDetailsSourcePositionIndex = 5; 10780 static const int kFrameDetailsSourcePositionIndex = 5;
10782 static const int kFrameDetailsConstructCallIndex = 6; 10781 static const int kFrameDetailsConstructCallIndex = 6;
10783 static const int kFrameDetailsAtReturnIndex = 7; 10782 static const int kFrameDetailsAtReturnIndex = 7;
10784 static const int kFrameDetailsFlagsIndex = 8; 10783 static const int kFrameDetailsFlagsIndex = 8;
10785 static const int kFrameDetailsFirstDynamicIndex = 9; 10784 static const int kFrameDetailsFirstDynamicIndex = 9;
10786 10785
10787 10786
10788 static SaveContext* FindSavedContextForFrame(Isolate* isolate, 10787 static SaveContext* FindSavedContextForFrame(Isolate* isolate,
10789 JavaScriptFrame* frame) { 10788 JavaScriptFrame* frame) {
10790 SaveContext* save = isolate->save_context(); 10789 SaveContext* save = isolate->save_context();
10791 while (save != NULL && !save->IsBelowFrame(frame)) { 10790 while (save != NULL && !save->IsBelowFrame(frame)) {
10792 save = save->prev(); 10791 save = save->prev();
10793 } 10792 }
10794 ASSERT(save != NULL); 10793 ASSERT(save != NULL);
10795 return save; 10794 return save;
10796 } 10795 }
10797 10796
10798 10797
10798 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsConstructCall) {
10799 NoHandleAllocation ha;
10800 ASSERT(args.length() == 0);
10801 JavaScriptFrameIterator it(isolate);
10802 JavaScriptFrame* frame = it.frame();
10803 FrameInspector frame_inspector(frame, frame->GetInlineCount() - 1, isolate);
10804 return isolate->heap()->ToBoolean(frame_inspector.IsConstructor());
10805 }
10806
10807
10799 // Return an array with frame details 10808 // Return an array with frame details
10800 // args[0]: number: break id 10809 // args[0]: number: break id
10801 // args[1]: number: frame index 10810 // args[1]: number: frame index
10802 // 10811 //
10803 // The array returned contains the following information: 10812 // The array returned contains the following information:
10804 // 0: Frame id 10813 // 0: Frame id
10805 // 1: Receiver 10814 // 1: Receiver
10806 // 2: Function 10815 // 2: Function
10807 // 3: Argument count 10816 // 3: Argument count
10808 // 4: Local count 10817 // 4: Local count
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
10855 SaveContext* save = FindSavedContextForFrame(isolate, it.frame()); 10864 SaveContext* save = FindSavedContextForFrame(isolate, it.frame());
10856 10865
10857 // Get the frame id. 10866 // Get the frame id.
10858 Handle<Object> frame_id(WrapFrameId(it.frame()->id()), isolate); 10867 Handle<Object> frame_id(WrapFrameId(it.frame()->id()), isolate);
10859 10868
10860 // Find source position in unoptimized code. 10869 // Find source position in unoptimized code.
10861 Handle<JSFunction> function(JSFunction::cast(frame_inspector.GetFunction())); 10870 Handle<JSFunction> function(JSFunction::cast(frame_inspector.GetFunction()));
10862 Handle<SharedFunctionInfo> shared(function->shared()); 10871 Handle<SharedFunctionInfo> shared(function->shared());
10863 int position = shared->code()->SourcePosition(frame_inspector.GetPc()); 10872 int position = shared->code()->SourcePosition(frame_inspector.GetPc());
10864 10873
10865 // Check for constructor frame. Inlined frames cannot be construct calls. 10874 // Check for constructor frame.
10866 bool inlined_frame = is_optimized && inlined_jsframe_index != 0; 10875 bool constructor = frame_inspector.IsConstructor();
10867 bool constructor = !inlined_frame && it.frame()->IsConstructor();
10868 10876
10869 // Get scope info and read from it for local variable information. 10877 // Get scope info and read from it for local variable information.
10870 Handle<ScopeInfo> scope_info(shared->scope_info()); 10878 Handle<ScopeInfo> scope_info(shared->scope_info());
10871 ASSERT(*scope_info != ScopeInfo::Empty()); 10879 ASSERT(*scope_info != ScopeInfo::Empty());
10872 10880
10873 // Get the locals names and values into a temporary array. 10881 // Get the locals names and values into a temporary array.
10874 // 10882 //
10875 // TODO(1240907): Hide compiler-introduced stack variables 10883 // TODO(1240907): Hide compiler-introduced stack variables
10876 // (e.g. .result)? For users of the debugger, they will probably be 10884 // (e.g. .result)? For users of the debugger, they will probably be
10877 // confusing. 10885 // confusing.
(...skipping 2771 matching lines...) Expand 10 before | Expand all | Expand 10 after
13649 } else { 13657 } else {
13650 // Handle last resort GC and make sure to allow future allocations 13658 // Handle last resort GC and make sure to allow future allocations
13651 // to grow the heap without causing GCs (if possible). 13659 // to grow the heap without causing GCs (if possible).
13652 isolate->counters()->gc_last_resort_from_js()->Increment(); 13660 isolate->counters()->gc_last_resort_from_js()->Increment();
13653 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); 13661 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags);
13654 } 13662 }
13655 } 13663 }
13656 13664
13657 13665
13658 } } // namespace v8::internal 13666 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | src/type-info.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698