Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index 39b94162285291ebafd899f5fc2446127e404a42..1daed54c24b0a3d8e95b53658b0b2f962de88760 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -17,7 +17,6 @@ |
namespace v8 { |
namespace internal { |
-#ifdef DEBUG |
char IC::TransitionMarkFromState(IC::State state) { |
switch (state) { |
case UNINITIALIZED: return '0'; |
@@ -48,25 +47,43 @@ const char* GetTransitionMarkModifier(KeyedAccessStoreMode mode) { |
} |
-void IC::TraceIC(const char* type, |
- Handle<Object> name) { |
+#ifdef DEBUG |
+ |
+#define TRACE_GENERIC_IC(isolate, type, reason) \ |
+ do { \ |
+ if (FLAG_trace_ic) { \ |
+ PrintF("[%s patching generic stub in ", type); \ |
+ JavaScriptFrame::PrintTop(isolate, stdout, false, true); \ |
+ PrintF(" (%s)]\n", reason); \ |
+ } \ |
+ } while (false) |
+ |
+#else |
+ |
+#define TRACE_GENERIC_IC(isolate, type, reason) |
+ |
+#endif // DEBUG |
+ |
+void IC::TraceIC(const char* type, Handle<Object> name) { |
if (FLAG_trace_ic) { |
Code* new_target = raw_target(); |
State new_state = new_target->ic_state(); |
PrintF("[%s%s in ", new_target->is_keyed_stub() ? "Keyed" : "", type); |
- StackFrameIterator it(isolate()); |
- while (it.frame()->fp() != this->fp()) it.Advance(); |
- StackFrame* raw_frame = it.frame(); |
- if (raw_frame->is_internal()) { |
- Code* apply_builtin = isolate()->builtins()->builtin( |
- Builtins::kFunctionApply); |
- if (raw_frame->unchecked_code() == apply_builtin) { |
- PrintF("apply from "); |
- it.Advance(); |
- raw_frame = it.frame(); |
- } |
+ |
+ // TODO(jkummerow): Add support for "apply". The logic is roughly: |
+ // marker = [fp_ + kMarkerOffset]; |
+ // if marker is smi and marker.value == INTERNAL and |
+ // the frame's code == builtin(Builtins::kFunctionApply): |
+ // then print "apply from" and advance one frame |
+ |
+ Object* maybe_function = |
+ Memory::Object_at(fp_ + JavaScriptFrameConstants::kFunctionOffset); |
+ if (maybe_function->IsJSFunction()) { |
+ JSFunction* function = JSFunction::cast(maybe_function); |
+ JavaScriptFrame::PrintFunctionAndOffset(function, function->code(), pc(), |
+ stdout, true); |
} |
- JavaScriptFrame::PrintTop(isolate(), stdout, false, true); |
+ |
ExtraICState extra_state = new_target->extra_ic_state(); |
const char* modifier = ""; |
if (new_target->kind() == Code::KEYED_STORE_IC) { |
@@ -82,21 +99,8 @@ void IC::TraceIC(const char* type, |
} |
} |
-#define TRACE_GENERIC_IC(isolate, type, reason) \ |
- do { \ |
- if (FLAG_trace_ic) { \ |
- PrintF("[%s patching generic stub in ", type); \ |
- JavaScriptFrame::PrintTop(isolate, stdout, false, true); \ |
- PrintF(" (%s)]\n", reason); \ |
- } \ |
- } while (false) |
+#define TRACE_IC(type, name) TraceIC(type, name) |
-#else |
-#define TRACE_GENERIC_IC(isolate, type, reason) |
-#endif // DEBUG |
- |
-#define TRACE_IC(type, name) \ |
- ASSERT((TraceIC(type, name), true)) |
IC::IC(FrameDepth depth, Isolate* isolate) |
: isolate_(isolate), |
@@ -615,7 +619,11 @@ MaybeHandle<Object> LoadIC::Load(Handle<Object> object, Handle<String> name) { |
uint32_t index; |
if (kind() == Code::KEYED_LOAD_IC && name->AsArrayIndex(&index)) { |
// Rewrite to the generic keyed load stub. |
- if (FLAG_use_ic) set_target(*generic_stub()); |
+ if (FLAG_use_ic) { |
+ set_target(*generic_stub()); |
+ TRACE_IC("LoadIC", name); |
+ TRACE_GENERIC_IC(isolate(), "LoadIC", "name as array index"); |
+ } |
Handle<Object> result; |
ASSIGN_RETURN_ON_EXCEPTION( |
isolate(), |