Changeset 32838 in webkit
- Timestamp:
- May 3, 2008 2:14:39 AM (16 years ago)
- Location:
- branches/squirrelfish/JavaScriptCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/squirrelfish/JavaScriptCore/ChangeLog
r32837 r32838 1 2008-05-03 Geoffrey Garen <ggaren@apple.com> 2 3 Reviewed by Oliver Hunt. 4 5 A bit more efficient fix than r32832: Don't copy globals into function 6 register files; instead, have the RegisterFileStack track only the base 7 of the last *global* register file, so the global object's register 8 references stay good. 9 10 SunSpider reports a .3% speedup. Not sure what that's about. 11 1 12 2008-05-03 Oliver Hunt <oliver@apple.com> 2 13 -
branches/squirrelfish/JavaScriptCore/JavaScriptCore.exp
r32753 r32838 134 134 __ZN3KJS17PrototypeFunctionC1EPNS_9ExecStateEPNS_17FunctionPrototypeEiRKNS_10IdentifierEPFPNS_7JSValueES2_PNS_8JSObjectERKNS_4ListEE 135 135 __ZN3KJS17PrototypeFunctionC1EPNS_9ExecStateEiRKNS_10IdentifierEPFPNS_7JSValueES2_PNS_8JSObjectERKNS_4ListEE 136 __ZN3KJS17RegisterFileStack20allocateRegisterFileEm 136 __ZN3KJS17RegisterFileStack20allocateRegisterFileEmPS0_ 137 137 __ZN3KJS19InternalFunctionImp11getCallDataERNS_8CallDataE 138 138 __ZN3KJS19InternalFunctionImp4infoE -
branches/squirrelfish/JavaScriptCore/VM/Machine.cpp
r32837 r32838 552 552 553 553 RegisterFile* registerFile = registerFileStack->pushGlobalRegisterFile(); 554 CodeBlock* codeBlock = &programNode->code(scopeChain, !registerFileStack->inImplicitCall());554 CodeBlock* codeBlock = &programNode->code(scopeChain, registerFileStack->current()->isGlobal()); 555 555 registerFile->addGlobalSlots(codeBlock->numVars); 556 556 -
branches/squirrelfish/JavaScriptCore/VM/RegisterFile.cpp
r32696 r32838 98 98 { 99 99 m_base = base; 100 m_stack->baseChanged(this); 100 if (m_baseObserver) 101 m_baseObserver->baseChanged(this); 101 102 } 102 103 -
branches/squirrelfish/JavaScriptCore/VM/RegisterFile.h
r32797 r32838 88 88 public: 89 89 enum { DefaultRegisterFileSize = 2 * 1024 * 1024 }; 90 RegisterFile(RegisterFileStack* stack, size_t maxSize) 91 : m_isForImplicitCall(false) 92 , m_size(0) 90 RegisterFile(size_t maxSize, RegisterFileStack* m_baseObserver) 91 : m_size(0) 93 92 , m_capacity(0) 94 93 , m_maxSize(maxSize) 95 94 , m_base(0) 96 95 , m_buffer(0) 97 , m_ stack(stack)96 , m_baseObserver(m_baseObserver) 98 97 { 99 98 } … … 150 149 Collector::markStackObjectsConservatively(m_buffer, m_base + m_size); 151 150 } 152 void setIsForImplicitCall(bool isForImplicitCall) { m_isForImplicitCall = isForImplicitCall; } 153 bool isForImplicitCall() { return m_isForImplicitCall; } 151 152 bool isGlobal() { return !!m_baseObserver; } 153 154 154 private: 155 155 size_t newBuffer(size_t size, size_t capacity, size_t minCapacity, size_t maxSize, size_t offset); … … 170 170 Register* m_base; 171 171 Register* m_buffer; 172 RegisterFileStack* m_ stack;172 RegisterFileStack* m_baseObserver; 173 173 }; 174 174 -
branches/squirrelfish/JavaScriptCore/VM/RegisterFileStack.cpp
r32832 r32838 36 36 RegisterFileStack::~RegisterFileStack() 37 37 { 38 for (size_t i = 0; i < m_stack.size(); ++i)39 delete m_stack[i];38 ASSERT(m_stack.size() == 1 && m_stack[0]->size() == 0); // The stack shouldn't be destroyed during execution. 39 delete m_stack[0]; 40 40 } 41 41 … … 48 48 return current; 49 49 50 RegisterFile* previous = current;51 52 50 // Slow case: Existing register file is in use: Create a nested 53 51 // register file with a copy of this register file's globals. 54 RegisterFile* registerFile = allocateRegisterFile(current->maxSize() - current->size()); 55 registerFile->addGlobalSlots(previous->numGlobalSlots()); 56 registerFile->copyGlobals(previous); 52 RegisterFile* lastGlobal = this->lastGlobal(); 57 53 58 return registerFile; 54 current = allocateRegisterFile(current->maxSize() - current->size(), this); 55 current->addGlobalSlots(lastGlobal->numGlobalSlots()); 56 current->copyGlobals(lastGlobal); 57 m_globalBase = *current->basePointer(); 58 59 return current; 59 60 } 60 61 … … 72 73 m_stack.removeLast(); 73 74 74 RegisterFile* previous = current(); 75 ASSERT(tmp->numGlobalSlots() == previous->numGlobalSlots() || !m_implicitCallDepth); 76 previous->addGlobalSlots(tmp->numGlobalSlots() - previous->numGlobalSlots()); 77 previous->copyGlobals(tmp); 78 m_base = *current()->basePointer(); 75 ASSERT(tmp->isGlobal() || tmp->numGlobalSlots() == lastGlobal()->numGlobalSlots()); 76 if (tmp->isGlobal()) { 77 RegisterFile* lastGlobal = this->lastGlobal(); 78 lastGlobal->addGlobalSlots(tmp->numGlobalSlots() - lastGlobal->numGlobalSlots()); 79 lastGlobal->copyGlobals(tmp); 80 81 m_globalBase = *lastGlobal->basePointer(); 82 } 83 79 84 delete tmp; 80 85 } … … 82 87 RegisterFile* RegisterFileStack::pushFunctionRegisterFile() 83 88 { 84 m_implicitCallDepth++; 85 86 RegisterFile* previous = current(); 87 88 RegisterFile* result = allocateRegisterFile(current()->maxSize() - current()->size()); 89 result->addGlobalSlots(previous->numGlobalSlots()); 90 result->copyGlobals(previous); 91 result->setIsForImplicitCall(true); 92 return result; 89 return allocateRegisterFile(current()->maxSize() - current()->size()); 93 90 } 94 91 95 92 void RegisterFileStack::popFunctionRegisterFile() 96 93 { 97 RegisterFile* tmp =m_stack.last();94 delete m_stack.last(); 98 95 m_stack.removeLast(); 99 100 RegisterFile* previous = current();101 ASSERT(tmp->numGlobalSlots() == previous->numGlobalSlots());102 previous->copyGlobals(tmp);103 m_base = *current()->basePointer();104 delete tmp;105 96 } 106 97 107 RegisterFile* RegisterFileStack::allocateRegisterFile(size_t maxSize )98 RegisterFile* RegisterFileStack::allocateRegisterFile(size_t maxSize, RegisterFileStack* registerFileStack) 108 99 { 109 RegisterFile* registerFile = new RegisterFile( this, maxSize);100 RegisterFile* registerFile = new RegisterFile(maxSize, registerFileStack); 110 101 m_stack.append(registerFile); 111 m_base = *registerFile->basePointer();112 102 return registerFile; 113 103 } -
branches/squirrelfish/JavaScriptCore/VM/RegisterFileStack.h
r32718 r32838 38 38 public: 39 39 RegisterFileStack() 40 : m_ implicitCallDepth(0)40 : m_globalBase(0) 41 41 { 42 allocateRegisterFile( );42 allocateRegisterFile(RegisterFile::DefaultRegisterFileSize, this); 43 43 } 44 44 … … 60 60 } 61 61 62 // Pointer to a value that holds the base of the top-most register file.63 Register** basePointer() { return &m_base; }62 // Pointer to a value that holds the base of the top-most global register file. 63 Register** globalBasePointer() { return &m_globalBase; } 64 64 65 65 void baseChanged(RegisterFile* registerFile) 66 66 { 67 ASSERT(registerFile == current());68 m_ base = *registerFile->basePointer();67 ASSERT(registerFile == lastGlobal()); 68 m_globalBase = *registerFile->basePointer(); 69 69 } 70 70 71 bool inImplicitCall() { return m_implicitCallDepth > 0; } 71 private: 72 typedef Vector<RegisterFile*, 4> Stack; 72 73 73 74 RegisterFile* lastGlobal() { 74 75 ASSERT(m_stack.size()); 75 76 for (size_t i = m_stack.size() - 1; i > 0; --i) { 76 if ( !m_stack[i]->isForImplicitCall())77 if (m_stack[i]->isGlobal()) 77 78 return m_stack[i]; 78 79 } 79 ASSERT( !m_stack[0]->isForImplicitCall());80 ASSERT(m_stack[0]->isGlobal()); 80 81 return m_stack[0]; 81 82 } 82 private:83 typedef Vector<RegisterFile*, 4> Stack;84 83 85 RegisterFile* allocateRegisterFile(size_t maxSize = RegisterFile::DefaultRegisterFileSize);84 RegisterFile* allocateRegisterFile(size_t maxSize, RegisterFileStack* = 0); 86 85 87 86 RegisterFile* previous() { return m_stack[m_stack.size() - 2]; } … … 89 88 90 89 Stack m_stack; 91 Register* m_base; 92 int m_implicitCallDepth; 90 Register* m_globalBase; 93 91 }; 94 92 -
branches/squirrelfish/JavaScriptCore/kjs/JSGlobalObject.h
r32831 r32838 80 80 struct JSGlobalObjectData : public JSVariableObjectData { 81 81 JSGlobalObjectData(JSGlobalObject* globalObject, JSObject* thisValue) 82 : JSVariableObjectData(&symbolTable, registerFileStack. basePointer(), 0)82 : JSVariableObjectData(&symbolTable, registerFileStack.globalBasePointer(), 0) 83 83 , globalScopeChain(globalObject) 84 84 , globalExec(globalObject, thisValue, globalScopeChain)
Note: See TracChangeset
for help on using the changeset viewer.