Changeset 37213 in webkit for trunk/JavaScriptCore/VM
- Timestamp:
- Oct 2, 2008, 3:19:05 PM (17 years ago)
- Location:
- trunk/JavaScriptCore/VM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/VM/Machine.cpp
r37191 r37213 533 533 } 534 534 535 ALWAYS_INLINE Register* slideRegisterWindowForCall(ExecState* exec, CodeBlock* newCodeBlock, RegisterFile* registerFile, Register* r egisterBase, Register* r, size_t registerOffset, int argc, JSValue*& exceptionValue)536 { 537 size_t size = r - registerBase+ registerOffset + newCodeBlock->numCalleeRegisters;535 ALWAYS_INLINE Register* slideRegisterWindowForCall(ExecState* exec, CodeBlock* newCodeBlock, RegisterFile* registerFile, Register* r, size_t registerOffset, int argc, JSValue*& exceptionValue) 536 { 537 Register* newEnd = r + registerOffset + newCodeBlock->numCalleeRegisters; 538 538 539 539 if (argc == newCodeBlock->numParameters) { // correct number of arguments 540 if (!registerFile->grow( size)) {540 if (!registerFile->grow(newEnd)) { 541 541 exceptionValue = createStackOverflowError(exec); 542 542 return r; … … 546 546 size_t omittedArgCount = newCodeBlock->numParameters - argc; 547 547 registerOffset += omittedArgCount; 548 size+= omittedArgCount;549 if (!registerFile->grow( size)) {548 newEnd += omittedArgCount; 549 if (!registerFile->grow(newEnd)) { 550 550 exceptionValue = createStackOverflowError(exec); 551 551 return r; … … 559 559 size_t numParameters = newCodeBlock->numParameters; 560 560 registerOffset += numParameters; 561 size+= numParameters;562 563 if (!registerFile->grow( size)) {561 newEnd += numParameters; 562 563 if (!registerFile->grow(newEnd)) { 564 564 exceptionValue = createStackOverflowError(exec); 565 565 return r; … … 604 604 JSValue* result = 0; 605 605 if (evalNode) 606 result = exec->globalData().machine->execute(evalNode.get(), exec, thisObj, r - registerFile-> base() + argv + 1 + RegisterFile::CallFrameHeaderSize, scopeChain, &exceptionValue);606 result = exec->globalData().machine->execute(evalNode.get(), exec, thisObj, r - registerFile->start() + argv + 1 + RegisterFile::CallFrameHeaderSize, scopeChain, &exceptionValue); 607 607 608 608 if (*profiler) … … 887 887 CodeBlock* codeBlock = &programNode->byteCode(scopeChain); 888 888 889 size_t oldSize = m_registerFile.size();890 size_t newSize = oldSize+ codeBlock->numParameters + RegisterFile::CallFrameHeaderSize + codeBlock->numCalleeRegisters;891 if (!m_registerFile.grow(new Size)) {889 Register* oldEnd = m_registerFile.end(); 890 Register* newEnd = oldEnd + codeBlock->numParameters + RegisterFile::CallFrameHeaderSize + codeBlock->numCalleeRegisters; 891 if (!m_registerFile.grow(newEnd)) { 892 892 *exception = createStackOverflowError(exec); 893 893 return jsNull(); … … 898 898 globalObject->copyGlobalsTo(m_registerFile); 899 899 900 Register* r = m_registerFile.base() + oldSize+ codeBlock->numParameters + RegisterFile::CallFrameHeaderSize;900 Register* r = oldEnd + codeBlock->numParameters + RegisterFile::CallFrameHeaderSize; 901 901 r[codeBlock->thisRegister] = thisObj; 902 902 initializeCallFrame(r, codeBlock, 0, scopeChain, makeHostCallFramePointer(0), 0, 0, 0); … … 929 929 lastGlobalObject->copyGlobalsTo(m_registerFile); 930 930 931 m_registerFile.shrink(old Size);931 m_registerFile.shrink(oldEnd); 932 932 return result; 933 933 } … … 942 942 } 943 943 944 size_t oldSize = m_registerFile.size();944 Register* oldEnd = m_registerFile.end(); 945 945 int argc = 1 + args.size(); // implicit "this" parameter 946 946 947 if (!m_registerFile.grow(old Size+ argc)) {947 if (!m_registerFile.grow(oldEnd + argc)) { 948 948 *exception = createStackOverflowError(exec); 949 949 return jsNull(); 950 950 } 951 951 952 Register* argv = m_registerFile.base() + oldSize;952 Register* argv = oldEnd; 953 953 size_t dst = 0; 954 954 argv[dst] = thisObj; … … 959 959 960 960 CodeBlock* codeBlock = &functionBodyNode->byteCode(scopeChain); 961 Register* r = slideRegisterWindowForCall(exec, codeBlock, &m_registerFile, m_registerFile.base(),argv, argc + RegisterFile::CallFrameHeaderSize, argc, *exception);961 Register* r = slideRegisterWindowForCall(exec, codeBlock, &m_registerFile, argv, argc + RegisterFile::CallFrameHeaderSize, argc, *exception); 962 962 if (UNLIKELY(*exception != 0)) { 963 m_registerFile.shrink(old Size);963 m_registerFile.shrink(oldEnd); 964 964 return jsNull(); 965 965 } … … 985 985 MACHINE_SAMPLING_privateExecuteReturned(); 986 986 987 m_registerFile.shrink(old Size);987 m_registerFile.shrink(oldEnd); 988 988 return result; 989 989 } … … 1037 1037 } 1038 1038 1039 size_t oldSize = m_registerFile.size();1040 size_t newSize =registerOffset + codeBlock->numCalleeRegisters;1041 if (!m_registerFile.grow(new Size)) {1039 Register* oldEnd = m_registerFile.end(); 1040 Register* newEnd = m_registerFile.start() + registerOffset + codeBlock->numCalleeRegisters; 1041 if (!m_registerFile.grow(newEnd)) { 1042 1042 *exception = createStackOverflowError(exec); 1043 1043 return jsNull(); 1044 1044 } 1045 1045 1046 Register* r = m_registerFile. base() + registerOffset;1046 Register* r = m_registerFile.start() + registerOffset; 1047 1047 1048 1048 // a 0 codeBlock indicates a built-in caller … … 1074 1074 (*profiler)->didExecute(exec, evalNode->sourceURL(), evalNode->lineNo()); 1075 1075 1076 m_registerFile.shrink(old Size);1076 m_registerFile.shrink(oldEnd); 1077 1077 return result; 1078 1078 } … … 1447 1447 Instruction* handlerVPC = 0; 1448 1448 1449 Register* registerBase = registerFile->base();1450 1449 Instruction* vPC = this->codeBlock(r)->instructions.begin(); 1451 1450 Profiler** enabledProfilerReference = Profiler::enabledProfilerReference(); … … 3285 3284 Register* savedR = r; 3286 3285 3287 r = slideRegisterWindowForCall(exec, newCodeBlock, registerFile, r egisterBase, r, registerOffset, argCount, exceptionValue);3286 r = slideRegisterWindowForCall(exec, newCodeBlock, registerFile, r, registerOffset, argCount, exceptionValue); 3288 3287 exec->m_callFrame = r; 3289 3288 if (UNLIKELY(exceptionValue != 0)) … … 3468 3467 Register* savedR = r; 3469 3468 3470 r = slideRegisterWindowForCall(exec, newCodeBlock, registerFile, r egisterBase, r, registerOffset, argCount, exceptionValue);3469 r = slideRegisterWindowForCall(exec, newCodeBlock, registerFile, r, registerOffset, argCount, exceptionValue); 3471 3470 exec->m_callFrame = r; 3472 3471 if (UNLIKELY(exceptionValue != 0)) … … 4490 4489 Register* r = ARG_r; 4491 4490 4492 Register* registerBase = registerFile->base();4493 4494 4491 JSValue* funcVal = ARG_src1; 4495 4492 int registerOffset = ARG_int2; … … 4512 4509 4513 4510 JSValue* exceptionValue = 0; 4514 r = slideRegisterWindowForCall(exec, newCodeBlock, registerFile, r egisterBase, r, registerOffset, argCount, exceptionValue);4511 r = slideRegisterWindowForCall(exec, newCodeBlock, registerFile, r, registerOffset, argCount, exceptionValue); 4515 4512 JSVALUE_VM_CHECK_EXCEPTION_ARG(exceptionValue); 4516 4513 … … 4691 4688 Register* r = ARG_r; 4692 4689 4693 Register* registerBase = registerFile->base();4694 4695 4690 JSValue* constrVal = ARG_src1; 4696 4691 JSValue* constrProtoVal = ARG_src2; … … 4725 4720 4726 4721 JSValue* exceptionValue = 0; 4727 r = slideRegisterWindowForCall(exec, newCodeBlock, registerFile, r egisterBase, r, registerOffset, argCount, exceptionValue);4722 r = slideRegisterWindowForCall(exec, newCodeBlock, registerFile, r, registerOffset, argCount, exceptionValue); 4728 4723 JSVALUE_VM_CHECK_EXCEPTION_ARG(exceptionValue); 4729 4724 -
trunk/JavaScriptCore/VM/RegisterFile.cpp
r36263 r37213 35 35 { 36 36 #if HAVE(MMAP) 37 munmap(m_buffer, ( m_capacity+ m_maxGlobals) * sizeof(Register));37 munmap(m_buffer, ((m_max - m_start) + m_maxGlobals) * sizeof(Register)); 38 38 #elif HAVE(VIRTUALALLOC) 39 39 // FIXME: Use VirtualFree. -
trunk/JavaScriptCore/VM/RegisterFile.h
r37160 r37213 111 111 112 112 RegisterFile(size_t capacity = DefaultCapacity, size_t maxGlobals = DefaultMaxGlobals) 113 : m_size(0) 114 , m_capacity(capacity) 115 , m_numGlobals(0) 113 : m_numGlobals(0) 116 114 , m_maxGlobals(maxGlobals) 117 , m_base(0) 115 , m_start(0) 116 , m_end(0) 117 , m_max(0) 118 118 , m_buffer(0) 119 119 , m_globalObject(0) … … 129 129 #error "Don't know how to reserve virtual memory on this platform." 130 130 #endif 131 m_base = m_buffer + maxGlobals; 131 m_start = m_buffer + maxGlobals; 132 m_end = m_start; 133 m_max = m_start + capacity; 132 134 } 133 135 134 136 ~RegisterFile(); 135 137 136 Register* base() const { return m_base; } 137 138 Register* start() const { return m_start; } 139 Register* end() const { return m_end; } 140 size_t size() const { return m_end - m_start; } 141 138 142 void setGlobalObject(JSGlobalObject* globalObject) { m_globalObject = globalObject; } 139 143 JSGlobalObject* globalObject() { return m_globalObject; } 140 144 141 void shrink( size_t size)145 void shrink(Register* newEnd) 142 146 { 143 if ( size < m_size)144 m_ size = size;147 if (newEnd < m_end) 148 m_end = newEnd; 145 149 } 146 150 147 bool grow( size_t size)151 bool grow(Register* newEnd) 148 152 { 149 if ( size > m_size) {150 if ( size > m_capacity)153 if (newEnd > m_end) { 154 if (newEnd > m_max) 151 155 return false; 152 156 #if !HAVE(MMAP) && HAVE(VIRTUALALLOC) 153 157 // FIXME: Use VirtualAlloc, and commit pages as we go. 154 158 #endif 155 m_ size = size;159 m_end = newEnd; 156 160 } 157 161 return true; 158 162 } 159 160 size_t size() const { return m_size; }161 163 162 164 void setNumGlobals(size_t numGlobals) { m_numGlobals = numGlobals; } … … 164 166 size_t maxGlobals() const { return m_maxGlobals; } 165 167 166 Register* lastGlobal() const { return m_ base- m_numGlobals; }168 Register* lastGlobal() const { return m_start - m_numGlobals; } 167 169 168 void markGlobals(Heap* heap) { heap->markConservatively(lastGlobal(), m_ base); }169 void markCallFrames(Heap* heap) { heap->markConservatively(m_ base, m_base + m_size); }170 void markGlobals(Heap* heap) { heap->markConservatively(lastGlobal(), m_start); } 171 void markCallFrames(Heap* heap) { heap->markConservatively(m_start, m_end); } 170 172 171 173 private: 172 size_t m_size;173 const size_t m_capacity;174 174 size_t m_numGlobals; 175 175 const size_t m_maxGlobals; 176 Register* m_base; 176 Register* m_start; 177 Register* m_end; 178 Register* m_max; 177 179 Register* m_buffer; 178 180 JSGlobalObject* m_globalObject; // The global object whose vars are currently stored in the register file.
Note:
See TracChangeset
for help on using the changeset viewer.