Changeset 221832 in webkit for trunk/Source/JavaScriptCore/assembler/ProbeStack.h
- Timestamp:
- Sep 9, 2017, 5:21:55 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/assembler/ProbeStack.h
r221823 r221832 57 57 T get(void* logicalAddress) 58 58 { 59 return *physicalAddressFor<T*>(logicalAddress); 59 void* from = physicalAddressFor(logicalAddress); 60 typename std::remove_const<T>::type to { }; 61 std::memcpy(&to, from, sizeof(to)); // Use std::memcpy to avoid strict aliasing issues. 62 return to; 63 } 64 template<typename T> 65 T get(void* logicalBaseAddress, ptrdiff_t offset) 66 { 67 return get<T>(reinterpret_cast<uint8_t*>(logicalBaseAddress) + offset); 60 68 } 61 69 … … 64 72 { 65 73 m_dirtyBits |= dirtyBitFor(logicalAddress); 66 *physicalAddressFor<T*>(logicalAddress) = value; 74 void* to = physicalAddressFor(logicalAddress); 75 std::memcpy(to, &value, sizeof(T)); // Use std::memcpy to avoid strict aliasing issues. 76 } 77 template<typename T> 78 void set(void* logicalBaseAddress, ptrdiff_t offset, T value) 79 { 80 set<T>(reinterpret_cast<uint8_t*>(logicalBaseAddress) + offset, value); 67 81 } 68 82 … … 81 95 } 82 96 83 template<typename T, typename = typename std::enable_if<std::is_pointer<T>::value>::type> 84 T physicalAddressFor(void* logicalAddress) 85 { 86 uintptr_t offset = reinterpret_cast<uintptr_t>(logicalAddress) & s_pageMask; 87 void* physicalAddress = reinterpret_cast<uint8_t*>(&m_buffer) + offset; 88 return reinterpret_cast<T>(physicalAddress); 97 void* physicalAddressFor(void* logicalAddress) 98 { 99 return reinterpret_cast<uint8_t*>(logicalAddress) + m_physicalAddressOffset; 89 100 } 90 101 … … 93 104 void* m_baseLogicalAddress { nullptr }; 94 105 uintptr_t m_dirtyBits { 0 }; 106 ptrdiff_t m_physicalAddressOffset; 95 107 96 108 static constexpr size_t s_pageSize = 1024; … … 121 133 Stack(Stack&& other); 122 134 123 void* lowWatermark() { return m_lowWatermark; } 124 125 template<typename T> 126 typename std::enable_if<!std::is_same<double, typename std::remove_cv<T>::type>::value, T>::type get(void* address) 127 { 128 Page* page = pageFor(address); 129 return page->get<T>(address); 130 } 131 132 template<typename T, typename = typename std::enable_if<!std::is_same<double, typename std::remove_cv<T>::type>::value>::type> 133 void set(void* address, T value) 134 { 135 Page* page = pageFor(address); 136 page->set<T>(address, value); 137 135 void* lowWatermark() 136 { 138 137 // We use the chunkAddress for the low watermark because we'll be doing write backs 139 138 // to the stack in increments of chunks. Hence, we'll treat the lowest address of 140 139 // the chunk as the low watermark of any given set address. 141 void* chunkAddress = Page::chunkAddressFor(address); 142 if (chunkAddress < m_lowWatermark) 143 m_lowWatermark = chunkAddress; 144 } 145 146 template<typename T> 147 typename std::enable_if<std::is_same<double, typename std::remove_cv<T>::type>::value, T>::type get(void* address) 140 return Page::chunkAddressFor(m_lowWatermark); 141 } 142 143 template<typename T> 144 T get(void* address) 148 145 { 149 146 Page* page = pageFor(address); 150 return bitwise_cast<double>(page->get<uint64_t>(address)); 151 } 152 153 template<typename T, typename = typename std::enable_if<std::is_same<double, typename std::remove_cv<T>::type>::value>::type> 154 void set(void* address, double value) 155 { 156 set<uint64_t>(address, bitwise_cast<uint64_t>(value)); 147 return page->get<T>(address); 148 } 149 template<typename T> 150 T get(void* logicalBaseAddress, ptrdiff_t offset) 151 { 152 return get<T>(reinterpret_cast<uint8_t*>(logicalBaseAddress) + offset); 153 } 154 155 template<typename T> 156 void set(void* address, T value) 157 { 158 Page* page = pageFor(address); 159 page->set<T>(address, value); 160 161 if (address < m_lowWatermark) 162 m_lowWatermark = address; 163 } 164 template<typename T> 165 void set(void* logicalBaseAddress, ptrdiff_t offset, T value) 166 { 167 set<T>(reinterpret_cast<uint8_t*>(logicalBaseAddress) + offset, value); 157 168 } 158 169
Note:
See TracChangeset
for help on using the changeset viewer.