| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 // Generate a pseudo-random number in the range 0-2^31-1. Usually | 149 // Generate a pseudo-random number in the range 0-2^31-1. Usually |
| 150 // defined in stdlib.h | 150 // defined in stdlib.h |
| 151 int random() { | 151 int random() { |
| 152 return rand(); | 152 return rand(); |
| 153 } | 153 } |
| 154 | 154 |
| 155 | 155 |
| 156 // Case-insensitive string comparisons. Use stricmp() on Win32. Usually defined | 156 // Case-insensitive string comparisons. Use stricmp() on Win32. Usually defined |
| 157 // in strings.h. | 157 // in strings.h. |
| 158 int strcasecmp(const char* s1, const char* s2) { | 158 int strcasecmp(const char* s1, const char* s2) { |
| 159 return stricmp(s1, s2); | 159 return _stricmp(s1, s2); |
| 160 } | 160 } |
| 161 | 161 |
| 162 | 162 |
| 163 // Case-insensitive bounded string comparisons. Use stricmp() on Win32. Usually | 163 // Case-insensitive bounded string comparisons. Use stricmp() on Win32. Usually |
| 164 // defined in strings.h. | 164 // defined in strings.h. |
| 165 int strncasecmp(const char* s1, const char* s2, int n) { | 165 int strncasecmp(const char* s1, const char* s2, int n) { |
| 166 return strnicmp(s1, s2, n); | 166 return _strnicmp(s1, s2, n); |
| 167 } | 167 } |
| 168 | 168 |
| 169 namespace v8 { namespace internal { | 169 namespace v8 { namespace internal { |
| 170 | 170 |
| 171 double ceiling(double x) { | 171 double ceiling(double x) { |
| 172 return ceil(x); | 172 return ceil(x); |
| 173 } | 173 } |
| 174 | 174 |
| 175 // ---------------------------------------------------------------------------- | 175 // ---------------------------------------------------------------------------- |
| 176 // The Time class represents time on win32. A timestamp is represented as | 176 // The Time class represents time on win32. A timestamp is represented as |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 tzinfo_.StandardDate.wDay = 5; | 334 tzinfo_.StandardDate.wDay = 5; |
| 335 tzinfo_.StandardDate.wHour = 3; | 335 tzinfo_.StandardDate.wHour = 3; |
| 336 tzinfo_.StandardBias = 0; | 336 tzinfo_.StandardBias = 0; |
| 337 tzinfo_.DaylightDate.wMonth = 3; | 337 tzinfo_.DaylightDate.wMonth = 3; |
| 338 tzinfo_.DaylightDate.wDay = 5; | 338 tzinfo_.DaylightDate.wDay = 5; |
| 339 tzinfo_.DaylightDate.wHour = 2; | 339 tzinfo_.DaylightDate.wHour = 2; |
| 340 tzinfo_.DaylightBias = -60; | 340 tzinfo_.DaylightBias = -60; |
| 341 } | 341 } |
| 342 | 342 |
| 343 // Make standard and DST timezone names. | 343 // Make standard and DST timezone names. |
| 344 _snprintf(std_tz_name_, kTzNameSize, "%S", tzinfo_.StandardName); | 344 OS::SNPrintF(Vector<char>(std_tz_name_, kTzNameSize), |
| 345 "%S", |
| 346 tzinfo_.StandardName); |
| 345 std_tz_name_[kTzNameSize - 1] = '\0'; | 347 std_tz_name_[kTzNameSize - 1] = '\0'; |
| 346 _snprintf(dst_tz_name_, kTzNameSize, "%S", tzinfo_.DaylightName); | 348 OS::SNPrintF(Vector<char>(dst_tz_name_, kTzNameSize), |
| 349 "%S", |
| 350 tzinfo_.DaylightName); |
| 347 dst_tz_name_[kTzNameSize - 1] = '\0'; | 351 dst_tz_name_[kTzNameSize - 1] = '\0'; |
| 348 | 352 |
| 349 // If OS returned empty string or resource id (like "@tzres.dll,-211") | 353 // If OS returned empty string or resource id (like "@tzres.dll,-211") |
| 350 // simply guess the name from the UTC bias of the timezone. | 354 // simply guess the name from the UTC bias of the timezone. |
| 351 // To properly resolve the resource identifier requires a library load, | 355 // To properly resolve the resource identifier requires a library load, |
| 352 // which is not possible in a sandbox. | 356 // which is not possible in a sandbox. |
| 353 if (std_tz_name_[0] == '\0' || std_tz_name_[0] == '@') { | 357 if (std_tz_name_[0] == '\0' || std_tz_name_[0] == '@') { |
| 354 _snprintf(std_tz_name_, kTzNameSize - 1, "%s Standard Time", | 358 OS::SNPrintF(Vector<char>(std_tz_name_, kTzNameSize - 1), |
| 355 GuessTimezoneNameFromBias(tzinfo_.Bias)); | 359 "%s Standard Time", |
| 360 GuessTimezoneNameFromBias(tzinfo_.Bias)); |
| 356 } | 361 } |
| 357 if (dst_tz_name_[0] == '\0' || dst_tz_name_[0] == '@') { | 362 if (dst_tz_name_[0] == '\0' || dst_tz_name_[0] == '@') { |
| 358 _snprintf(dst_tz_name_, kTzNameSize - 1, "%s Daylight Time", | 363 OS::SNPrintF(Vector<char>(dst_tz_name_, kTzNameSize - 1), |
| 359 GuessTimezoneNameFromBias(tzinfo_.Bias)); | 364 "%s Daylight Time", |
| 365 GuessTimezoneNameFromBias(tzinfo_.Bias)); |
| 360 } | 366 } |
| 361 | 367 |
| 362 // Timezone information initialized. | 368 // Timezone information initialized. |
| 363 tz_initialized_ = true; | 369 tz_initialized_ = true; |
| 364 } | 370 } |
| 365 | 371 |
| 366 | 372 |
| 367 // Return the difference in milliseconds between this and another timestamp. | 373 // Return the difference in milliseconds between this and another timestamp. |
| 368 int64_t Time::Diff(Time* other) { | 374 int64_t Time::Diff(Time* other) { |
| 369 return (t() - other->t()) / kTimeScaler; | 375 return (t() - other->t()) / kTimeScaler; |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 } | 606 } |
| 601 | 607 |
| 602 | 608 |
| 603 static void VPrintHelper(FILE* stream, const char* format, va_list args) { | 609 static void VPrintHelper(FILE* stream, const char* format, va_list args) { |
| 604 if (HasConsole()) { | 610 if (HasConsole()) { |
| 605 vfprintf(stream, format, args); | 611 vfprintf(stream, format, args); |
| 606 } else { | 612 } else { |
| 607 // It is important to use safe print here in order to avoid | 613 // It is important to use safe print here in order to avoid |
| 608 // overflowing the buffer. We might truncate the output, but this | 614 // overflowing the buffer. We might truncate the output, but this |
| 609 // does not crash. | 615 // does not crash. |
| 610 static const int kBufferSize = 4096; | 616 EmbeddedVector<char, 4096> buffer; |
| 611 char buffer[kBufferSize]; | 617 OS::VSNPrintF(buffer, format, args); |
| 612 OS::VSNPrintF(buffer, kBufferSize, format, args); | 618 OutputDebugStringA(buffer.start()); |
| 613 OutputDebugStringA(buffer); | 619 } |
| 620 } |
| 621 |
| 622 |
| 623 FILE* OS::FOpen(const char* path, const char* mode) { |
| 624 FILE* result; |
| 625 if (fopen_s(&result, path, mode) == 0) { |
| 626 return result; |
| 627 } else { |
| 628 return NULL; |
| 614 } | 629 } |
| 615 } | 630 } |
| 616 | 631 |
| 617 | 632 |
| 618 // Print (debug) message to console. | 633 // Print (debug) message to console. |
| 619 void OS::Print(const char* format, ...) { | 634 void OS::Print(const char* format, ...) { |
| 620 va_list args; | 635 va_list args; |
| 621 va_start(args, format); | 636 va_start(args, format); |
| 622 VPrint(format, args); | 637 VPrint(format, args); |
| 623 va_end(args); | 638 va_end(args); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 636 VPrintError(format, args); | 651 VPrintError(format, args); |
| 637 va_end(args); | 652 va_end(args); |
| 638 } | 653 } |
| 639 | 654 |
| 640 | 655 |
| 641 void OS::VPrintError(const char* format, va_list args) { | 656 void OS::VPrintError(const char* format, va_list args) { |
| 642 VPrintHelper(stderr, format, args); | 657 VPrintHelper(stderr, format, args); |
| 643 } | 658 } |
| 644 | 659 |
| 645 | 660 |
| 646 int OS::SNPrintF(char* str, size_t size, const char* format, ...) { | 661 int OS::SNPrintF(Vector<char> str, const char* format, ...) { |
| 647 va_list args; | 662 va_list args; |
| 648 va_start(args, format); | 663 va_start(args, format); |
| 649 int result = VSNPrintF(str, size, format, args); | 664 int result = VSNPrintF(str, format, args); |
| 650 va_end(args); | 665 va_end(args); |
| 651 return result; | 666 return result; |
| 652 } | 667 } |
| 653 | 668 |
| 654 | 669 |
| 655 int OS::VSNPrintF(char* str, size_t size, const char* format, va_list args) { | 670 int OS::VSNPrintF(Vector<char> str, const char* format, va_list args) { |
| 656 // Print formated output to string. The _vsnprintf function has been | 671 int n = _vsnprintf_s(str.start(), str.length(), str.length(), format, args); |
| 657 // deprecated in MSVC. We need to define _CRT_NONSTDC_NO_DEPRECATE | |
| 658 // during compilation to use it anyway. Usually defined in stdio.h. | |
| 659 int n = _vsnprintf(str, size, format, args); | |
| 660 // Make sure to zero-terminate the string if the output was | 672 // Make sure to zero-terminate the string if the output was |
| 661 // truncated or if there was an error. | 673 // truncated or if there was an error. |
| 662 if (n < 0 || static_cast<size_t>(n) >= size) { | 674 if (n < 0 || n >= str.length()) { |
| 663 str[size - 1] = '\0'; | 675 str[str.length() - 1] = '\0'; |
| 664 return -1; | 676 return -1; |
| 665 } else { | 677 } else { |
| 666 return n; | 678 return n; |
| 667 } | 679 } |
| 668 } | 680 } |
| 669 | 681 |
| 670 | 682 |
| 683 void OS::StrNCpy(Vector<char> dest, const char* src, size_t n) { |
| 684 int result = strncpy_s(dest.start(), dest.length(), src, n); |
| 685 USE(result); ASSERT(result == 0); |
| 686 } |
| 687 |
| 688 |
| 689 void OS::WcsCpy(Vector<wchar_t> dest, const wchar_t* src) { |
| 690 int result = wcscpy_s(dest.start(), dest.length(), src); |
| 691 USE(result); ASSERT(result == 0); |
| 692 } |
| 693 |
| 694 |
| 695 char *OS::StrDup(const char* str) { |
| 696 return _strdup(str); |
| 697 } |
| 698 |
| 699 |
| 671 // We keep the lowest and highest addresses mapped as a quick way of | 700 // We keep the lowest and highest addresses mapped as a quick way of |
| 672 // determining that pointers are outside the heap (used mostly in assertions | 701 // determining that pointers are outside the heap (used mostly in assertions |
| 673 // and verification). The estimate is conservative, ie, not all addresses in | 702 // and verification). The estimate is conservative, ie, not all addresses in |
| 674 // 'allocated' space are actually allocated to our heap. The range is | 703 // 'allocated' space are actually allocated to our heap. The range is |
| 675 // [lowest, highest), inclusive on the low and and exclusive on the high end. | 704 // [lowest, highest), inclusive on the low and and exclusive on the high end. |
| 676 static void* lowest_ever_allocated = reinterpret_cast<void*>(-1); | 705 static void* lowest_ever_allocated = reinterpret_cast<void*>(-1); |
| 677 static void* highest_ever_allocated = reinterpret_cast<void*>(0); | 706 static void* highest_ever_allocated = reinterpret_cast<void*>(0); |
| 678 | 707 |
| 679 | 708 |
| 680 static void UpdateAllocatedSpaceLimits(void* address, int size) { | 709 static void UpdateAllocatedSpaceLimits(void* address, int size) { |
| (...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1125 Line.SizeOfStruct = sizeof(Line); | 1154 Line.SizeOfStruct = sizeof(Line); |
| 1126 DWORD line_displacement; | 1155 DWORD line_displacement; |
| 1127 ok = _SymGetLineFromAddr64( | 1156 ok = _SymGetLineFromAddr64( |
| 1128 process_handle, // hProcess | 1157 process_handle, // hProcess |
| 1129 stack_frame.AddrPC.Offset, // dwAddr | 1158 stack_frame.AddrPC.Offset, // dwAddr |
| 1130 &line_displacement, // pdwDisplacement | 1159 &line_displacement, // pdwDisplacement |
| 1131 &Line); // Line | 1160 &Line); // Line |
| 1132 // Format a text representation of the frame based on the information | 1161 // Format a text representation of the frame based on the information |
| 1133 // available. | 1162 // available. |
| 1134 if (ok) { | 1163 if (ok) { |
| 1135 SNPrintF(frames[frames_count].text, kStackWalkMaxTextLen, "%s %s:%d:%d", | 1164 SNPrintF(MutableCStrVector(frames[frames_count].text, |
| 1165 kStackWalkMaxTextLen), |
| 1166 "%s %s:%d:%d", |
| 1136 symbol->Name, Line.FileName, Line.LineNumber, | 1167 symbol->Name, Line.FileName, Line.LineNumber, |
| 1137 line_displacement); | 1168 line_displacement); |
| 1138 } else { | 1169 } else { |
| 1139 SNPrintF(frames[frames_count].text, kStackWalkMaxTextLen, "%s", | 1170 SNPrintF(MutableCStrVector(frames[frames_count].text, |
| 1171 kStackWalkMaxTextLen), |
| 1172 "%s", |
| 1140 symbol->Name); | 1173 symbol->Name); |
| 1141 } | 1174 } |
| 1142 // Make sure line termination is in place. | 1175 // Make sure line termination is in place. |
| 1143 frames[frames_count].text[kStackWalkMaxTextLen - 1] = '\0'; | 1176 frames[frames_count].text[kStackWalkMaxTextLen - 1] = '\0'; |
| 1144 } else { | 1177 } else { |
| 1145 // No text representation of this frame | 1178 // No text representation of this frame |
| 1146 frames[frames_count].text[0] = '\0'; | 1179 frames[frames_count].text[0] = '\0'; |
| 1147 | 1180 |
| 1148 // Continue if we are just missing a module (for non C/C++ frames a | 1181 // Continue if we are just missing a module (for non C/C++ frames a |
| 1149 // module will never be found). | 1182 // module will never be found). |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1530 | 1563 |
| 1531 // Release the thread handles | 1564 // Release the thread handles |
| 1532 CloseHandle(data_->sampler_thread_); | 1565 CloseHandle(data_->sampler_thread_); |
| 1533 CloseHandle(data_->profiled_thread_); | 1566 CloseHandle(data_->profiled_thread_); |
| 1534 } | 1567 } |
| 1535 | 1568 |
| 1536 | 1569 |
| 1537 #endif // ENABLE_LOGGING_AND_PROFILING | 1570 #endif // ENABLE_LOGGING_AND_PROFILING |
| 1538 | 1571 |
| 1539 } } // namespace v8::internal | 1572 } } // namespace v8::internal |
| OLD | NEW |