Index: src/log.cc |
diff --git a/src/log.cc b/src/log.cc |
index 0dec99af18122c6dbb9fc1de24169640a722dc14..039f026b2b111033f4e66d1bd27a581fa3dc623b 100644 |
--- a/src/log.cc |
+++ b/src/log.cc |
@@ -638,24 +638,6 @@ void Logger::DeleteEvent(const char* name, void* object) { |
} |
-void Logger::CallbackEvent(const char* class_name, const char* method_name, |
- Address entry_point) { |
-#ifdef ENABLE_LOGGING_AND_PROFILING |
- if (!Log::IsEnabled() || !FLAG_log_code) return; |
- LogMessageBuilder msg; |
- msg.Append("%s,%s,", |
- log_events_[CODE_CREATION_EVENT], log_events_[CALLBACK_TAG]); |
- msg.AppendAddress(entry_point); |
- msg.Append(",0,\""); |
- if (class_name != NULL) { |
- msg.Append("%s.", class_name); |
- } |
- msg.Append("%s\"\n", method_name); |
- msg.WriteToLogFile(); |
-#endif |
-} |
- |
- |
#ifdef ENABLE_LOGGING_AND_PROFILING |
// A class that contains all common code dealing with record compression. |
@@ -692,6 +674,26 @@ class CompressionHelper { |
#endif // ENABLE_LOGGING_AND_PROFILING |
+void Logger::CallbackEvent(String* name, Address entry_point) { |
+#ifdef ENABLE_LOGGING_AND_PROFILING |
+ if (!Log::IsEnabled() || !FLAG_log_code) return; |
+ LogMessageBuilder msg; |
+ msg.Append("%s,%s,", |
+ log_events_[CODE_CREATION_EVENT], log_events_[CALLBACK_TAG]); |
+ msg.AppendAddress(entry_point); |
+ SmartPointer<char> str = |
+ name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
+ msg.Append(",0,\"%s\"", *str); |
+ if (FLAG_compress_log) { |
+ ASSERT(compression_helper_ != NULL); |
+ if (!compression_helper_->HandleMessage(&msg)) return; |
+ } |
+ msg.Append('\n'); |
+ msg.WriteToLogFile(); |
+#endif |
+} |
+ |
+ |
void Logger::CodeCreateEvent(LogEventsAndTags tag, |
Code* code, |
const char* comment) { |
@@ -1090,7 +1092,6 @@ void Logger::ResumeProfiler(int flags) { |
LOG(UncheckedStringEvent("profiler", "resume")); |
FLAG_log_code = true; |
LogCompiledFunctions(); |
- LogCallbacks(); |
if (!FLAG_sliding_state_window) ticker_->Start(); |
} |
profiler_->resume(); |
@@ -1211,79 +1212,30 @@ void Logger::LogCompiledFunctions() { |
LOG(CodeCreateEvent(Logger::SCRIPT_TAG, |
shared->code(), *script_name)); |
} |
- continue; |
+ } else { |
+ LOG(CodeCreateEvent( |
+ Logger::LAZY_COMPILE_TAG, shared->code(), *func_name)); |
+ } |
+ } else if (shared->function_data()->IsFunctionTemplateInfo()) { |
+ // API function. |
+ FunctionTemplateInfo* fun_data = |
+ FunctionTemplateInfo::cast(shared->function_data()); |
+ Object* raw_call_data = fun_data->call_code(); |
+ if (!raw_call_data->IsUndefined()) { |
+ CallHandlerInfo* call_data = CallHandlerInfo::cast(raw_call_data); |
+ Object* callback_obj = call_data->callback(); |
+ Address entry_point = v8::ToCData<Address>(callback_obj); |
+ LOG(CallbackEvent(*func_name, entry_point)); |
} |
+ } else { |
+ LOG(CodeCreateEvent( |
+ Logger::LAZY_COMPILE_TAG, shared->code(), *func_name)); |
} |
- // If no script or script has no name. |
- LOG(CodeCreateEvent(Logger::LAZY_COMPILE_TAG, shared->code(), *func_name)); |
} |
DeleteArray(sfis); |
} |
- |
-namespace { |
- |
-class FunctionTemplateInfosVisitor : public ObjectVisitor { |
- public: |
- virtual ~FunctionTemplateInfosVisitor() {} |
- virtual void VisitPointers(Object** start, Object** end) { |
- for (Object** p = start; p < end; ++p) { |
- VisitFTI(*p); |
- } |
- } |
- |
- private: |
- void VisitFTI(Object* o) { |
- // The data about callbacks is in fact dynamically typed |
- // (Object ptrs are used), so we use runtime type checking |
- // to be sure that we retrieve the right thing. |
- if (!o->IsFunctionTemplateInfo()) |
- return; |
- AssertNoAllocation no_alloc; |
- FunctionTemplateInfo* fti = FunctionTemplateInfo::cast(o); |
- if (!fti->prototype_template()->IsObjectTemplateInfo()) |
- return; |
- SmartPointer<char> class_name; |
- if (fti->class_name()->IsString()) { |
- class_name = String::cast(fti->class_name())-> |
- ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
- } |
- ObjectTemplateInfo* proto = |
- ObjectTemplateInfo::cast(fti->prototype_template()); |
- NeanderArray props(Handle<Object>(proto->property_list())); |
- // Properties are triples: [property name, entry point, attributes]. |
- // See Template::Set in api.cc. |
- for (int i = 0; i < props.length(); i += 3) { |
- if (!props.get(i)->IsString() |
- || !props.get(i + 1)->IsFunctionTemplateInfo()) |
- continue; |
- FunctionTemplateInfo* native_fti = |
- FunctionTemplateInfo::cast(props.get(i + 1)); |
- Object* raw_call_data = native_fti->call_code(); |
- if (raw_call_data->IsUndefined()) |
- continue; |
- CallHandlerInfo* call_data = CallHandlerInfo::cast(raw_call_data); |
- Object* callback_obj = call_data->callback(); |
- Address entry_point = v8::ToCData<Address>(callback_obj); |
- SmartPointer<char> method_name( |
- String::cast(props.get(i))-> |
- ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL)); |
- LOG(CallbackEvent(*class_name, *method_name, entry_point)); |
- } |
- } |
-}; |
- |
-} // anonymous namespace |
- |
- |
-void Logger::LogCallbacks() { |
- // We are looking for callbacks information exposed via persistent |
- // FunctionTemplate objects. |
- FunctionTemplateInfosVisitor visitor; |
- GlobalHandles::IterateStrongRoots(&visitor); |
-} |
- |
#endif |