OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 #include "snapshot.h" | 47 #include "snapshot.h" |
48 #include "v8threads.h" | 48 #include "v8threads.h" |
49 #include "version.h" | 49 #include "version.h" |
50 #include "vm-state-inl.h" | 50 #include "vm-state-inl.h" |
51 | 51 |
52 #include "../include/v8-profiler.h" | 52 #include "../include/v8-profiler.h" |
53 #include "../include/v8-testing.h" | 53 #include "../include/v8-testing.h" |
54 | 54 |
55 #define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr)) | 55 #define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr)) |
56 | 56 |
57 #ifdef ENABLE_VMSTATE_TRACKING | |
58 #define ENTER_V8(isolate) \ | 57 #define ENTER_V8(isolate) \ |
59 ASSERT((isolate)->IsInitialized()); \ | 58 ASSERT((isolate)->IsInitialized()); \ |
60 i::VMState __state__((isolate), i::OTHER) | 59 i::VMState __state__((isolate), i::OTHER) |
61 #define LEAVE_V8(isolate) \ | 60 #define LEAVE_V8(isolate) \ |
62 i::VMState __state__((isolate), i::EXTERNAL) | 61 i::VMState __state__((isolate), i::EXTERNAL) |
63 #else | |
64 #define ENTER_V8(isolate) ((void) 0) | |
65 #define LEAVE_V8(isolate) ((void) 0) | |
66 #endif | |
67 | 62 |
68 namespace v8 { | 63 namespace v8 { |
69 | 64 |
70 #define ON_BAILOUT(isolate, location, code) \ | 65 #define ON_BAILOUT(isolate, location, code) \ |
71 if (IsDeadCheck(isolate, location) || \ | 66 if (IsDeadCheck(isolate, location) || \ |
72 IsExecutionTerminatingCheck(isolate)) { \ | 67 IsExecutionTerminatingCheck(isolate)) { \ |
73 code; \ | 68 code; \ |
74 UNREACHABLE(); \ | 69 UNREACHABLE(); \ |
75 } | 70 } |
76 | 71 |
(...skipping 30 matching lines...) Expand all Loading... |
107 "Entering the V8 API without proper locking in place"); \ | 102 "Entering the V8 API without proper locking in place"); \ |
108 } \ | 103 } \ |
109 } while (false) | 104 } while (false) |
110 | 105 |
111 | 106 |
112 // --- E x c e p t i o n B e h a v i o r --- | 107 // --- E x c e p t i o n B e h a v i o r --- |
113 | 108 |
114 | 109 |
115 static void DefaultFatalErrorHandler(const char* location, | 110 static void DefaultFatalErrorHandler(const char* location, |
116 const char* message) { | 111 const char* message) { |
117 #ifdef ENABLE_VMSTATE_TRACKING | |
118 i::VMState __state__(i::Isolate::Current(), i::OTHER); | 112 i::VMState __state__(i::Isolate::Current(), i::OTHER); |
119 #endif | |
120 API_Fatal(location, message); | 113 API_Fatal(location, message); |
121 } | 114 } |
122 | 115 |
123 | 116 |
124 static FatalErrorCallback GetFatalErrorHandler() { | 117 static FatalErrorCallback GetFatalErrorHandler() { |
125 i::Isolate* isolate = i::Isolate::Current(); | 118 i::Isolate* isolate = i::Isolate::Current(); |
126 if (isolate->exception_behavior() == NULL) { | 119 if (isolate->exception_behavior() == NULL) { |
127 isolate->set_exception_behavior(DefaultFatalErrorHandler); | 120 isolate->set_exception_behavior(DefaultFatalErrorHandler); |
128 } | 121 } |
129 return isolate->exception_behavior(); | 122 return isolate->exception_behavior(); |
(...skipping 4663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4793 | 4786 |
4794 void V8::RemoveMemoryAllocationCallback(MemoryAllocationCallback callback) { | 4787 void V8::RemoveMemoryAllocationCallback(MemoryAllocationCallback callback) { |
4795 i::Isolate* isolate = i::Isolate::Current(); | 4788 i::Isolate* isolate = i::Isolate::Current(); |
4796 if (IsDeadCheck(isolate, "v8::V8::RemoveMemoryAllocationCallback()")) return; | 4789 if (IsDeadCheck(isolate, "v8::V8::RemoveMemoryAllocationCallback()")) return; |
4797 isolate->memory_allocator()->RemoveMemoryAllocationCallback( | 4790 isolate->memory_allocator()->RemoveMemoryAllocationCallback( |
4798 callback); | 4791 callback); |
4799 } | 4792 } |
4800 | 4793 |
4801 | 4794 |
4802 void V8::PauseProfiler() { | 4795 void V8::PauseProfiler() { |
4803 #ifdef ENABLE_LOGGING_AND_PROFILING | |
4804 i::Isolate* isolate = i::Isolate::Current(); | 4796 i::Isolate* isolate = i::Isolate::Current(); |
4805 isolate->logger()->PauseProfiler(); | 4797 isolate->logger()->PauseProfiler(); |
4806 #endif | |
4807 } | 4798 } |
4808 | 4799 |
4809 | 4800 |
4810 void V8::ResumeProfiler() { | 4801 void V8::ResumeProfiler() { |
4811 #ifdef ENABLE_LOGGING_AND_PROFILING | |
4812 i::Isolate* isolate = i::Isolate::Current(); | 4802 i::Isolate* isolate = i::Isolate::Current(); |
4813 isolate->logger()->ResumeProfiler(); | 4803 isolate->logger()->ResumeProfiler(); |
4814 #endif | |
4815 } | 4804 } |
4816 | 4805 |
4817 | 4806 |
4818 bool V8::IsProfilerPaused() { | 4807 bool V8::IsProfilerPaused() { |
4819 #ifdef ENABLE_LOGGING_AND_PROFILING | |
4820 i::Isolate* isolate = i::Isolate::Current(); | 4808 i::Isolate* isolate = i::Isolate::Current(); |
4821 return isolate->logger()->IsProfilerPaused(); | 4809 return isolate->logger()->IsProfilerPaused(); |
4822 #else | |
4823 return true; | |
4824 #endif | |
4825 } | 4810 } |
4826 | 4811 |
4827 | 4812 |
4828 int V8::GetLogLines(int from_pos, char* dest_buf, int max_size) { | 4813 int V8::GetLogLines(int from_pos, char* dest_buf, int max_size) { |
4829 #ifdef ENABLE_LOGGING_AND_PROFILING | |
4830 ASSERT(max_size >= kMinimumSizeForLogLinesBuffer); | 4814 ASSERT(max_size >= kMinimumSizeForLogLinesBuffer); |
4831 return LOGGER->GetLogLines(from_pos, dest_buf, max_size); | 4815 return LOGGER->GetLogLines(from_pos, dest_buf, max_size); |
4832 #endif | |
4833 return 0; | |
4834 } | 4816 } |
4835 | 4817 |
4836 | 4818 |
4837 int V8::GetCurrentThreadId() { | 4819 int V8::GetCurrentThreadId() { |
4838 i::Isolate* isolate = i::Isolate::Current(); | 4820 i::Isolate* isolate = i::Isolate::Current(); |
4839 EnsureInitializedForIsolate(isolate, "V8::GetCurrentThreadId()"); | 4821 EnsureInitializedForIsolate(isolate, "V8::GetCurrentThreadId()"); |
4840 return isolate->thread_id().ToInteger(); | 4822 return isolate->thread_id().ToInteger(); |
4841 } | 4823 } |
4842 | 4824 |
4843 | 4825 |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5288 i::Isolate* isolate = i::Isolate::Current(); | 5270 i::Isolate* isolate = i::Isolate::Current(); |
5289 EnsureInitializedForIsolate(isolate, "v8::Debug::GetDebugContext()"); | 5271 EnsureInitializedForIsolate(isolate, "v8::Debug::GetDebugContext()"); |
5290 ENTER_V8(isolate); | 5272 ENTER_V8(isolate); |
5291 return Utils::ToLocal(i::Isolate::Current()->debugger()->GetDebugContext()); | 5273 return Utils::ToLocal(i::Isolate::Current()->debugger()->GetDebugContext()); |
5292 } | 5274 } |
5293 | 5275 |
5294 #endif // ENABLE_DEBUGGER_SUPPORT | 5276 #endif // ENABLE_DEBUGGER_SUPPORT |
5295 | 5277 |
5296 | 5278 |
5297 Handle<String> CpuProfileNode::GetFunctionName() const { | 5279 Handle<String> CpuProfileNode::GetFunctionName() const { |
5298 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5299 i::Isolate* isolate = i::Isolate::Current(); | 5280 i::Isolate* isolate = i::Isolate::Current(); |
5300 IsDeadCheck(isolate, "v8::CpuProfileNode::GetFunctionName"); | 5281 IsDeadCheck(isolate, "v8::CpuProfileNode::GetFunctionName"); |
5301 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); | 5282 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); |
5302 const i::CodeEntry* entry = node->entry(); | 5283 const i::CodeEntry* entry = node->entry(); |
5303 if (!entry->has_name_prefix()) { | 5284 if (!entry->has_name_prefix()) { |
5304 return Handle<String>(ToApi<String>( | 5285 return Handle<String>(ToApi<String>( |
5305 isolate->factory()->LookupAsciiSymbol(entry->name()))); | 5286 isolate->factory()->LookupAsciiSymbol(entry->name()))); |
5306 } else { | 5287 } else { |
5307 return Handle<String>(ToApi<String>(isolate->factory()->NewConsString( | 5288 return Handle<String>(ToApi<String>(isolate->factory()->NewConsString( |
5308 isolate->factory()->LookupAsciiSymbol(entry->name_prefix()), | 5289 isolate->factory()->LookupAsciiSymbol(entry->name_prefix()), |
5309 isolate->factory()->LookupAsciiSymbol(entry->name())))); | 5290 isolate->factory()->LookupAsciiSymbol(entry->name())))); |
5310 } | 5291 } |
5311 #else | |
5312 return v8::String::Empty(); | |
5313 #endif | |
5314 } | 5292 } |
5315 | 5293 |
5316 | 5294 |
5317 Handle<String> CpuProfileNode::GetScriptResourceName() const { | 5295 Handle<String> CpuProfileNode::GetScriptResourceName() const { |
5318 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5319 i::Isolate* isolate = i::Isolate::Current(); | 5296 i::Isolate* isolate = i::Isolate::Current(); |
5320 IsDeadCheck(isolate, "v8::CpuProfileNode::GetScriptResourceName"); | 5297 IsDeadCheck(isolate, "v8::CpuProfileNode::GetScriptResourceName"); |
5321 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); | 5298 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); |
5322 return Handle<String>(ToApi<String>(isolate->factory()->LookupAsciiSymbol( | 5299 return Handle<String>(ToApi<String>(isolate->factory()->LookupAsciiSymbol( |
5323 node->entry()->resource_name()))); | 5300 node->entry()->resource_name()))); |
5324 #else | |
5325 return v8::String::Empty(); | |
5326 #endif | |
5327 } | 5301 } |
5328 | 5302 |
5329 | 5303 |
5330 int CpuProfileNode::GetLineNumber() const { | 5304 int CpuProfileNode::GetLineNumber() const { |
5331 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5332 i::Isolate* isolate = i::Isolate::Current(); | 5305 i::Isolate* isolate = i::Isolate::Current(); |
5333 IsDeadCheck(isolate, "v8::CpuProfileNode::GetLineNumber"); | 5306 IsDeadCheck(isolate, "v8::CpuProfileNode::GetLineNumber"); |
5334 return reinterpret_cast<const i::ProfileNode*>(this)->entry()->line_number(); | 5307 return reinterpret_cast<const i::ProfileNode*>(this)->entry()->line_number(); |
5335 #else | |
5336 return 0; | |
5337 #endif | |
5338 } | 5308 } |
5339 | 5309 |
5340 | 5310 |
5341 double CpuProfileNode::GetTotalTime() const { | 5311 double CpuProfileNode::GetTotalTime() const { |
5342 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5343 i::Isolate* isolate = i::Isolate::Current(); | 5312 i::Isolate* isolate = i::Isolate::Current(); |
5344 IsDeadCheck(isolate, "v8::CpuProfileNode::GetTotalTime"); | 5313 IsDeadCheck(isolate, "v8::CpuProfileNode::GetTotalTime"); |
5345 return reinterpret_cast<const i::ProfileNode*>(this)->GetTotalMillis(); | 5314 return reinterpret_cast<const i::ProfileNode*>(this)->GetTotalMillis(); |
5346 #else | |
5347 return 0.0; | |
5348 #endif | |
5349 } | 5315 } |
5350 | 5316 |
5351 | 5317 |
5352 double CpuProfileNode::GetSelfTime() const { | 5318 double CpuProfileNode::GetSelfTime() const { |
5353 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5354 i::Isolate* isolate = i::Isolate::Current(); | 5319 i::Isolate* isolate = i::Isolate::Current(); |
5355 IsDeadCheck(isolate, "v8::CpuProfileNode::GetSelfTime"); | 5320 IsDeadCheck(isolate, "v8::CpuProfileNode::GetSelfTime"); |
5356 return reinterpret_cast<const i::ProfileNode*>(this)->GetSelfMillis(); | 5321 return reinterpret_cast<const i::ProfileNode*>(this)->GetSelfMillis(); |
5357 #else | |
5358 return 0.0; | |
5359 #endif | |
5360 } | 5322 } |
5361 | 5323 |
5362 | 5324 |
5363 double CpuProfileNode::GetTotalSamplesCount() const { | 5325 double CpuProfileNode::GetTotalSamplesCount() const { |
5364 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5365 i::Isolate* isolate = i::Isolate::Current(); | 5326 i::Isolate* isolate = i::Isolate::Current(); |
5366 IsDeadCheck(isolate, "v8::CpuProfileNode::GetTotalSamplesCount"); | 5327 IsDeadCheck(isolate, "v8::CpuProfileNode::GetTotalSamplesCount"); |
5367 return reinterpret_cast<const i::ProfileNode*>(this)->total_ticks(); | 5328 return reinterpret_cast<const i::ProfileNode*>(this)->total_ticks(); |
5368 #else | |
5369 return 0.0; | |
5370 #endif | |
5371 } | 5329 } |
5372 | 5330 |
5373 | 5331 |
5374 double CpuProfileNode::GetSelfSamplesCount() const { | 5332 double CpuProfileNode::GetSelfSamplesCount() const { |
5375 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5376 i::Isolate* isolate = i::Isolate::Current(); | 5333 i::Isolate* isolate = i::Isolate::Current(); |
5377 IsDeadCheck(isolate, "v8::CpuProfileNode::GetSelfSamplesCount"); | 5334 IsDeadCheck(isolate, "v8::CpuProfileNode::GetSelfSamplesCount"); |
5378 return reinterpret_cast<const i::ProfileNode*>(this)->self_ticks(); | 5335 return reinterpret_cast<const i::ProfileNode*>(this)->self_ticks(); |
5379 #else | |
5380 return 0.0; | |
5381 #endif | |
5382 } | 5336 } |
5383 | 5337 |
5384 | 5338 |
5385 unsigned CpuProfileNode::GetCallUid() const { | 5339 unsigned CpuProfileNode::GetCallUid() const { |
5386 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5387 i::Isolate* isolate = i::Isolate::Current(); | 5340 i::Isolate* isolate = i::Isolate::Current(); |
5388 IsDeadCheck(isolate, "v8::CpuProfileNode::GetCallUid"); | 5341 IsDeadCheck(isolate, "v8::CpuProfileNode::GetCallUid"); |
5389 return reinterpret_cast<const i::ProfileNode*>(this)->entry()->GetCallUid(); | 5342 return reinterpret_cast<const i::ProfileNode*>(this)->entry()->GetCallUid(); |
5390 #else | |
5391 return 0; | |
5392 #endif | |
5393 } | 5343 } |
5394 | 5344 |
5395 | 5345 |
5396 int CpuProfileNode::GetChildrenCount() const { | 5346 int CpuProfileNode::GetChildrenCount() const { |
5397 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5398 i::Isolate* isolate = i::Isolate::Current(); | 5347 i::Isolate* isolate = i::Isolate::Current(); |
5399 IsDeadCheck(isolate, "v8::CpuProfileNode::GetChildrenCount"); | 5348 IsDeadCheck(isolate, "v8::CpuProfileNode::GetChildrenCount"); |
5400 return reinterpret_cast<const i::ProfileNode*>(this)->children()->length(); | 5349 return reinterpret_cast<const i::ProfileNode*>(this)->children()->length(); |
5401 #else | |
5402 return 0; | |
5403 #endif | |
5404 } | 5350 } |
5405 | 5351 |
5406 | 5352 |
5407 const CpuProfileNode* CpuProfileNode::GetChild(int index) const { | 5353 const CpuProfileNode* CpuProfileNode::GetChild(int index) const { |
5408 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5409 i::Isolate* isolate = i::Isolate::Current(); | 5354 i::Isolate* isolate = i::Isolate::Current(); |
5410 IsDeadCheck(isolate, "v8::CpuProfileNode::GetChild"); | 5355 IsDeadCheck(isolate, "v8::CpuProfileNode::GetChild"); |
5411 const i::ProfileNode* child = | 5356 const i::ProfileNode* child = |
5412 reinterpret_cast<const i::ProfileNode*>(this)->children()->at(index); | 5357 reinterpret_cast<const i::ProfileNode*>(this)->children()->at(index); |
5413 return reinterpret_cast<const CpuProfileNode*>(child); | 5358 return reinterpret_cast<const CpuProfileNode*>(child); |
5414 #else | |
5415 return NULL; | |
5416 #endif | |
5417 } | 5359 } |
5418 | 5360 |
5419 | 5361 |
5420 void CpuProfile::Delete() { | 5362 void CpuProfile::Delete() { |
5421 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5422 i::Isolate* isolate = i::Isolate::Current(); | 5363 i::Isolate* isolate = i::Isolate::Current(); |
5423 IsDeadCheck(isolate, "v8::CpuProfile::Delete"); | 5364 IsDeadCheck(isolate, "v8::CpuProfile::Delete"); |
5424 i::CpuProfiler::DeleteProfile(reinterpret_cast<i::CpuProfile*>(this)); | 5365 i::CpuProfiler::DeleteProfile(reinterpret_cast<i::CpuProfile*>(this)); |
5425 if (i::CpuProfiler::GetProfilesCount() == 0 && | 5366 if (i::CpuProfiler::GetProfilesCount() == 0 && |
5426 !i::CpuProfiler::HasDetachedProfiles()) { | 5367 !i::CpuProfiler::HasDetachedProfiles()) { |
5427 // If this was the last profile, clean up all accessory data as well. | 5368 // If this was the last profile, clean up all accessory data as well. |
5428 i::CpuProfiler::DeleteAllProfiles(); | 5369 i::CpuProfiler::DeleteAllProfiles(); |
5429 } | 5370 } |
5430 #endif | |
5431 } | 5371 } |
5432 | 5372 |
5433 | 5373 |
5434 unsigned CpuProfile::GetUid() const { | 5374 unsigned CpuProfile::GetUid() const { |
5435 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5436 i::Isolate* isolate = i::Isolate::Current(); | 5375 i::Isolate* isolate = i::Isolate::Current(); |
5437 IsDeadCheck(isolate, "v8::CpuProfile::GetUid"); | 5376 IsDeadCheck(isolate, "v8::CpuProfile::GetUid"); |
5438 return reinterpret_cast<const i::CpuProfile*>(this)->uid(); | 5377 return reinterpret_cast<const i::CpuProfile*>(this)->uid(); |
5439 #else | |
5440 return 0; | |
5441 #endif | |
5442 } | 5378 } |
5443 | 5379 |
5444 | 5380 |
5445 Handle<String> CpuProfile::GetTitle() const { | 5381 Handle<String> CpuProfile::GetTitle() const { |
5446 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5447 i::Isolate* isolate = i::Isolate::Current(); | 5382 i::Isolate* isolate = i::Isolate::Current(); |
5448 IsDeadCheck(isolate, "v8::CpuProfile::GetTitle"); | 5383 IsDeadCheck(isolate, "v8::CpuProfile::GetTitle"); |
5449 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); | 5384 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); |
5450 return Handle<String>(ToApi<String>(isolate->factory()->LookupAsciiSymbol( | 5385 return Handle<String>(ToApi<String>(isolate->factory()->LookupAsciiSymbol( |
5451 profile->title()))); | 5386 profile->title()))); |
5452 #else | |
5453 return v8::String::Empty(); | |
5454 #endif | |
5455 } | 5387 } |
5456 | 5388 |
5457 | 5389 |
5458 const CpuProfileNode* CpuProfile::GetBottomUpRoot() const { | 5390 const CpuProfileNode* CpuProfile::GetBottomUpRoot() const { |
5459 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5460 i::Isolate* isolate = i::Isolate::Current(); | 5391 i::Isolate* isolate = i::Isolate::Current(); |
5461 IsDeadCheck(isolate, "v8::CpuProfile::GetBottomUpRoot"); | 5392 IsDeadCheck(isolate, "v8::CpuProfile::GetBottomUpRoot"); |
5462 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); | 5393 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); |
5463 return reinterpret_cast<const CpuProfileNode*>(profile->bottom_up()->root()); | 5394 return reinterpret_cast<const CpuProfileNode*>(profile->bottom_up()->root()); |
5464 #else | |
5465 return NULL; | |
5466 #endif | |
5467 } | 5395 } |
5468 | 5396 |
5469 | 5397 |
5470 const CpuProfileNode* CpuProfile::GetTopDownRoot() const { | 5398 const CpuProfileNode* CpuProfile::GetTopDownRoot() const { |
5471 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5472 i::Isolate* isolate = i::Isolate::Current(); | 5399 i::Isolate* isolate = i::Isolate::Current(); |
5473 IsDeadCheck(isolate, "v8::CpuProfile::GetTopDownRoot"); | 5400 IsDeadCheck(isolate, "v8::CpuProfile::GetTopDownRoot"); |
5474 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); | 5401 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); |
5475 return reinterpret_cast<const CpuProfileNode*>(profile->top_down()->root()); | 5402 return reinterpret_cast<const CpuProfileNode*>(profile->top_down()->root()); |
5476 #else | |
5477 return NULL; | |
5478 #endif | |
5479 } | 5403 } |
5480 | 5404 |
5481 | 5405 |
5482 int CpuProfiler::GetProfilesCount() { | 5406 int CpuProfiler::GetProfilesCount() { |
5483 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5484 i::Isolate* isolate = i::Isolate::Current(); | 5407 i::Isolate* isolate = i::Isolate::Current(); |
5485 IsDeadCheck(isolate, "v8::CpuProfiler::GetProfilesCount"); | 5408 IsDeadCheck(isolate, "v8::CpuProfiler::GetProfilesCount"); |
5486 return i::CpuProfiler::GetProfilesCount(); | 5409 return i::CpuProfiler::GetProfilesCount(); |
5487 #else | |
5488 return 0; | |
5489 #endif | |
5490 } | 5410 } |
5491 | 5411 |
5492 | 5412 |
5493 const CpuProfile* CpuProfiler::GetProfile(int index, | 5413 const CpuProfile* CpuProfiler::GetProfile(int index, |
5494 Handle<Value> security_token) { | 5414 Handle<Value> security_token) { |
5495 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5496 i::Isolate* isolate = i::Isolate::Current(); | 5415 i::Isolate* isolate = i::Isolate::Current(); |
5497 IsDeadCheck(isolate, "v8::CpuProfiler::GetProfile"); | 5416 IsDeadCheck(isolate, "v8::CpuProfiler::GetProfile"); |
5498 return reinterpret_cast<const CpuProfile*>( | 5417 return reinterpret_cast<const CpuProfile*>( |
5499 i::CpuProfiler::GetProfile( | 5418 i::CpuProfiler::GetProfile( |
5500 security_token.IsEmpty() ? NULL : *Utils::OpenHandle(*security_token), | 5419 security_token.IsEmpty() ? NULL : *Utils::OpenHandle(*security_token), |
5501 index)); | 5420 index)); |
5502 #else | |
5503 return NULL; | |
5504 #endif | |
5505 } | 5421 } |
5506 | 5422 |
5507 | 5423 |
5508 const CpuProfile* CpuProfiler::FindProfile(unsigned uid, | 5424 const CpuProfile* CpuProfiler::FindProfile(unsigned uid, |
5509 Handle<Value> security_token) { | 5425 Handle<Value> security_token) { |
5510 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5511 i::Isolate* isolate = i::Isolate::Current(); | 5426 i::Isolate* isolate = i::Isolate::Current(); |
5512 IsDeadCheck(isolate, "v8::CpuProfiler::FindProfile"); | 5427 IsDeadCheck(isolate, "v8::CpuProfiler::FindProfile"); |
5513 return reinterpret_cast<const CpuProfile*>( | 5428 return reinterpret_cast<const CpuProfile*>( |
5514 i::CpuProfiler::FindProfile( | 5429 i::CpuProfiler::FindProfile( |
5515 security_token.IsEmpty() ? NULL : *Utils::OpenHandle(*security_token), | 5430 security_token.IsEmpty() ? NULL : *Utils::OpenHandle(*security_token), |
5516 uid)); | 5431 uid)); |
5517 #else | |
5518 return NULL; | |
5519 #endif | |
5520 } | 5432 } |
5521 | 5433 |
5522 | 5434 |
5523 void CpuProfiler::StartProfiling(Handle<String> title) { | 5435 void CpuProfiler::StartProfiling(Handle<String> title) { |
5524 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5525 i::Isolate* isolate = i::Isolate::Current(); | 5436 i::Isolate* isolate = i::Isolate::Current(); |
5526 IsDeadCheck(isolate, "v8::CpuProfiler::StartProfiling"); | 5437 IsDeadCheck(isolate, "v8::CpuProfiler::StartProfiling"); |
5527 i::CpuProfiler::StartProfiling(*Utils::OpenHandle(*title)); | 5438 i::CpuProfiler::StartProfiling(*Utils::OpenHandle(*title)); |
5528 #endif | |
5529 } | 5439 } |
5530 | 5440 |
5531 | 5441 |
5532 const CpuProfile* CpuProfiler::StopProfiling(Handle<String> title, | 5442 const CpuProfile* CpuProfiler::StopProfiling(Handle<String> title, |
5533 Handle<Value> security_token) { | 5443 Handle<Value> security_token) { |
5534 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5535 i::Isolate* isolate = i::Isolate::Current(); | 5444 i::Isolate* isolate = i::Isolate::Current(); |
5536 IsDeadCheck(isolate, "v8::CpuProfiler::StopProfiling"); | 5445 IsDeadCheck(isolate, "v8::CpuProfiler::StopProfiling"); |
5537 return reinterpret_cast<const CpuProfile*>( | 5446 return reinterpret_cast<const CpuProfile*>( |
5538 i::CpuProfiler::StopProfiling( | 5447 i::CpuProfiler::StopProfiling( |
5539 security_token.IsEmpty() ? NULL : *Utils::OpenHandle(*security_token), | 5448 security_token.IsEmpty() ? NULL : *Utils::OpenHandle(*security_token), |
5540 *Utils::OpenHandle(*title))); | 5449 *Utils::OpenHandle(*title))); |
5541 #else | |
5542 return NULL; | |
5543 #endif | |
5544 } | 5450 } |
5545 | 5451 |
5546 | 5452 |
5547 void CpuProfiler::DeleteAllProfiles() { | 5453 void CpuProfiler::DeleteAllProfiles() { |
5548 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5549 i::Isolate* isolate = i::Isolate::Current(); | 5454 i::Isolate* isolate = i::Isolate::Current(); |
5550 IsDeadCheck(isolate, "v8::CpuProfiler::DeleteAllProfiles"); | 5455 IsDeadCheck(isolate, "v8::CpuProfiler::DeleteAllProfiles"); |
5551 i::CpuProfiler::DeleteAllProfiles(); | 5456 i::CpuProfiler::DeleteAllProfiles(); |
5552 #endif | |
5553 } | 5457 } |
5554 | 5458 |
5555 | 5459 |
5556 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5557 static i::HeapGraphEdge* ToInternal(const HeapGraphEdge* edge) { | 5460 static i::HeapGraphEdge* ToInternal(const HeapGraphEdge* edge) { |
5558 return const_cast<i::HeapGraphEdge*>( | 5461 return const_cast<i::HeapGraphEdge*>( |
5559 reinterpret_cast<const i::HeapGraphEdge*>(edge)); | 5462 reinterpret_cast<const i::HeapGraphEdge*>(edge)); |
5560 } | 5463 } |
5561 #endif | |
5562 | 5464 |
5563 | 5465 |
5564 HeapGraphEdge::Type HeapGraphEdge::GetType() const { | 5466 HeapGraphEdge::Type HeapGraphEdge::GetType() const { |
5565 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5566 i::Isolate* isolate = i::Isolate::Current(); | 5467 i::Isolate* isolate = i::Isolate::Current(); |
5567 IsDeadCheck(isolate, "v8::HeapGraphEdge::GetType"); | 5468 IsDeadCheck(isolate, "v8::HeapGraphEdge::GetType"); |
5568 return static_cast<HeapGraphEdge::Type>(ToInternal(this)->type()); | 5469 return static_cast<HeapGraphEdge::Type>(ToInternal(this)->type()); |
5569 #else | |
5570 return static_cast<HeapGraphEdge::Type>(0); | |
5571 #endif | |
5572 } | 5470 } |
5573 | 5471 |
5574 | 5472 |
5575 Handle<Value> HeapGraphEdge::GetName() const { | 5473 Handle<Value> HeapGraphEdge::GetName() const { |
5576 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5577 i::Isolate* isolate = i::Isolate::Current(); | 5474 i::Isolate* isolate = i::Isolate::Current(); |
5578 IsDeadCheck(isolate, "v8::HeapGraphEdge::GetName"); | 5475 IsDeadCheck(isolate, "v8::HeapGraphEdge::GetName"); |
5579 i::HeapGraphEdge* edge = ToInternal(this); | 5476 i::HeapGraphEdge* edge = ToInternal(this); |
5580 switch (edge->type()) { | 5477 switch (edge->type()) { |
5581 case i::HeapGraphEdge::kContextVariable: | 5478 case i::HeapGraphEdge::kContextVariable: |
5582 case i::HeapGraphEdge::kInternal: | 5479 case i::HeapGraphEdge::kInternal: |
5583 case i::HeapGraphEdge::kProperty: | 5480 case i::HeapGraphEdge::kProperty: |
5584 case i::HeapGraphEdge::kShortcut: | 5481 case i::HeapGraphEdge::kShortcut: |
5585 return Handle<String>(ToApi<String>(isolate->factory()->LookupAsciiSymbol( | 5482 return Handle<String>(ToApi<String>(isolate->factory()->LookupAsciiSymbol( |
5586 edge->name()))); | 5483 edge->name()))); |
5587 case i::HeapGraphEdge::kElement: | 5484 case i::HeapGraphEdge::kElement: |
5588 case i::HeapGraphEdge::kHidden: | 5485 case i::HeapGraphEdge::kHidden: |
5589 return Handle<Number>(ToApi<Number>(isolate->factory()->NewNumberFromInt( | 5486 return Handle<Number>(ToApi<Number>(isolate->factory()->NewNumberFromInt( |
5590 edge->index()))); | 5487 edge->index()))); |
5591 default: UNREACHABLE(); | 5488 default: UNREACHABLE(); |
5592 } | 5489 } |
5593 #endif | |
5594 return v8::Undefined(); | 5490 return v8::Undefined(); |
5595 } | 5491 } |
5596 | 5492 |
5597 | 5493 |
5598 const HeapGraphNode* HeapGraphEdge::GetFromNode() const { | 5494 const HeapGraphNode* HeapGraphEdge::GetFromNode() const { |
5599 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5600 i::Isolate* isolate = i::Isolate::Current(); | 5495 i::Isolate* isolate = i::Isolate::Current(); |
5601 IsDeadCheck(isolate, "v8::HeapGraphEdge::GetFromNode"); | 5496 IsDeadCheck(isolate, "v8::HeapGraphEdge::GetFromNode"); |
5602 const i::HeapEntry* from = ToInternal(this)->From(); | 5497 const i::HeapEntry* from = ToInternal(this)->From(); |
5603 return reinterpret_cast<const HeapGraphNode*>(from); | 5498 return reinterpret_cast<const HeapGraphNode*>(from); |
5604 #else | |
5605 return NULL; | |
5606 #endif | |
5607 } | 5499 } |
5608 | 5500 |
5609 | 5501 |
5610 const HeapGraphNode* HeapGraphEdge::GetToNode() const { | 5502 const HeapGraphNode* HeapGraphEdge::GetToNode() const { |
5611 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5612 i::Isolate* isolate = i::Isolate::Current(); | 5503 i::Isolate* isolate = i::Isolate::Current(); |
5613 IsDeadCheck(isolate, "v8::HeapGraphEdge::GetToNode"); | 5504 IsDeadCheck(isolate, "v8::HeapGraphEdge::GetToNode"); |
5614 const i::HeapEntry* to = ToInternal(this)->to(); | 5505 const i::HeapEntry* to = ToInternal(this)->to(); |
5615 return reinterpret_cast<const HeapGraphNode*>(to); | 5506 return reinterpret_cast<const HeapGraphNode*>(to); |
5616 #else | |
5617 return NULL; | |
5618 #endif | |
5619 } | 5507 } |
5620 | 5508 |
5621 | 5509 |
5622 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5623 static i::HeapEntry* ToInternal(const HeapGraphNode* entry) { | 5510 static i::HeapEntry* ToInternal(const HeapGraphNode* entry) { |
5624 return const_cast<i::HeapEntry*>( | 5511 return const_cast<i::HeapEntry*>( |
5625 reinterpret_cast<const i::HeapEntry*>(entry)); | 5512 reinterpret_cast<const i::HeapEntry*>(entry)); |
5626 } | 5513 } |
5627 #endif | |
5628 | 5514 |
5629 | 5515 |
5630 HeapGraphNode::Type HeapGraphNode::GetType() const { | 5516 HeapGraphNode::Type HeapGraphNode::GetType() const { |
5631 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5632 i::Isolate* isolate = i::Isolate::Current(); | 5517 i::Isolate* isolate = i::Isolate::Current(); |
5633 IsDeadCheck(isolate, "v8::HeapGraphNode::GetType"); | 5518 IsDeadCheck(isolate, "v8::HeapGraphNode::GetType"); |
5634 return static_cast<HeapGraphNode::Type>(ToInternal(this)->type()); | 5519 return static_cast<HeapGraphNode::Type>(ToInternal(this)->type()); |
5635 #else | |
5636 return static_cast<HeapGraphNode::Type>(0); | |
5637 #endif | |
5638 } | 5520 } |
5639 | 5521 |
5640 | 5522 |
5641 Handle<String> HeapGraphNode::GetName() const { | 5523 Handle<String> HeapGraphNode::GetName() const { |
5642 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5643 i::Isolate* isolate = i::Isolate::Current(); | 5524 i::Isolate* isolate = i::Isolate::Current(); |
5644 IsDeadCheck(isolate, "v8::HeapGraphNode::GetName"); | 5525 IsDeadCheck(isolate, "v8::HeapGraphNode::GetName"); |
5645 return Handle<String>(ToApi<String>(isolate->factory()->LookupAsciiSymbol( | 5526 return Handle<String>(ToApi<String>(isolate->factory()->LookupAsciiSymbol( |
5646 ToInternal(this)->name()))); | 5527 ToInternal(this)->name()))); |
5647 #else | |
5648 return v8::String::Empty(); | |
5649 #endif | |
5650 } | 5528 } |
5651 | 5529 |
5652 | 5530 |
5653 uint64_t HeapGraphNode::GetId() const { | 5531 uint64_t HeapGraphNode::GetId() const { |
5654 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5655 i::Isolate* isolate = i::Isolate::Current(); | 5532 i::Isolate* isolate = i::Isolate::Current(); |
5656 IsDeadCheck(isolate, "v8::HeapGraphNode::GetId"); | 5533 IsDeadCheck(isolate, "v8::HeapGraphNode::GetId"); |
5657 return ToInternal(this)->id(); | 5534 return ToInternal(this)->id(); |
5658 #else | |
5659 return 0; | |
5660 #endif | |
5661 } | 5535 } |
5662 | 5536 |
5663 | 5537 |
5664 int HeapGraphNode::GetSelfSize() const { | 5538 int HeapGraphNode::GetSelfSize() const { |
5665 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5666 i::Isolate* isolate = i::Isolate::Current(); | 5539 i::Isolate* isolate = i::Isolate::Current(); |
5667 IsDeadCheck(isolate, "v8::HeapGraphNode::GetSelfSize"); | 5540 IsDeadCheck(isolate, "v8::HeapGraphNode::GetSelfSize"); |
5668 return ToInternal(this)->self_size(); | 5541 return ToInternal(this)->self_size(); |
5669 #else | |
5670 return 0; | |
5671 #endif | |
5672 } | 5542 } |
5673 | 5543 |
5674 | 5544 |
5675 int HeapGraphNode::GetRetainedSize(bool exact) const { | 5545 int HeapGraphNode::GetRetainedSize(bool exact) const { |
5676 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5677 i::Isolate* isolate = i::Isolate::Current(); | 5546 i::Isolate* isolate = i::Isolate::Current(); |
5678 IsDeadCheck(isolate, "v8::HeapSnapshot::GetRetainedSize"); | 5547 IsDeadCheck(isolate, "v8::HeapSnapshot::GetRetainedSize"); |
5679 return ToInternal(this)->RetainedSize(exact); | 5548 return ToInternal(this)->RetainedSize(exact); |
5680 #else | |
5681 return 0; | |
5682 #endif | |
5683 } | 5549 } |
5684 | 5550 |
5685 | 5551 |
5686 int HeapGraphNode::GetChildrenCount() const { | 5552 int HeapGraphNode::GetChildrenCount() const { |
5687 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5688 i::Isolate* isolate = i::Isolate::Current(); | 5553 i::Isolate* isolate = i::Isolate::Current(); |
5689 IsDeadCheck(isolate, "v8::HeapSnapshot::GetChildrenCount"); | 5554 IsDeadCheck(isolate, "v8::HeapSnapshot::GetChildrenCount"); |
5690 return ToInternal(this)->children().length(); | 5555 return ToInternal(this)->children().length(); |
5691 #else | |
5692 return 0; | |
5693 #endif | |
5694 } | 5556 } |
5695 | 5557 |
5696 | 5558 |
5697 const HeapGraphEdge* HeapGraphNode::GetChild(int index) const { | 5559 const HeapGraphEdge* HeapGraphNode::GetChild(int index) const { |
5698 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5699 i::Isolate* isolate = i::Isolate::Current(); | 5560 i::Isolate* isolate = i::Isolate::Current(); |
5700 IsDeadCheck(isolate, "v8::HeapSnapshot::GetChild"); | 5561 IsDeadCheck(isolate, "v8::HeapSnapshot::GetChild"); |
5701 return reinterpret_cast<const HeapGraphEdge*>( | 5562 return reinterpret_cast<const HeapGraphEdge*>( |
5702 &ToInternal(this)->children()[index]); | 5563 &ToInternal(this)->children()[index]); |
5703 #else | |
5704 return NULL; | |
5705 #endif | |
5706 } | 5564 } |
5707 | 5565 |
5708 | 5566 |
5709 int HeapGraphNode::GetRetainersCount() const { | 5567 int HeapGraphNode::GetRetainersCount() const { |
5710 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5711 i::Isolate* isolate = i::Isolate::Current(); | 5568 i::Isolate* isolate = i::Isolate::Current(); |
5712 IsDeadCheck(isolate, "v8::HeapSnapshot::GetRetainersCount"); | 5569 IsDeadCheck(isolate, "v8::HeapSnapshot::GetRetainersCount"); |
5713 return ToInternal(this)->retainers().length(); | 5570 return ToInternal(this)->retainers().length(); |
5714 #else | |
5715 return 0; | |
5716 #endif | |
5717 } | 5571 } |
5718 | 5572 |
5719 | 5573 |
5720 const HeapGraphEdge* HeapGraphNode::GetRetainer(int index) const { | 5574 const HeapGraphEdge* HeapGraphNode::GetRetainer(int index) const { |
5721 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5722 i::Isolate* isolate = i::Isolate::Current(); | 5575 i::Isolate* isolate = i::Isolate::Current(); |
5723 IsDeadCheck(isolate, "v8::HeapSnapshot::GetRetainer"); | 5576 IsDeadCheck(isolate, "v8::HeapSnapshot::GetRetainer"); |
5724 return reinterpret_cast<const HeapGraphEdge*>( | 5577 return reinterpret_cast<const HeapGraphEdge*>( |
5725 ToInternal(this)->retainers()[index]); | 5578 ToInternal(this)->retainers()[index]); |
5726 #else | |
5727 return NULL; | |
5728 #endif | |
5729 } | 5579 } |
5730 | 5580 |
5731 | 5581 |
5732 const HeapGraphNode* HeapGraphNode::GetDominatorNode() const { | 5582 const HeapGraphNode* HeapGraphNode::GetDominatorNode() const { |
5733 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5734 i::Isolate* isolate = i::Isolate::Current(); | 5583 i::Isolate* isolate = i::Isolate::Current(); |
5735 IsDeadCheck(isolate, "v8::HeapSnapshot::GetDominatorNode"); | 5584 IsDeadCheck(isolate, "v8::HeapSnapshot::GetDominatorNode"); |
5736 return reinterpret_cast<const HeapGraphNode*>(ToInternal(this)->dominator()); | 5585 return reinterpret_cast<const HeapGraphNode*>(ToInternal(this)->dominator()); |
5737 #else | |
5738 return NULL; | |
5739 #endif | |
5740 } | 5586 } |
5741 | 5587 |
5742 | 5588 |
5743 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5744 static i::HeapSnapshot* ToInternal(const HeapSnapshot* snapshot) { | 5589 static i::HeapSnapshot* ToInternal(const HeapSnapshot* snapshot) { |
5745 return const_cast<i::HeapSnapshot*>( | 5590 return const_cast<i::HeapSnapshot*>( |
5746 reinterpret_cast<const i::HeapSnapshot*>(snapshot)); | 5591 reinterpret_cast<const i::HeapSnapshot*>(snapshot)); |
5747 } | 5592 } |
5748 #endif | |
5749 | 5593 |
5750 | 5594 |
5751 void HeapSnapshot::Delete() { | 5595 void HeapSnapshot::Delete() { |
5752 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5753 i::Isolate* isolate = i::Isolate::Current(); | 5596 i::Isolate* isolate = i::Isolate::Current(); |
5754 IsDeadCheck(isolate, "v8::HeapSnapshot::Delete"); | 5597 IsDeadCheck(isolate, "v8::HeapSnapshot::Delete"); |
5755 if (i::HeapProfiler::GetSnapshotsCount() > 1) { | 5598 if (i::HeapProfiler::GetSnapshotsCount() > 1) { |
5756 ToInternal(this)->Delete(); | 5599 ToInternal(this)->Delete(); |
5757 } else { | 5600 } else { |
5758 // If this is the last snapshot, clean up all accessory data as well. | 5601 // If this is the last snapshot, clean up all accessory data as well. |
5759 i::HeapProfiler::DeleteAllSnapshots(); | 5602 i::HeapProfiler::DeleteAllSnapshots(); |
5760 } | 5603 } |
5761 #endif | |
5762 } | 5604 } |
5763 | 5605 |
5764 | 5606 |
5765 HeapSnapshot::Type HeapSnapshot::GetType() const { | 5607 HeapSnapshot::Type HeapSnapshot::GetType() const { |
5766 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5767 i::Isolate* isolate = i::Isolate::Current(); | 5608 i::Isolate* isolate = i::Isolate::Current(); |
5768 IsDeadCheck(isolate, "v8::HeapSnapshot::GetType"); | 5609 IsDeadCheck(isolate, "v8::HeapSnapshot::GetType"); |
5769 return static_cast<HeapSnapshot::Type>(ToInternal(this)->type()); | 5610 return static_cast<HeapSnapshot::Type>(ToInternal(this)->type()); |
5770 #else | |
5771 return static_cast<HeapSnapshot::Type>(0); | |
5772 #endif | |
5773 } | 5611 } |
5774 | 5612 |
5775 | 5613 |
5776 unsigned HeapSnapshot::GetUid() const { | 5614 unsigned HeapSnapshot::GetUid() const { |
5777 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5778 i::Isolate* isolate = i::Isolate::Current(); | 5615 i::Isolate* isolate = i::Isolate::Current(); |
5779 IsDeadCheck(isolate, "v8::HeapSnapshot::GetUid"); | 5616 IsDeadCheck(isolate, "v8::HeapSnapshot::GetUid"); |
5780 return ToInternal(this)->uid(); | 5617 return ToInternal(this)->uid(); |
5781 #else | |
5782 return 0; | |
5783 #endif | |
5784 } | 5618 } |
5785 | 5619 |
5786 | 5620 |
5787 Handle<String> HeapSnapshot::GetTitle() const { | 5621 Handle<String> HeapSnapshot::GetTitle() const { |
5788 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5789 i::Isolate* isolate = i::Isolate::Current(); | 5622 i::Isolate* isolate = i::Isolate::Current(); |
5790 IsDeadCheck(isolate, "v8::HeapSnapshot::GetTitle"); | 5623 IsDeadCheck(isolate, "v8::HeapSnapshot::GetTitle"); |
5791 return Handle<String>(ToApi<String>(isolate->factory()->LookupAsciiSymbol( | 5624 return Handle<String>(ToApi<String>(isolate->factory()->LookupAsciiSymbol( |
5792 ToInternal(this)->title()))); | 5625 ToInternal(this)->title()))); |
5793 #else | |
5794 return v8::String::Empty(); | |
5795 #endif | |
5796 } | 5626 } |
5797 | 5627 |
5798 | 5628 |
5799 const HeapGraphNode* HeapSnapshot::GetRoot() const { | 5629 const HeapGraphNode* HeapSnapshot::GetRoot() const { |
5800 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5801 i::Isolate* isolate = i::Isolate::Current(); | 5630 i::Isolate* isolate = i::Isolate::Current(); |
5802 IsDeadCheck(isolate, "v8::HeapSnapshot::GetHead"); | 5631 IsDeadCheck(isolate, "v8::HeapSnapshot::GetHead"); |
5803 return reinterpret_cast<const HeapGraphNode*>(ToInternal(this)->root()); | 5632 return reinterpret_cast<const HeapGraphNode*>(ToInternal(this)->root()); |
5804 #else | |
5805 return 0; | |
5806 #endif | |
5807 } | 5633 } |
5808 | 5634 |
5809 | 5635 |
5810 const HeapGraphNode* HeapSnapshot::GetNodeById(uint64_t id) const { | 5636 const HeapGraphNode* HeapSnapshot::GetNodeById(uint64_t id) const { |
5811 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5812 i::Isolate* isolate = i::Isolate::Current(); | 5637 i::Isolate* isolate = i::Isolate::Current(); |
5813 IsDeadCheck(isolate, "v8::HeapSnapshot::GetNodeById"); | 5638 IsDeadCheck(isolate, "v8::HeapSnapshot::GetNodeById"); |
5814 return reinterpret_cast<const HeapGraphNode*>( | 5639 return reinterpret_cast<const HeapGraphNode*>( |
5815 ToInternal(this)->GetEntryById(id)); | 5640 ToInternal(this)->GetEntryById(id)); |
5816 #else | |
5817 return NULL; | |
5818 #endif | |
5819 } | 5641 } |
5820 | 5642 |
5821 | 5643 |
5822 int HeapSnapshot::GetNodesCount() const { | 5644 int HeapSnapshot::GetNodesCount() const { |
5823 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5824 i::Isolate* isolate = i::Isolate::Current(); | 5645 i::Isolate* isolate = i::Isolate::Current(); |
5825 IsDeadCheck(isolate, "v8::HeapSnapshot::GetNodesCount"); | 5646 IsDeadCheck(isolate, "v8::HeapSnapshot::GetNodesCount"); |
5826 return ToInternal(this)->entries()->length(); | 5647 return ToInternal(this)->entries()->length(); |
5827 #else | |
5828 return 0; | |
5829 #endif | |
5830 } | 5648 } |
5831 | 5649 |
5832 | 5650 |
5833 const HeapGraphNode* HeapSnapshot::GetNode(int index) const { | 5651 const HeapGraphNode* HeapSnapshot::GetNode(int index) const { |
5834 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5835 i::Isolate* isolate = i::Isolate::Current(); | 5652 i::Isolate* isolate = i::Isolate::Current(); |
5836 IsDeadCheck(isolate, "v8::HeapSnapshot::GetNode"); | 5653 IsDeadCheck(isolate, "v8::HeapSnapshot::GetNode"); |
5837 return reinterpret_cast<const HeapGraphNode*>( | 5654 return reinterpret_cast<const HeapGraphNode*>( |
5838 ToInternal(this)->entries()->at(index)); | 5655 ToInternal(this)->entries()->at(index)); |
5839 #else | |
5840 return 0; | |
5841 #endif | |
5842 } | 5656 } |
5843 | 5657 |
5844 | 5658 |
5845 void HeapSnapshot::Serialize(OutputStream* stream, | 5659 void HeapSnapshot::Serialize(OutputStream* stream, |
5846 HeapSnapshot::SerializationFormat format) const { | 5660 HeapSnapshot::SerializationFormat format) const { |
5847 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5848 i::Isolate* isolate = i::Isolate::Current(); | 5661 i::Isolate* isolate = i::Isolate::Current(); |
5849 IsDeadCheck(isolate, "v8::HeapSnapshot::Serialize"); | 5662 IsDeadCheck(isolate, "v8::HeapSnapshot::Serialize"); |
5850 ApiCheck(format == kJSON, | 5663 ApiCheck(format == kJSON, |
5851 "v8::HeapSnapshot::Serialize", | 5664 "v8::HeapSnapshot::Serialize", |
5852 "Unknown serialization format"); | 5665 "Unknown serialization format"); |
5853 ApiCheck(stream->GetOutputEncoding() == OutputStream::kAscii, | 5666 ApiCheck(stream->GetOutputEncoding() == OutputStream::kAscii, |
5854 "v8::HeapSnapshot::Serialize", | 5667 "v8::HeapSnapshot::Serialize", |
5855 "Unsupported output encoding"); | 5668 "Unsupported output encoding"); |
5856 ApiCheck(stream->GetChunkSize() > 0, | 5669 ApiCheck(stream->GetChunkSize() > 0, |
5857 "v8::HeapSnapshot::Serialize", | 5670 "v8::HeapSnapshot::Serialize", |
5858 "Invalid stream chunk size"); | 5671 "Invalid stream chunk size"); |
5859 i::HeapSnapshotJSONSerializer serializer(ToInternal(this)); | 5672 i::HeapSnapshotJSONSerializer serializer(ToInternal(this)); |
5860 serializer.Serialize(stream); | 5673 serializer.Serialize(stream); |
5861 #endif | |
5862 } | 5674 } |
5863 | 5675 |
5864 | 5676 |
5865 int HeapProfiler::GetSnapshotsCount() { | 5677 int HeapProfiler::GetSnapshotsCount() { |
5866 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5867 i::Isolate* isolate = i::Isolate::Current(); | 5678 i::Isolate* isolate = i::Isolate::Current(); |
5868 IsDeadCheck(isolate, "v8::HeapProfiler::GetSnapshotsCount"); | 5679 IsDeadCheck(isolate, "v8::HeapProfiler::GetSnapshotsCount"); |
5869 return i::HeapProfiler::GetSnapshotsCount(); | 5680 return i::HeapProfiler::GetSnapshotsCount(); |
5870 #else | |
5871 return 0; | |
5872 #endif | |
5873 } | 5681 } |
5874 | 5682 |
5875 | 5683 |
5876 const HeapSnapshot* HeapProfiler::GetSnapshot(int index) { | 5684 const HeapSnapshot* HeapProfiler::GetSnapshot(int index) { |
5877 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5878 i::Isolate* isolate = i::Isolate::Current(); | 5685 i::Isolate* isolate = i::Isolate::Current(); |
5879 IsDeadCheck(isolate, "v8::HeapProfiler::GetSnapshot"); | 5686 IsDeadCheck(isolate, "v8::HeapProfiler::GetSnapshot"); |
5880 return reinterpret_cast<const HeapSnapshot*>( | 5687 return reinterpret_cast<const HeapSnapshot*>( |
5881 i::HeapProfiler::GetSnapshot(index)); | 5688 i::HeapProfiler::GetSnapshot(index)); |
5882 #else | |
5883 return NULL; | |
5884 #endif | |
5885 } | 5689 } |
5886 | 5690 |
5887 | 5691 |
5888 const HeapSnapshot* HeapProfiler::FindSnapshot(unsigned uid) { | 5692 const HeapSnapshot* HeapProfiler::FindSnapshot(unsigned uid) { |
5889 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5890 i::Isolate* isolate = i::Isolate::Current(); | 5693 i::Isolate* isolate = i::Isolate::Current(); |
5891 IsDeadCheck(isolate, "v8::HeapProfiler::FindSnapshot"); | 5694 IsDeadCheck(isolate, "v8::HeapProfiler::FindSnapshot"); |
5892 return reinterpret_cast<const HeapSnapshot*>( | 5695 return reinterpret_cast<const HeapSnapshot*>( |
5893 i::HeapProfiler::FindSnapshot(uid)); | 5696 i::HeapProfiler::FindSnapshot(uid)); |
5894 #else | |
5895 return NULL; | |
5896 #endif | |
5897 } | 5697 } |
5898 | 5698 |
5899 | 5699 |
5900 const HeapSnapshot* HeapProfiler::TakeSnapshot(Handle<String> title, | 5700 const HeapSnapshot* HeapProfiler::TakeSnapshot(Handle<String> title, |
5901 HeapSnapshot::Type type, | 5701 HeapSnapshot::Type type, |
5902 ActivityControl* control) { | 5702 ActivityControl* control) { |
5903 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5904 i::Isolate* isolate = i::Isolate::Current(); | 5703 i::Isolate* isolate = i::Isolate::Current(); |
5905 IsDeadCheck(isolate, "v8::HeapProfiler::TakeSnapshot"); | 5704 IsDeadCheck(isolate, "v8::HeapProfiler::TakeSnapshot"); |
5906 i::HeapSnapshot::Type internal_type = i::HeapSnapshot::kFull; | 5705 i::HeapSnapshot::Type internal_type = i::HeapSnapshot::kFull; |
5907 switch (type) { | 5706 switch (type) { |
5908 case HeapSnapshot::kFull: | 5707 case HeapSnapshot::kFull: |
5909 internal_type = i::HeapSnapshot::kFull; | 5708 internal_type = i::HeapSnapshot::kFull; |
5910 break; | 5709 break; |
5911 default: | 5710 default: |
5912 UNREACHABLE(); | 5711 UNREACHABLE(); |
5913 } | 5712 } |
5914 return reinterpret_cast<const HeapSnapshot*>( | 5713 return reinterpret_cast<const HeapSnapshot*>( |
5915 i::HeapProfiler::TakeSnapshot( | 5714 i::HeapProfiler::TakeSnapshot( |
5916 *Utils::OpenHandle(*title), internal_type, control)); | 5715 *Utils::OpenHandle(*title), internal_type, control)); |
5917 #else | |
5918 return NULL; | |
5919 #endif | |
5920 } | 5716 } |
5921 | 5717 |
5922 | 5718 |
5923 void HeapProfiler::DeleteAllSnapshots() { | 5719 void HeapProfiler::DeleteAllSnapshots() { |
5924 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5925 i::Isolate* isolate = i::Isolate::Current(); | 5720 i::Isolate* isolate = i::Isolate::Current(); |
5926 IsDeadCheck(isolate, "v8::HeapProfiler::DeleteAllSnapshots"); | 5721 IsDeadCheck(isolate, "v8::HeapProfiler::DeleteAllSnapshots"); |
5927 i::HeapProfiler::DeleteAllSnapshots(); | 5722 i::HeapProfiler::DeleteAllSnapshots(); |
5928 #endif | |
5929 } | 5723 } |
5930 | 5724 |
5931 | 5725 |
5932 void HeapProfiler::DefineWrapperClass(uint16_t class_id, | 5726 void HeapProfiler::DefineWrapperClass(uint16_t class_id, |
5933 WrapperInfoCallback callback) { | 5727 WrapperInfoCallback callback) { |
5934 #ifdef ENABLE_LOGGING_AND_PROFILING | |
5935 i::Isolate::Current()->heap_profiler()->DefineWrapperClass(class_id, | 5728 i::Isolate::Current()->heap_profiler()->DefineWrapperClass(class_id, |
5936 callback); | 5729 callback); |
5937 #endif | |
5938 } | 5730 } |
5939 | 5731 |
5940 | 5732 |
5941 | 5733 |
5942 v8::Testing::StressType internal::Testing::stress_type_ = | 5734 v8::Testing::StressType internal::Testing::stress_type_ = |
5943 v8::Testing::kStressTypeOpt; | 5735 v8::Testing::kStressTypeOpt; |
5944 | 5736 |
5945 | 5737 |
5946 void Testing::SetStressRunType(Testing::StressType type) { | 5738 void Testing::SetStressRunType(Testing::StressType type) { |
5947 internal::Testing::set_stress_type(type); | 5739 internal::Testing::set_stress_type(type); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6066 | 5858 |
6067 | 5859 |
6068 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { | 5860 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { |
6069 HandleScopeImplementer* scope_implementer = | 5861 HandleScopeImplementer* scope_implementer = |
6070 reinterpret_cast<HandleScopeImplementer*>(storage); | 5862 reinterpret_cast<HandleScopeImplementer*>(storage); |
6071 scope_implementer->IterateThis(v); | 5863 scope_implementer->IterateThis(v); |
6072 return storage + ArchiveSpacePerThread(); | 5864 return storage + ArchiveSpacePerThread(); |
6073 } | 5865 } |
6074 | 5866 |
6075 } } // namespace v8::internal | 5867 } } // namespace v8::internal |
OLD | NEW |