Index: test/cctest/test-log.cc |
diff --git a/test/cctest/test-log.cc b/test/cctest/test-log.cc |
index 57004d7c88da6911f08f5604f130c0a57c2674ed..8e3b5f4b58e18a12765d9ad34abb0ca383bb934f 100644 |
--- a/test/cctest/test-log.cc |
+++ b/test/cctest/test-log.cc |
@@ -247,7 +247,7 @@ TEST(ProfLazyMode) { |
i::FLAG_logfile = "*"; |
// If tests are being run manually, V8 will be already initialized |
- // by the test below. |
+ // by the bottom test. |
const bool need_to_set_up_logger = i::V8::IsRunning(); |
v8::HandleScope scope; |
v8::Handle<v8::Context> env = v8::Context::New(); |
@@ -474,6 +474,66 @@ TEST(Issue23768) { |
} |
+static v8::Handle<v8::Value> ObjMethod1(const v8::Arguments& args) { |
+ return v8::Handle<v8::Value>(); |
+} |
+ |
+TEST(LogCallbacks) { |
+ const bool saved_prof_lazy = i::FLAG_prof_lazy; |
+ const bool saved_prof = i::FLAG_prof; |
+ const bool saved_prof_auto = i::FLAG_prof_auto; |
+ i::FLAG_prof = true; |
+ i::FLAG_prof_lazy = false; |
+ i::FLAG_prof_auto = false; |
+ i::FLAG_logfile = "*"; |
+ |
+ // If tests are being run manually, V8 will be already initialized |
+ // by the bottom test. |
+ const bool need_to_set_up_logger = i::V8::IsRunning(); |
+ v8::HandleScope scope; |
+ v8::Handle<v8::Context> env = v8::Context::New(); |
+ if (need_to_set_up_logger) Logger::Setup(); |
+ env->Enter(); |
+ |
+ // Skip all initially logged stuff. |
+ EmbeddedVector<char, 102400> buffer; |
+ int log_pos = GetLogLines(0, &buffer); |
+ |
+ v8::Persistent<v8::FunctionTemplate> obj = |
+ v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTemplate::New()); |
+ obj->SetClassName(v8::String::New("Obj")); |
+ v8::Handle<v8::ObjectTemplate> proto = obj->PrototypeTemplate(); |
+ v8::Local<v8::Signature> signature = v8::Signature::New(obj); |
+ proto->Set(v8::String::New("method1"), |
+ v8::FunctionTemplate::New(ObjMethod1, |
+ v8::Handle<v8::Value>(), |
+ signature), |
+ static_cast<v8::PropertyAttribute>(v8::DontDelete)); |
+ |
+ i::Logger::LogCallbacks(); |
+ log_pos = GetLogLines(log_pos, &buffer); |
+ CHECK_GT(log_pos, 0); |
+ buffer[log_pos] = 0; |
+ |
+ const char* callback_rec = "code-creation,Callback,"; |
+ const char* pos = strstr(buffer.start(), callback_rec); |
+ CHECK_NE(NULL, pos); |
+ pos += strlen(callback_rec); |
+ EmbeddedVector<char, 100> ref_data; |
+ i::OS::SNPrintF(ref_data, |
+ "0x%" V8PRIxPTR ",0,\"Obj.method1\"\n", ObjMethod1); |
+ CHECK_EQ(ref_data.start(), pos); |
+ |
+ obj.Dispose(); |
+ |
+ env->Exit(); |
+ Logger::TearDown(); |
+ i::FLAG_prof_lazy = saved_prof_lazy; |
+ i::FLAG_prof = saved_prof; |
+ i::FLAG_prof_auto = saved_prof_auto; |
+} |
+ |
+ |
static inline bool IsStringEqualTo(const char* r, const char* s) { |
return strncmp(r, s, strlen(r)) == 0; |
} |