Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 7afa3a6aa6e6122bc1932a2a320d3077684d18d9..96e07a71a0cf31c8047c4f8296a39ac19e45feef 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -11078,7 +11078,12 @@ RUNTIME_FUNCTION(Runtime_GetFrameCount) { |
} |
for (JavaScriptFrameIterator it(isolate, id); !it.done(); it.Advance()) { |
- n += it.frame()->GetInlineCount(); |
+ List<FrameSummary> frames(FLAG_max_inlining_levels + 1); |
+ it.frame()->Summarize(&frames); |
+ for (int i = frames.length() - 1; i >= 0; i--) { |
+ // Omit functions from native scripts. |
+ if (!frames[i].function()->IsFromNativeScript()) n++; |
+ } |
} |
return Smi::FromInt(n); |
} |
@@ -11193,6 +11198,23 @@ RUNTIME_FUNCTION(Runtime_IsOptimized) { |
} |
+// 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.
|
+// the inlined frame index, or -1 if not found. Skips native JS functions. |
+static int FindIndexedNonNativeFrame(JavaScriptFrameIterator* it, int index) { |
+ int count = -1; |
+ for (; !it->done(); it->Advance()) { |
+ List<FrameSummary> frames(FLAG_max_inlining_levels + 1); |
+ it->frame()->Summarize(&frames); |
+ for (int i = frames.length() - 1; i >= 0; i--) { |
+ // Omit functions from native scripts. |
+ if (frames[i].function()->IsFromNativeScript()) continue; |
+ if (++count == index) return i; |
+ } |
+ } |
+ return -1; |
+} |
+ |
+ |
// Return an array with frame details |
// args[0]: number: break id |
// args[1]: number: frame index |
@@ -11226,22 +11248,13 @@ RUNTIME_FUNCTION(Runtime_GetFrameDetails) { |
return heap->undefined_value(); |
} |
- int count = 0; |
JavaScriptFrameIterator it(isolate, id); |
- for (; !it.done(); it.Advance()) { |
- if (index < count + it.frame()->GetInlineCount()) break; |
- count += it.frame()->GetInlineCount(); |
- } |
- if (it.done()) return heap->undefined_value(); |
+ // Inlined frame index in optimized frame, starting from outer function. |
+ int inlined_jsframe_index = FindIndexedNonNativeFrame(&it, index); |
+ if (inlined_jsframe_index == -1) return heap->undefined_value(); |
- bool is_optimized = it.frame()->is_optimized(); |
- |
- int inlined_jsframe_index = 0; // Inlined frame index in optimized frame. |
- if (is_optimized) { |
- inlined_jsframe_index = |
- it.frame()->GetInlineCount() - (index - count) - 1; |
- } |
FrameInspector frame_inspector(it.frame(), inlined_jsframe_index, isolate); |
+ bool is_optimized = it.frame()->is_optimized(); |
// Traverse the saved contexts chain to find the active context for the |
// selected frame. |