OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 855 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
866 | 866 |
867 inline HeapObjectHeader* HeapObjectHeader::fromPayload(const void* payload) { | 867 inline HeapObjectHeader* HeapObjectHeader::fromPayload(const void* payload) { |
868 Address addr = reinterpret_cast<Address>(const_cast<void*>(payload)); | 868 Address addr = reinterpret_cast<Address>(const_cast<void*>(payload)); |
869 HeapObjectHeader* header = | 869 HeapObjectHeader* header = |
870 reinterpret_cast<HeapObjectHeader*>(addr - sizeof(HeapObjectHeader)); | 870 reinterpret_cast<HeapObjectHeader*>(addr - sizeof(HeapObjectHeader)); |
871 ASSERT(header->checkHeader()); | 871 ASSERT(header->checkHeader()); |
872 return header; | 872 return header; |
873 } | 873 } |
874 | 874 |
875 #if CPU(64BIT) | 875 #if CPU(64BIT) |
| 876 ALWAYS_INLINE uint32_t RotateLeft16(uint32_t x) { |
| 877 #if COMPILER(MSVC) |
| 878 return _lrotr(x, 16); |
| 879 #else |
| 880 // http://blog.regehr.org/archives/1063 |
| 881 return (x << 16) | (x >> (-16 & 31)); |
| 882 #endif |
| 883 } |
| 884 |
876 inline uint32_t HeapObjectHeader::getMagic() const { | 885 inline uint32_t HeapObjectHeader::getMagic() const { |
877 const uintptr_t random1 = | 886 // Ignore C4319: It is OK to 0-extend into the high-order bits of the uintptr_t |
878 ~(reinterpret_cast<uintptr_t>( | 887 // on 64-bit, in this case. |
879 base::trace_event::MemoryAllocatorDump::kNameSize) >> | 888 #if COMPILER(MSVC) |
880 16); | 889 #pragma warning(push) |
| 890 #pragma warning(disable : 4319) |
| 891 #endif |
| 892 |
| 893 const uintptr_t random1 = ~(RotateLeft16(reinterpret_cast<uintptr_t>( |
| 894 base::trace_event::MemoryAllocatorDump::kNameSize))); |
881 | 895 |
882 #if OS(WIN) | 896 #if OS(WIN) |
883 const uintptr_t random2 = ~(reinterpret_cast<uintptr_t>(::ReadFile) << 16); | 897 const uintptr_t random2 = |
| 898 ~(RotateLeft16(reinterpret_cast<uintptr_t>(::ReadFile))); |
884 #elif OS(POSIX) | 899 #elif OS(POSIX) |
885 const uintptr_t random2 = ~(reinterpret_cast<uintptr_t>(::read) << 16); | 900 const uintptr_t random2 = |
| 901 ~(RotateLeft16(reinterpret_cast<uintptr_t>(::read))); |
886 #else | 902 #else |
887 #error OS not supported | 903 #error OS not supported |
888 #endif | 904 #endif |
889 | 905 |
890 #if CPU(64BIT) | 906 #if CPU(64BIT) |
891 static_assert(sizeof(uintptr_t) == sizeof(uint64_t), | 907 static_assert(sizeof(uintptr_t) == sizeof(uint64_t), |
892 "uintptr_t is not uint64_t"); | 908 "uintptr_t is not uint64_t"); |
893 const uint32_t random = static_cast<uint32_t>( | 909 const uint32_t random = static_cast<uint32_t>( |
894 (random1 & 0x0FFFFULL) | ((random2 >> 32) & 0x0FFFF0000ULL)); | 910 (random1 & 0x0FFFFULL) | ((random2 >> 32) & 0x0FFFF0000ULL)); |
895 #elif CPU(32BIT) | 911 #elif CPU(32BIT) |
896 // Although we don't use heap metadata canaries on 32-bit due to memory | 912 // Although we don't use heap metadata canaries on 32-bit due to memory |
897 // pressure, keep this code around just in case we do, someday. | 913 // pressure, keep this code around just in case we do, someday. |
898 static_assert(sizeof(uintptr_t) == sizeof(uint32_t), | 914 static_assert(sizeof(uintptr_t) == sizeof(uint32_t), |
899 "uintptr_t is not uint32_t"); | 915 "uintptr_t is not uint32_t"); |
900 const uint32_t random = (random1 & 0x0FFFFUL) | (random2 & 0xFFFF0000UL); | 916 const uint32_t random = (random1 & 0x0FFFFUL) | (random2 & 0xFFFF0000UL); |
901 #else | 917 #else |
902 #error architecture not supported | 918 #error architecture not supported |
903 #endif | 919 #endif |
904 | 920 |
| 921 #if COMPILER(MSVC) |
| 922 #pragma warning(pop) |
| 923 #endif |
| 924 |
905 return random; | 925 return random; |
906 } | 926 } |
907 #endif | 927 #endif // CPU(64BIT) |
908 | 928 |
909 NO_SANITIZE_ADDRESS inline bool HeapObjectHeader::isWrapperHeaderMarked() | 929 NO_SANITIZE_ADDRESS inline bool HeapObjectHeader::isWrapperHeaderMarked() |
910 const { | 930 const { |
911 ASSERT(checkHeader()); | 931 ASSERT(checkHeader()); |
912 return m_encoded & headerWrapperMarkBitMask; | 932 return m_encoded & headerWrapperMarkBitMask; |
913 } | 933 } |
914 | 934 |
915 NO_SANITIZE_ADDRESS inline void HeapObjectHeader::markWrapperHeader() { | 935 NO_SANITIZE_ADDRESS inline void HeapObjectHeader::markWrapperHeader() { |
916 ASSERT(checkHeader()); | 936 ASSERT(checkHeader()); |
917 ASSERT(!isWrapperHeaderMarked()); | 937 ASSERT(!isWrapperHeaderMarked()); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
959 return outOfLineAllocate(allocationSize, gcInfoIndex); | 979 return outOfLineAllocate(allocationSize, gcInfoIndex); |
960 } | 980 } |
961 | 981 |
962 inline NormalPageArena* NormalPage::arenaForNormalPage() const { | 982 inline NormalPageArena* NormalPage::arenaForNormalPage() const { |
963 return static_cast<NormalPageArena*>(arena()); | 983 return static_cast<NormalPageArena*>(arena()); |
964 } | 984 } |
965 | 985 |
966 } // namespace blink | 986 } // namespace blink |
967 | 987 |
968 #endif // HeapPage_h | 988 #endif // HeapPage_h |
OLD | NEW |