Chromium Code Reviews| Index: src/ic.cc |
| diff --git a/src/ic.cc b/src/ic.cc |
| index 39b94162285291ebafd899f5fc2446127e404a42..96c7a219097af60ed62745d257fa0f0942b71816 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,65 @@ 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: |
|
Sven Panne
2014/07/08 06:37:11
Hmmm, can we extract the body of the while loop in
Jakob Kummerow
2014/07/08 07:47:40
Done.
|
| + // 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); |
| + PrintF("%s", function->IsOptimized() ? "*" : "~"); |
| + function->PrintName(); |
| + Code* js_code = function->code(); |
| + int code_offset = static_cast<int>(pc() - js_code->instruction_start()); |
| + PrintF("+%d", code_offset); |
| + |
| + int source_pos = js_code->SourcePosition(pc()); |
| + SharedFunctionInfo* shared = function->shared(); |
| + Object* maybe_script = shared->script(); |
| + if (maybe_script->IsScript()) { |
| + Script* script = Script::cast(maybe_script); |
| + int line = script->GetLineNumber(source_pos) + 1; |
| + Object* script_name_raw = script->name(); |
| + if (script_name_raw->IsString()) { |
| + String* script_name = String::cast(script->name()); |
| + SmartArrayPointer<char> c_script_name = |
| + script_name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
| + PrintF(stdout, " at %s:%d", c_script_name.get(), line); |
| + } else { |
| + PrintF(stdout, " at <unknown>:%d", line); |
| + } |
| + } else { |
| + PrintF(stdout, " at <unknown>:<unknown>"); |
| } |
| } |
| - 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 +121,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 +641,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(), |