Changeset 128260 in webkit for trunk/Source/JavaScriptCore/runtime
- Timestamp:
- Sep 11, 2012, 9:08:18 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore/runtime
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/runtime/Arguments.h
r126695 r128260 111 111 d->registers = &activation->registerAt(0); 112 112 } 113 void setRegisters(WriteBarrierBase<Unknown>* registers) { d->registers = registers; }114 113 115 114 static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype) -
trunk/Source/JavaScriptCore/runtime/JSActivation.cpp
r127363 r128260 42 42 const ClassInfo JSActivation::s_info = { "JSActivation", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSActivation) }; 43 43 44 JSActivation::JSActivation(CallFrame* callFrame, FunctionExecutable* functionExecutable)45 : Base(46 callFrame->globalData(),47 callFrame->lexicalGlobalObject()->activationStructure(),48 callFrame->registers(),49 callFrame->scope()50 )51 , m_registerArray(callFrame->globalData(), this, 0)52 , m_numCapturedArgs(max(callFrame->argumentCount(), functionExecutable->parameterCount()))53 , m_numCapturedVars(functionExecutable->capturedVariableCount())54 , m_isTornOff(false)55 , m_requiresDynamicChecks(functionExecutable->usesEval() && !functionExecutable->isStrictMode())56 , m_argumentsRegister(functionExecutable->generatedBytecode().argumentsRegister())57 {58 }59 60 void JSActivation::finishCreation(CallFrame* callFrame, FunctionExecutable* functionExecutable)61 {62 Base::finishCreation(callFrame->globalData(), functionExecutable->symbolTable());63 ASSERT(inherits(&s_info));64 }65 66 44 void JSActivation::visitChildren(JSCell* cell, SlotVisitor& visitor) 67 45 { … … 73 51 74 52 // No need to mark our registers if they're still in the RegisterFile. 75 PropertyStorage registerArray = thisObject->m_registerArray.get(); 76 if (!registerArray) 53 if (!thisObject->isTornOff()) 77 54 return; 78 55 79 visitor.copyAndAppend(bitwise_cast<void**>(®isterArray), thisObject->registerArraySizeInBytes(), reinterpret_cast<JSValue*>(registerArray), thisObject->registerArraySize()); 80 thisObject->m_registerArray.set(registerArray, StorageBarrier::Unchecked); 81 thisObject->m_registers = registerArray + thisObject->registerOffset(); 82 83 // Update the arguments object, since it points at our buffer. 84 CallFrame* callFrame = CallFrame::create(reinterpret_cast<Register*>(thisObject->m_registers)); 85 if (JSValue v = callFrame->uncheckedR(unmodifiedArgumentsRegister(thisObject->m_argumentsRegister)).jsValue()) 86 jsCast<Arguments*>(v)->setRegisters(thisObject->m_registers); 56 for (size_t i = 0; i < thisObject->storageSize(); ++i) 57 visitor.append(&thisObject->storage()[i]); 87 58 } 88 59 … … 94 65 95 66 // Defend against the inspector asking for a var after it has been optimized out. 96 if ( m_isTornOff && entry.getIndex() >= m_numCapturedVars)67 if (isTornOff() && !isValid(entry)) 97 68 return false; 98 69 … … 108 79 109 80 // Defend against the inspector asking for a var after it has been optimized out. 110 if ( m_isTornOff && entry.getIndex() >= m_numCapturedVars)81 if (isTornOff() && !isValid(entry)) 111 82 return false; 112 83 … … 130 101 131 102 // Defend against the inspector asking for a var after it has been optimized out. 132 if ( m_isTornOff && entry.getIndex() >= m_numCapturedVars)103 if (isTornOff() && !isValid(entry)) 133 104 return false; 134 105 … … 141 112 JSActivation* thisObject = jsCast<JSActivation*>(object); 142 113 143 if (mode == IncludeDontEnumProperties )114 if (mode == IncludeDontEnumProperties && !thisObject->isTornOff()) 144 115 propertyNames.add(exec->propertyNames().arguments); 145 116 … … 148 119 if (it->second.getAttributes() & DontEnum && mode != IncludeDontEnumProperties) 149 120 continue; 150 if ( it->second.getIndex() >= thisObject->m_numCapturedVars)121 if (!thisObject->isValid(it->second)) 151 122 continue; 152 123 propertyNames.add(Identifier(exec, it->first.get())); … … 165 136 SymbolTableEntry& entry = iter->second; 166 137 ASSERT(!entry.isNull()); 167 if ( entry.getIndex() >= m_numCapturedVars)138 if (!isValid(entry)) 168 139 return false; 169 140 … … 179 150 if (propertyName == exec->propertyNames().arguments) { 180 151 // Defend against the inspector asking for the arguments object after it has been optimized out. 181 if (!thisObject-> m_isTornOff) {152 if (!thisObject->isTornOff()) { 182 153 slot.setCustom(thisObject, thisObject->getArgumentsGetter()); 183 154 return true; … … 206 177 if (propertyName == exec->propertyNames().arguments) { 207 178 // Defend against the inspector asking for the arguments object after it has been optimized out. 208 if (!thisObject-> m_isTornOff) {179 if (!thisObject->isTornOff()) { 209 180 PropertySlot slot; 210 181 JSActivation::getOwnPropertySlot(thisObject, exec, propertyName, slot); … … 266 237 JSValue JSActivation::argumentsGetter(ExecState*, JSValue slotBase, PropertyName) 267 238 { 268 JSActivation* activation = asActivation(slotBase); 239 JSActivation* activation = jsCast<JSActivation*>(slotBase); 240 if (activation->isTornOff()) 241 return jsUndefined(); 242 269 243 CallFrame* callFrame = CallFrame::create(reinterpret_cast<Register*>(activation->m_registers)); 270 int argumentsRegister = activation->m_argumentsRegister;244 int argumentsRegister = callFrame->codeBlock()->argumentsRegister(); 271 245 if (JSValue arguments = callFrame->uncheckedR(argumentsRegister).jsValue()) 272 246 return arguments; -
trunk/Source/JavaScriptCore/runtime/JSActivation.h
r127376 r128260 38 38 namespace JSC { 39 39 40 class Arguments;41 40 class Register; 42 41 43 42 class JSActivation : public JSVariableObject { 44 43 private: 45 JSActivation( CallFrame*, FunctionExecutable*);44 JSActivation(JSGlobalData& globalData, CallFrame*, SharedSymbolTable*, size_t storageSize); 46 45 47 46 public: 48 47 typedef JSVariableObject Base; 49 48 50 static JSActivation* create(JSGlobalData& globalData, CallFrame* callFrame, FunctionExecutable* func Exec)49 static JSActivation* create(JSGlobalData& globalData, CallFrame* callFrame, FunctionExecutable* functionExecutable) 51 50 { 52 JSActivation* activation = new (NotNull, allocateCell<JSActivation>(globalData.heap)) JSActivation(callFrame, funcExec); 53 activation->finishCreation(callFrame, funcExec); 51 size_t storageSize = JSActivation::storageSize(callFrame, functionExecutable->symbolTable()); 52 JSActivation* activation = new ( 53 NotNull, 54 allocateCell<JSActivation>( 55 globalData.heap, 56 allocationSize(storageSize) 57 ) 58 ) JSActivation(globalData, callFrame, functionExecutable->symbolTable(), storageSize); 59 activation->finishCreation(globalData); 54 60 return activation; 55 61 } … … 76 82 static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto) { return Structure::create(globalData, globalObject, proto, TypeInfo(ActivationObjectType, StructureFlags), &s_info); } 77 83 78 bool isValidScopedLookup(int index) { return index < m_numCapturedVars; } 84 bool isValid(const SymbolTableEntry&); 85 bool isTornOff(); 79 86 80 87 protected: 81 void finishCreation(CallFrame*, FunctionExecutable*);82 88 static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesVisitChildren | OverridesGetPropertyNames | Base::StructureFlags; 83 89 … … 92 98 NEVER_INLINE PropertySlot::GetValueFunc getArgumentsGetter(); 93 99 94 size_t registerOffset(); 95 size_t registerArraySize(); 96 size_t registerArraySizeInBytes(); 97 98 StorageBarrier m_registerArray; // Independent copy of registers, used when a variable object copies its registers out of the register file. 99 int m_numCapturedArgs; 100 int m_numCapturedVars : 30; 101 bool m_isTornOff : 1; 102 bool m_requiresDynamicChecks : 1; 103 int m_argumentsRegister; 100 static size_t allocationSize(size_t storageSize); 101 static size_t storageSize(CallFrame*, SharedSymbolTable*); 102 static int captureStart(CallFrame*, SharedSymbolTable*); 103 104 int registerOffset(); 105 size_t storageSize(); 106 WriteBarrier<Unknown>* storage(); // storageSize() number of registers. 104 107 }; 108 109 extern int activationCount; 110 extern int allTheThingsCount; 111 112 inline JSActivation::JSActivation(JSGlobalData& globalData, CallFrame* callFrame, SharedSymbolTable* symbolTable, size_t storageSize) 113 : Base( 114 globalData, 115 callFrame->lexicalGlobalObject()->activationStructure(), 116 callFrame->registers(), 117 callFrame->scope(), 118 symbolTable 119 ) 120 { 121 WriteBarrier<Unknown>* storage = this->storage(); 122 for (size_t i = 0; i < storageSize; ++i) 123 new(&storage[i]) WriteBarrier<Unknown>; 124 } 105 125 106 126 JSActivation* asActivation(JSValue); … … 119 139 inline bool JSActivation::isDynamicScope(bool& requiresDynamicChecks) const 120 140 { 121 requiresDynamicChecks = m_requiresDynamicChecks;141 requiresDynamicChecks = symbolTable()->usesNonStrictEval(); 122 142 return false; 123 143 } 124 144 125 inline size_t JSActivation::registerOffset() 126 { 127 if (!m_numCapturedArgs) 128 return 0; 129 130 size_t capturedArgumentCountIncludingThis = m_numCapturedArgs + 1; 131 return CallFrame::offsetFor(capturedArgumentCountIncludingThis); 132 } 133 134 inline size_t JSActivation::registerArraySize() 135 { 136 return registerOffset() + m_numCapturedVars; 137 } 138 139 inline size_t JSActivation::registerArraySizeInBytes() 140 { 141 return registerArraySize() * sizeof(WriteBarrierBase<Unknown>); 145 inline int JSActivation::captureStart(CallFrame* callFrame, SharedSymbolTable* symbolTable) 146 { 147 if (symbolTable->captureMode() == SharedSymbolTable::AllOfTheThings) 148 return -CallFrame::offsetFor(std::max<size_t>(callFrame->argumentCountIncludingThis(), symbolTable->parameterCountIncludingThis())); 149 return symbolTable->captureStart(); 150 } 151 152 inline size_t JSActivation::storageSize(CallFrame* callFrame, SharedSymbolTable* symbolTable) 153 { 154 return symbolTable->captureEnd() - captureStart(callFrame, symbolTable); 155 } 156 157 inline int JSActivation::registerOffset() 158 { 159 return -captureStart(CallFrame::create(reinterpret_cast<Register*>(m_registers)), symbolTable()); 160 } 161 162 inline size_t JSActivation::storageSize() 163 { 164 return storageSize(CallFrame::create(reinterpret_cast<Register*>(m_registers)), symbolTable()); 142 165 } 143 166 144 167 inline void JSActivation::tearOff(JSGlobalData& globalData) 145 168 { 146 ASSERT(!m_registerArray); 147 ASSERT(m_numCapturedVars + m_numCapturedArgs); 148 149 void* allocation = 0; 150 if (!globalData.heap.tryAllocateStorage(registerArraySizeInBytes(), &allocation)) 151 CRASH(); 152 PropertyStorage registerArray = static_cast<PropertyStorage>(allocation); 153 PropertyStorage registers = registerArray + registerOffset(); 154 155 // arguments 156 int from = CallFrame::argumentOffset(m_numCapturedArgs - 1); 157 int to = CallFrame::thisArgumentOffset(); // Skip 'this' because it's not lexically accessible. 158 for (int i = from; i < to; ++i) 159 registers[i].set(globalData, this, m_registers[i].get()); 160 161 // vars 162 from = 0; 163 to = m_numCapturedVars; 164 for (int i = from; i < to; ++i) 165 registers[i].set(globalData, this, m_registers[i].get()); 166 167 m_registerArray.set(globalData, this, registerArray); 168 m_registers = registers; 169 m_isTornOff = true; 169 ASSERT(!isTornOff()); 170 171 int registerOffset = this->registerOffset(); 172 WriteBarrierBase<Unknown>* dst = storage() + registerOffset; 173 WriteBarrierBase<Unknown>* src = m_registers; 174 175 if (symbolTable()->captureMode() == SharedSymbolTable::AllOfTheThings) { 176 int from = -registerOffset; 177 int to = CallFrame::thisArgumentOffset(); // Skip 'this' because it's not lexically accessible. 178 for (int i = from; i < to; ++i) 179 dst[i].set(globalData, this, src[i].get()); 180 181 dst[RegisterFile::ArgumentCount].set(globalData, this, JSValue( 182 CallFrame::create(reinterpret_cast<Register*>(src))->argumentCountIncludingThis())); 183 184 int captureEnd = symbolTable()->captureEnd(); 185 for (int i = 0; i < captureEnd; ++i) 186 dst[i].set(globalData, this, src[i].get()); 187 } else { 188 int captureEnd = symbolTable()->captureEnd(); 189 for (int i = symbolTable()->captureStart(); i < captureEnd; ++i) 190 dst[i].set(globalData, this, src[i].get()); 191 } 192 193 m_registers = dst; 194 ASSERT(isTornOff()); 195 } 196 197 inline bool JSActivation::isTornOff() 198 { 199 return m_registers == storage() + registerOffset(); 200 } 201 202 inline WriteBarrier<Unknown>* JSActivation::storage() 203 { 204 return reinterpret_cast<WriteBarrier<Unknown>*>( 205 reinterpret_cast<char*>(this) + 206 WTF::roundUpToMultipleOf<sizeof(WriteBarrier<Unknown>)>(sizeof(JSActivation)) 207 ); 208 } 209 210 inline size_t JSActivation::allocationSize(size_t storageSize) 211 { 212 size_t objectSizeInBytes = WTF::roundUpToMultipleOf<sizeof(WriteBarrier<Unknown>)>(sizeof(JSActivation)); 213 size_t storageSizeInBytes = storageSize * sizeof(WriteBarrier<Unknown>); 214 return objectSizeInBytes + storageSizeInBytes; 215 } 216 217 inline bool JSActivation::isValid(const SymbolTableEntry& entry) 218 { 219 if (entry.getIndex() < captureStart(CallFrame::create(reinterpret_cast<Register*>(m_registers)), symbolTable())) 220 return false; 221 if (entry.getIndex() >= symbolTable()->captureEnd()) 222 return false; 223 return true; 170 224 } 171 225 -
trunk/Source/JavaScriptCore/runtime/JSCell.h
r128146 r128260 65 65 friend class MarkedBlock; 66 66 template<typename T> friend void* allocateCell(Heap&); 67 template<typename T> friend void* allocateCell(Heap&, size_t); 67 68 68 69 public: … … 338 339 } 339 340 341 template<typename T> 342 void* allocateCell(Heap& heap, size_t size) 343 { 344 ASSERT(size >= sizeof(T)); 345 #if ENABLE(GC_VALIDATION) 346 ASSERT(!heap.globalData()->isInitializingObject()); 347 heap.globalData()->setInitializingObjectClass(&T::s_info); 348 #endif 349 JSCell* result = 0; 350 if (NeedsDestructor<T>::value) 351 result = static_cast<JSCell*>(heap.allocateWithDestructor(size)); 352 else { 353 ASSERT(T::s_info.methodTable.destroy == JSCell::destroy); 354 result = static_cast<JSCell*>(heap.allocateWithoutDestructor(size)); 355 } 356 result->clearStructure(); 357 return result; 358 } 359 340 360 inline bool isZapped(const JSCell* cell) 341 361 { -
trunk/Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
r127505 r128260 28 28 #include "CallFrame.h" 29 29 #include "Interpreter.h" 30 #include "JSFunction.h" 30 31 #include "JSGlobalObject.h" 31 32 #include "JSString.h" -
trunk/Source/JavaScriptCore/runtime/JSSymbolTableObject.h
r127363 r128260 50 50 static const unsigned StructureFlags = IsEnvironmentRecord | OverridesVisitChildren | OverridesGetPropertyNames | Base::StructureFlags; 51 51 52 JSSymbolTableObject(JSGlobalData& globalData, Structure* structure, JSScope* scope )52 JSSymbolTableObject(JSGlobalData& globalData, Structure* structure, JSScope* scope, SharedSymbolTable* symbolTable = 0) 53 53 : Base(globalData, structure, scope) 54 54 { 55 if (symbolTable) 56 m_symbolTable.set(globalData, this, symbolTable); 55 57 } 56 58 57 void finishCreation(JSGlobalData& globalData , SharedSymbolTable* symbolTable = 0)59 void finishCreation(JSGlobalData& globalData) 58 60 { 59 61 Base::finishCreation(globalData); 60 if (!symbolTable) 61 symbolTable = SharedSymbolTable::create(globalData); 62 m_symbolTable.set(globalData, this, symbolTable); 62 if (!m_symbolTable) 63 m_symbolTable.set(globalData, this, SharedSymbolTable::create(globalData)); 63 64 } 64 65 -
trunk/Source/JavaScriptCore/runtime/JSVariableObject.h
r127363 r128260 61 61 Structure* structure, 62 62 Register* registers, 63 JSScope* scope 63 JSScope* scope, 64 SharedSymbolTable* symbolTable = 0 64 65 ) 65 : Base(globalData, structure, scope )66 : Base(globalData, structure, scope, symbolTable) 66 67 , m_registers(reinterpret_cast<WriteBarrierBase<Unknown>*>(registers)) 67 68 { 68 }69 70 void finishCreation(JSGlobalData& globalData, SharedSymbolTable* symbolTable = 0)71 {72 Base::finishCreation(globalData, symbolTable);73 COMPILE_ASSERT(sizeof(WriteBarrierBase<Unknown>) == sizeof(Register), Register_should_be_same_size_as_WriteBarrierBase);74 69 } 75 70 -
trunk/Source/JavaScriptCore/runtime/SymbolTable.h
r127191 r128260 341 341 } 342 342 343 bool usesNonStrictEval() { return m_usesNonStrictEval; } 344 void setUsesNonStrictEval(bool usesNonStrictEval) { m_usesNonStrictEval = usesNonStrictEval; } 345 346 enum CaptureMode { 347 SomeOfTheThings, 348 AllOfTheThings 349 }; 350 351 CaptureMode captureMode() { return m_captureMode; } 352 void setCaptureMode(CaptureMode captureMode) { m_captureMode = captureMode; } 353 354 int captureStart() { return m_captureStart; } 355 void setCaptureStart(int captureStart) { m_captureStart = captureStart; } 356 357 int captureEnd() { return m_captureEnd; } 358 void setCaptureEnd(int captureEnd) { m_captureEnd = captureEnd; } 359 360 int parameterCountIncludingThis() { return m_parameterCountIncludingThis; } 361 void setParameterCountIncludingThis(int parameterCountIncludingThis) { m_parameterCountIncludingThis = parameterCountIncludingThis; } 362 343 363 static JS_EXPORTDATA const ClassInfo s_info; 344 364 … … 346 366 SharedSymbolTable(JSGlobalData& globalData) 347 367 : JSCell(globalData, globalData.sharedSymbolTableStructure.get()) 348 { 349 } 368 , m_parameterCountIncludingThis(0) 369 , m_usesNonStrictEval(false) 370 , m_captureMode(SomeOfTheThings) 371 , m_captureStart(0) 372 , m_captureEnd(0) 373 { 374 } 375 376 int m_parameterCountIncludingThis; 377 bool m_usesNonStrictEval; 378 379 CaptureMode m_captureMode; 380 int m_captureStart; 381 int m_captureEnd; 350 382 }; 351 383
Note:
See TracChangeset
for help on using the changeset viewer.