Changeset 34372 in webkit for trunk/JavaScriptCore/VM/RegisterFile.h
- Timestamp:
- Jun 4, 2008, 10:36:55 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/VM/RegisterFile.h
r34069 r34372 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 28 29 29 #ifndef RegisterFile_h 30 30 #define RegisterFile_h … … 40 40 frame by its offset from "base", the logical first entry in the register 41 41 file. The bottom-most register frame's offset from base is 0. 42 42 43 43 In a program where function "a" calls function "b" (global code -> a -> b), 44 44 the register file might look like this: … … 54 54 | | | | 55 55 buffer base (frame 0) frame 1 frame 2 56 56 57 57 Since all variables, including globals, are accessed by negative offsets 58 58 from their register frame pointers, to keep old global offsets correct, new 59 59 globals must appear at the beginning of the register file, shifting base 60 60 to the right. 61 61 62 62 If we added one global variable to the register file depicted above, it 63 63 would look like this: … … 70 70 -------------------------------> < 71 71 | <-globals | temps-> | 72 ^ ^ 73 | | 72 ^ ^ 73 | | 74 74 buffer base (frame 0) 75 75 … … 78 78 clients keep an indirect pointer, so their calculations update 79 79 automatically when base changes. 80 80 81 81 For client simplicity, the RegisterFile measures size and capacity from 82 82 "base", not "buffer". … … 84 84 85 85 class RegisterFileStack; 86 86 87 87 class RegisterFile : Noncopyable { 88 88 public: 89 89 enum { DefaultRegisterFileSize = 2 * 1024 * 1024 }; 90 90 91 RegisterFile(size_t maxSize, RegisterFileStack* m_baseObserver) 91 92 : m_safeForReentry(true) … … 98 99 { 99 100 } 100 101 101 102 ~RegisterFile() 102 103 { 103 104 setBuffer(0); 104 105 } 105 106 106 107 // Pointer to a value that holds the base of this register file. 107 108 Register** basePointer() { return &m_base; } 108 109 109 110 void shrink(size_t size) 110 111 { … … 128 129 size_t size() { return m_size; } 129 130 size_t maxSize() { return m_maxSize; } 130 131 131 132 void clear(); 132 133 … … 145 146 bool safeForReentry() { return m_safeForReentry; } 146 147 void setSafeForReentry(bool safeForReentry) { m_safeForReentry = safeForReentry; } 148 147 149 private: 148 150 size_t newBuffer(size_t size, size_t capacity, size_t minCapacity, size_t maxSize, size_t offset); … … 155 157 m_buffer = buffer; 156 158 } 157 159 158 160 void setBase(Register*); 161 159 162 bool m_safeForReentry; 160 163 size_t m_size; … … 165 168 RegisterFileStack* m_baseObserver; 166 169 }; 167 170 168 171 } // namespace KJS 169 172
Note:
See TracChangeset
for help on using the changeset viewer.