Changeset 99810 in webkit
- Timestamp:
- Nov 9, 2011, 8:37:32 PM (15 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
bytecode/CodeBlock.cpp (modified) (11 diffs)
-
bytecode/CodeBlock.h (modified) (2 diffs)
-
jit/JIT.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r99798 r99810 1 2011-11-09 Filip Pizlo <fpizlo@apple.com> 2 3 Multiple CodeBlock should be able to share the same instruction 4 stream without copying 5 https://bugs.webkit.org/show_bug.cgi?id=71978 6 7 Reviewed by Oliver Hunt. 8 9 This refactors CodeBlock::m_instructions to be a Vector boxed in a 10 ref-counted object, but otherwise does not take advantage of this. 11 12 This is performance neutral. 13 14 * bytecode/CodeBlock.cpp: 15 (JSC::CodeBlock::printStructure): 16 (JSC::CodeBlock::printStructures): 17 (JSC::CodeBlock::dump): 18 (JSC::CodeBlock::CodeBlock): 19 (JSC::CodeBlock::visitAggregate): 20 (JSC::CodeBlock::shrinkToFit): 21 * bytecode/CodeBlock.h: 22 (JSC::CodeBlock::hasInstructions): 23 (JSC::CodeBlock::numberOfInstructions): 24 (JSC::CodeBlock::instructions): 25 * jit/JIT.cpp: 26 (JSC::JIT::JIT): 27 1 28 2011-11-09 Gavin Barraclough <barraclough@apple.com> 2 29 -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r99375 r99810 285 285 void CodeBlock::printStructure(const char* name, const Instruction* vPC, int operand) const 286 286 { 287 unsigned instructionOffset = vPC - m_instructions.begin();287 unsigned instructionOffset = vPC - instructions().begin(); 288 288 printf(" [%4d] %s: %s\n", instructionOffset, name, pointerToSourceString(vPC[operand].u.structure).utf8().data()); 289 289 } … … 292 292 { 293 293 Interpreter* interpreter = m_globalData->interpreter; 294 unsigned instructionOffset = vPC - m_instructions.begin();294 unsigned instructionOffset = vPC - instructions().begin(); 295 295 296 296 if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id)) { … … 337 337 void CodeBlock::dump(ExecState* exec) const 338 338 { 339 if ( m_instructions.isEmpty()) {339 if (!m_instructions) { 340 340 printf("No instructions available.\n"); 341 341 return; … … 344 344 size_t instructionCount = 0; 345 345 346 for (size_t i = 0; i < m_instructions.size(); i += opcodeLengths[exec->interpreter()->getOpcodeID(m_instructions[i].u.opcode)])346 for (size_t i = 0; i < instructions().size(); i += opcodeLengths[exec->interpreter()->getOpcodeID(instructions()[i].u.opcode)]) 347 347 ++instructionCount; 348 348 349 349 printf("%lu m_instructions; %lu bytes at %p; %d parameter(s); %d callee register(s)\n\n", 350 350 static_cast<unsigned long>(instructionCount), 351 static_cast<unsigned long>( m_instructions.size() * sizeof(Instruction)),351 static_cast<unsigned long>(instructions().size() * sizeof(Instruction)), 352 352 this, m_numParameters, m_numCalleeRegisters); 353 353 354 Vector<Instruction>::const_iterator begin = m_instructions.begin();355 Vector<Instruction>::const_iterator end = m_instructions.end();354 Vector<Instruction>::const_iterator begin = instructions().begin(); 355 Vector<Instruction>::const_iterator end = instructions().end(); 356 356 for (Vector<Instruction>::const_iterator it = begin; it != end; ++it) 357 357 dump(exec, begin, it); … … 391 391 size_t i = 0; 392 392 do { 393 printGlobalResolveInfo(m_globalResolveInfos[i], instructionOffsetForNth(exec, m_instructions, i + 1, isGlobalResolve));393 printGlobalResolveInfo(m_globalResolveInfos[i], instructionOffsetForNth(exec, instructions(), i + 1, isGlobalResolve)); 394 394 ++i; 395 395 } while (i < m_globalResolveInfos.size()); … … 398 398 size_t i = 0; 399 399 do { 400 printStructureStubInfo(m_structureStubInfos[i], instructionOffsetForNth(exec, m_instructions, i + 1, isPropertyAccess));400 printStructureStubInfo(m_structureStubInfos[i], instructionOffsetForNth(exec, instructions(), i + 1, isPropertyAccess)); 401 401 ++i; 402 402 } while (i < m_structureStubInfos.size()); … … 410 410 size_t i = 0; 411 411 do { 412 printStructures(& m_instructions[m_globalResolveInstructions[i]]);412 printStructures(&instructions()[m_globalResolveInstructions[i]]); 413 413 ++i; 414 414 } while (i < m_globalResolveInstructions.size()); … … 417 417 size_t i = 0; 418 418 do { 419 printStructures(& m_instructions[m_propertyAccessInstructions[i]]);419 printStructures(&instructions()[m_propertyAccessInstructions[i]]); 420 420 ++i; 421 421 } while (i < m_propertyAccessInstructions.size()); … … 1417 1417 , m_ownerExecutable(globalObject->globalData(), ownerExecutable, ownerExecutable) 1418 1418 , m_globalData(0) 1419 #ifndef NDEBUG 1419 , m_instructions(adoptRef(new Instructions)) 1420 1420 , m_instructionCount(0) 1421 #endif1422 1421 , m_argumentsRegister(-1) 1423 1422 , m_needsFullScopeChain(ownerExecutable->needsActivation()) … … 1555 1554 #if ENABLE(INTERPRETER) 1556 1555 for (size_t size = m_propertyAccessInstructions.size(), i = 0; i < size; ++i) 1557 visitStructures(visitor, & m_instructions[m_propertyAccessInstructions[i]]);1556 visitStructures(visitor, &instructions()[m_propertyAccessInstructions[i]]); 1558 1557 for (size_t size = m_globalResolveInstructions.size(), i = 0; i < size; ++i) 1559 visitStructures(visitor, & m_instructions[m_globalResolveInstructions[i]]);1558 visitStructures(visitor, &instructions()[m_globalResolveInstructions[i]]); 1560 1559 #endif 1561 1560 #if ENABLE(JIT) … … 1723 1722 void CodeBlock::shrinkToFit() 1724 1723 { 1725 m_instructions.shrinkToFit();1724 instructions().shrinkToFit(); 1726 1725 1727 1726 #if ENABLE(INTERPRETER) -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
r99787 r99810 439 439 bool isNumericCompareFunction() { return m_isNumericCompareFunction; } 440 440 441 Vector<Instruction>& instructions() { return m_instructions; } 441 bool hasInstructions() const { return !!m_instructions; } 442 unsigned numberOfInstructions() const { return !m_instructions ? 0 : m_instructions->m_instructions.size(); } 443 Vector<Instruction>& instructions() { return m_instructions->m_instructions; } 444 const Vector<Instruction>& instructions() const { return m_instructions->m_instructions; } 442 445 void discardBytecode() { m_instructions.clear(); } 443 446 … … 1016 1019 JSGlobalData* m_globalData; 1017 1020 1018 Vector<Instruction> m_instructions; 1021 struct Instructions : public RefCounted<Instructions> { 1022 Vector<Instruction> m_instructions; 1023 }; 1024 RefPtr<Instructions> m_instructions; 1019 1025 unsigned m_instructionCount; 1020 1026 -
trunk/Source/JavaScriptCore/jit/JIT.cpp
r99633 r99810 74 74 , m_globalData(globalData) 75 75 , m_codeBlock(codeBlock) 76 , m_labels(codeBlock ? codeBlock-> instructions().size() : 0)76 , m_labels(codeBlock ? codeBlock->numberOfInstructions() : 0) 77 77 , m_bytecodeOffset((unsigned)-1) 78 78 #if USE(JSVALUE32_64)
Note:
See TracChangeset
for help on using the changeset viewer.