Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(262)

Unified Diff: src/log.cc

Issue 414036: Reimplement logging of API callbacks entry points in an easier way. (Closed)
Patch Set: Final version Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/log.h ('k') | test/cctest/test-log.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « src/log.h ('k') | test/cctest/test-log.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698