Changeset 34838 in webkit for trunk/JavaScriptCore/VM/RegisterFile.h
- Timestamp:
- Jun 27, 2008, 3:35:33 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/VM/RegisterFile.h
r34659 r34838 32 32 #include "Register.h" 33 33 #include "collector.h" 34 #if HAVE(MMAP) 35 #include <sys/mman.h> 36 #endif 34 37 #include <wtf/Noncopyable.h> 35 38 … … 83 86 */ 84 87 85 class RegisterFileStack;88 class JSGlobalObject; 86 89 87 90 class RegisterFile : Noncopyable { 88 91 public: 89 enum { DefaultRegisterFileSize = 2 * 1024 * 1024 }; 92 enum { 93 CallerCodeBlock = 0, 94 ReturnVPC, 95 CallerScopeChain, 96 CallerRegisterOffset, 97 ReturnValueRegister, 98 ArgumentStartRegister, 99 ArgumentCount, 100 CalledAsConstructor, 101 Callee, 102 OptionalCalleeActivation, 103 CallFrameHeaderSize 104 }; 90 105 91 RegisterFile(size_t maxSize, RegisterFileStack* m_baseObserver) 92 : m_safeForReentry(true) 93 , m_size(0) 94 , m_capacity(0) 95 , m_maxSize(maxSize) 106 enum { ProgramCodeThisRegister = - 1 }; 107 108 enum { DefaultCapacity = 2 * 1024 * 1024 }; 109 enum { DefaultMaxGlobals = 8 * 1024 }; 110 111 RegisterFile(size_t capacity = DefaultCapacity, size_t maxGlobals = DefaultMaxGlobals) 112 : m_size(0) 113 , m_capacity(capacity) 114 , m_numGlobals(0) 115 , m_maxGlobals(maxGlobals) 96 116 , m_base(0) 97 117 , m_buffer(0) 98 , m_ baseObserver(m_baseObserver)118 , m_globalObject(0) 99 119 { 120 size_t bufferLength = (capacity + maxGlobals) * sizeof(Register); 121 #if HAVE(MMAP) 122 m_buffer = static_cast<Register*>(mmap(0, bufferLength, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0)); 123 #elif HAVE(VIRTUALALLOC) 124 // FIXME: Use VirtualAlloc, and commit pages as we go. 125 m_buffer = fastMalloc(bufferLength); 126 #else 127 #error "Don't know how to reserve virtual memory on this platform." 128 #endif 129 m_base = m_buffer + maxGlobals; 100 130 } 101 131 102 ~RegisterFile() 103 { 104 setBuffer(0); 105 } 132 ~RegisterFile(); 106 133 107 134 // Pointer to a value that holds the base of this register file. 108 135 Register** basePointer() { return &m_base; } 136 137 void setGlobalObject(JSGlobalObject* globalObject) { m_globalObject = globalObject; } 138 JSGlobalObject* globalObject() { return m_globalObject; } 109 139 110 140 void shrink(size_t size) … … 117 147 { 118 148 if (size > m_size) { 119 if (size > m_capacity) {120 if (size > m_maxSize)121 return false; 122 growBuffer(size, m_maxSize);123 } 149 if (size > m_capacity) 150 return false; 151 #if !HAVE(MMAP) && HAVE(VIRTUALALLOC) 152 // FIXME: Use VirtualAlloc, and commit pages as we go. 153 #endif 124 154 m_size = size; 125 155 } … … 128 158 129 159 size_t size() { return m_size; } 130 size_t maxSize() { return m_maxSize; } 160 161 void setNumGlobals(size_t numGlobals) { m_numGlobals = numGlobals; } 162 int numGlobals() { return m_numGlobals; } 163 size_t maxGlobals() { return m_maxGlobals; } 131 164 132 void clear(); 133 134 void addGlobalSlots(size_t count); 135 int numGlobalSlots() { return static_cast<int>(m_base - m_buffer); } 136 137 void copyGlobals(RegisterFile* src); 165 Register* lastGlobal() { return m_base - m_numGlobals; } 138 166 139 167 void mark(Heap* heap) 140 168 { 141 heap->mark StackObjectsConservatively(m_buffer, m_base + m_size);169 heap->markConservatively(lastGlobal(), m_base + m_size); 142 170 } 143 171 144 bool isGlobal() { return !!m_baseObserver; }145 146 bool safeForReentry() { return m_safeForReentry; }147 void setSafeForReentry(bool safeForReentry) { m_safeForReentry = safeForReentry; }148 149 172 private: 150 size_t newBuffer(size_t size, size_t capacity, size_t minCapacity, size_t maxSize, size_t offset);151 bool growBuffer(size_t minCapacity, size_t maxSize);152 void setBuffer(Register* buffer)153 {154 if (m_buffer)155 fastFree(m_buffer);156 157 m_buffer = buffer;158 }159 160 void setBase(Register*);161 162 bool m_safeForReentry;163 173 size_t m_size; 164 174 size_t m_capacity; 165 size_t m_maxSize; 175 size_t m_numGlobals; 176 size_t m_maxGlobals; 166 177 Register* m_base; 167 178 Register* m_buffer; 168 RegisterFileStack* m_baseObserver;179 JSGlobalObject* m_globalObject; // The global object whose vars are currently stored in the register file. 169 180 }; 170 181
Note:
See TracChangeset
for help on using the changeset viewer.