Chromium Code Reviews| 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 #include <stdlib.h> | 5 #include <stdlib.h> |
| 6 #include <limits> | 6 #include <limits> |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
| (...skipping 11060 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11071 | 11071 |
| 11072 // Count all frames which are relevant to debugging stack trace. | 11072 // Count all frames which are relevant to debugging stack trace. |
| 11073 int n = 0; | 11073 int n = 0; |
| 11074 StackFrame::Id id = isolate->debug()->break_frame_id(); | 11074 StackFrame::Id id = isolate->debug()->break_frame_id(); |
| 11075 if (id == StackFrame::NO_ID) { | 11075 if (id == StackFrame::NO_ID) { |
| 11076 // If there is no JavaScript stack frame count is 0. | 11076 // If there is no JavaScript stack frame count is 0. |
| 11077 return Smi::FromInt(0); | 11077 return Smi::FromInt(0); |
| 11078 } | 11078 } |
| 11079 | 11079 |
| 11080 for (JavaScriptFrameIterator it(isolate, id); !it.done(); it.Advance()) { | 11080 for (JavaScriptFrameIterator it(isolate, id); !it.done(); it.Advance()) { |
| 11081 n += it.frame()->GetInlineCount(); | 11081 List<FrameSummary> frames(FLAG_max_inlining_levels + 1); |
| 11082 it.frame()->Summarize(&frames); | |
| 11083 for (int i = frames.length() - 1; i >= 0; i--) { | |
| 11084 // Omit functions from native scripts. | |
| 11085 if (!frames[i].function()->IsFromNativeScript()) n++; | |
| 11086 } | |
| 11082 } | 11087 } |
| 11083 return Smi::FromInt(n); | 11088 return Smi::FromInt(n); |
| 11084 } | 11089 } |
| 11085 | 11090 |
| 11086 | 11091 |
| 11087 class FrameInspector { | 11092 class FrameInspector { |
| 11088 public: | 11093 public: |
| 11089 FrameInspector(JavaScriptFrame* frame, | 11094 FrameInspector(JavaScriptFrame* frame, |
| 11090 int inlined_jsframe_index, | 11095 int inlined_jsframe_index, |
| 11091 Isolate* isolate) | 11096 Isolate* isolate) |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11186 | 11191 |
| 11187 RUNTIME_FUNCTION(Runtime_IsOptimized) { | 11192 RUNTIME_FUNCTION(Runtime_IsOptimized) { |
| 11188 SealHandleScope shs(isolate); | 11193 SealHandleScope shs(isolate); |
| 11189 ASSERT(args.length() == 0); | 11194 ASSERT(args.length() == 0); |
| 11190 JavaScriptFrameIterator it(isolate); | 11195 JavaScriptFrameIterator it(isolate); |
| 11191 JavaScriptFrame* frame = it.frame(); | 11196 JavaScriptFrame* frame = it.frame(); |
| 11192 return isolate->heap()->ToBoolean(frame->is_optimized()); | 11197 return isolate->heap()->ToBoolean(frame->is_optimized()); |
| 11193 } | 11198 } |
| 11194 | 11199 |
| 11195 | 11200 |
| 11201 // Advances the iterator to to the frame that matches the index and returns | |
|
aandrey
2014/07/31 14:43:17
typo: to to
Yang
2014/07/31 15:27:10
Done.
| |
| 11202 // the inlined frame index, or -1 if not found. Skips native JS functions. | |
| 11203 static int FindIndexedNonNativeFrame(JavaScriptFrameIterator* it, int index) { | |
| 11204 int count = -1; | |
| 11205 for (; !it->done(); it->Advance()) { | |
| 11206 List<FrameSummary> frames(FLAG_max_inlining_levels + 1); | |
| 11207 it->frame()->Summarize(&frames); | |
| 11208 for (int i = frames.length() - 1; i >= 0; i--) { | |
| 11209 // Omit functions from native scripts. | |
| 11210 if (frames[i].function()->IsFromNativeScript()) continue; | |
| 11211 if (++count == index) return i; | |
| 11212 } | |
| 11213 } | |
| 11214 return -1; | |
| 11215 } | |
| 11216 | |
| 11217 | |
| 11196 // Return an array with frame details | 11218 // Return an array with frame details |
| 11197 // args[0]: number: break id | 11219 // args[0]: number: break id |
| 11198 // args[1]: number: frame index | 11220 // args[1]: number: frame index |
| 11199 // | 11221 // |
| 11200 // The array returned contains the following information: | 11222 // The array returned contains the following information: |
| 11201 // 0: Frame id | 11223 // 0: Frame id |
| 11202 // 1: Receiver | 11224 // 1: Receiver |
| 11203 // 2: Function | 11225 // 2: Function |
| 11204 // 3: Argument count | 11226 // 3: Argument count |
| 11205 // 4: Local count | 11227 // 4: Local count |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 11219 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); | 11241 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); |
| 11220 Heap* heap = isolate->heap(); | 11242 Heap* heap = isolate->heap(); |
| 11221 | 11243 |
| 11222 // Find the relevant frame with the requested index. | 11244 // Find the relevant frame with the requested index. |
| 11223 StackFrame::Id id = isolate->debug()->break_frame_id(); | 11245 StackFrame::Id id = isolate->debug()->break_frame_id(); |
| 11224 if (id == StackFrame::NO_ID) { | 11246 if (id == StackFrame::NO_ID) { |
| 11225 // If there are no JavaScript stack frames return undefined. | 11247 // If there are no JavaScript stack frames return undefined. |
| 11226 return heap->undefined_value(); | 11248 return heap->undefined_value(); |
| 11227 } | 11249 } |
| 11228 | 11250 |
| 11229 int count = 0; | |
| 11230 JavaScriptFrameIterator it(isolate, id); | 11251 JavaScriptFrameIterator it(isolate, id); |
| 11231 for (; !it.done(); it.Advance()) { | 11252 // Inlined frame index in optimized frame, starting from outer function. |
| 11232 if (index < count + it.frame()->GetInlineCount()) break; | 11253 int inlined_jsframe_index = FindIndexedNonNativeFrame(&it, index); |
| 11233 count += it.frame()->GetInlineCount(); | 11254 if (inlined_jsframe_index == -1) return heap->undefined_value(); |
| 11234 } | |
| 11235 if (it.done()) return heap->undefined_value(); | |
| 11236 | 11255 |
| 11256 FrameInspector frame_inspector(it.frame(), inlined_jsframe_index, isolate); | |
| 11237 bool is_optimized = it.frame()->is_optimized(); | 11257 bool is_optimized = it.frame()->is_optimized(); |
| 11238 | 11258 |
| 11239 int inlined_jsframe_index = 0; // Inlined frame index in optimized frame. | |
| 11240 if (is_optimized) { | |
| 11241 inlined_jsframe_index = | |
| 11242 it.frame()->GetInlineCount() - (index - count) - 1; | |
| 11243 } | |
| 11244 FrameInspector frame_inspector(it.frame(), inlined_jsframe_index, isolate); | |
| 11245 | |
| 11246 // Traverse the saved contexts chain to find the active context for the | 11259 // Traverse the saved contexts chain to find the active context for the |
| 11247 // selected frame. | 11260 // selected frame. |
| 11248 SaveContext* save = FindSavedContextForFrame(isolate, it.frame()); | 11261 SaveContext* save = FindSavedContextForFrame(isolate, it.frame()); |
| 11249 | 11262 |
| 11250 // Get the frame id. | 11263 // Get the frame id. |
| 11251 Handle<Object> frame_id(WrapFrameId(it.frame()->id()), isolate); | 11264 Handle<Object> frame_id(WrapFrameId(it.frame()->id()), isolate); |
| 11252 | 11265 |
| 11253 // Find source position in unoptimized code. | 11266 // Find source position in unoptimized code. |
| 11254 int position = frame_inspector.GetSourcePosition(); | 11267 int position = frame_inspector.GetSourcePosition(); |
| 11255 | 11268 |
| (...skipping 2355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13611 // Find the relevant frame with the requested index. | 13624 // Find the relevant frame with the requested index. |
| 13612 StackFrame::Id id = isolate->debug()->break_frame_id(); | 13625 StackFrame::Id id = isolate->debug()->break_frame_id(); |
| 13613 if (id == StackFrame::NO_ID) { | 13626 if (id == StackFrame::NO_ID) { |
| 13614 // If there are no JavaScript stack frames return undefined. | 13627 // If there are no JavaScript stack frames return undefined. |
| 13615 return heap->undefined_value(); | 13628 return heap->undefined_value(); |
| 13616 } | 13629 } |
| 13617 | 13630 |
| 13618 int count = 0; | 13631 int count = 0; |
| 13619 JavaScriptFrameIterator it(isolate, id); | 13632 JavaScriptFrameIterator it(isolate, id); |
| 13620 for (; !it.done(); it.Advance()) { | 13633 for (; !it.done(); it.Advance()) { |
| 13621 if (index < count + it.frame()->GetInlineCount()) break; | 13634 if (index < count + it.frame()->GetInlineCount()) break; |
|
aandrey
2014/07/31 14:43:17
I bet this should be fixed as well.
Yang
2014/07/31 15:27:10
Done.
| |
| 13622 count += it.frame()->GetInlineCount(); | 13635 count += it.frame()->GetInlineCount(); |
| 13623 } | 13636 } |
| 13624 if (it.done()) return heap->undefined_value(); | 13637 if (it.done()) return heap->undefined_value(); |
| 13625 | 13638 |
| 13626 const char* error_message = LiveEdit::RestartFrame(it.frame()); | 13639 const char* error_message = LiveEdit::RestartFrame(it.frame()); |
| 13627 if (error_message) { | 13640 if (error_message) { |
| 13628 return *(isolate->factory()->InternalizeUtf8String(error_message)); | 13641 return *(isolate->factory()->InternalizeUtf8String(error_message)); |
| 13629 } | 13642 } |
| 13630 return heap->true_value(); | 13643 return heap->true_value(); |
| 13631 } | 13644 } |
| (...skipping 1966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15598 } | 15611 } |
| 15599 return NULL; | 15612 return NULL; |
| 15600 } | 15613 } |
| 15601 | 15614 |
| 15602 | 15615 |
| 15603 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { | 15616 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { |
| 15604 return &(kIntrinsicFunctions[static_cast<int>(id)]); | 15617 return &(kIntrinsicFunctions[static_cast<int>(id)]); |
| 15605 } | 15618 } |
| 15606 | 15619 |
| 15607 } } // namespace v8::internal | 15620 } } // namespace v8::internal |
| OLD | NEW |