| OLD | NEW |
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Tests of logging functions from log.h | 3 // Tests of logging functions from log.h |
| 4 | 4 |
| 5 #ifdef ENABLE_LOGGING_AND_PROFILING | 5 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 6 | 6 |
| 7 #ifdef __linux__ | 7 #ifdef __linux__ |
| 8 #include <math.h> | 8 #include <math.h> |
| 9 #include <pthread.h> | 9 #include <pthread.h> |
| 10 #include <signal.h> | 10 #include <signal.h> |
| 11 #include <unistd.h> | 11 #include <unistd.h> |
| 12 #endif // __linux__ | 12 #endif // __linux__ |
| 13 | 13 |
| 14 #include "v8.h" | 14 #include "v8.h" |
| 15 #include "log.h" | 15 #include "log.h" |
| 16 #include "v8threads.h" | 16 #include "v8threads.h" |
| 17 #include "cctest.h" | 17 #include "cctest.h" |
| 18 | 18 |
| 19 using v8::internal::Address; | 19 using v8::internal::Address; |
| 20 using v8::internal::EmbeddedVector; | 20 using v8::internal::EmbeddedVector; |
| 21 using v8::internal::Logger; | 21 using v8::internal::Logger; |
| 22 using v8::internal::StrLength; |
| 22 | 23 |
| 23 namespace i = v8::internal; | 24 namespace i = v8::internal; |
| 24 | 25 |
| 25 static void SetUp() { | 26 static void SetUp() { |
| 26 // Log to memory buffer. | 27 // Log to memory buffer. |
| 27 i::FLAG_logfile = "*"; | 28 i::FLAG_logfile = "*"; |
| 28 i::FLAG_log = true; | 29 i::FLAG_log = true; |
| 29 Logger::Setup(); | 30 Logger::Setup(); |
| 30 } | 31 } |
| 31 | 32 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 48 SetUp(); | 49 SetUp(); |
| 49 Logger::StringEvent("aaa", "bbb"); | 50 Logger::StringEvent("aaa", "bbb"); |
| 50 Logger::StringEvent("cccc", "dddd"); | 51 Logger::StringEvent("cccc", "dddd"); |
| 51 CHECK_EQ(0, Logger::GetLogLines(0, NULL, 0)); | 52 CHECK_EQ(0, Logger::GetLogLines(0, NULL, 0)); |
| 52 char log_lines[100]; | 53 char log_lines[100]; |
| 53 memset(log_lines, 0, sizeof(log_lines)); | 54 memset(log_lines, 0, sizeof(log_lines)); |
| 54 // Requesting data size which is smaller than first log message length. | 55 // Requesting data size which is smaller than first log message length. |
| 55 CHECK_EQ(0, Logger::GetLogLines(0, log_lines, 3)); | 56 CHECK_EQ(0, Logger::GetLogLines(0, log_lines, 3)); |
| 56 // See Logger::StringEvent. | 57 // See Logger::StringEvent. |
| 57 const char* line_1 = "aaa,\"bbb\"\n"; | 58 const char* line_1 = "aaa,\"bbb\"\n"; |
| 58 const int line_1_len = strlen(line_1); | 59 const int line_1_len = StrLength(line_1); |
| 59 // Still smaller than log message length. | 60 // Still smaller than log message length. |
| 60 CHECK_EQ(0, Logger::GetLogLines(0, log_lines, line_1_len - 1)); | 61 CHECK_EQ(0, Logger::GetLogLines(0, log_lines, line_1_len - 1)); |
| 61 // The exact size. | 62 // The exact size. |
| 62 CHECK_EQ(line_1_len, Logger::GetLogLines(0, log_lines, line_1_len)); | 63 CHECK_EQ(line_1_len, Logger::GetLogLines(0, log_lines, line_1_len)); |
| 63 CHECK_EQ(line_1, log_lines); | 64 CHECK_EQ(line_1, log_lines); |
| 64 memset(log_lines, 0, sizeof(log_lines)); | 65 memset(log_lines, 0, sizeof(log_lines)); |
| 65 // A bit more than the first line length. | 66 // A bit more than the first line length. |
| 66 CHECK_EQ(line_1_len, Logger::GetLogLines(0, log_lines, line_1_len + 3)); | 67 CHECK_EQ(line_1_len, Logger::GetLogLines(0, log_lines, line_1_len + 3)); |
| 67 log_lines[line_1_len] = '\0'; | 68 log_lines[line_1_len] = '\0'; |
| 68 CHECK_EQ(line_1, log_lines); | 69 CHECK_EQ(line_1, log_lines); |
| 69 memset(log_lines, 0, sizeof(log_lines)); | 70 memset(log_lines, 0, sizeof(log_lines)); |
| 70 const char* line_2 = "cccc,\"dddd\"\n"; | 71 const char* line_2 = "cccc,\"dddd\"\n"; |
| 71 const int line_2_len = strlen(line_2); | 72 const int line_2_len = StrLength(line_2); |
| 72 // Now start with line_2 beginning. | 73 // Now start with line_2 beginning. |
| 73 CHECK_EQ(0, Logger::GetLogLines(line_1_len, log_lines, 0)); | 74 CHECK_EQ(0, Logger::GetLogLines(line_1_len, log_lines, 0)); |
| 74 CHECK_EQ(0, Logger::GetLogLines(line_1_len, log_lines, 3)); | 75 CHECK_EQ(0, Logger::GetLogLines(line_1_len, log_lines, 3)); |
| 75 CHECK_EQ(0, Logger::GetLogLines(line_1_len, log_lines, line_2_len - 1)); | 76 CHECK_EQ(0, Logger::GetLogLines(line_1_len, log_lines, line_2_len - 1)); |
| 76 CHECK_EQ(line_2_len, Logger::GetLogLines(line_1_len, log_lines, line_2_len)); | 77 CHECK_EQ(line_2_len, Logger::GetLogLines(line_1_len, log_lines, line_2_len)); |
| 77 CHECK_EQ(line_2, log_lines); | 78 CHECK_EQ(line_2, log_lines); |
| 78 memset(log_lines, 0, sizeof(log_lines)); | 79 memset(log_lines, 0, sizeof(log_lines)); |
| 79 CHECK_EQ(line_2_len, | 80 CHECK_EQ(line_2_len, |
| 80 Logger::GetLogLines(line_1_len, log_lines, line_2_len + 3)); | 81 Logger::GetLogLines(line_1_len, log_lines, line_2_len + 3)); |
| 81 CHECK_EQ(line_2, log_lines); | 82 CHECK_EQ(line_2, log_lines); |
| 82 memset(log_lines, 0, sizeof(log_lines)); | 83 memset(log_lines, 0, sizeof(log_lines)); |
| 83 // Now get entire buffer contents. | 84 // Now get entire buffer contents. |
| 84 const char* all_lines = "aaa,\"bbb\"\ncccc,\"dddd\"\n"; | 85 const char* all_lines = "aaa,\"bbb\"\ncccc,\"dddd\"\n"; |
| 85 const int all_lines_len = strlen(all_lines); | 86 const int all_lines_len = StrLength(all_lines); |
| 86 CHECK_EQ(all_lines_len, Logger::GetLogLines(0, log_lines, all_lines_len)); | 87 CHECK_EQ(all_lines_len, Logger::GetLogLines(0, log_lines, all_lines_len)); |
| 87 CHECK_EQ(all_lines, log_lines); | 88 CHECK_EQ(all_lines, log_lines); |
| 88 memset(log_lines, 0, sizeof(log_lines)); | 89 memset(log_lines, 0, sizeof(log_lines)); |
| 89 CHECK_EQ(all_lines_len, Logger::GetLogLines(0, log_lines, all_lines_len + 3)); | 90 CHECK_EQ(all_lines_len, Logger::GetLogLines(0, log_lines, all_lines_len + 3)); |
| 90 CHECK_EQ(all_lines, log_lines); | 91 CHECK_EQ(all_lines, log_lines); |
| 91 memset(log_lines, 0, sizeof(log_lines)); | 92 memset(log_lines, 0, sizeof(log_lines)); |
| 92 TearDown(); | 93 TearDown(); |
| 93 } | 94 } |
| 94 | 95 |
| 95 | 96 |
| 96 static int GetLogLines(int start_pos, i::Vector<char>* buffer) { | 97 static int GetLogLines(int start_pos, i::Vector<char>* buffer) { |
| 97 return Logger::GetLogLines(start_pos, buffer->start(), buffer->length()); | 98 return Logger::GetLogLines(start_pos, buffer->start(), buffer->length()); |
| 98 } | 99 } |
| 99 | 100 |
| 100 | 101 |
| 101 TEST(BeyondWritePosition) { | 102 TEST(BeyondWritePosition) { |
| 102 SetUp(); | 103 SetUp(); |
| 103 Logger::StringEvent("aaa", "bbb"); | 104 Logger::StringEvent("aaa", "bbb"); |
| 104 Logger::StringEvent("cccc", "dddd"); | 105 Logger::StringEvent("cccc", "dddd"); |
| 105 // See Logger::StringEvent. | 106 // See Logger::StringEvent. |
| 106 const char* all_lines = "aaa,\"bbb\"\ncccc,\"dddd\"\n"; | 107 const char* all_lines = "aaa,\"bbb\"\ncccc,\"dddd\"\n"; |
| 107 const int all_lines_len = strlen(all_lines); | 108 const int all_lines_len = StrLength(all_lines); |
| 108 EmbeddedVector<char, 100> buffer; | 109 EmbeddedVector<char, 100> buffer; |
| 109 const int beyond_write_pos = all_lines_len; | 110 const int beyond_write_pos = all_lines_len; |
| 110 CHECK_EQ(0, Logger::GetLogLines(beyond_write_pos, buffer.start(), 1)); | 111 CHECK_EQ(0, Logger::GetLogLines(beyond_write_pos, buffer.start(), 1)); |
| 111 CHECK_EQ(0, GetLogLines(beyond_write_pos, &buffer)); | 112 CHECK_EQ(0, GetLogLines(beyond_write_pos, &buffer)); |
| 112 CHECK_EQ(0, Logger::GetLogLines(beyond_write_pos + 1, buffer.start(), 1)); | 113 CHECK_EQ(0, Logger::GetLogLines(beyond_write_pos + 1, buffer.start(), 1)); |
| 113 CHECK_EQ(0, GetLogLines(beyond_write_pos + 1, &buffer)); | 114 CHECK_EQ(0, GetLogLines(beyond_write_pos + 1, &buffer)); |
| 114 CHECK_EQ(0, Logger::GetLogLines(beyond_write_pos + 100, buffer.start(), 1)); | 115 CHECK_EQ(0, Logger::GetLogLines(beyond_write_pos + 100, buffer.start(), 1)); |
| 115 CHECK_EQ(0, GetLogLines(beyond_write_pos + 100, &buffer)); | 116 CHECK_EQ(0, GetLogLines(beyond_write_pos + 100, &buffer)); |
| 116 CHECK_EQ(0, Logger::GetLogLines(10 * 1024 * 1024, buffer.start(), 1)); | 117 CHECK_EQ(0, Logger::GetLogLines(10 * 1024 * 1024, buffer.start(), 1)); |
| 117 CHECK_EQ(0, GetLogLines(10 * 1024 * 1024, &buffer)); | 118 CHECK_EQ(0, GetLogLines(10 * 1024 * 1024, &buffer)); |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 | 431 |
| 431 | 432 |
| 432 // Test for issue http://crbug.com/23768 in Chromium. | 433 // Test for issue http://crbug.com/23768 in Chromium. |
| 433 // Heap can contain scripts with already disposed external sources. | 434 // Heap can contain scripts with already disposed external sources. |
| 434 // We need to verify that LogCompiledFunctions doesn't crash on them. | 435 // We need to verify that LogCompiledFunctions doesn't crash on them. |
| 435 namespace { | 436 namespace { |
| 436 | 437 |
| 437 class SimpleExternalString : public v8::String::ExternalStringResource { | 438 class SimpleExternalString : public v8::String::ExternalStringResource { |
| 438 public: | 439 public: |
| 439 explicit SimpleExternalString(const char* source) | 440 explicit SimpleExternalString(const char* source) |
| 440 : utf_source_(strlen(source)) { | 441 : utf_source_(StrLength(source)) { |
| 441 for (int i = 0; i < utf_source_.length(); ++i) | 442 for (int i = 0; i < utf_source_.length(); ++i) |
| 442 utf_source_[i] = source[i]; | 443 utf_source_[i] = source[i]; |
| 443 } | 444 } |
| 444 virtual ~SimpleExternalString() {} | 445 virtual ~SimpleExternalString() {} |
| 445 virtual size_t length() const { return utf_source_.length(); } | 446 virtual size_t length() const { return utf_source_.length(); } |
| 446 virtual const uint16_t* data() const { return utf_source_.start(); } | 447 virtual const uint16_t* data() const { return utf_source_.start(); } |
| 447 private: | 448 private: |
| 448 i::ScopedVector<uint16_t> utf_source_; | 449 i::ScopedVector<uint16_t> utf_source_; |
| 449 }; | 450 }; |
| 450 | 451 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 // Make sure that the test doesn't operate on a bogus log. | 586 // Make sure that the test doesn't operate on a bogus log. |
| 586 CHECK_GT(max_entities, 0); | 587 CHECK_GT(max_entities, 0); |
| 587 CHECK_GT(bounds.GetMinAddr(), 0); | 588 CHECK_GT(bounds.GetMinAddr(), 0); |
| 588 CHECK_GT(bounds.GetMaxAddr(), bounds.GetMinAddr()); | 589 CHECK_GT(bounds.GetMaxAddr(), bounds.GetMinAddr()); |
| 589 | 590 |
| 590 entities = i::NewArray<CodeEntityInfo>(max_entities); | 591 entities = i::NewArray<CodeEntityInfo>(max_entities); |
| 591 for (int i = 0; i < max_entities; ++i) { | 592 for (int i = 0; i < max_entities; ++i) { |
| 592 entities[i] = NULL; | 593 entities[i] = NULL; |
| 593 } | 594 } |
| 594 const size_t map_length = bounds.Length(); | 595 const size_t map_length = bounds.Length(); |
| 595 entities_map = i::NewArray<int>(map_length); | 596 entities_map = i::NewArray<int>(static_cast<int>(map_length)); |
| 596 for (size_t i = 0; i < map_length; ++i) { | 597 for (size_t i = 0; i < map_length; ++i) { |
| 597 entities_map[i] = -1; | 598 entities_map[i] = -1; |
| 598 } | 599 } |
| 599 } | 600 } |
| 600 | 601 |
| 601 bool HasIndexForAddress(Address addr) { | 602 bool HasIndexForAddress(Address addr) { |
| 602 return bounds.Contains(addr); | 603 return bounds.Contains(addr); |
| 603 } | 604 } |
| 604 | 605 |
| 605 size_t GetIndexForAddress(Address addr) { | 606 size_t GetIndexForAddress(Address addr) { |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 // Pass 2: Fill in code entries data. | 762 // Pass 2: Fill in code entries data. |
| 762 ParserCycle(start, end, result, | 763 ParserCycle(start, end, result, |
| 763 Pass2CodeCreation, Pass2CodeDelete, Pass2CodeMove); | 764 Pass2CodeCreation, Pass2CodeDelete, Pass2CodeMove); |
| 764 } | 765 } |
| 765 | 766 |
| 766 | 767 |
| 767 static inline void PrintCodeEntityInfo(CodeEntityInfo entity) { | 768 static inline void PrintCodeEntityInfo(CodeEntityInfo entity) { |
| 768 const int max_len = 50; | 769 const int max_len = 50; |
| 769 if (entity != NULL) { | 770 if (entity != NULL) { |
| 770 char* eol = strchr(entity, '\n'); | 771 char* eol = strchr(entity, '\n'); |
| 771 int len = eol - entity; | 772 int len = static_cast<int>(eol - entity); |
| 772 len = len <= max_len ? len : max_len; | 773 len = len <= max_len ? len : max_len; |
| 773 printf("%-*.*s ", max_len, len, entity); | 774 printf("%-*.*s ", max_len, len, entity); |
| 774 } else { | 775 } else { |
| 775 printf("%*s", max_len + 1, ""); | 776 printf("%*s", max_len + 1, ""); |
| 776 } | 777 } |
| 777 } | 778 } |
| 778 | 779 |
| 779 | 780 |
| 780 static void PrintCodeEntitiesInfo( | 781 static void PrintCodeEntitiesInfo( |
| 781 bool is_equal, Address addr, | 782 bool is_equal, Address addr, |
| 782 CodeEntityInfo l_entity, CodeEntityInfo r_entity) { | 783 CodeEntityInfo l_entity, CodeEntityInfo r_entity) { |
| 783 printf("%c %p ", is_equal ? ' ' : '*', addr); | 784 printf("%c %p ", is_equal ? ' ' : '*', addr); |
| 784 PrintCodeEntityInfo(l_entity); | 785 PrintCodeEntityInfo(l_entity); |
| 785 PrintCodeEntityInfo(r_entity); | 786 PrintCodeEntityInfo(r_entity); |
| 786 printf("\n"); | 787 printf("\n"); |
| 787 } | 788 } |
| 788 | 789 |
| 789 | 790 |
| 790 static inline int StrChrLen(const char* s, char c) { | 791 static inline int StrChrLen(const char* s, char c) { |
| 791 return strchr(s, c) - s; | 792 return static_cast<int>(strchr(s, c) - s); |
| 792 } | 793 } |
| 793 | 794 |
| 794 | 795 |
| 795 static bool AreFuncSizesEqual(CodeEntityInfo ref_s, CodeEntityInfo new_s) { | 796 static bool AreFuncSizesEqual(CodeEntityInfo ref_s, CodeEntityInfo new_s) { |
| 796 int ref_len = StrChrLen(ref_s, ','); | 797 int ref_len = StrChrLen(ref_s, ','); |
| 797 int new_len = StrChrLen(new_s, ','); | 798 int new_len = StrChrLen(new_s, ','); |
| 798 return ref_len == new_len && strncmp(ref_s, new_s, ref_len) == 0; | 799 return ref_len == new_len && strncmp(ref_s, new_s, ref_len) == 0; |
| 799 } | 800 } |
| 800 | 801 |
| 801 | 802 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 932 // Make sure that all log data is written prior crash due to CHECK failure. | 933 // Make sure that all log data is written prior crash due to CHECK failure. |
| 933 fflush(stdout); | 934 fflush(stdout); |
| 934 CHECK(results_equal); | 935 CHECK(results_equal); |
| 935 | 936 |
| 936 env->Exit(); | 937 env->Exit(); |
| 937 Logger::TearDown(); | 938 Logger::TearDown(); |
| 938 i::FLAG_always_compact = saved_always_compact; | 939 i::FLAG_always_compact = saved_always_compact; |
| 939 } | 940 } |
| 940 | 941 |
| 941 #endif // ENABLE_LOGGING_AND_PROFILING | 942 #endif // ENABLE_LOGGING_AND_PROFILING |
| OLD | NEW |