| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | 27 |
| 28 #include <stdarg.h> | 28 #include <stdarg.h> |
| 29 | 29 |
| 30 #include "v8.h" | 30 #include "v8.h" |
| 31 | 31 |
| 32 #include "bootstrapper.h" | 32 #include "bootstrapper.h" |
| 33 #include "global-handles.h" |
| 33 #include "log.h" | 34 #include "log.h" |
| 34 #include "macro-assembler.h" | 35 #include "macro-assembler.h" |
| 35 #include "serialize.h" | 36 #include "serialize.h" |
| 36 #include "string-stream.h" | 37 #include "string-stream.h" |
| 37 | 38 |
| 38 namespace v8 { | 39 namespace v8 { |
| 39 namespace internal { | 40 namespace internal { |
| 40 | 41 |
| 41 #ifdef ENABLE_LOGGING_AND_PROFILING | 42 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 42 | 43 |
| (...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 void Logger::DeleteEvent(const char* name, void* object) { | 631 void Logger::DeleteEvent(const char* name, void* object) { |
| 631 #ifdef ENABLE_LOGGING_AND_PROFILING | 632 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 632 if (!Log::IsEnabled() || !FLAG_log) return; | 633 if (!Log::IsEnabled() || !FLAG_log) return; |
| 633 LogMessageBuilder msg; | 634 LogMessageBuilder msg; |
| 634 msg.Append("delete,%s,0x%" V8PRIxPTR "\n", name, object); | 635 msg.Append("delete,%s,0x%" V8PRIxPTR "\n", name, object); |
| 635 msg.WriteToLogFile(); | 636 msg.WriteToLogFile(); |
| 636 #endif | 637 #endif |
| 637 } | 638 } |
| 638 | 639 |
| 639 | 640 |
| 641 void Logger::CallbackEvent(const char* class_name, const char* method_name, |
| 642 Address entry_point) { |
| 643 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 644 if (!Log::IsEnabled() || !FLAG_log_code) return; |
| 645 LogMessageBuilder msg; |
| 646 msg.Append("%s,%s,", |
| 647 log_events_[CODE_CREATION_EVENT], log_events_[CALLBACK_TAG]); |
| 648 msg.AppendAddress(entry_point); |
| 649 msg.Append(",0,\""); |
| 650 if (class_name != NULL) { |
| 651 msg.Append("%s.", class_name); |
| 652 } |
| 653 msg.Append("%s\"\n", method_name); |
| 654 msg.WriteToLogFile(); |
| 655 #endif |
| 656 } |
| 657 |
| 658 |
| 640 #ifdef ENABLE_LOGGING_AND_PROFILING | 659 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 641 | 660 |
| 642 // A class that contains all common code dealing with record compression. | 661 // A class that contains all common code dealing with record compression. |
| 643 class CompressionHelper { | 662 class CompressionHelper { |
| 644 public: | 663 public: |
| 645 explicit CompressionHelper(int window_size) | 664 explicit CompressionHelper(int window_size) |
| 646 : compressor_(window_size), repeat_count_(0) { } | 665 : compressor_(window_size), repeat_count_(0) { } |
| 647 | 666 |
| 648 // Handles storing message in compressor, retrieving the previous one and | 667 // Handles storing message in compressor, retrieving the previous one and |
| 649 // prefixing it with repeat count, if needed. | 668 // prefixing it with repeat count, if needed. |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1064 const int modules_to_enable = ~GetActiveProfilerModules() & flags; | 1083 const int modules_to_enable = ~GetActiveProfilerModules() & flags; |
| 1065 if (modules_to_enable != PROFILER_MODULE_NONE) { | 1084 if (modules_to_enable != PROFILER_MODULE_NONE) { |
| 1066 is_logging_ = true; | 1085 is_logging_ = true; |
| 1067 } | 1086 } |
| 1068 if (modules_to_enable & PROFILER_MODULE_CPU) { | 1087 if (modules_to_enable & PROFILER_MODULE_CPU) { |
| 1069 if (FLAG_prof_lazy) { | 1088 if (FLAG_prof_lazy) { |
| 1070 profiler_->Engage(); | 1089 profiler_->Engage(); |
| 1071 LOG(UncheckedStringEvent("profiler", "resume")); | 1090 LOG(UncheckedStringEvent("profiler", "resume")); |
| 1072 FLAG_log_code = true; | 1091 FLAG_log_code = true; |
| 1073 LogCompiledFunctions(); | 1092 LogCompiledFunctions(); |
| 1093 LogCallbacks(); |
| 1074 if (!FLAG_sliding_state_window) ticker_->Start(); | 1094 if (!FLAG_sliding_state_window) ticker_->Start(); |
| 1075 } | 1095 } |
| 1076 profiler_->resume(); | 1096 profiler_->resume(); |
| 1077 } | 1097 } |
| 1078 if (modules_to_enable & | 1098 if (modules_to_enable & |
| 1079 (PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS)) { | 1099 (PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS)) { |
| 1080 FLAG_log_gc = true; | 1100 FLAG_log_gc = true; |
| 1081 } | 1101 } |
| 1082 } | 1102 } |
| 1083 | 1103 |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1194 continue; | 1214 continue; |
| 1195 } | 1215 } |
| 1196 } | 1216 } |
| 1197 // If no script or script has no name. | 1217 // If no script or script has no name. |
| 1198 LOG(CodeCreateEvent(Logger::LAZY_COMPILE_TAG, shared->code(), *func_name)); | 1218 LOG(CodeCreateEvent(Logger::LAZY_COMPILE_TAG, shared->code(), *func_name)); |
| 1199 } | 1219 } |
| 1200 | 1220 |
| 1201 DeleteArray(sfis); | 1221 DeleteArray(sfis); |
| 1202 } | 1222 } |
| 1203 | 1223 |
| 1224 |
| 1225 namespace { |
| 1226 |
| 1227 class FunctionTemplateInfosVisitor : public ObjectVisitor { |
| 1228 public: |
| 1229 virtual ~FunctionTemplateInfosVisitor() {} |
| 1230 virtual void VisitPointers(Object** start, Object** end) { |
| 1231 for (Object** p = start; p < end; ++p) { |
| 1232 VisitFTI(*p); |
| 1233 } |
| 1234 } |
| 1235 |
| 1236 private: |
| 1237 void VisitFTI(Object* o) { |
| 1238 // The data about callbacks is in fact dynamically typed |
| 1239 // (Object ptrs are used), so we use runtime type checking |
| 1240 // to be sure that we retrieve the right thing. |
| 1241 if (!o->IsFunctionTemplateInfo()) |
| 1242 return; |
| 1243 AssertNoAllocation no_alloc; |
| 1244 FunctionTemplateInfo* fti = FunctionTemplateInfo::cast(o); |
| 1245 if (!fti->prototype_template()->IsObjectTemplateInfo()) |
| 1246 return; |
| 1247 SmartPointer<char> class_name; |
| 1248 if (fti->class_name()->IsString()) { |
| 1249 class_name = String::cast(fti->class_name())-> |
| 1250 ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
| 1251 } |
| 1252 ObjectTemplateInfo* proto = |
| 1253 ObjectTemplateInfo::cast(fti->prototype_template()); |
| 1254 NeanderArray props(Handle<Object>(proto->property_list())); |
| 1255 // Properties are triples: [property name, entry point, attributes]. |
| 1256 // See Template::Set in api.cc. |
| 1257 for (int i = 0; i < props.length(); i += 3) { |
| 1258 if (!props.get(i)->IsString() |
| 1259 || !props.get(i + 1)->IsFunctionTemplateInfo()) |
| 1260 continue; |
| 1261 FunctionTemplateInfo* native_fti = |
| 1262 FunctionTemplateInfo::cast(props.get(i + 1)); |
| 1263 Object* raw_call_data = native_fti->call_code(); |
| 1264 if (raw_call_data->IsUndefined()) |
| 1265 continue; |
| 1266 CallHandlerInfo* call_data = CallHandlerInfo::cast(raw_call_data); |
| 1267 Object* callback_obj = call_data->callback(); |
| 1268 Address entry_point = v8::ToCData<Address>(callback_obj); |
| 1269 SmartPointer<char> method_name( |
| 1270 String::cast(props.get(i))-> |
| 1271 ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL)); |
| 1272 LOG(CallbackEvent(*class_name, *method_name, entry_point)); |
| 1273 } |
| 1274 } |
| 1275 }; |
| 1276 |
| 1277 } // anonymous namespace |
| 1278 |
| 1279 |
| 1280 void Logger::LogCallbacks() { |
| 1281 // We are looking for callbacks information exposed via persistent |
| 1282 // FunctionTemplate objects. |
| 1283 FunctionTemplateInfosVisitor visitor; |
| 1284 GlobalHandles::IterateStrongRoots(&visitor); |
| 1285 } |
| 1286 |
| 1204 #endif | 1287 #endif |
| 1205 | 1288 |
| 1206 | 1289 |
| 1207 bool Logger::Setup() { | 1290 bool Logger::Setup() { |
| 1208 #ifdef ENABLE_LOGGING_AND_PROFILING | 1291 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 1209 // --log-all enables all the log flags. | 1292 // --log-all enables all the log flags. |
| 1210 if (FLAG_log_all) { | 1293 if (FLAG_log_all) { |
| 1211 FLAG_log_runtime = true; | 1294 FLAG_log_runtime = true; |
| 1212 FLAG_log_api = true; | 1295 FLAG_log_api = true; |
| 1213 FLAG_log_code = true; | 1296 FLAG_log_code = true; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1355 // Otherwise, if the sliding state window computation has not been | 1438 // Otherwise, if the sliding state window computation has not been |
| 1356 // started we do it now. | 1439 // started we do it now. |
| 1357 if (sliding_state_window_ == NULL) { | 1440 if (sliding_state_window_ == NULL) { |
| 1358 sliding_state_window_ = new SlidingStateWindow(); | 1441 sliding_state_window_ = new SlidingStateWindow(); |
| 1359 } | 1442 } |
| 1360 #endif | 1443 #endif |
| 1361 } | 1444 } |
| 1362 | 1445 |
| 1363 | 1446 |
| 1364 } } // namespace v8::internal | 1447 } } // namespace v8::internal |
| OLD | NEW |