Changeset 190546 in webkit
- Timestamp:
- Oct 3, 2015 6:45:21 PM (9 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 56 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r190542 r190546 1 2015-10-03 Commit Queue <commit-queue@webkit.org> 2 3 Unreviewed, rolling out r190522. 4 https://bugs.webkit.org/show_bug.cgi?id=149787 5 6 Caused a lot of leaks (Requested by ap on #webkit). 7 8 Reverted changeset: 9 10 "Unreviewed, rolling back in r190450" 11 https://bugs.webkit.org/show_bug.cgi?id=149727 12 http://trac.webkit.org/changeset/190522 13 1 14 2015-10-02 Matt Baker <mattbaker@apple.com> 2 15 -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r190522 r190546 83 83 namespace JSC { 84 84 85 const ClassInfo CodeBlock::s_info = {86 "CodeBlock", 0, 0,87 CREATE_METHOD_TABLE(CodeBlock)88 };89 90 const ClassInfo FunctionCodeBlock::s_info = {91 "FunctionCodeBlock", &Base::s_info, 0,92 CREATE_METHOD_TABLE(FunctionCodeBlock)93 };94 95 #if ENABLE(WEBASSEMBLY)96 const ClassInfo WebAssemblyCodeBlock::s_info = {97 "WebAssemblyCodeBlock", &Base::s_info, 0,98 CREATE_METHOD_TABLE(WebAssemblyCodeBlock)99 };100 #endif101 102 const ClassInfo GlobalCodeBlock::s_info = {103 "GlobalCodeBlock", &Base::s_info, 0,104 CREATE_METHOD_TABLE(GlobalCodeBlock)105 };106 107 const ClassInfo ProgramCodeBlock::s_info = {108 "ProgramCodeBlock", &Base::s_info, 0,109 CREATE_METHOD_TABLE(ProgramCodeBlock)110 };111 112 const ClassInfo ModuleProgramCodeBlock::s_info = {113 "ModuleProgramCodeBlock", &Base::s_info, 0,114 CREATE_METHOD_TABLE(ModuleProgramCodeBlock)115 };116 117 const ClassInfo EvalCodeBlock::s_info = {118 "EvalCodeBlock", &Base::s_info, 0,119 CREATE_METHOD_TABLE(EvalCodeBlock)120 };121 122 void FunctionCodeBlock::destroy(JSCell* cell)123 {124 jsCast<FunctionCodeBlock*>(cell)->~FunctionCodeBlock();125 }126 127 #if ENABLE(WEBASSEMBLY)128 void WebAssemblyCodeBlock::destroy(JSCell* cell)129 {130 jsCast<WebAssemblyCodeBlock*>(cell)->~WebAssemblyCodeBlock();131 }132 #endif133 134 void ProgramCodeBlock::destroy(JSCell* cell)135 {136 jsCast<ProgramCodeBlock*>(cell)->~ProgramCodeBlock();137 }138 139 void ModuleProgramCodeBlock::destroy(JSCell* cell)140 {141 jsCast<ModuleProgramCodeBlock*>(cell)->~ModuleProgramCodeBlock();142 }143 144 void EvalCodeBlock::destroy(JSCell* cell)145 {146 jsCast<EvalCodeBlock*>(cell)->~EvalCodeBlock();147 }148 149 85 CString CodeBlock::inferredName() const 150 86 { … … 218 154 out.print(":[", RawPointer(this), "->"); 219 155 if (!!m_alternative) 220 out.print(RawPointer( alternative()), "->");156 out.print(RawPointer(m_alternative.get()), "->"); 221 157 out.print(RawPointer(ownerExecutable()), ", ", jitType, codeType()); 222 158 … … 1650 1586 } // anonymous namespace 1651 1587 1652 CodeBlock::CodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, CodeBlock& other) 1653 : JSCell(*vm, structure) 1654 , m_globalObject(other.m_globalObject) 1588 CodeBlock::CodeBlock(CopyParsedBlockTag, CodeBlock& other) 1589 : m_globalObject(other.m_globalObject) 1655 1590 , m_heap(other.m_heap) 1656 1591 , m_numCalleeRegisters(other.m_numCalleeRegisters) … … 1660 1595 , m_didFailFTLCompilation(false) 1661 1596 , m_hasBeenCompiledWithFTL(false) 1662 , m_unlinkedCode(*other.m_vm, this, other.m_unlinkedCode.get())1597 , m_unlinkedCode(*other.m_vm, other.m_ownerExecutable.get(), other.m_unlinkedCode.get()) 1663 1598 , m_hasDebuggerStatement(false) 1664 1599 , m_steppingMode(SteppingModeDisabled) 1665 1600 , m_numBreakpoints(0) 1666 , m_ownerExecutable(*other.m_vm, this, other.m_ownerExecutable.get())1601 , m_ownerExecutable(*other.m_vm, other.m_ownerExecutable.get(), other.m_ownerExecutable.get()) 1667 1602 , m_vm(other.m_vm) 1668 1603 , m_instructions(other.m_instructions) … … 1689 1624 #endif 1690 1625 { 1691 m_visitWeaklyHasBeenCalled.store(false, std::memory_order_relaxed); 1626 m_visitStronglyHasBeenCalled.store(false, std::memory_order_relaxed); 1627 m_visitAggregateHasBeenCalled.store(false, std::memory_order_relaxed); 1692 1628 1693 1629 ASSERT(m_heap->isDeferred()); … … 1695 1631 1696 1632 setNumParameters(other.numParameters()); 1697 }1698 1699 void CodeBlock::finishCreation(VM& vm, CopyParsedBlockTag, CodeBlock& other)1700 {1701 Base::finishCreation(vm);1702 1703 1633 optimizeAfterWarmUp(); 1704 1634 jitAfterWarmUp(); … … 1714 1644 1715 1645 m_heap->m_codeBlocks.add(this); 1716 } 1717 1718 CodeBlock::CodeBlock(VM* vm, Structure* structure, ScriptExecutable* ownerExecutable, UnlinkedCodeBlock* unlinkedCodeBlock, 1719 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, unsigned firstLineColumnOffset) 1720 : JSCell(*vm, structure) 1721 , m_globalObject(scope->globalObject()->vm(), this, scope->globalObject()) 1646 m_heap->reportExtraMemoryAllocated(sizeof(CodeBlock)); 1647 } 1648 1649 CodeBlock::CodeBlock(ScriptExecutable* ownerExecutable, UnlinkedCodeBlock* unlinkedCodeBlock, JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, unsigned firstLineColumnOffset) 1650 : m_globalObject(scope->globalObject()->vm(), ownerExecutable, scope->globalObject()) 1722 1651 , m_heap(&m_globalObject->vm().heap) 1723 1652 , m_numCalleeRegisters(unlinkedCodeBlock->m_numCalleeRegisters) … … 1727 1656 , m_didFailFTLCompilation(false) 1728 1657 , m_hasBeenCompiledWithFTL(false) 1729 , m_unlinkedCode(m_globalObject->vm(), this, unlinkedCodeBlock)1658 , m_unlinkedCode(m_globalObject->vm(), ownerExecutable, unlinkedCodeBlock) 1730 1659 , m_hasDebuggerStatement(false) 1731 1660 , m_steppingMode(SteppingModeDisabled) 1732 1661 , m_numBreakpoints(0) 1733 , m_ownerExecutable(m_globalObject->vm(), this, ownerExecutable)1662 , m_ownerExecutable(m_globalObject->vm(), ownerExecutable, ownerExecutable) 1734 1663 , m_vm(unlinkedCodeBlock->vm()) 1735 1664 , m_thisRegister(unlinkedCodeBlock->thisRegister()) … … 1750 1679 #endif 1751 1680 { 1752 m_visitWeaklyHasBeenCalled.store(false, std::memory_order_relaxed); 1681 m_visitStronglyHasBeenCalled.store(false, std::memory_order_relaxed); 1682 m_visitAggregateHasBeenCalled.store(false, std::memory_order_relaxed); 1753 1683 1754 1684 ASSERT(m_heap->isDeferred()); … … 1757 1687 ASSERT(m_source); 1758 1688 setNumParameters(unlinkedCodeBlock->numParameters()); 1759 } 1760 1761 void CodeBlock::finishCreation(VM& vm, ScriptExecutable* ownerExecutable, UnlinkedCodeBlock* unlinkedCodeBlock, 1762 JSScope* scope) 1763 { 1764 Base::finishCreation(vm); 1765 1766 if (vm.typeProfiler() || vm.controlFlowProfiler()) 1767 vm.functionHasExecutedCache()->removeUnexecutedRange(ownerExecutable->sourceID(), ownerExecutable->typeProfilingStartOffset(), ownerExecutable->typeProfilingEndOffset()); 1689 1690 if (vm()->typeProfiler() || vm()->controlFlowProfiler()) 1691 vm()->functionHasExecutedCache()->removeUnexecutedRange(ownerExecutable->sourceID(), ownerExecutable->typeProfilingStartOffset(), ownerExecutable->typeProfilingEndOffset()); 1768 1692 1769 1693 setConstantRegisters(unlinkedCodeBlock->constantRegisters(), unlinkedCodeBlock->constantsSourceCodeRepresentation()); 1770 1694 if (unlinkedCodeBlock->usesGlobalObject()) 1771 m_constantRegisters[unlinkedCodeBlock->globalObjectRegister().toConstantIndex()].set(*m_vm, this, m_globalObject.get());1695 m_constantRegisters[unlinkedCodeBlock->globalObjectRegister().toConstantIndex()].set(*m_vm, ownerExecutable, m_globalObject.get()); 1772 1696 1773 1697 for (unsigned i = 0; i < LinkTimeConstantCount; i++) { 1774 1698 LinkTimeConstant type = static_cast<LinkTimeConstant>(i); 1775 1699 if (unsigned registerIndex = unlinkedCodeBlock->registerIndexForLinkTimeConstant(type)) 1776 m_constantRegisters[registerIndex].set(*m_vm, this, m_globalObject->jsCellForLinkTimeConstant(type));1700 m_constantRegisters[registerIndex].set(*m_vm, ownerExecutable, m_globalObject->jsCellForLinkTimeConstant(type)); 1777 1701 } 1778 1702 … … 1789 1713 symbolTable->prepareForTypeProfiling(locker); 1790 1714 } 1791 m_constantRegisters[i].set(*m_vm, this, symbolTable->cloneScopePart(*m_vm));1715 m_constantRegisters[i].set(*m_vm, ownerExecutable, symbolTable->cloneScopePart(*m_vm)); 1792 1716 clonedConstantSymbolTables.add(i + FirstConstantRegisterIndex); 1793 1717 } … … 1809 1733 for (size_t count = unlinkedCodeBlock->numberOfFunctionDecls(), i = 0; i < count; ++i) { 1810 1734 UnlinkedFunctionExecutable* unlinkedExecutable = unlinkedCodeBlock->functionDecl(i); 1811 if (vm .typeProfiler() || vm.controlFlowProfiler())1812 vm .functionHasExecutedCache()->insertUnexecutedRange(ownerExecutable->sourceID(), unlinkedExecutable->typeProfilingStartOffset(), unlinkedExecutable->typeProfilingEndOffset());1813 m_functionDecls[i].set(*m_vm, this, unlinkedExecutable->link(*m_vm, ownerExecutable->source()));1735 if (vm()->typeProfiler() || vm()->controlFlowProfiler()) 1736 vm()->functionHasExecutedCache()->insertUnexecutedRange(ownerExecutable->sourceID(), unlinkedExecutable->typeProfilingStartOffset(), unlinkedExecutable->typeProfilingEndOffset()); 1737 m_functionDecls[i].set(*m_vm, ownerExecutable, unlinkedExecutable->link(*m_vm, ownerExecutable->source())); 1814 1738 } 1815 1739 … … 1817 1741 for (size_t count = unlinkedCodeBlock->numberOfFunctionExprs(), i = 0; i < count; ++i) { 1818 1742 UnlinkedFunctionExecutable* unlinkedExecutable = unlinkedCodeBlock->functionExpr(i); 1819 if (vm .typeProfiler() || vm.controlFlowProfiler())1820 vm .functionHasExecutedCache()->insertUnexecutedRange(ownerExecutable->sourceID(), unlinkedExecutable->typeProfilingStartOffset(), unlinkedExecutable->typeProfilingEndOffset());1821 m_functionExprs[i].set(*m_vm, this, unlinkedExecutable->link(*m_vm, ownerExecutable->source()));1743 if (vm()->typeProfiler() || vm()->controlFlowProfiler()) 1744 vm()->functionHasExecutedCache()->insertUnexecutedRange(ownerExecutable->sourceID(), unlinkedExecutable->typeProfilingStartOffset(), unlinkedExecutable->typeProfilingEndOffset()); 1745 m_functionExprs[i].set(*m_vm, ownerExecutable, unlinkedExecutable->link(*m_vm, ownerExecutable->source())); 1822 1746 } 1823 1747 … … 1898 1822 unsigned opLength = opcodeLength(pc[0].u.opcode); 1899 1823 1900 instructions[i] = vm .interpreter->getOpcode(pc[0].u.opcode);1824 instructions[i] = vm()->interpreter->getOpcode(pc[0].u.opcode); 1901 1825 for (size_t j = 1; j < opLength; ++j) { 1902 1826 if (sizeof(int32_t) != sizeof(intptr_t)) … … 1957 1881 1958 1882 instructions[i + opLength - 1] = objectAllocationProfile; 1959 objectAllocationProfile->initialize( vm,1883 objectAllocationProfile->initialize(*vm(), 1960 1884 ownerExecutable, m_globalObject->objectPrototype(), inferredInlineCapacity); 1961 1885 break; … … 2006 1930 if (stronglyReferencedModuleEnvironments.add(jsCast<JSModuleEnvironment*>(op.lexicalEnvironment)).isNewEntry) 2007 1931 addConstant(op.lexicalEnvironment); 2008 instructions[i + 6].u.jsCell.set( vm, this, op.lexicalEnvironment);1932 instructions[i + 6].u.jsCell.set(*vm(), ownerExecutable, op.lexicalEnvironment); 2009 1933 } else 2010 instructions[i + 6].u.symbolTable.set( vm, this, op.lexicalEnvironment->symbolTable());1934 instructions[i + 6].u.symbolTable.set(*vm(), ownerExecutable, op.lexicalEnvironment->symbolTable()); 2011 1935 } else if (JSScope* constantScope = JSScope::constantScopeForCodeBlock(op.type, this)) 2012 instructions[i + 6].u.jsCell.set( vm, this, constantScope);1936 instructions[i + 6].u.jsCell.set(*vm(), ownerExecutable, constantScope); 2013 1937 else 2014 1938 instructions[i + 6].u.pointer = nullptr; … … 2043 1967 instructions[i + 5].u.watchpointSet = op.watchpointSet; 2044 1968 else if (op.structure) 2045 instructions[i + 5].u.structure.set( vm, this, op.structure);1969 instructions[i + 5].u.structure.set(*vm(), ownerExecutable, op.structure); 2046 1970 instructions[i + 6].u.pointer = reinterpret_cast<void*>(op.operand); 2047 1971 break; … … 2080 2004 op.watchpointSet->invalidate(PutToScopeFireDetail(this, ident)); 2081 2005 } else if (op.structure) 2082 instructions[i + 5].u.structure.set( vm, this, op.structure);2006 instructions[i + 5].u.structure.set(*vm(), ownerExecutable, op.structure); 2083 2007 instructions[i + 6].u.pointer = reinterpret_cast<void*>(op.operand); 2084 2008 … … 2087 2011 2088 2012 case op_profile_type: { 2089 RELEASE_ASSERT(vm .typeProfiler());2013 RELEASE_ASSERT(vm()->typeProfiler()); 2090 2014 // The format of this instruction is: op_profile_type regToProfile, TypeLocation*, flag, identifier?, resolveType? 2091 2015 size_t instructionOffset = i + opLength - 1; … … 2117 2041 // If our parent scope was created while profiling was disabled, it will not have prepared for profiling yet. 2118 2042 symbolTable->prepareForTypeProfiling(locker); 2119 globalVariableID = symbolTable->uniqueIDForVariable(locker, impl, vm);2120 globalTypeSet = symbolTable->globalTypeSetForVariable(locker, impl, vm);2043 globalVariableID = symbolTable->uniqueIDForVariable(locker, impl, *vm()); 2044 globalTypeSet = symbolTable->globalTypeSetForVariable(locker, impl, *vm()); 2121 2045 } else 2122 2046 globalVariableID = TypeProfilerNoGlobalIDExists; … … 2131 2055 ConcurrentJITLocker locker(symbolTable->m_lock); 2132 2056 // If our parent scope was created while profiling was disabled, it will not have prepared for profiling yet. 2133 globalVariableID = symbolTable->uniqueIDForVariable(locker, ident.impl(), vm);2134 globalTypeSet = symbolTable->globalTypeSetForVariable(locker, ident.impl(), vm);2057 globalVariableID = symbolTable->uniqueIDForVariable(locker, ident.impl(), *vm()); 2058 globalTypeSet = symbolTable->globalTypeSetForVariable(locker, ident.impl(), *vm()); 2135 2059 2136 2060 break; … … 2158 2082 } 2159 2083 2160 std::pair<TypeLocation*, bool> locationPair = vm .typeProfiler()->typeLocationCache()->getTypeLocation(globalVariableID,2161 ownerExecutable->sourceID(), divotStart, divotEnd, globalTypeSet, &vm);2084 std::pair<TypeLocation*, bool> locationPair = vm()->typeProfiler()->typeLocationCache()->getTypeLocation(globalVariableID, 2085 ownerExecutable->sourceID(), divotStart, divotEnd, globalTypeSet, vm()); 2162 2086 TypeLocation* location = locationPair.first; 2163 2087 bool isNewLocation = locationPair.second; … … 2167 2091 2168 2092 if (shouldAnalyze && isNewLocation) 2169 vm .typeProfiler()->insertNewLocation(location);2093 vm()->typeProfiler()->insertNewLocation(location); 2170 2094 2171 2095 instructions[i + 2].u.location = location; … … 2185 2109 } 2186 2110 2187 if (vm .controlFlowProfiler())2111 if (vm()->controlFlowProfiler()) 2188 2112 insertBasicBlockBoundariesForControlFlowProfiler(instructions); 2189 2113 … … 2205 2129 2206 2130 m_heap->m_codeBlocks.add(this); 2207 m_heap->reportExtraMemoryAllocated( m_instructions.size() * sizeof(Instruction));2131 m_heap->reportExtraMemoryAllocated(sizeof(CodeBlock) + m_instructions.size() * sizeof(Instruction)); 2208 2132 } 2209 2133 2210 2134 #if ENABLE(WEBASSEMBLY) 2211 CodeBlock::CodeBlock(VM* vm, Structure* structure, WebAssemblyExecutable* ownerExecutable, VM& vm, JSGlobalObject* globalObject) 2212 : JSCell(vm, structure) 2213 , m_globalObject(globalObject->vm(), this, globalObject) 2135 CodeBlock::CodeBlock(WebAssemblyExecutable* ownerExecutable, VM& vm, JSGlobalObject* globalObject) 2136 : m_globalObject(globalObject->vm(), ownerExecutable, globalObject) 2214 2137 , m_heap(&m_globalObject->vm().heap) 2215 2138 , m_numCalleeRegisters(0) … … 2222 2145 , m_steppingMode(SteppingModeDisabled) 2223 2146 , m_numBreakpoints(0) 2224 , m_ownerExecutable(m_globalObject->vm(), this, ownerExecutable)2147 , m_ownerExecutable(m_globalObject->vm(), ownerExecutable, ownerExecutable) 2225 2148 , m_vm(&vm) 2226 2149 , m_isStrictMode(false) … … 2236 2159 { 2237 2160 ASSERT(m_heap->isDeferred()); 2238 }2239 2240 void CodeBlock::finishCreation(VM& vm, WebAssemblyExecutable*, JSGlobalObject*)2241 {2242 Base::finishCreation(vm);2243 2161 2244 2162 m_heap->m_codeBlocks.add(this); 2163 m_heap->reportExtraMemoryAllocated(sizeof(CodeBlock)); 2245 2164 } 2246 2165 #endif … … 2254 2173 dumpValueProfiles(); 2255 2174 #endif 2256 2175 while (m_incomingLLIntCalls.begin() != m_incomingLLIntCalls.end()) 2176 m_incomingLLIntCalls.begin()->remove(); 2177 #if ENABLE(JIT) 2257 2178 // We may be destroyed before any CodeBlocks that refer to us are destroyed. 2258 2179 // Consider that two CodeBlocks become unreachable at the same time. There … … 2261 2182 // CodeBlock(s) that have calls into us, then the CallLinkInfo vector's 2262 2183 // destructor will try to remove nodes from our (no longer valid) linked list. 2263 unlinkIncomingCalls(); 2184 while (m_incomingCalls.begin() != m_incomingCalls.end()) 2185 m_incomingCalls.begin()->remove(); 2186 while (m_incomingPolymorphicCalls.begin() != m_incomingPolymorphicCalls.end()) 2187 m_incomingPolymorphicCalls.begin()->remove(); 2264 2188 2265 2189 // Note that our outgoing calls will be removed from other CodeBlocks' … … 2267 2191 // destructors. 2268 2192 2269 #if ENABLE(JIT)2270 2193 for (Bag<StructureStubInfo>::iterator iter = m_stubInfos.begin(); !!iter; ++iter) 2271 2194 (*iter)->deref(); 2272 2195 #endif // ENABLE(JIT) 2273 }2274 2275 void CodeBlock::setAlternative(VM& vm, CodeBlock* alternative)2276 {2277 m_alternative.set(vm, this, alternative);2278 2196 } 2279 2197 … … 2298 2216 return 0; 2299 2217 DFG::JITCode* jitCode = m_jitCode->dfg(); 2300 return jitCode->osrEntryBlock ();2218 return jitCode->osrEntryBlock.get(); 2301 2219 #else // ENABLE(FTL_JIT) 2302 2220 return 0; … … 2304 2222 } 2305 2223 2306 void CodeBlock::visit Weakly(SlotVisitor& visitor)2307 { 2308 bool setByMe = m_visit WeaklyHasBeenCalled.compareExchangeStrong(false, true);2224 void CodeBlock::visitStrongly(SlotVisitor& visitor) 2225 { 2226 bool setByMe = m_visitStronglyHasBeenCalled.compareExchangeStrong(false, true); 2309 2227 if (!setByMe) 2310 2228 return; 2311 2229 2312 if (Heap::isMarked(this)) 2230 visitAggregate(visitor); 2231 2232 stronglyVisitStrongReferences(visitor); 2233 stronglyVisitWeakReferences(visitor); 2234 propagateTransitions(visitor); 2235 } 2236 2237 void CodeBlock::visitAggregate(SlotVisitor& visitor) 2238 { 2239 // I may be asked to scan myself more than once, and it may even happen concurrently. 2240 // To this end, use an atomic operation to check (and set) if I've been called already. 2241 // Only one thread may proceed past this point - whichever one wins the atomic set race. 2242 bool setByMe = m_visitAggregateHasBeenCalled.compareExchangeStrong(false, true); 2243 if (!setByMe) 2313 2244 return; 2314 2315 if (shouldVisitStrongly()) { 2316 visitor.appendUnbarrieredReadOnlyPointer(this); 2317 return; 2318 } 2245 2246 if (!!m_alternative) 2247 m_alternative->visitAggregate(visitor); 2248 2249 if (CodeBlock* otherBlock = specialOSREntryBlockOrNull()) 2250 otherBlock->visitAggregate(visitor); 2251 2252 visitor.reportExtraMemoryVisited(ownerExecutable(), sizeof(CodeBlock)); 2253 if (m_jitCode) 2254 visitor.reportExtraMemoryVisited(ownerExecutable(), m_jitCode->size()); 2255 if (m_instructions.size()) { 2256 // Divide by refCount() because m_instructions points to something that is shared 2257 // by multiple CodeBlocks, and we only want to count it towards the heap size once. 2258 // Having each CodeBlock report only its proportional share of the size is one way 2259 // of accomplishing this. 2260 visitor.reportExtraMemoryVisited(ownerExecutable(), m_instructions.size() * sizeof(Instruction) / m_instructions.refCount()); 2261 } 2262 2263 visitor.append(&m_unlinkedCode); 2319 2264 2320 2265 // There are two things that may use unconditional finalizers: inline cache clearing … … 2322 2267 // is probably quite close to 1. So we add one no matter what and when it runs, it 2323 2268 // figures out whether it has any work to do. 2324 visitor.addUnconditionalFinalizer(&m_unconditionalFinalizer); 2325 2269 visitor.addUnconditionalFinalizer(this); 2270 2271 m_allTransitionsHaveBeenMarked = false; 2272 2273 if (shouldVisitStrongly()) { 2274 visitStrongly(visitor); 2275 return; 2276 } 2277 2326 2278 if (!JITCode::isOptimizingJIT(jitType())) 2327 2279 return; 2328 2280 2329 // If we jettison ourselves we'll install our alternative, so make sure that it2330 // survives GC even if we don't.2331 visitor.append(&m_alternative);2332 2333 2281 // There are two things that we use weak reference harvesters for: DFG fixpoint for 2334 2282 // jettisoning, and trying to find structures that would be live based on some 2335 2283 // inline cache. So it makes sense to register them regardless. 2336 visitor.addWeakReferenceHarvester( &m_weakReferenceHarvester);2284 visitor.addWeakReferenceHarvester(this); 2337 2285 2338 2286 #if ENABLE(DFG_JIT) … … 2345 2293 // other reasons, that this iteration should run again; it will notify us of this 2346 2294 // decision by calling harvestWeakReferences(). 2347 2348 m_allTransitionsHaveBeenMarked = false; 2295 2296 m_jitCode->dfgCommon()->livenessHasBeenProved = false; 2297 2349 2298 propagateTransitions(visitor); 2350 2351 m_jitCode->dfgCommon()->livenessHasBeenProved = false;2352 2299 determineLiveness(visitor); 2353 2300 #endif // ENABLE(DFG_JIT) 2354 }2355 2356 void CodeBlock::visitChildren(JSCell* cell, SlotVisitor& visitor)2357 {2358 CodeBlock* thisObject = jsCast<CodeBlock*>(cell);2359 ASSERT_GC_OBJECT_INHERITS(thisObject, info());2360 JSCell::visitChildren(thisObject, visitor);2361 thisObject->visitChildren(visitor);2362 }2363 2364 void CodeBlock::visitChildren(SlotVisitor& visitor)2365 {2366 // There are two things that may use unconditional finalizers: inline cache clearing2367 // and jettisoning. The probability of us wanting to do at least one of those things2368 // is probably quite close to 1. So we add one no matter what and when it runs, it2369 // figures out whether it has any work to do.2370 visitor.addUnconditionalFinalizer(&m_unconditionalFinalizer);2371 2372 if (CodeBlock* otherBlock = specialOSREntryBlockOrNull())2373 visitor.appendUnbarrieredReadOnlyPointer(otherBlock);2374 2375 if (m_jitCode)2376 visitor.reportExtraMemoryVisited(this, m_jitCode->size());2377 if (m_instructions.size())2378 visitor.reportExtraMemoryVisited(this, m_instructions.size() * sizeof(Instruction) / m_instructions.refCount());2379 2380 visitor.append(&m_unlinkedCode);2381 2382 stronglyVisitStrongReferences(visitor);2383 stronglyVisitWeakReferences(visitor);2384 2385 m_allTransitionsHaveBeenMarked = false;2386 propagateTransitions(visitor);2387 2301 } 2388 2302 … … 2414 2328 // - Code blocks that don't have any dead weak references. 2415 2329 2416 return Heap::isMarked(this); 2330 if (m_visitStronglyHasBeenCalled.load(std::memory_order_relaxed)) 2331 return true; 2332 2333 #if ENABLE(DFG_JIT) 2334 if (JITCode::isOptimizingJIT(jitType())) { 2335 if (m_jitCode->dfgCommon()->livenessHasBeenProved) 2336 return true; 2337 } 2338 #endif 2339 2340 return false; 2417 2341 } 2418 2342 … … 2424 2348 } 2425 2349 2426 static std::chrono::milliseconds timeToLive(JITCode::JITType jitType)2427 {2428 switch (jitType) {2429 case JITCode::InterpreterThunk:2430 return std::chrono::duration_cast<std::chrono::milliseconds>(2431 std::chrono::seconds(5));2432 case JITCode::BaselineJIT:2433 // Effectively 10 additional seconds, since BaselineJIT and2434 // InterpreterThunk share a CodeBlock.2435 return std::chrono::duration_cast<std::chrono::milliseconds>(2436 std::chrono::seconds(15));2437 case JITCode::DFGJIT:2438 return std::chrono::duration_cast<std::chrono::milliseconds>(2439 std::chrono::seconds(20));2440 case JITCode::FTLJIT:2441 return std::chrono::duration_cast<std::chrono::milliseconds>(2442 std::chrono::seconds(60));2443 default:2444 return std::chrono::milliseconds::max();2445 }2446 }2447 2448 2350 bool CodeBlock::shouldJettisonDueToOldAge() 2449 2351 { 2450 if ( Heap::isMarked(this))2352 if (m_visitStronglyHasBeenCalled.load(std::memory_order_relaxed)) 2451 2353 return false; 2452 2354 2453 if (timeSinceCreation() < timeToLive(jitType()))2355 if (timeSinceCreation() < JITCode::timeToLive(jitType())) 2454 2356 return false; 2455 2357 … … 2604 2506 // come back here again, and scan the strong references. 2605 2507 dfgCommon->livenessHasBeenProved = true; 2606 visitor.appendUnbarrieredReadOnlyPointer(this);2508 stronglyVisitStrongReferences(visitor); 2607 2509 #endif // ENABLE(DFG_JIT) 2608 2510 } 2609 2511 2610 void CodeBlock::WeakReferenceHarvester::visitWeakReferences(SlotVisitor& visitor) 2611 { 2612 CodeBlock* codeBlock = 2613 bitwise_cast<CodeBlock*>( 2614 bitwise_cast<char*>(this) - OBJECT_OFFSETOF(CodeBlock, m_weakReferenceHarvester)); 2615 2616 codeBlock->propagateTransitions(visitor); 2617 codeBlock->determineLiveness(visitor); 2512 void CodeBlock::visitWeakReferences(SlotVisitor& visitor) 2513 { 2514 propagateTransitions(visitor); 2515 determineLiveness(visitor); 2618 2516 } 2619 2517 … … 2735 2633 } 2736 2634 2737 void CodeBlock::UnconditionalFinalizer::finalizeUnconditionally() 2738 { 2739 CodeBlock* codeBlock = bitwise_cast<CodeBlock*>( 2740 bitwise_cast<char*>(this) - OBJECT_OFFSETOF(CodeBlock, m_unconditionalFinalizer)); 2741 2635 void CodeBlock::finalizeUnconditionally() 2636 { 2742 2637 #if ENABLE(DFG_JIT) 2743 if ( codeBlock->shouldJettisonDueToWeakReference()) {2744 codeBlock->jettison(Profiler::JettisonDueToWeakReference);2638 if (shouldJettisonDueToWeakReference()) { 2639 jettison(Profiler::JettisonDueToWeakReference); 2745 2640 return; 2746 2641 } 2747 2642 #endif // ENABLE(DFG_JIT) 2748 2643 2749 if ( codeBlock->shouldJettisonDueToOldAge()) {2750 codeBlock->jettison(Profiler::JettisonDueToOldAge);2644 if (shouldJettisonDueToOldAge()) { 2645 jettison(Profiler::JettisonDueToOldAge); 2751 2646 return; 2752 2647 } 2753 2648 2754 if (JITCode::couldBeInterpreted( codeBlock->jitType()))2755 codeBlock->finalizeLLIntInlineCaches();2649 if (JITCode::couldBeInterpreted(jitType())) 2650 finalizeLLIntInlineCaches(); 2756 2651 2757 2652 #if ENABLE(JIT) 2758 if (!! codeBlock->jitCode())2759 codeBlock->finalizeBaselineJITInlineCaches();2653 if (!!jitCode()) 2654 finalizeBaselineJITInlineCaches(); 2760 2655 #endif 2761 2656 } … … 2852 2747 // the OSR exit against. 2853 2748 2854 visitor.append(&m_alternative);2749 alternative()->visitStrongly(visitor); 2855 2750 2856 2751 #if ENABLE(DFG_JIT) … … 2858 2753 if (dfgCommon->inlineCallFrames) { 2859 2754 for (auto* inlineCallFrame : *dfgCommon->inlineCallFrames) { 2860 ASSERT(inlineCallFrame->baselineCodeBlock );2861 visitor.append(&inlineCallFrame->baselineCodeBlock);2755 ASSERT(inlineCallFrame->baselineCodeBlock()); 2756 inlineCallFrame->baselineCodeBlock()->visitStrongly(visitor); 2862 2757 } 2863 2758 } … … 3068 2963 m_incomingLLIntCalls.begin()->unlink(); 3069 2964 #if ENABLE(JIT) 2965 if (m_incomingCalls.isEmpty() && m_incomingPolymorphicCalls.isEmpty()) 2966 return; 3070 2967 while (m_incomingCalls.begin() != m_incomingCalls.end()) 3071 2968 m_incomingCalls.begin()->unlink(*vm()); … … 3081 2978 } 3082 2979 3083 CodeBlock*CodeBlock::newReplacement()2980 PassRefPtr<CodeBlock> CodeBlock::newReplacement() 3084 2981 { 3085 2982 return ownerScriptExecutable()->newReplacementCodeBlockFor(specializationKind()); … … 3087 2984 3088 2985 #if ENABLE(JIT) 3089 CodeBlock* CodeBlock::replacement() 3090 { 3091 const ClassInfo* classInfo = this->classInfo(); 3092 3093 if (classInfo == FunctionCodeBlock::info()) 3094 return jsCast<FunctionExecutable*>(ownerExecutable())->codeBlockFor(m_isConstructor ? CodeForConstruct : CodeForCall); 3095 3096 if (classInfo == EvalCodeBlock::info()) 3097 return jsCast<EvalExecutable*>(ownerExecutable())->codeBlock(); 3098 3099 if (classInfo == ProgramCodeBlock::info()) 3100 return jsCast<ProgramExecutable*>(ownerExecutable())->codeBlock(); 3101 3102 if (classInfo == ModuleProgramCodeBlock::info()) 3103 return jsCast<ModuleProgramExecutable*>(ownerExecutable())->codeBlock(); 2986 CodeBlock* ProgramCodeBlock::replacement() 2987 { 2988 return jsCast<ProgramExecutable*>(ownerExecutable())->codeBlock(); 2989 } 2990 2991 CodeBlock* ModuleProgramCodeBlock::replacement() 2992 { 2993 return jsCast<ModuleProgramExecutable*>(ownerExecutable())->codeBlock(); 2994 } 2995 2996 CodeBlock* EvalCodeBlock::replacement() 2997 { 2998 return jsCast<EvalExecutable*>(ownerExecutable())->codeBlock(); 2999 } 3000 3001 CodeBlock* FunctionCodeBlock::replacement() 3002 { 3003 return jsCast<FunctionExecutable*>(ownerExecutable())->codeBlockFor(m_isConstructor ? CodeForConstruct : CodeForCall); 3004 } 3005 3006 DFG::CapabilityLevel ProgramCodeBlock::capabilityLevelInternal() 3007 { 3008 return DFG::programCapabilityLevel(this); 3009 } 3010 3011 DFG::CapabilityLevel ModuleProgramCodeBlock::capabilityLevelInternal() 3012 { 3013 return DFG::programCapabilityLevel(this); 3014 } 3015 3016 DFG::CapabilityLevel EvalCodeBlock::capabilityLevelInternal() 3017 { 3018 return DFG::evalCapabilityLevel(this); 3019 } 3020 3021 DFG::CapabilityLevel FunctionCodeBlock::capabilityLevelInternal() 3022 { 3023 if (m_isConstructor) 3024 return DFG::functionForConstructCapabilityLevel(this); 3025 return DFG::functionForCallCapabilityLevel(this); 3026 } 3104 3027 3105 3028 #if ENABLE(WEBASSEMBLY) 3106 if (classInfo == WebAssemblyCodeBlock::info()) 3107 return nullptr 3029 CodeBlock* WebAssemblyCodeBlock::replacement() 3030 { 3031 return nullptr; 3032 } 3033 3034 DFG::CapabilityLevel WebAssemblyCodeBlock::capabilityLevelInternal() 3035 { 3036 return DFG::CannotCompile; 3037 } 3108 3038 #endif 3109 3110 RELEASE_ASSERT_NOT_REACHED();3111 return nullptr;3112 }3113 3114 DFG::CapabilityLevel CodeBlock::computeCapabilityLevel()3115 {3116 const ClassInfo* classInfo = this->classInfo();3117 3118 if (classInfo == FunctionCodeBlock::info()) {3119 if (m_isConstructor)3120 return DFG::functionForConstructCapabilityLevel(this);3121 return DFG::functionForCallCapabilityLevel(this);3122 }3123 3124 if (classInfo == EvalCodeBlock::info())3125 return DFG::evalCapabilityLevel(this);3126 3127 if (classInfo == ProgramCodeBlock::info())3128 return DFG::programCapabilityLevel(this);3129 3130 if (classInfo == ModuleProgramCodeBlock::info())3131 return DFG::programCapabilityLevel(this);3132 3133 #if ENABLE(WEBASSEMBLY)3134 if (classInfo == WebAssemblyCodeBlock::info())3135 return DFG::CannotCompile;3136 3039 #endif 3137 3138 RELEASE_ASSERT_NOT_REACHED();3139 return DFG::CannotCompile;3140 }3141 3142 #endif // ENABLE(JIT)3143 3040 3144 3041 void CodeBlock::jettison(Profiler::JettisonReason reason, ReoptimizationMode mode, const FireDetail* detail) … … 3244 3141 if (!codeOrigin.inlineCallFrame) 3245 3142 return globalObject(); 3246 return codeOrigin.inlineCallFrame->baselineCodeBlock->globalObject();3143 return jsCast<FunctionExecutable*>(codeOrigin.inlineCallFrame->executable.get())->eitherCodeBlock()->globalObject(); 3247 3144 } 3248 3145 … … 4084 3981 DFG::CapabilityLevel CodeBlock::capabilityLevel() 4085 3982 { 4086 DFG::CapabilityLevel result = c omputeCapabilityLevel();3983 DFG::CapabilityLevel result = capabilityLevelInternal(); 4087 3984 m_capabilityLevelState = result; 4088 3985 return result; -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
r190522 r190546 39 39 #include "CodeBlockHash.h" 40 40 #include "CodeBlockSet.h" 41 #include "ConcurrentJITLock.h" 41 42 #include "CodeOrigin.h" 42 43 #include "CodeType.h" 43 44 #include "CompactJITCodeMap.h" 44 #include "ConcurrentJITLock.h"45 45 #include "DFGCommon.h" 46 46 #include "DFGExitProfile.h" … … 50 50 #include "ExpressionRangeInfo.h" 51 51 #include "HandlerInfo.h" 52 #include "ObjectAllocationProfile.h" 53 #include "Options.h" 54 #include "PutPropertySlot.h" 52 55 #include "Instruction.h" 53 56 #include "JITCode.h" 54 57 #include "JITWriteBarrier.h" 55 #include "JSCell.h"56 58 #include "JSGlobalObject.h" 57 59 #include "JumpTable.h" 58 60 #include "LLIntCallLinkInfo.h" 59 61 #include "LazyOperandValueProfile.h" 60 #include "ObjectAllocationProfile.h"61 #include "Options.h"62 62 #include "ProfilerCompilation.h" 63 63 #include "ProfilerJettisonReason.h" 64 #include "PutPropertySlot.h"65 64 #include "RegExpObject.h" 66 65 #include "StructureStubInfo.h" … … 87 86 enum ReoptimizationMode { DontCountReoptimization, CountReoptimization }; 88 87 89 class CodeBlock : public JSCell{90 typedef JSCell Base;88 class CodeBlock : public ThreadSafeRefCounted<CodeBlock>, public UnconditionalFinalizer, public WeakReferenceHarvester { 89 WTF_MAKE_FAST_ALLOCATED; 91 90 friend class BytecodeLivenessAnalysis; 92 91 friend class JIT; 93 92 friend class LLIntOffsetsExtractor; 94 95 class UnconditionalFinalizer : public JSC::UnconditionalFinalizer {96 virtual void finalizeUnconditionally() override;97 };98 99 class WeakReferenceHarvester : public JSC::WeakReferenceHarvester {100 virtual void visitWeakReferences(SlotVisitor&) override;101 };102 103 93 public: 104 94 enum CopyParsedBlockTag { CopyParsedBlock }; 105 106 static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;107 108 DECLARE_INFO;109 110 95 protected: 111 CodeBlock(VM*, Structure*, CopyParsedBlockTag, CodeBlock& other); 112 CodeBlock(VM*, Structure*, ScriptExecutable* ownerExecutable, UnlinkedCodeBlock*, JSScope*, PassRefPtr<SourceProvider>, unsigned sourceOffset, unsigned firstLineColumnOffset); 96 CodeBlock(CopyParsedBlockTag, CodeBlock& other); 97 98 CodeBlock(ScriptExecutable* ownerExecutable, UnlinkedCodeBlock*, JSScope*, PassRefPtr<SourceProvider>, unsigned sourceOffset, unsigned firstLineColumnOffset); 113 99 #if ENABLE(WEBASSEMBLY) 114 CodeBlock(VM*, Structure*, WebAssemblyExecutable* ownerExecutable, VM&, JSGlobalObject*); 115 #endif 116 117 void finishCreation(VM&, CopyParsedBlockTag, CodeBlock& other); 118 void finishCreation(VM&, ScriptExecutable* ownerExecutable, UnlinkedCodeBlock*, JSScope*); 119 #if ENABLE(WEBASSEMBLY) 120 void finishCreation(VM&, WebAssemblyExecutable* ownerExecutable, JSGlobalObject*); 100 CodeBlock(WebAssemblyExecutable* ownerExecutable, VM&, JSGlobalObject*); 121 101 #endif 122 102 … … 125 105 126 106 public: 127 JS_EXPORT_PRIVATE ~CodeBlock();107 JS_EXPORT_PRIVATE virtual ~CodeBlock(); 128 108 129 109 UnlinkedCodeBlock* unlinkedCodeBlock() const { return m_unlinkedCode.get(); } … … 145 125 static ptrdiff_t offsetOfNumParameters() { return OBJECT_OFFSETOF(CodeBlock, m_numParameters); } 146 126 147 CodeBlock* alternative() const { return static_cast<CodeBlock*>(m_alternative.get()); }148 void setAlternative( VM&, CodeBlock*);127 CodeBlock* alternative() { return m_alternative.get(); } 128 void setAlternative(PassRefPtr<CodeBlock> alternative) { m_alternative = alternative; } 149 129 150 130 template <typename Functor> void forEachRelatedCodeBlock(Functor&& functor) … … 169 149 return specializationFromIsConstruct(m_isConstructor); 170 150 } 171 172 CodeBlock* alternativeForJettison(); 151 173 152 CodeBlock* baselineAlternative(); 174 153 … … 177 156 CodeBlock* baselineVersion(); 178 157 179 static void visitChildren(JSCell*, SlotVisitor&); 180 void visitChildren(SlotVisitor&); 181 void visitWeakly(SlotVisitor&); 182 void clearVisitWeaklyHasBeenCalled(); 158 void clearMarks(); 159 void visitAggregate(SlotVisitor&); 160 void visitStrongly(SlotVisitor&); 183 161 184 162 void dumpSource(); … … 288 266 289 267 // Exactly equivalent to codeBlock->ownerExecutable()->newReplacementCodeBlockFor(codeBlock->specializationKind()) 290 CodeBlock*newReplacement();268 PassRefPtr<CodeBlock> newReplacement(); 291 269 292 270 void setJITCode(PassRefPtr<JITCode> code) … … 314 292 315 293 #if ENABLE(JIT) 316 CodeBlock* replacement();317 318 DFG::CapabilityLevel computeCapabilityLevel();294 virtual CodeBlock* replacement() = 0; 295 296 virtual DFG::CapabilityLevel capabilityLevelInternal() = 0; 319 297 DFG::CapabilityLevel capabilityLevel(); 320 298 DFG::CapabilityLevel capabilityLevelState() { return m_capabilityLevelState; } … … 566 544 unsigned result = m_constantRegisters.size(); 567 545 m_constantRegisters.append(WriteBarrier<Unknown>()); 568 m_constantRegisters.last().set(m_globalObject->vm(), this, v);546 m_constantRegisters.last().set(m_globalObject->vm(), m_ownerExecutable.get(), v); 569 547 m_constantsSourceCodeRepresentation.append(SourceCodeRepresentation::Other); 570 548 return result; … … 918 896 919 897 protected: 898 virtual void visitWeakReferences(SlotVisitor&) override; 899 virtual void finalizeUnconditionally() override; 920 900 void finalizeLLIntInlineCaches(); 921 901 void finalizeBaselineJITInlineCaches(); … … 944 924 m_constantRegisters.resizeToFit(count); 945 925 for (size_t i = 0; i < count; i++) 946 m_constantRegisters[i].set(*m_vm, this, constants[i].get());926 m_constantRegisters[i].set(*m_vm, ownerExecutable(), constants[i].get()); 947 927 m_constantsSourceCodeRepresentation = constantsSourceCodeRepresentation; 948 928 } … … 951 931 { 952 932 ASSERT(isConstantRegisterIndex(index) && static_cast<size_t>(index - FirstConstantRegisterIndex) < m_constantRegisters.size()); 953 m_constantRegisters[index - FirstConstantRegisterIndex].set(m_globalObject->vm(), this, value);933 m_constantRegisters[index - FirstConstantRegisterIndex].set(m_globalObject->vm(), m_ownerExecutable.get(), value); 954 934 } 955 935 … … 1023 1003 bool m_needsActivation; 1024 1004 1025 Atomic<bool> m_visitWeaklyHasBeenCalled; 1005 Atomic<bool> m_visitAggregateHasBeenCalled; 1006 Atomic<bool> m_visitStronglyHasBeenCalled; 1026 1007 1027 1008 RefPtr<SourceProvider> m_source; … … 1065 1046 Vector<WriteBarrier<FunctionExecutable>> m_functionExprs; 1066 1047 1067 WriteBarrier<CodeBlock> m_alternative;1048 RefPtr<CodeBlock> m_alternative; 1068 1049 1069 1050 BaselineExecutionCounter m_llintExecuteCounter; … … 1085 1066 DFG::CapabilityLevel m_capabilityLevelState; 1086 1067 #endif 1087 1088 UnconditionalFinalizer m_unconditionalFinalizer;1089 WeakReferenceHarvester m_weakReferenceHarvester;1090 1068 }; 1091 1069 … … 1094 1072 1095 1073 class GlobalCodeBlock : public CodeBlock { 1096 typedef CodeBlock Base;1097 DECLARE_INFO;1098 1099 1074 protected: 1100 GlobalCodeBlock( VM* vm, Structure* structure,CopyParsedBlockTag, GlobalCodeBlock& other)1101 : CodeBlock(vm, structure,CopyParsedBlock, other)1102 { 1103 } 1104 1105 GlobalCodeBlock( VM* vm, Structure* structure,ScriptExecutable* ownerExecutable, UnlinkedCodeBlock* unlinkedCodeBlock, JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, unsigned firstLineColumnOffset)1106 : CodeBlock( vm, structure,ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, sourceOffset, firstLineColumnOffset)1075 GlobalCodeBlock(CopyParsedBlockTag, GlobalCodeBlock& other) 1076 : CodeBlock(CopyParsedBlock, other) 1077 { 1078 } 1079 1080 GlobalCodeBlock(ScriptExecutable* ownerExecutable, UnlinkedCodeBlock* unlinkedCodeBlock, JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, unsigned firstLineColumnOffset) 1081 : CodeBlock(ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, sourceOffset, firstLineColumnOffset) 1107 1082 { 1108 1083 } … … 1111 1086 class ProgramCodeBlock : public GlobalCodeBlock { 1112 1087 public: 1113 typedef GlobalCodeBlock Base; 1114 DECLARE_INFO; 1115 1116 static ProgramCodeBlock* create(VM* vm, CopyParsedBlockTag, ProgramCodeBlock& other) 1117 { 1118 ProgramCodeBlock* instance = new (NotNull, allocateCell<ProgramCodeBlock>(vm->heap)) 1119 ProgramCodeBlock(vm, vm->programCodeBlockStructure.get(), CopyParsedBlock, other); 1120 instance->finishCreation(*vm, CopyParsedBlock, other); 1121 return instance; 1122 } 1123 1124 static ProgramCodeBlock* create(VM* vm, ProgramExecutable* ownerExecutable, UnlinkedProgramCodeBlock* unlinkedCodeBlock, 1125 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned firstLineColumnOffset) 1126 { 1127 ProgramCodeBlock* instance = new (NotNull, allocateCell<ProgramCodeBlock>(vm->heap)) 1128 ProgramCodeBlock(vm, vm->programCodeBlockStructure.get(), ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, firstLineColumnOffset); 1129 instance->finishCreation(*vm, ownerExecutable, unlinkedCodeBlock, scope); 1130 return instance; 1131 } 1132 1133 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) 1134 { 1135 return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info()); 1136 } 1137 1138 private: 1139 ProgramCodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, ProgramCodeBlock& other) 1140 : GlobalCodeBlock(vm, structure, CopyParsedBlock, other) 1141 { 1142 } 1143 1144 ProgramCodeBlock(VM* vm, Structure* structure, ProgramExecutable* ownerExecutable, UnlinkedProgramCodeBlock* unlinkedCodeBlock, 1145 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned firstLineColumnOffset) 1146 : GlobalCodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, 0, firstLineColumnOffset) 1147 { 1148 } 1149 1150 static void destroy(JSCell*); 1088 ProgramCodeBlock(CopyParsedBlockTag, ProgramCodeBlock& other) 1089 : GlobalCodeBlock(CopyParsedBlock, other) 1090 { 1091 } 1092 1093 ProgramCodeBlock(ProgramExecutable* ownerExecutable, UnlinkedProgramCodeBlock* unlinkedCodeBlock, JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned firstLineColumnOffset) 1094 : GlobalCodeBlock(ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, 0, firstLineColumnOffset) 1095 { 1096 } 1097 1098 #if ENABLE(JIT) 1099 protected: 1100 virtual CodeBlock* replacement() override; 1101 virtual DFG::CapabilityLevel capabilityLevelInternal() override; 1102 #endif 1151 1103 }; 1152 1104 1153 1105 class ModuleProgramCodeBlock : public GlobalCodeBlock { 1154 1106 public: 1155 typedef GlobalCodeBlock Base; 1156 DECLARE_INFO; 1157 1158 static ModuleProgramCodeBlock* create(VM* vm, CopyParsedBlockTag, ModuleProgramCodeBlock& other) 1159 { 1160 ModuleProgramCodeBlock* instance = new (NotNull, allocateCell<ModuleProgramCodeBlock>(vm->heap)) 1161 ModuleProgramCodeBlock(vm, vm->moduleProgramCodeBlockStructure.get(), CopyParsedBlock, other); 1162 instance->finishCreation(*vm, CopyParsedBlock, other); 1163 return instance; 1164 } 1165 1166 static ModuleProgramCodeBlock* create(VM* vm, ModuleProgramExecutable* ownerExecutable, UnlinkedModuleProgramCodeBlock* unlinkedCodeBlock, 1167 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned firstLineColumnOffset) 1168 { 1169 ModuleProgramCodeBlock* instance = new (NotNull, allocateCell<ModuleProgramCodeBlock>(vm->heap)) 1170 ModuleProgramCodeBlock(vm, vm->moduleProgramCodeBlockStructure.get(), ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, firstLineColumnOffset); 1171 instance->finishCreation(*vm, ownerExecutable, unlinkedCodeBlock, scope); 1172 return instance; 1173 } 1174 1175 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) 1176 { 1177 return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info()); 1178 } 1179 1180 private: 1181 ModuleProgramCodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, ModuleProgramCodeBlock& other) 1182 : GlobalCodeBlock(vm, structure, CopyParsedBlock, other) 1183 { 1184 } 1185 1186 ModuleProgramCodeBlock(VM* vm, Structure* structure, ModuleProgramExecutable* ownerExecutable, UnlinkedModuleProgramCodeBlock* unlinkedCodeBlock, 1187 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned firstLineColumnOffset) 1188 : GlobalCodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, 0, firstLineColumnOffset) 1189 { 1190 } 1191 1192 static void destroy(JSCell*); 1107 ModuleProgramCodeBlock(CopyParsedBlockTag, ModuleProgramCodeBlock& other) 1108 : GlobalCodeBlock(CopyParsedBlock, other) 1109 { 1110 } 1111 1112 ModuleProgramCodeBlock(ModuleProgramExecutable* ownerExecutable, UnlinkedModuleProgramCodeBlock* unlinkedCodeBlock, JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned firstLineColumnOffset) 1113 : GlobalCodeBlock(ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, 0, firstLineColumnOffset) 1114 { 1115 } 1116 1117 #if ENABLE(JIT) 1118 protected: 1119 virtual CodeBlock* replacement() override; 1120 virtual DFG::CapabilityLevel capabilityLevelInternal() override; 1121 #endif 1193 1122 }; 1194 1123 1195 1124 class EvalCodeBlock : public GlobalCodeBlock { 1196 1125 public: 1197 typedef GlobalCodeBlock Base; 1198 DECLARE_INFO; 1199 1200 static EvalCodeBlock* create(VM* vm, CopyParsedBlockTag, EvalCodeBlock& other) 1201 { 1202 EvalCodeBlock* instance = new (NotNull, allocateCell<EvalCodeBlock>(vm->heap)) 1203 EvalCodeBlock(vm, vm->evalCodeBlockStructure.get(), CopyParsedBlock, other); 1204 instance->finishCreation(*vm, CopyParsedBlock, other); 1205 return instance; 1206 } 1207 1208 static EvalCodeBlock* create(VM* vm, EvalExecutable* ownerExecutable, UnlinkedEvalCodeBlock* unlinkedCodeBlock, 1209 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider) 1210 { 1211 EvalCodeBlock* instance = new (NotNull, allocateCell<EvalCodeBlock>(vm->heap)) 1212 EvalCodeBlock(vm, vm->evalCodeBlockStructure.get(), ownerExecutable, unlinkedCodeBlock, scope, sourceProvider); 1213 instance->finishCreation(*vm, ownerExecutable, unlinkedCodeBlock, scope); 1214 return instance; 1215 } 1216 1217 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) 1218 { 1219 return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info()); 1220 } 1221 1126 EvalCodeBlock(CopyParsedBlockTag, EvalCodeBlock& other) 1127 : GlobalCodeBlock(CopyParsedBlock, other) 1128 { 1129 } 1130 1131 EvalCodeBlock(EvalExecutable* ownerExecutable, UnlinkedEvalCodeBlock* unlinkedCodeBlock, JSScope* scope, PassRefPtr<SourceProvider> sourceProvider) 1132 : GlobalCodeBlock(ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, 0, 1) 1133 { 1134 } 1135 1222 1136 const Identifier& variable(unsigned index) { return unlinkedEvalCodeBlock()->variable(index); } 1223 1137 unsigned numVariables() { return unlinkedEvalCodeBlock()->numVariables(); } 1224 1138 1225 private: 1226 EvalCodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, EvalCodeBlock& other) 1227 : GlobalCodeBlock(vm, structure, CopyParsedBlock, other) 1228 { 1229 } 1230 1231 EvalCodeBlock(VM* vm, Structure* structure, EvalExecutable* ownerExecutable, UnlinkedEvalCodeBlock* unlinkedCodeBlock, 1232 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider) 1233 : GlobalCodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, 0, 1) 1234 { 1235 } 1236 1237 static void destroy(JSCell*); 1238 1139 #if ENABLE(JIT) 1140 protected: 1141 virtual CodeBlock* replacement() override; 1142 virtual DFG::CapabilityLevel capabilityLevelInternal() override; 1143 #endif 1144 1239 1145 private: 1240 1146 UnlinkedEvalCodeBlock* unlinkedEvalCodeBlock() const { return jsCast<UnlinkedEvalCodeBlock*>(unlinkedCodeBlock()); } … … 1243 1149 class FunctionCodeBlock : public CodeBlock { 1244 1150 public: 1245 typedef CodeBlock Base; 1246 DECLARE_INFO; 1247 1248 static FunctionCodeBlock* create(VM* vm, CopyParsedBlockTag, FunctionCodeBlock& other) 1249 { 1250 FunctionCodeBlock* instance = new (NotNull, allocateCell<FunctionCodeBlock>(vm->heap)) 1251 FunctionCodeBlock(vm, vm->functionCodeBlockStructure.get(), CopyParsedBlock, other); 1252 instance->finishCreation(*vm, CopyParsedBlock, other); 1253 return instance; 1254 } 1255 1256 static FunctionCodeBlock* create(VM* vm, FunctionExecutable* ownerExecutable, UnlinkedFunctionCodeBlock* unlinkedCodeBlock, JSScope* scope, 1257 PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, unsigned firstLineColumnOffset) 1258 { 1259 FunctionCodeBlock* instance = new (NotNull, allocateCell<FunctionCodeBlock>(vm->heap)) 1260 FunctionCodeBlock(vm, vm->functionCodeBlockStructure.get(), ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, sourceOffset, firstLineColumnOffset); 1261 instance->finishCreation(*vm, ownerExecutable, unlinkedCodeBlock, scope); 1262 return instance; 1263 } 1264 1265 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) 1266 { 1267 return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info()); 1268 } 1269 1270 private: 1271 FunctionCodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, FunctionCodeBlock& other) 1272 : CodeBlock(vm, structure, CopyParsedBlock, other) 1273 { 1274 } 1275 1276 FunctionCodeBlock(VM* vm, Structure* structure, FunctionExecutable* ownerExecutable, UnlinkedFunctionCodeBlock* unlinkedCodeBlock, JSScope* scope, 1277 PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, unsigned firstLineColumnOffset) 1278 : CodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, sourceOffset, firstLineColumnOffset) 1279 { 1280 } 1281 1282 static void destroy(JSCell*); 1151 FunctionCodeBlock(CopyParsedBlockTag, FunctionCodeBlock& other) 1152 : CodeBlock(CopyParsedBlock, other) 1153 { 1154 } 1155 1156 FunctionCodeBlock(FunctionExecutable* ownerExecutable, UnlinkedFunctionCodeBlock* unlinkedCodeBlock, JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, unsigned firstLineColumnOffset) 1157 : CodeBlock(ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, sourceOffset, firstLineColumnOffset) 1158 { 1159 } 1160 1161 #if ENABLE(JIT) 1162 protected: 1163 virtual CodeBlock* replacement() override; 1164 virtual DFG::CapabilityLevel capabilityLevelInternal() override; 1165 #endif 1283 1166 }; 1284 1167 … … 1286 1169 class WebAssemblyCodeBlock : public CodeBlock { 1287 1170 public: 1288 DECLARE_INFO; 1289 1290 static WebAssemblyCodeBlock* create(VM* vm, CopyParsedBlockTag, WebAssemblyCodeBlock& other) 1291 { 1292 WebAssemblyCodeBlock* instance = new (NotNull, allocateCell<WebAssemblyCodeBlock>(vm->heap)) 1293 WebAssemblyCodeBlock(vm, vm->webAssemblyCodeBlockStructure.get(), CopyParsedBlock, other); 1294 instance->finishCreation(*vm); 1295 return instance; 1296 } 1297 1298 static WebAssemblyCodeBlock* create(VM* vm, WebAssemblyExecutable* ownerExecutable, JSGlobalObject* globalObject) 1299 { 1300 WebAssemblyCodeBlock* instance = new (NotNull, allocateCell<WebAssemblyCodeBlock>(vm->heap)) 1301 WebAssemblyCodeBlock(vm, vm->webAssemblyCodeBlockStructure.get(), ownerExecutable, globalObject); 1302 instance->finishCreation(*vm); 1303 return instance; 1304 } 1305 1306 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) 1307 { 1308 return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info()); 1309 } 1310 1311 private: 1312 WebAssemblyCodeBlock(VM& vm, Structure* structure, CopyParsedBlockTag, WebAssemblyCodeBlock& other) 1313 : CodeBlock(vm, structure, CopyParsedBlock, other) 1314 { 1315 } 1316 1317 WebAssemblyCodeBlock(VM& vm, Structure* structure, WebAssemblyExecutable* ownerExecutable, JSGlobalObject* globalObject) 1318 : CodeBlock(vm, structure, ownerExecutable, vm, globalObject) 1319 { 1320 } 1321 1322 static void destroy(JSCell*); 1171 WebAssemblyCodeBlock(CopyParsedBlockTag, WebAssemblyCodeBlock& other) 1172 : CodeBlock(CopyParsedBlock, other) 1173 { 1174 } 1175 1176 WebAssemblyCodeBlock(WebAssemblyExecutable* ownerExecutable, VM& vm, JSGlobalObject* globalObject) 1177 : CodeBlock(ownerExecutable, vm, globalObject) 1178 { 1179 } 1180 1181 #if ENABLE(JIT) 1182 protected: 1183 virtual CodeBlock* replacement() override; 1184 virtual DFG::CapabilityLevel capabilityLevelInternal() override; 1185 #endif 1323 1186 }; 1324 1187 #endif … … 1348 1211 } 1349 1212 1350 inline void CodeBlock::clear VisitWeaklyHasBeenCalled()1213 inline void CodeBlock::clearMarks() 1351 1214 { 1352 m_visitWeaklyHasBeenCalled.store(false, std::memory_order_relaxed); 1215 m_visitStronglyHasBeenCalled.store(false, std::memory_order_relaxed); 1216 m_visitAggregateHasBeenCalled.store(false, std::memory_order_relaxed); 1353 1217 } 1354 1218 … … 1375 1239 if (!codeBlock) 1376 1240 return; 1377 1378 // Try to recover gracefully if we forget to execute a barrier for a 1379 // CodeBlock that does value profiling. This is probably overkill, but we 1380 // have always done it. 1381 Heap::heap(codeBlock)->writeBarrier(codeBlock); 1241 1242 // Force GC to visit all CodeBlocks on the stack, including old CodeBlocks 1243 // that have not executed a barrier. This is overkill, but we have always 1244 // done this, and it might help us recover gracefully if we forget to execute 1245 // a barrier when a CodeBlock needs it. 1246 codeBlock->clearMarks(); 1382 1247 1383 1248 m_currentlyExecuting.add(codeBlock); … … 1388 1253 switch (type()) { 1389 1254 case ProgramExecutableType: { 1390 if (CodeBlock* codeBlock = static_cast<CodeBlock*>(jsCast<ProgramExecutable*>(this)->m_programCodeBlock.get()))1255 if (CodeBlock* codeBlock = jsCast<ProgramExecutable*>(this)->m_programCodeBlock.get()) 1391 1256 codeBlock->forEachRelatedCodeBlock(std::forward<Functor>(functor)); 1392 1257 break; … … 1394 1259 1395 1260 case EvalExecutableType: { 1396 if (CodeBlock* codeBlock = static_cast<CodeBlock*>(jsCast<EvalExecutable*>(this)->m_evalCodeBlock.get()))1261 if (CodeBlock* codeBlock = jsCast<EvalExecutable*>(this)->m_evalCodeBlock.get()) 1397 1262 codeBlock->forEachRelatedCodeBlock(std::forward<Functor>(functor)); 1398 1263 break; … … 1402 1267 Functor f(std::forward<Functor>(functor)); 1403 1268 FunctionExecutable* executable = jsCast<FunctionExecutable*>(this); 1404 if (CodeBlock* codeBlock = static_cast<CodeBlock*>(executable->m_codeBlockForCall.get()))1269 if (CodeBlock* codeBlock = executable->m_codeBlockForCall.get()) 1405 1270 codeBlock->forEachRelatedCodeBlock(f); 1406 if (CodeBlock* codeBlock = static_cast<CodeBlock*>(executable->m_codeBlockForConstruct.get()))1271 if (CodeBlock* codeBlock = executable->m_codeBlockForConstruct.get()) 1407 1272 codeBlock->forEachRelatedCodeBlock(f); 1408 1273 break; … … 1410 1275 1411 1276 case ModuleProgramExecutableType: { 1412 if (CodeBlock* codeBlock = static_cast<CodeBlock*>(jsCast<ModuleProgramExecutable*>(this)->m_moduleProgramCodeBlock.get()))1277 if (CodeBlock* codeBlock = jsCast<ModuleProgramExecutable*>(this)->m_moduleProgramCodeBlock.get()) 1413 1278 codeBlock->forEachRelatedCodeBlock(std::forward<Functor>(functor)); 1414 1279 break; -
trunk/Source/JavaScriptCore/bytecode/CodeOrigin.cpp
r190522 r190546 76 76 return true; 77 77 78 if (a.inlineCallFrame-> baselineCodeBlock.get() != b.inlineCallFrame->baselineCodeBlock.get())78 if (a.inlineCallFrame->executable.get() != b.inlineCallFrame->executable.get()) 79 79 return false; 80 80 … … 99 99 return result; 100 100 101 result += WTF::PtrHash<JSCell*>::hash(codeOrigin.inlineCallFrame-> baselineCodeBlock.get());101 result += WTF::PtrHash<JSCell*>::hash(codeOrigin.inlineCallFrame->executable.get()); 102 102 103 103 codeOrigin = codeOrigin.inlineCallFrame->directCaller; … … 116 116 } 117 117 118 CodeBlock* CodeOrigin::codeOriginOwner() const118 ScriptExecutable* CodeOrigin::codeOriginOwner() const 119 119 { 120 120 if (!inlineCallFrame) 121 121 return 0; 122 return inlineCallFrame-> baselineCodeBlock.get();122 return inlineCallFrame->executable.get(); 123 123 } 124 124 … … 144 144 145 145 if (InlineCallFrame* frame = stack[i].inlineCallFrame) { 146 out.print(frame->briefFunctionInformation(), ":<", RawPointer(frame-> baselineCodeBlock.get()), "> ");146 out.print(frame->briefFunctionInformation(), ":<", RawPointer(frame->executable.get()), "> "); 147 147 if (frame->isClosureCall) 148 148 out.print("(closure) "); -
trunk/Source/JavaScriptCore/bytecode/CodeOrigin.h
r190522 r190546 88 88 // If the code origin corresponds to inlined code, gives you the heap object that 89 89 // would have owned the code if it had not been inlined. Otherwise returns 0. 90 CodeBlock* codeOriginOwner() const;90 ScriptExecutable* codeOriginOwner() const; 91 91 92 92 int stackOffset() const; -
trunk/Source/JavaScriptCore/bytecode/DeferredCompilationCallback.cpp
r190522 r190546 34 34 DeferredCompilationCallback::~DeferredCompilationCallback() { } 35 35 36 void DeferredCompilationCallback::compilationDidComplete(CodeBlock* codeBlock, Co deBlock*, CompilationResult result)36 void DeferredCompilationCallback::compilationDidComplete(CodeBlock* codeBlock, CompilationResult result) 37 37 { 38 38 dumpCompiledSourcesIfNeeded(); -
trunk/Source/JavaScriptCore/bytecode/DeferredCompilationCallback.h
r190522 r190546 43 43 virtual ~DeferredCompilationCallback(); 44 44 45 virtual void compilationDidBecomeReadyAsynchronously(CodeBlock* , CodeBlock* profiledDFGCodeBlock) = 0;46 virtual void compilationDidComplete(CodeBlock*, Co deBlock* profiledDFGCodeBlock, CompilationResult);45 virtual void compilationDidBecomeReadyAsynchronously(CodeBlock*) = 0; 46 virtual void compilationDidComplete(CodeBlock*, CompilationResult); 47 47 48 48 Vector<DeferredSourceDump>& ensureDeferredSourceDump(); -
trunk/Source/JavaScriptCore/bytecode/EvalCodeCache.h
r190522 r190546 52 52 } 53 53 54 EvalExecutable* getSlow(ExecState* exec, JSCell* owner, bool inStrictContext, ThisTDZMode thisTDZMode, const String& evalSource, JSScope* scope)54 EvalExecutable* getSlow(ExecState* exec, ScriptExecutable* owner, bool inStrictContext, ThisTDZMode thisTDZMode, const String& evalSource, JSScope* scope) 55 55 { 56 56 VariableEnvironment variablesUnderTDZ; -
trunk/Source/JavaScriptCore/bytecode/InlineCallFrame.cpp
r190522 r190546 48 48 CodeBlockHash InlineCallFrame::hash() const 49 49 { 50 return baselineCodeBlock->hash(); 50 return jsCast<FunctionExecutable*>(executable.get())->codeBlockFor( 51 specializationKind())->hash(); 51 52 } 52 53 53 54 CString InlineCallFrame::hashAsStringIfPossible() const 54 55 { 55 return baselineCodeBlock->hashAsStringIfPossible(); 56 return jsCast<FunctionExecutable*>(executable.get())->codeBlockFor( 57 specializationKind())->hashAsStringIfPossible(); 56 58 } 57 59 58 60 CString InlineCallFrame::inferredName() const 59 61 { 60 return jsCast<FunctionExecutable*>(baselineCodeBlock->ownerExecutable())->inferredName().utf8(); 62 return jsCast<FunctionExecutable*>(executable.get())->inferredName().utf8(); 63 } 64 65 CodeBlock* InlineCallFrame::baselineCodeBlock() const 66 { 67 return jsCast<FunctionExecutable*>(executable.get())->baselineCodeBlockFor(specializationKind()); 61 68 } 62 69 … … 68 75 void InlineCallFrame::dumpInContext(PrintStream& out, DumpContext* context) const 69 76 { 70 out.print(briefFunctionInformation(), ":<", RawPointer( baselineCodeBlock.get()));71 if ( isStrictMode())77 out.print(briefFunctionInformation(), ":<", RawPointer(executable.get())); 78 if (executable->isStrictMode()) 72 79 out.print(" (StrictMode)"); 73 80 out.print(", bc#", directCaller.bytecodeIndex, ", ", static_cast<Kind>(kind)); -
trunk/Source/JavaScriptCore/bytecode/InlineCallFrame.h
r190522 r190546 30 30 #include "CodeBlockHash.h" 31 31 #include "CodeOrigin.h" 32 #include "Executable.h" 32 33 #include "ValueRecovery.h" 33 34 #include "WriteBarrier.h" … … 42 43 struct InlineCallFrame; 43 44 class ExecState; 45 class ScriptExecutable; 44 46 class JSFunction; 45 47 … … 173 175 174 176 Vector<ValueRecovery> arguments; // Includes 'this'. 175 WriteBarrier< CodeBlock> baselineCodeBlock;177 WriteBarrier<ScriptExecutable> executable; 176 178 ValueRecovery calleeRecovery; 177 179 CodeOrigin directCaller; … … 208 210 CString hashAsStringIfPossible() const; 209 211 212 CodeBlock* baselineCodeBlock() const; 213 210 214 void setStackOffset(signed offset) 211 215 { … … 216 220 ptrdiff_t callerFrameOffset() const { return stackOffset * sizeof(Register) + CallFrame::callerFrameOffset(); } 217 221 ptrdiff_t returnPCOffset() const { return stackOffset * sizeof(Register) + CallFrame::returnPCOffset(); } 218 219 bool isStrictMode() const { return baselineCodeBlock->isStrictMode(); }220 222 221 223 void dumpBriefFunctionInformation(PrintStream&) const; … … 230 232 { 231 233 RELEASE_ASSERT(inlineCallFrame); 232 return inlineCallFrame->baselineCodeBlock.get(); 234 ScriptExecutable* executable = inlineCallFrame->executable.get(); 235 RELEASE_ASSERT(executable->structure()->classInfo() == FunctionExecutable::info()); 236 return static_cast<FunctionExecutable*>(executable)->baselineCodeBlockFor(inlineCallFrame->specializationKind()); 233 237 } 234 238 -
trunk/Source/JavaScriptCore/bytecode/PolymorphicAccess.cpp
r190522 r190546 412 412 413 413 // We will emit code that has a weak reference that isn't otherwise listed anywhere. 414 state.weakReferences.append(WriteBarrier<JSCell>(vm, codeBlock , structure));414 state.weakReferences.append(WriteBarrier<JSCell>(vm, codeBlock->ownerExecutable(), structure)); 415 415 416 416 jit.move(CCallHelpers::TrustedImmPtr(condition.object()), scratchGPR); … … 1171 1171 doesCalls |= entry->doesCalls(); 1172 1172 1173 m_stubRoutine = createJITStubRoutine(code, vm, codeBlock , doesCalls);1173 m_stubRoutine = createJITStubRoutine(code, vm, codeBlock->ownerExecutable(), doesCalls); 1174 1174 m_watchpoints = WTF::move(state.watchpoints); 1175 1175 if (!state.weakReferences.isEmpty()) -
trunk/Source/JavaScriptCore/bytecode/StructureStubInfo.cpp
r190522 r190546 63 63 64 64 std::unique_ptr<AccessCase> previousCase = 65 AccessCase::fromStructureStubInfo(vm, codeBlock , *this);65 AccessCase::fromStructureStubInfo(vm, codeBlock->ownerExecutable(), *this); 66 66 if (previousCase) 67 67 accessCases.append(WTF::move(previousCase)); -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r190522 r190546 4634 4634 4635 4635 m_inlineCallFrame = byteCodeParser->m_graph.m_plan.inlineCallFrames->add(); 4636 byteCodeParser->m_graph.freeze(codeBlock-> baselineVersion());4636 byteCodeParser->m_graph.freeze(codeBlock->ownerExecutable()); 4637 4637 // The owner is the machine code block, and we already have a barrier on that when the 4638 4638 // plan finishes. 4639 m_inlineCallFrame-> baselineCodeBlock.setWithoutWriteBarrier(codeBlock->baselineVersion());4639 m_inlineCallFrame->executable.setWithoutWriteBarrier(codeBlock->ownerScriptExecutable()); 4640 4640 m_inlineCallFrame->setStackOffset(inlineCallFrameStart.offset() - JSStack::CallFrameHeaderSize); 4641 4641 if (callee) { … … 4829 4829 dataLog("Parsing ", *m_codeBlock, "\n"); 4830 4830 4831 m_dfgCodeBlock = m_graph.m_plan.profiledDFGCodeBlock ;4831 m_dfgCodeBlock = m_graph.m_plan.profiledDFGCodeBlock.get(); 4832 4832 if (isFTL(m_graph.m_plan.mode) && m_dfgCodeBlock 4833 4833 && Options::enablePolyvariantDevirtualization()) { -
trunk/Source/JavaScriptCore/dfg/DFGCommonData.cpp
r190522 r190546 90 90 } 91 91 92 if ( CodeBlock* baselineCodeBlock = inlineCallFrame->baselineCodeBlock.get())93 trackedReferences.check( baselineCodeBlock);92 if (ScriptExecutable* executable = inlineCallFrame->executable.get()) 93 trackedReferences.check(executable); 94 94 95 95 if (inlineCallFrame->calleeRecovery.isConstant()) -
trunk/Source/JavaScriptCore/dfg/DFGDesiredTransitions.cpp
r190522 r190546 35 35 namespace JSC { namespace DFG { 36 36 37 DesiredTransition::DesiredTransition(CodeBlock* codeBlock, CodeBlock* codeOriginOwner, Structure* oldStructure, Structure* newStructure)37 DesiredTransition::DesiredTransition(CodeBlock* codeBlock, ScriptExecutable* codeOriginOwner, Structure* oldStructure, Structure* newStructure) 38 38 : m_codeBlock(codeBlock) 39 39 , m_codeOriginOwner(codeOriginOwner) … … 47 47 common->transitions.append( 48 48 WeakReferenceTransition( 49 vm, m_codeBlock ,49 vm, m_codeBlock->ownerExecutable(), 50 50 m_codeOriginOwner, 51 51 m_oldStructure, m_newStructure)); … … 67 67 } 68 68 69 void DesiredTransitions::addLazily(CodeBlock* codeBlock, CodeBlock* codeOriginOwner, Structure* oldStructure, Structure* newStructure)69 void DesiredTransitions::addLazily(CodeBlock* codeBlock, ScriptExecutable* codeOriginOwner, Structure* oldStructure, Structure* newStructure) 70 70 { 71 71 m_transitions.append(DesiredTransition(codeBlock, codeOriginOwner, oldStructure, newStructure)); -
trunk/Source/JavaScriptCore/dfg/DFGDesiredTransitions.h
r190522 r190546 45 45 class DesiredTransition { 46 46 public: 47 DesiredTransition(CodeBlock*, CodeBlock* codeOriginOwner, Structure*, Structure*);47 DesiredTransition(CodeBlock*, ScriptExecutable*, Structure*, Structure*); 48 48 49 49 void reallyAdd(VM&, CommonData*); … … 53 53 private: 54 54 CodeBlock* m_codeBlock; 55 CodeBlock* m_codeOriginOwner;55 ScriptExecutable* m_codeOriginOwner; 56 56 Structure* m_oldStructure; 57 57 Structure* m_newStructure; … … 63 63 ~DesiredTransitions(); 64 64 65 void addLazily(CodeBlock*, CodeBlock* codeOriginOwner, Structure*, Structure*);65 void addLazily(CodeBlock*, ScriptExecutable*, Structure*, Structure*); 66 66 void reallyAdd(VM&, CommonData*); 67 67 void visitChildren(SlotVisitor&); -
trunk/Source/JavaScriptCore/dfg/DFGDesiredWeakReferences.cpp
r190522 r190546 71 71 if (Structure* structure = jsDynamicCast<Structure*>(target)) { 72 72 common->weakStructureReferences.append( 73 WriteBarrier<Structure>(vm, m_codeBlock , structure));73 WriteBarrier<Structure>(vm, m_codeBlock->ownerExecutable(), structure)); 74 74 } else { 75 75 common->weakReferences.append( 76 WriteBarrier<JSCell>(vm, m_codeBlock , target));76 WriteBarrier<JSCell>(vm, m_codeBlock->ownerExecutable(), target)); 77 77 } 78 78 } -
trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp
r190522 r190546 122 122 callback); 123 123 if (result != CompilationDeferred) 124 callback->compilationDidComplete(codeBlock, profiledDFGCodeBlock,result);124 callback->compilationDidComplete(codeBlock, result); 125 125 return result; 126 126 } -
trunk/Source/JavaScriptCore/dfg/DFGGraph.cpp
r190522 r190546 62 62 : m_vm(vm) 63 63 , m_plan(plan) 64 , m_codeBlock(m_plan.codeBlock )64 , m_codeBlock(m_plan.codeBlock.get()) 65 65 , m_profiledBlock(m_codeBlock->alternative()) 66 66 , m_allocator(longLivedState.m_allocator) -
trunk/Source/JavaScriptCore/dfg/DFGGraph.h
r190522 r190546 349 349 return m_codeBlock->ownerScriptExecutable(); 350 350 351 return inlineCallFrame-> baselineCodeBlock->ownerScriptExecutable();351 return inlineCallFrame->executable.get(); 352 352 } 353 353 … … 373 373 if (!codeOrigin.inlineCallFrame) 374 374 return m_codeBlock->isStrictMode(); 375 return codeOrigin.inlineCallFrame->isStrictMode();375 return jsCast<FunctionExecutable*>(codeOrigin.inlineCallFrame->executable.get())->isStrictMode(); 376 376 } 377 377 -
trunk/Source/JavaScriptCore/dfg/DFGJITCode.h
r190522 r190546 29 29 #if ENABLE(DFG_JIT) 30 30 31 #include "CodeBlock.h"32 31 #include "CompilationResult.h" 33 32 #include "DFGCommonData.h" … … 116 115 117 116 void shrinkToFit(); 118 119 #if ENABLE(FTL_JIT)120 CodeBlock* osrEntryBlock() { return m_osrEntryBlock.get(); }121 void setOSREntryBlock(VM& vm, const JSCell* owner, CodeBlock* osrEntryBlock) { m_osrEntryBlock.set(vm, owner, osrEntryBlock); }122 void clearOSREntryBlock() { m_osrEntryBlock.clear(); }123 #endif124 117 125 118 private: … … 136 129 uint8_t nestedTriggerIsSet { 0 }; 137 130 UpperTierExecutionCounter tierUpCounter; 138 WriteBarrier<CodeBlock> m_osrEntryBlock;131 RefPtr<CodeBlock> osrEntryBlock; 139 132 unsigned osrEntryRetry; 140 133 bool abandonOSREntry; -
trunk/Source/JavaScriptCore/dfg/DFGJITFinalizer.cpp
r190522 r190546 58 58 { 59 59 m_jitCode->initializeCodeRef( 60 FINALIZE_DFG_CODE(*m_linkBuffer, ("DFG JIT code for %s", toCString(CodeBlockWithJITType(m_plan.codeBlock , JITCode::DFGJIT)).data())),60 FINALIZE_DFG_CODE(*m_linkBuffer, ("DFG JIT code for %s", toCString(CodeBlockWithJITType(m_plan.codeBlock.get(), JITCode::DFGJIT)).data())), 61 61 MacroAssemblerCodePtr()); 62 62 … … 72 72 RELEASE_ASSERT(!m_withArityCheck.isEmptyValue()); 73 73 m_jitCode->initializeCodeRef( 74 FINALIZE_DFG_CODE(*m_linkBuffer, ("DFG JIT code for %s", toCString(CodeBlockWithJITType(m_plan.codeBlock , JITCode::DFGJIT)).data())),74 FINALIZE_DFG_CODE(*m_linkBuffer, ("DFG JIT code for %s", toCString(CodeBlockWithJITType(m_plan.codeBlock.get(), JITCode::DFGJIT)).data())), 75 75 m_withArityCheck); 76 76 m_plan.codeBlock->setJITCode(m_jitCode); … … 84 84 { 85 85 #if ENABLE(FTL_JIT) 86 m_jitCode->optimizeAfterWarmUp(m_plan.codeBlock );86 m_jitCode->optimizeAfterWarmUp(m_plan.codeBlock.get()); 87 87 #endif // ENABLE(FTL_JIT) 88 88 -
trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp
r190522 r190546 70 70 AssemblyHelpers::NonZero, 71 71 AssemblyHelpers::AbsoluteAddress( 72 inlineCallFrame-> baselineCodeBlock->ownerScriptExecutable()->addressOfDidTryToEnterInLoop())));72 inlineCallFrame->executable->addressOfDidTryToEnterInLoop()))); 73 73 } 74 74 … … 269 269 void adjustAndJumpToTarget(CCallHelpers& jit, const OSRExitBase& exit, bool isExitingToOpCatch) 270 270 { 271 CodeBlock* baselineCodeBlock = jit.baselineCodeBlockFor(exit.m_codeOrigin); 272 jit.move(AssemblyHelpers::TrustedImmPtr(baselineCodeBlock), GPRInfo::argumentGPR1); 271 jit.move(AssemblyHelpers::TrustedImmPtr(jit.codeBlock()->ownerExecutable()), GPRInfo::argumentGPR1); 273 272 osrWriteBarrier(jit, GPRInfo::argumentGPR1, GPRInfo::nonArgGPR0); 274 273 InlineCallFrameSet* inlineCallFrames = jit.codeBlock()->jitCode()->dfgCommon()->inlineCallFrames.get(); 275 274 if (inlineCallFrames) { 276 275 for (InlineCallFrame* inlineCallFrame : *inlineCallFrames) { 277 CodeBlock* baselineCodeBlock = inlineCallFrame->baselineCodeBlock.get();278 jit.move(AssemblyHelpers::TrustedImmPtr( baselineCodeBlock), GPRInfo::argumentGPR1);276 ScriptExecutable* ownerExecutable = inlineCallFrame->executable.get(); 277 jit.move(AssemblyHelpers::TrustedImmPtr(ownerExecutable), GPRInfo::argumentGPR1); 279 278 osrWriteBarrier(jit, GPRInfo::argumentGPR1, GPRInfo::nonArgGPR0); 280 279 } … … 284 283 jit.addPtr(AssemblyHelpers::TrustedImm32(exit.m_codeOrigin.inlineCallFrame->stackOffset * sizeof(EncodedJSValue)), GPRInfo::callFrameRegister); 285 284 285 CodeBlock* baselineCodeBlock = jit.baselineCodeBlockFor(exit.m_codeOrigin); 286 286 Vector<BytecodeAndMachineOffset>& decodedCodeMap = jit.decodedCodeMapFor(baselineCodeBlock); 287 287 -
trunk/Source/JavaScriptCore/dfg/DFGOSRExitPreparation.cpp
r190522 r190546 43 43 44 44 for (; codeOrigin.inlineCallFrame; codeOrigin = codeOrigin.inlineCallFrame->directCaller) { 45 CodeBlock* codeBlock = codeOrigin.inlineCallFrame->baselineCodeBlock .get();45 CodeBlock* codeBlock = codeOrigin.inlineCallFrame->baselineCodeBlock(); 46 46 if (codeBlock->jitType() == JSC::JITCode::BaselineJIT) 47 47 continue; -
trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp
r190522 r190546 1308 1308 bool didTryToEnterIntoInlinedLoops = false; 1309 1309 for (InlineCallFrame* inlineCallFrame = exit->m_codeOrigin.inlineCallFrame; inlineCallFrame; inlineCallFrame = inlineCallFrame->directCaller.inlineCallFrame) { 1310 if (inlineCallFrame-> baselineCodeBlock->ownerScriptExecutable()->didTryToEnterInLoop()) {1310 if (inlineCallFrame->executable->didTryToEnterInLoop()) { 1311 1311 didTryToEnterIntoInlinedLoops = true; 1312 1312 break; … … 1378 1378 // We need to compile the code. 1379 1379 compile( 1380 *vm, codeBlock->newReplacement() , codeBlock, FTLMode, UINT_MAX,1381 Operands<JSValue>(), ToFTLDeferredCompilationCallback::create( ));1380 *vm, codeBlock->newReplacement().get(), codeBlock, FTLMode, UINT_MAX, 1381 Operands<JSValue>(), ToFTLDeferredCompilationCallback::create(codeBlock)); 1382 1382 } 1383 1383 … … 1464 1464 return 0; 1465 1465 1466 if (CodeBlock* entryBlock = jitCode->osrEntryBlock ()) {1466 if (CodeBlock* entryBlock = jitCode->osrEntryBlock.get()) { 1467 1467 void* address = FTL::prepareOSREntry( 1468 1468 exec, codeBlock, entryBlock, bytecodeIndex, streamIndex); … … 1478 1478 // OSR entry failed. Oh no! This implies that we need to retry. We retry 1479 1479 // without exponential backoff and we only do this for the entry code block. 1480 jitCode-> clearOSREntryBlock();1480 jitCode->osrEntryBlock = nullptr; 1481 1481 jitCode->osrEntryRetry = 0; 1482 1482 return 0; … … 1495 1495 jitCode->reconstruct( 1496 1496 exec, codeBlock, CodeOrigin(bytecodeIndex), streamIndex, mustHandleValues); 1497 CodeBlock*replacementCodeBlock = codeBlock->newReplacement();1497 RefPtr<CodeBlock> replacementCodeBlock = codeBlock->newReplacement(); 1498 1498 CompilationResult forEntryResult = compile( 1499 *vm, replacementCodeBlock, codeBlock, FTLForOSREntryMode, bytecodeIndex, 1500 mustHandleValues, ToFTLForOSREntryDeferredCompilationCallback::create()); 1501 1502 if (forEntryResult != CompilationSuccessful) 1499 *vm, replacementCodeBlock.get(), codeBlock, FTLForOSREntryMode, bytecodeIndex, 1500 mustHandleValues, ToFTLForOSREntryDeferredCompilationCallback::create(codeBlock)); 1501 1502 if (forEntryResult != CompilationSuccessful) { 1503 ASSERT(forEntryResult == CompilationDeferred || replacementCodeBlock->hasOneRef()); 1503 1504 return 0; 1505 } 1504 1506 1505 1507 // It's possible that the for-entry compile already succeeded. In that case OSR … … 1507 1509 // We signal to try again after a while if that happens. 1508 1510 void* address = FTL::prepareOSREntry( 1509 exec, codeBlock, jitCode->osrEntryBlock (), bytecodeIndex, streamIndex);1511 exec, codeBlock, jitCode->osrEntryBlock.get(), bytecodeIndex, streamIndex); 1510 1512 return static_cast<char*>(address); 1511 1513 } -
trunk/Source/JavaScriptCore/dfg/DFGPlan.cpp
r190522 r190546 132 132 } // anonymous namespace 133 133 134 Plan::Plan( CodeBlock*passedCodeBlock, CodeBlock* profiledDFGCodeBlock,134 Plan::Plan(PassRefPtr<CodeBlock> passedCodeBlock, CodeBlock* profiledDFGCodeBlock, 135 135 CompilationMode mode, unsigned osrEntryBytecodeIndex, 136 136 const Operands<JSValue>& mustHandleValues) … … 141 141 , osrEntryBytecodeIndex(osrEntryBytecodeIndex) 142 142 , mustHandleValues(mustHandleValues) 143 , compilation(codeBlock->vm()->m_perBytecodeProfiler ? adoptRef(new Profiler::Compilation(codeBlock->vm()->m_perBytecodeProfiler->ensureBytecodesFor(codeBlock ), profilerCompilationKindForMode(mode))) : 0)143 , compilation(codeBlock->vm()->m_perBytecodeProfiler ? adoptRef(new Profiler::Compilation(codeBlock->vm()->m_perBytecodeProfiler->ensureBytecodesFor(codeBlock.get()), profilerCompilationKindForMode(mode))) : 0) 144 144 , inlineCallFrames(adoptRef(new InlineCallFrameSet())) 145 , identifiers(codeBlock )146 , weakReferences(codeBlock )145 , identifiers(codeBlock.get()) 146 , weakReferences(codeBlock.get()) 147 147 , willTryToTierUp(false) 148 148 , stage(Preparing) … … 536 536 void Plan::reallyAdd(CommonData* commonData) 537 537 { 538 watchpoints.reallyAdd(codeBlock , *commonData);538 watchpoints.reallyAdd(codeBlock.get(), *commonData); 539 539 identifiers.reallyAdd(vm, commonData); 540 540 weakReferences.reallyAdd(vm, commonData); … … 554 554 void Plan::notifyReady() 555 555 { 556 callback->compilationDidBecomeReadyAsynchronously(codeBlock , profiledDFGCodeBlock);556 callback->compilationDidBecomeReadyAsynchronously(codeBlock.get()); 557 557 stage = Ready; 558 558 } … … 561 561 { 562 562 // We will establish new references from the code block to things. So, we need a barrier. 563 vm.heap.writeBarrier(codeBlock );563 vm.heap.writeBarrier(codeBlock->ownerExecutable()); 564 564 565 565 if (!isStillValid()) … … 597 597 void Plan::finalizeAndNotifyCallback() 598 598 { 599 callback->compilationDidComplete(codeBlock , profiledDFGCodeBlock, finalizeWithoutNotifyingCallback());599 callback->compilationDidComplete(codeBlock.get(), finalizeWithoutNotifyingCallback()); 600 600 } 601 601 … … 605 605 } 606 606 607 void Plan:: rememberCodeBlocks()607 void Plan::clearCodeBlockMarks() 608 608 { 609 609 // Compilation writes lots of values to a CodeBlock without performing … … 611 611 // all our CodeBlocks must be visited during GC. 612 612 613 Heap::heap(codeBlock)->writeBarrier(codeBlock); 613 codeBlock->clearMarks(); 614 codeBlock->alternative()->clearMarks(); 614 615 if (profiledDFGCodeBlock) 615 Heap::heap(profiledDFGCodeBlock)->writeBarrier(profiledDFGCodeBlock);616 profiledDFGCodeBlock->clearMarks(); 616 617 } 617 618 … … 624 625 visitor.appendUnbarrieredValue(&mustHandleValues[i]); 625 626 626 visitor.appendUnbarrieredReadOnlyPointer(codeBlock); 627 visitor.appendUnbarrieredReadOnlyPointer(profiledDFGCodeBlock); 627 codeBlock->visitStrongly(visitor); 628 codeBlock->alternative()->visitStrongly(visitor); 629 if (profiledDFGCodeBlock) 630 profiledDFGCodeBlock->visitStrongly(visitor); 628 631 629 632 if (inlineCallFrames) { 630 633 for (auto* inlineCallFrame : *inlineCallFrames) { 631 ASSERT(inlineCallFrame->baselineCodeBlock .get());632 visitor.appendUnbarrieredReadOnlyPointer(inlineCallFrame->baselineCodeBlock.get());634 ASSERT(inlineCallFrame->baselineCodeBlock()); 635 inlineCallFrame->baselineCodeBlock()->visitStrongly(visitor); 633 636 } 634 637 } -
trunk/Source/JavaScriptCore/dfg/DFGPlan.h
r190522 r190546 56 56 struct Plan : public ThreadSafeRefCounted<Plan> { 57 57 Plan( 58 CodeBlock*codeBlockToCompile, CodeBlock* profiledDFGCodeBlock,58 PassRefPtr<CodeBlock> codeBlockToCompile, CodeBlock* profiledDFGCodeBlock, 59 59 CompilationMode, unsigned osrEntryBytecodeIndex, 60 60 const Operands<JSValue>& mustHandleValues); … … 72 72 CompilationKey key(); 73 73 74 void rememberCodeBlocks();74 void clearCodeBlockMarks(); 75 75 void checkLivenessAndVisitChildren(SlotVisitor&); 76 76 bool isKnownToBeLiveDuringGC(); … … 78 78 79 79 VM& vm; 80 81 // These can be raw pointers because we visit them during every GC in checkLivenessAndVisitChildren. 82 CodeBlock* codeBlock; 83 CodeBlock* profiledDFGCodeBlock; 84 80 RefPtr<CodeBlock> codeBlock; 81 RefPtr<CodeBlock> profiledDFGCodeBlock; 85 82 CompilationMode mode; 86 83 const unsigned osrEntryBytecodeIndex; -
trunk/Source/JavaScriptCore/dfg/DFGToFTLDeferredCompilationCallback.cpp
r190522 r190546 36 36 namespace JSC { namespace DFG { 37 37 38 ToFTLDeferredCompilationCallback::ToFTLDeferredCompilationCallback() 38 ToFTLDeferredCompilationCallback::ToFTLDeferredCompilationCallback( 39 PassRefPtr<CodeBlock> dfgCodeBlock) 40 : m_dfgCodeBlock(dfgCodeBlock) 39 41 { 40 42 } … … 42 44 ToFTLDeferredCompilationCallback::~ToFTLDeferredCompilationCallback() { } 43 45 44 Ref<ToFTLDeferredCompilationCallback> ToFTLDeferredCompilationCallback::create( )46 Ref<ToFTLDeferredCompilationCallback> ToFTLDeferredCompilationCallback::create(PassRefPtr<CodeBlock> dfgCodeBlock) 45 47 { 46 return adoptRef(*new ToFTLDeferredCompilationCallback( ));48 return adoptRef(*new ToFTLDeferredCompilationCallback(dfgCodeBlock)); 47 49 } 48 50 49 51 void ToFTLDeferredCompilationCallback::compilationDidBecomeReadyAsynchronously( 50 CodeBlock* codeBlock , CodeBlock* profiledDFGCodeBlock)52 CodeBlock* codeBlock) 51 53 { 52 54 if (Options::verboseOSR()) { 53 55 dataLog( 54 "Optimizing compilation of ", *codeBlock, " (for ", * profiledDFGCodeBlock,56 "Optimizing compilation of ", *codeBlock, " (for ", *m_dfgCodeBlock, 55 57 ") did become ready.\n"); 56 58 } 57 59 58 profiledDFGCodeBlock->jitCode()->dfg()->forceOptimizationSlowPathConcurrently(59 profiledDFGCodeBlock);60 m_dfgCodeBlock->jitCode()->dfg()->forceOptimizationSlowPathConcurrently( 61 m_dfgCodeBlock.get()); 60 62 } 61 63 62 64 void ToFTLDeferredCompilationCallback::compilationDidComplete( 63 CodeBlock* codeBlock, Co deBlock* profiledDFGCodeBlock, CompilationResult result)65 CodeBlock* codeBlock, CompilationResult result) 64 66 { 65 67 if (Options::verboseOSR()) { 66 68 dataLog( 67 "Optimizing compilation of ", *codeBlock, " (for ", * profiledDFGCodeBlock,69 "Optimizing compilation of ", *codeBlock, " (for ", *m_dfgCodeBlock, 68 70 ") result: ", result, "\n"); 69 71 } 70 72 71 if ( profiledDFGCodeBlock->replacement() != profiledDFGCodeBlock) {73 if (m_dfgCodeBlock->replacement() != m_dfgCodeBlock) { 72 74 if (Options::verboseOSR()) { 73 75 dataLog( 74 76 "Dropping FTL code block ", *codeBlock, " on the floor because the " 75 "DFG code block ", * profiledDFGCodeBlock, " was jettisoned.\n");77 "DFG code block ", *m_dfgCodeBlock, " was jettisoned.\n"); 76 78 } 77 79 return; … … 81 83 codeBlock->ownerScriptExecutable()->installCode(codeBlock); 82 84 83 profiledDFGCodeBlock->jitCode()->dfg()->setOptimizationThresholdBasedOnCompilationResult(84 profiledDFGCodeBlock, result);85 m_dfgCodeBlock->jitCode()->dfg()->setOptimizationThresholdBasedOnCompilationResult( 86 m_dfgCodeBlock.get(), result); 85 87 86 DeferredCompilationCallback::compilationDidComplete(codeBlock, profiledDFGCodeBlock,result);88 DeferredCompilationCallback::compilationDidComplete(codeBlock, result); 87 89 } 88 90 -
trunk/Source/JavaScriptCore/dfg/DFGToFTLDeferredCompilationCallback.h
r190522 r190546 41 41 class ToFTLDeferredCompilationCallback : public DeferredCompilationCallback { 42 42 protected: 43 ToFTLDeferredCompilationCallback( );43 ToFTLDeferredCompilationCallback(PassRefPtr<CodeBlock> dfgCodeBlock); 44 44 45 45 public: 46 46 virtual ~ToFTLDeferredCompilationCallback(); 47 47 48 static Ref<ToFTLDeferredCompilationCallback> create( );48 static Ref<ToFTLDeferredCompilationCallback> create(PassRefPtr<CodeBlock> dfgCodeBlock); 49 49 50 virtual void compilationDidBecomeReadyAsynchronously(CodeBlock*, CodeBlock* profiledDFGCodeBlock); 51 virtual void compilationDidComplete(CodeBlock*, CodeBlock* profiledDFGCodeBlock, CompilationResult); 50 virtual void compilationDidBecomeReadyAsynchronously(CodeBlock*); 51 virtual void compilationDidComplete(CodeBlock*, CompilationResult); 52 53 private: 54 RefPtr<CodeBlock> m_dfgCodeBlock; 52 55 }; 53 56 -
trunk/Source/JavaScriptCore/dfg/DFGToFTLForOSREntryDeferredCompilationCallback.cpp
r190522 r190546 36 36 namespace JSC { namespace DFG { 37 37 38 ToFTLForOSREntryDeferredCompilationCallback::ToFTLForOSREntryDeferredCompilationCallback() 38 ToFTLForOSREntryDeferredCompilationCallback::ToFTLForOSREntryDeferredCompilationCallback( 39 PassRefPtr<CodeBlock> dfgCodeBlock) 40 : m_dfgCodeBlock(dfgCodeBlock) 39 41 { 40 42 } … … 44 46 } 45 47 46 Ref<ToFTLForOSREntryDeferredCompilationCallback>ToFTLForOSREntryDeferredCompilationCallback::create() 48 Ref<ToFTLForOSREntryDeferredCompilationCallback>ToFTLForOSREntryDeferredCompilationCallback::create( 49 PassRefPtr<CodeBlock> dfgCodeBlock) 47 50 { 48 return adoptRef(*new ToFTLForOSREntryDeferredCompilationCallback( ));51 return adoptRef(*new ToFTLForOSREntryDeferredCompilationCallback(dfgCodeBlock)); 49 52 } 50 53 51 54 void ToFTLForOSREntryDeferredCompilationCallback::compilationDidBecomeReadyAsynchronously( 52 CodeBlock* codeBlock , CodeBlock* profiledDFGCodeBlock)55 CodeBlock* codeBlock) 53 56 { 54 57 if (Options::verboseOSR()) { 55 58 dataLog( 56 "Optimizing compilation of ", *codeBlock, " (for ", * profiledDFGCodeBlock,59 "Optimizing compilation of ", *codeBlock, " (for ", *m_dfgCodeBlock, 57 60 ") did become ready.\n"); 58 61 } 59 62 60 profiledDFGCodeBlock->jitCode()->dfg()->forceOptimizationSlowPathConcurrently(61 profiledDFGCodeBlock);63 m_dfgCodeBlock->jitCode()->dfg()->forceOptimizationSlowPathConcurrently( 64 m_dfgCodeBlock.get()); 62 65 } 63 66 64 67 void ToFTLForOSREntryDeferredCompilationCallback::compilationDidComplete( 65 CodeBlock* codeBlock, Co deBlock* profiledDFGCodeBlock, CompilationResult result)68 CodeBlock* codeBlock, CompilationResult result) 66 69 { 67 70 if (Options::verboseOSR()) { 68 71 dataLog( 69 "Optimizing compilation of ", *codeBlock, " (for ", * profiledDFGCodeBlock,72 "Optimizing compilation of ", *codeBlock, " (for ", *m_dfgCodeBlock, 70 73 ") result: ", result, "\n"); 71 74 } 72 75 73 JITCode* jitCode = profiledDFGCodeBlock->jitCode()->dfg();76 JITCode* jitCode = m_dfgCodeBlock->jitCode()->dfg(); 74 77 75 78 switch (result) { 76 79 case CompilationSuccessful: 77 jitCode-> setOSREntryBlock(*codeBlock->vm(), profiledDFGCodeBlock, codeBlock);80 jitCode->osrEntryBlock = codeBlock; 78 81 break; 79 82 case CompilationFailed: … … 88 91 } 89 92 90 DeferredCompilationCallback::compilationDidComplete(codeBlock, profiledDFGCodeBlock,result);93 DeferredCompilationCallback::compilationDidComplete(codeBlock, result); 91 94 } 92 95 -
trunk/Source/JavaScriptCore/dfg/DFGToFTLForOSREntryDeferredCompilationCallback.h
r190522 r190546 41 41 class ToFTLForOSREntryDeferredCompilationCallback : public DeferredCompilationCallback { 42 42 protected: 43 ToFTLForOSREntryDeferredCompilationCallback( );43 ToFTLForOSREntryDeferredCompilationCallback(PassRefPtr<CodeBlock> dfgCodeBlock); 44 44 45 45 public: 46 46 virtual ~ToFTLForOSREntryDeferredCompilationCallback(); 47 47 48 static Ref<ToFTLForOSREntryDeferredCompilationCallback> create( );48 static Ref<ToFTLForOSREntryDeferredCompilationCallback> create(PassRefPtr<CodeBlock> dfgCodeBlock); 49 49 50 virtual void compilationDidBecomeReadyAsynchronously(CodeBlock*, CodeBlock* profiledDFGCodeBlock); 51 virtual void compilationDidComplete(CodeBlock*, CodeBlock* profiledDFGCodeBlock, CompilationResult); 50 virtual void compilationDidBecomeReadyAsynchronously(CodeBlock*); 51 virtual void compilationDidComplete(CodeBlock*, CompilationResult); 52 53 private: 54 RefPtr<CodeBlock> m_dfgCodeBlock; 52 55 }; 53 56 -
trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp
r190522 r190546 208 208 } 209 209 210 void Worklist:: rememberCodeBlocks(VM& vm)210 void Worklist::clearCodeBlockMarks(VM& vm) 211 211 { 212 212 LockHolder locker(m_lock); … … 215 215 if (&plan->vm != &vm) 216 216 continue; 217 plan-> rememberCodeBlocks();217 plan->clearCodeBlockMarks(); 218 218 } 219 219 } … … 468 468 } 469 469 470 void rememberCodeBlocks(VM& vm)470 void clearCodeBlockMarks(VM& vm) 471 471 { 472 472 for (unsigned i = DFG::numberOfWorklists(); i--;) { 473 473 if (DFG::Worklist* worklist = DFG::worklistForIndexOrNull(i)) 474 worklist-> rememberCodeBlocks(vm);474 worklist->clearCodeBlockMarks(vm); 475 475 } 476 476 } -
trunk/Source/JavaScriptCore/dfg/DFGWorklist.h
r190522 r190546 58 58 void completeAllPlansForVM(VM&); 59 59 60 void rememberCodeBlocks(VM&);60 void clearCodeBlockMarks(VM&); 61 61 62 62 void waitUntilAllPlansForVMAreReady(VM&); … … 142 142 143 143 void completeAllPlansForVM(VM&); 144 void rememberCodeBlocks(VM&);144 void clearCodeBlockMarks(VM&); 145 145 146 146 } } // namespace JSC::DFG -
trunk/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp
r190522 r190546 100 100 FINALIZE_DFG_CODE( 101 101 *exitThunksLinkBuffer, 102 ("FTL exit thunks for %s", toCString(CodeBlockWithJITType(m_plan.codeBlock , JITCode::FTLJIT)).data())));102 ("FTL exit thunks for %s", toCString(CodeBlockWithJITType(m_plan.codeBlock.get(), JITCode::FTLJIT)).data()))); 103 103 } // else this function had no OSR exits, so no exit thunks. 104 104 … … 117 117 *sideCodeLinkBuffer, 118 118 ("FTL side code for %s", 119 toCString(CodeBlockWithJITType(m_plan.codeBlock , JITCode::FTLJIT)).data()))119 toCString(CodeBlockWithJITType(m_plan.codeBlock.get(), JITCode::FTLJIT)).data())) 120 120 .executableMemory()); 121 121 } … … 125 125 *handleExceptionsLinkBuffer, 126 126 ("FTL exception handler for %s", 127 toCString(CodeBlockWithJITType(m_plan.codeBlock , JITCode::FTLJIT)).data()))127 toCString(CodeBlockWithJITType(m_plan.codeBlock.get(), JITCode::FTLJIT)).data())) 128 128 .executableMemory()); 129 129 } … … 138 138 FINALIZE_DFG_CODE( 139 139 *entrypointLinkBuffer, 140 ("FTL entrypoint thunk for %s with LLVM generated code at %p", toCString(CodeBlockWithJITType(m_plan.codeBlock , JITCode::FTLJIT)).data(), function)));140 ("FTL entrypoint thunk for %s with LLVM generated code at %p", toCString(CodeBlockWithJITType(m_plan.codeBlock.get(), JITCode::FTLJIT)).data(), function))); 141 141 142 142 m_plan.codeBlock->setJITCode(jitCode); -
trunk/Source/JavaScriptCore/heap/CodeBlockSet.cpp
r190522 r190546 42 42 CodeBlockSet::~CodeBlockSet() 43 43 { 44 for (CodeBlock* codeBlock : m_oldCodeBlocks) 45 codeBlock->deref(); 46 47 for (CodeBlock* codeBlock : m_newCodeBlocks) 48 codeBlock->deref(); 44 49 } 45 50 46 void CodeBlockSet::add( CodeBlock*codeBlock)51 void CodeBlockSet::add(PassRefPtr<CodeBlock> codeBlock) 47 52 { 48 bool isNewEntry = m_newCodeBlocks.add(codeBlock).isNewEntry; 53 CodeBlock* block = codeBlock.leakRef(); 54 bool isNewEntry = m_newCodeBlocks.add(block).isNewEntry; 49 55 ASSERT_UNUSED(isNewEntry, isNewEntry); 50 56 } … … 59 65 { 60 66 for (CodeBlock* codeBlock : m_oldCodeBlocks) 61 codeBlock->clear VisitWeaklyHasBeenCalled();67 codeBlock->clearMarks(); 62 68 63 69 // We promote after we clear marks on the old generation CodeBlocks because … … 66 72 } 67 73 74 void CodeBlockSet::clearMarksForEdenCollection(const Vector<const JSCell*>& rememberedSet) 75 { 76 // This ensures that we will revisit CodeBlocks in remembered Executables even if they were previously marked. 77 for (const JSCell* cell : rememberedSet) { 78 ScriptExecutable* executable = const_cast<ScriptExecutable*>(jsDynamicCast<const ScriptExecutable*>(cell)); 79 if (!executable) 80 continue; 81 executable->forEachCodeBlock([this](CodeBlock* codeBlock) { 82 codeBlock->clearMarks(); 83 m_remembered.add(codeBlock); 84 }); 85 } 86 } 87 68 88 void CodeBlockSet::deleteUnmarkedAndUnreferenced(HeapOperation collectionType) 69 89 { 70 90 HashSet<CodeBlock*>& set = collectionType == EdenCollection ? m_newCodeBlocks : m_oldCodeBlocks; 71 Vector<CodeBlock*> unmarked;72 for (CodeBlock* codeBlock : set) {73 if (Heap::isMarked(codeBlock))74 continue;75 unmarked.append(codeBlock);76 }77 91 78 for (CodeBlock* codeBlock : unmarked) { 79 codeBlock->classInfo()->methodTable.destroy(codeBlock); 80 set.remove(codeBlock); 92 // This needs to be a fixpoint because code blocks that are unmarked may 93 // refer to each other. For example, a DFG code block that is owned by 94 // the GC may refer to an FTL for-entry code block that is also owned by 95 // the GC. 96 Vector<CodeBlock*, 16> toRemove; 97 if (verbose) 98 dataLog("Fixpointing over unmarked, set size = ", set.size(), "...\n"); 99 for (;;) { 100 for (CodeBlock* codeBlock : set) { 101 if (!codeBlock->hasOneRef()) 102 continue; 103 codeBlock->deref(); 104 toRemove.append(codeBlock); 105 } 106 if (verbose) 107 dataLog(" Removing ", toRemove.size(), " blocks.\n"); 108 if (toRemove.isEmpty()) 109 break; 110 for (CodeBlock* codeBlock : toRemove) 111 set.remove(codeBlock); 112 toRemove.resize(0); 81 113 } 82 114 … … 88 120 void CodeBlockSet::remove(CodeBlock* codeBlock) 89 121 { 122 codeBlock->deref(); 90 123 if (m_oldCodeBlocks.contains(codeBlock)) { 91 124 m_oldCodeBlocks.remove(codeBlock); … … 96 129 } 97 130 131 void CodeBlockSet::traceMarked(SlotVisitor& visitor) 132 { 133 if (verbose) 134 dataLog("Tracing ", m_currentlyExecuting.size(), " code blocks.\n"); 135 136 // We strongly visit the currently executing set because jettisoning code 137 // is not valuable once it's on the stack. We're past the point where 138 // jettisoning would avoid the cost of OSR exit. 139 for (const RefPtr<CodeBlock>& codeBlock : m_currentlyExecuting) 140 codeBlock->visitStrongly(visitor); 141 142 // We strongly visit the remembered set because jettisoning old code during 143 // Eden GC is unsound. There might be an old object with a strong reference 144 // to the code. 145 for (const RefPtr<CodeBlock>& codeBlock : m_remembered) 146 codeBlock->visitStrongly(visitor); 147 } 148 98 149 void CodeBlockSet::rememberCurrentlyExecutingCodeBlocks(Heap* heap) 99 150 { 100 151 if (verbose) 101 152 dataLog("Remembering ", m_currentlyExecuting.size(), " code blocks.\n"); 102 for (CodeBlock* codeBlock : m_currentlyExecuting) 103 heap->addToRememberedSet(codeBlock); 153 for (const RefPtr<CodeBlock>& codeBlock : m_currentlyExecuting) 154 heap->addToRememberedSet(codeBlock->ownerExecutable()); 155 156 // It's safe to clear these RefPtr sets because we won't delete the CodeBlocks 157 // in them until the next GC, and we'll recompute them at that time. 104 158 m_currentlyExecuting.clear(); 159 m_remembered.clear(); 105 160 } 106 161 … … 117 172 out.print("], currentlyExecuting = ["); 118 173 comma = CommaPrinter(); 119 for ( CodeBlock*codeBlock : m_currentlyExecuting)120 out.print(comma, pointerDump(codeBlock ));174 for (const RefPtr<CodeBlock>& codeBlock : m_currentlyExecuting) 175 out.print(comma, pointerDump(codeBlock.get())); 121 176 out.print("]}"); 122 177 } -
trunk/Source/JavaScriptCore/heap/CodeBlockSet.h
r190522 r190546 54 54 55 55 // Add a CodeBlock. This is only called by CodeBlock constructors. 56 void add( CodeBlock*);56 void add(PassRefPtr<CodeBlock>); 57 57 58 // Clear mark bits for certain CodeBlocks depending on the type of collection. 59 void clearMarksForEdenCollection(const Vector<const JSCell*>&); 60 58 61 // Clear all mark bits for all CodeBlocks. 59 62 void clearMarksForFullCollection(); … … 70 73 void remove(CodeBlock*); 71 74 75 // Trace all marked code blocks. The CodeBlock is free to make use of 76 // mayBeExecuting. 77 void traceMarked(SlotVisitor&); 78 72 79 // Add all currently executing CodeBlocks to the remembered set to be 73 80 // re-scanned during the next collection. … … 98 105 void promoteYoungCodeBlocks(); 99 106 107 // This is not a set of RefPtr<CodeBlock> because we need to be able to find 108 // arbitrary bogus pointers. I could have written a thingy that had peek types 109 // and all, but that seemed like overkill. 100 110 HashSet<CodeBlock*> m_oldCodeBlocks; 101 111 HashSet<CodeBlock*> m_newCodeBlocks; 102 HashSet<CodeBlock*> m_currentlyExecuting; 112 HashSet<RefPtr<CodeBlock>> m_currentlyExecuting; 113 HashSet<RefPtr<CodeBlock>> m_remembered; 103 114 }; 104 115 -
trunk/Source/JavaScriptCore/heap/Heap.cpp
r190527 r190546 521 521 ASSERT(isValidThreadState(m_vm)); 522 522 523 Vector<const JSCell*> rememberedSet(m_slotVisitor.markStack().size()); 524 m_slotVisitor.markStack().fillVector(rememberedSet); 525 526 #if ENABLE(DFG_JIT) 527 DFG::clearCodeBlockMarks(*m_vm); 528 #endif 529 if (m_operationInProgress == EdenCollection) 530 m_codeBlocks.clearMarksForEdenCollection(rememberedSet); 531 else 532 m_codeBlocks.clearMarksForFullCollection(); 533 523 534 // We gather conservative roots before clearing mark bits because conservative 524 535 // gathering uses the mark bits to determine whether a reference is valid. … … 528 539 gatherScratchBufferRoots(conservativeRoots); 529 540 530 #if ENABLE(DFG_JIT) 531 DFG::rememberCodeBlocks(*m_vm); 532 #endif 533 534 if (m_operationInProgress == FullCollection) { 541 clearLivenessData(); 542 543 if (m_operationInProgress == FullCollection) 535 544 m_opaqueRoots.clear(); 536 m_slotVisitor.clearMarkStack();537 }538 539 Vector<const JSCell*> rememberedSet(m_slotVisitor.markStack().size());540 m_slotVisitor.markStack().fillVector(rememberedSet);541 542 clearLivenessData();543 544 545 545 546 m_shouldHashCons = m_vm->haveEnoughNewStringsToHashCons(); … … 582 583 ParallelModeEnabler enabler(m_slotVisitor); 583 584 584 m_slotVisitor.donateAndDrain();585 585 visitExternalRememberedSet(); 586 586 visitSmallStrings(); … … 698 698 { 699 699 GCPHASE(ClearLivenessData); 700 if (m_operationInProgress == FullCollection)701 m_codeBlocks.clearMarksForFullCollection();702 703 700 m_objectSpace.clearNewlyAllocated(); 704 701 m_objectSpace.clearMarks(); … … 822 819 { 823 820 GCPHASE(TraceCodeBlocksAndJITStubRoutines); 821 m_codeBlocks.traceMarked(m_slotVisitor); 824 822 m_jitStubRoutines.traceMarkedStubRoutines(m_slotVisitor); 825 823 … … 966 964 // we'll end up returning to deleted code. 967 965 RELEASE_ASSERT(!m_vm->entryScope); 968 ASSERT(m_operationInProgress == NoOperation);969 966 970 967 completeAllDFGPlans(); 971 968 972 for (ExecutableBase* executable : m_executables) 973 executable->clearCode(); 969 for (ExecutableBase* current : m_executables) { 970 if (!current->isFunctionExecutable()) 971 continue; 972 static_cast<FunctionExecutable*>(current)->clearCode(); 973 } 974 975 ASSERT(m_operationInProgress == FullCollection || m_operationInProgress == NoOperation); 976 m_codeBlocks.clearMarksForFullCollection(); 977 m_codeBlocks.deleteUnmarkedAndUnreferenced(FullCollection); 974 978 } 975 979 … … 991 995 continue; 992 996 993 // Eagerly dereference the Executable's JITCode in order to run watchpoint994 // destructors. Otherwise, watchpoints might fire for deleted CodeBlocks.995 current->clearCode();997 // We do this because executable memory is limited on some platforms and because 998 // CodeBlock requires eager finalization. 999 ExecutableBase::clearCodeVirtual(current); 996 1000 std::swap(m_executables[i], m_executables.last()); 997 1001 m_executables.removeLast(); … … 1147 1151 if (shouldDoFullCollection(collectionType)) { 1148 1152 m_operationInProgress = FullCollection; 1153 m_slotVisitor.clearMarkStack(); 1149 1154 m_shouldDoFullCollection = false; 1150 1155 if (Options::logGC()) -
trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp
r190522 r190546 174 174 175 175 ThisTDZMode thisTDZMode = callerCodeBlock->unlinkedCodeBlock()->constructorKind() == ConstructorKind::Derived ? ThisTDZMode::AlwaysCheck : ThisTDZMode::CheckIfNeeded; 176 eval = callerCodeBlock->evalCodeCache().getSlow(callFrame, callerCodeBlock , callerCodeBlock->isStrictMode(), thisTDZMode, programSource, callerScopeChain);176 eval = callerCodeBlock->evalCodeCache().getSlow(callFrame, callerCodeBlock->ownerScriptExecutable(), callerCodeBlock->isStrictMode(), thisTDZMode, programSource, callerScopeChain); 177 177 if (!eval) 178 178 return jsUndefined(); -
trunk/Source/JavaScriptCore/interpreter/StackVisitor.cpp
r190522 r190546 171 171 else 172 172 m_frame.m_argumentCountIncludingThis = inlineCallFrame->arguments.size(); 173 m_frame.m_codeBlock = inlineCallFrame->baselineCodeBlock .get();173 m_frame.m_codeBlock = inlineCallFrame->baselineCodeBlock(); 174 174 m_frame.m_bytecodeOffset = codeOrigin->bytecodeIndex; 175 175 -
trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp
r190522 r190546 39 39 return m_codeBlock->ownerExecutable(); 40 40 41 return codeOrigin.inlineCallFrame-> baselineCodeBlock->ownerExecutable();41 return codeOrigin.inlineCallFrame->executable.get(); 42 42 } 43 43 -
trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h
r190522 r190546 1075 1075 if (!codeOrigin.inlineCallFrame) 1076 1076 return codeBlock()->isStrictMode(); 1077 return codeOrigin.inlineCallFrame->isStrictMode();1077 return jsCast<FunctionExecutable*>(codeOrigin.inlineCallFrame->executable.get())->isStrictMode(); 1078 1078 } 1079 1079 -
trunk/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.h
r190522 r190546 116 116 // that codeBlock gets "executed" more than once. 117 117 #define FINALIZE_CODE_FOR_GC_AWARE_STUB(codeBlock, patchBuffer, makesCalls, cell, dataLogFArguments) \ 118 (createJITStubRoutine(FINALIZE_CODE_FOR((codeBlock), (patchBuffer), dataLogFArguments), *(codeBlock)->vm(), (codeBlock) , (makesCalls), (cell)))118 (createJITStubRoutine(FINALIZE_CODE_FOR((codeBlock), (patchBuffer), dataLogFArguments), *(codeBlock)->vm(), (codeBlock)->ownerExecutable(), (makesCalls), (cell))) 119 119 120 120 } // namespace JSC -
trunk/Source/JavaScriptCore/jit/JITCode.h
r190522 r190546 122 122 } 123 123 124 static std::chrono::milliseconds timeToLive(JITType jitType) 125 { 126 switch (jitType) { 127 case InterpreterThunk: 128 return std::chrono::duration_cast<std::chrono::milliseconds>( 129 std::chrono::seconds(5)); 130 case BaselineJIT: 131 // Effectively 10 additional seconds, since BaselineJIT and 132 // InterpreterThunk share a CodeBlock. 133 return std::chrono::duration_cast<std::chrono::milliseconds>( 134 std::chrono::seconds(15)); 135 case DFGJIT: 136 return std::chrono::duration_cast<std::chrono::milliseconds>( 137 std::chrono::seconds(20)); 138 case FTLJIT: 139 return std::chrono::duration_cast<std::chrono::milliseconds>( 140 std::chrono::seconds(60)); 141 default: 142 return std::chrono::milliseconds::max(); 143 } 144 } 145 124 146 static bool isLowerTier(JITType expectedLower, JITType expectedHigher) 125 147 { -
trunk/Source/JavaScriptCore/jit/JITOpcodes.cpp
r190522 r190546 667 667 emitInitRegister(virtualRegisterForLocal(j).offset()); 668 668 669 emitWriteBarrier(m_codeBlock );669 emitWriteBarrier(m_codeBlock->ownerExecutable()); 670 670 671 671 emitEnterOptimizationCheck(); -
trunk/Source/JavaScriptCore/jit/JITOperations.cpp
r190522 r190546 1274 1274 } 1275 1275 1276 CodeBlock*replacementCodeBlock = codeBlock->newReplacement();1276 RefPtr<CodeBlock> replacementCodeBlock = codeBlock->newReplacement(); 1277 1277 CompilationResult result = DFG::compile( 1278 vm, replacementCodeBlock , nullptr, DFG::DFGMode, bytecodeIndex,1278 vm, replacementCodeBlock.get(), 0, DFG::DFGMode, bytecodeIndex, 1279 1279 mustHandleValues, JITToDFGDeferredCompilationCallback::create()); 1280 1280 1281 if (result != CompilationSuccessful) 1281 if (result != CompilationSuccessful) { 1282 ASSERT(result == CompilationDeferred || replacementCodeBlock->hasOneRef()); 1282 1283 return encodeResult(0, 0); 1284 } 1283 1285 } 1284 1286 -
trunk/Source/JavaScriptCore/jit/JITToDFGDeferredCompilationCallback.cpp
r190522 r190546 44 44 45 45 void JITToDFGDeferredCompilationCallback::compilationDidBecomeReadyAsynchronously( 46 CodeBlock* codeBlock , CodeBlock* profiledDFGCodeBlock)46 CodeBlock* codeBlock) 47 47 { 48 ASSERT_UNUSED(profiledDFGCodeBlock, !profiledDFGCodeBlock);49 48 ASSERT(codeBlock->alternative()->jitType() == JITCode::BaselineJIT); 50 49 … … 56 55 57 56 void JITToDFGDeferredCompilationCallback::compilationDidComplete( 58 CodeBlock* codeBlock, Co deBlock* profiledDFGCodeBlock, CompilationResult result)57 CodeBlock* codeBlock, CompilationResult result) 59 58 { 60 ASSERT(!profiledDFGCodeBlock);61 59 ASSERT(codeBlock->alternative()->jitType() == JITCode::BaselineJIT); 62 60 … … 69 67 codeBlock->alternative()->setOptimizationThresholdBasedOnCompilationResult(result); 70 68 71 DeferredCompilationCallback::compilationDidComplete(codeBlock, profiledDFGCodeBlock,result);69 DeferredCompilationCallback::compilationDidComplete(codeBlock, result); 72 70 } 73 71 -
trunk/Source/JavaScriptCore/jit/JITToDFGDeferredCompilationCallback.h
r190522 r190546 45 45 static Ref<JITToDFGDeferredCompilationCallback> create(); 46 46 47 virtual void compilationDidBecomeReadyAsynchronously(CodeBlock* , CodeBlock* profiledDFGCodeBlock) override;48 virtual void compilationDidComplete(CodeBlock*, Co deBlock* profiledDFGCodeBlock, CompilationResult) override;47 virtual void compilationDidBecomeReadyAsynchronously(CodeBlock*) override; 48 virtual void compilationDidComplete(CodeBlock*, CompilationResult) override; 49 49 }; 50 50 -
trunk/Source/JavaScriptCore/jit/Repatch.cpp
r190522 r190546 228 228 229 229 CodeBlock* codeBlock = exec->codeBlock(); 230 ScriptExecutable* owner = codeBlock->ownerScriptExecutable(); 230 231 VM& vm = exec->vm(); 231 232 … … 233 234 234 235 if (isJSArray(baseValue) && propertyName == exec->propertyNames().length) 235 newCase = AccessCase::getLength(vm, codeBlock, AccessCase::ArrayLength);236 newCase = AccessCase::getLength(vm, owner, AccessCase::ArrayLength); 236 237 else if (isJSString(baseValue) && propertyName == exec->propertyNames().length) 237 newCase = AccessCase::getLength(vm, codeBlock, AccessCase::StringLength);238 newCase = AccessCase::getLength(vm, owner, AccessCase::StringLength); 238 239 else { 239 240 if (!slot.isCacheable() && !slot.isUnset()) … … 266 267 structure->startWatchingPropertyForReplacements(vm, slot.cachedOffset()); 267 268 repatchByIdSelfAccess(codeBlock, stubInfo, structure, slot.cachedOffset(), operationGetByIdOptimize, true); 268 stubInfo.initGetByIdSelf(vm, codeBlock , structure, slot.cachedOffset());269 stubInfo.initGetByIdSelf(vm, codeBlock->ownerExecutable(), structure, slot.cachedOffset()); 269 270 return RetryCacheLater; 270 271 } … … 279 280 if (slot.isUnset()) { 280 281 conditionSet = generateConditionsForPropertyMiss( 281 vm, codeBlock , exec, structure, propertyName.impl());282 vm, codeBlock->ownerExecutable(), exec, structure, propertyName.impl()); 282 283 } else { 283 284 conditionSet = generateConditionsForPrototypePropertyHit( 284 vm, codeBlock , exec, structure, slot.slotBase(),285 vm, codeBlock->ownerExecutable(), exec, structure, slot.slotBase(), 285 286 propertyName.impl()); 286 287 } … … 303 304 304 305 newCase = AccessCase::get( 305 vm, codeBlock, type, offset, structure, conditionSet, loadTargetFromProxy,306 vm, owner, type, offset, structure, conditionSet, loadTargetFromProxy, 306 307 slot.watchpointSet(), slot.isCacheableCustom() ? slot.customGetter() : nullptr, 307 308 slot.isCacheableCustom() ? slot.slotBase() : nullptr); … … 357 358 358 359 CodeBlock* codeBlock = exec->codeBlock(); 360 ScriptExecutable* owner = codeBlock->ownerScriptExecutable(); 359 361 VM& vm = exec->vm(); 360 362 … … 384 386 appropriateOptimizingPutByIdFunction(slot, putKind), false); 385 387 stubInfo.initPutByIdReplace( 386 vm, codeBlock , structure, slot.cachedOffset());388 vm, codeBlock->ownerExecutable(), structure, slot.cachedOffset()); 387 389 return RetryCacheLater; 388 390 } 389 391 390 newCase = AccessCase::replace(vm, codeBlock, structure, slot.cachedOffset());392 newCase = AccessCase::replace(vm, owner, structure, slot.cachedOffset()); 391 393 } else { 392 394 ASSERT(slot.type() == PutPropertySlot::NewProperty); … … 410 412 conditionSet = 411 413 generateConditionsForPropertySetterMiss( 412 vm, codeBlock, exec, newStructure, ident.impl());414 vm, owner, exec, newStructure, ident.impl()); 413 415 if (!conditionSet.isValid()) 414 416 return GiveUpOnCache; 415 417 } 416 418 417 newCase = AccessCase::transition(vm, codeBlock, structure, newStructure, offset, conditionSet);419 newCase = AccessCase::transition(vm, owner, structure, newStructure, offset, conditionSet); 418 420 } 419 421 } else if (slot.isCacheableCustom() || slot.isCacheableSetter()) { … … 424 426 conditionSet = 425 427 generateConditionsForPrototypePropertyHitCustom( 426 vm, codeBlock, exec, structure, slot.base(), ident.impl());428 vm, owner, exec, structure, slot.base(), ident.impl()); 427 429 if (!conditionSet.isValid()) 428 430 return GiveUpOnCache; … … 430 432 431 433 newCase = AccessCase::setter( 432 vm, codeBlock, AccessCase::CustomSetter, structure, invalidOffset, conditionSet,434 vm, owner, AccessCase::CustomSetter, structure, invalidOffset, conditionSet, 433 435 slot.customSetter(), slot.base()); 434 436 } else { … … 439 441 conditionSet = 440 442 generateConditionsForPrototypePropertyHit( 441 vm, codeBlock, exec, structure, slot.base(), ident.impl());443 vm, owner, exec, structure, slot.base(), ident.impl()); 442 444 if (!conditionSet.isValid()) 443 445 return GiveUpOnCache; … … 447 449 448 450 newCase = AccessCase::setter( 449 vm, codeBlock, AccessCase::Setter, structure, offset, conditionSet);451 vm, owner, AccessCase::Setter, structure, offset, conditionSet); 450 452 } 451 453 } … … 490 492 491 493 CodeBlock* codeBlock = exec->codeBlock(); 494 ScriptExecutable* owner = codeBlock->ownerScriptExecutable(); 492 495 VM& vm = exec->vm(); 493 496 Structure* structure = base->structure(vm); … … 497 500 if (slot.slotBase() != base) { 498 501 conditionSet = generateConditionsForPrototypePropertyHit( 499 vm, codeBlock , exec, structure, slot.slotBase(), ident.impl());502 vm, codeBlock->ownerExecutable(), exec, structure, slot.slotBase(), ident.impl()); 500 503 } 501 504 } else { 502 505 conditionSet = generateConditionsForPropertyMiss( 503 vm, codeBlock , exec, structure, ident.impl());506 vm, codeBlock->ownerExecutable(), exec, structure, ident.impl()); 504 507 } 505 508 if (!conditionSet.isValid()) … … 507 510 508 511 std::unique_ptr<AccessCase> newCase = AccessCase::in( 509 vm, codeBlock, wasFound ? AccessCase::InHit : AccessCase::InMiss, structure, conditionSet);512 vm, owner, wasFound ? AccessCase::InHit : AccessCase::InMiss, structure, conditionSet); 510 513 511 514 MacroAssemblerCodePtr codePtr = stubInfo.addAccessCase(vm, codeBlock, ident, WTF::move(newCase)); … … 556 559 557 560 ASSERT(!callLinkInfo.isLinked()); 558 callLinkInfo.setCallee(exec->callerFrame()->vm(), callLinkInfo.hotPathBegin(), callerCodeBlock , callee);559 callLinkInfo.setLastSeenCallee(exec->callerFrame()->vm(), callerCodeBlock , callee);561 callLinkInfo.setCallee(exec->callerFrame()->vm(), callLinkInfo.hotPathBegin(), callerCodeBlock->ownerExecutable(), callee); 562 callLinkInfo.setLastSeenCallee(exec->callerFrame()->vm(), callerCodeBlock->ownerExecutable(), callee); 560 563 if (shouldShowDisassemblyFor(callerCodeBlock)) 561 564 dataLog("Linking call in ", *callerCodeBlock, " at ", callLinkInfo.codeOrigin(), " to ", pointerDump(calleeCodeBlock), ", entrypoint at ", codePtr, "\n"); … … 874 877 toCString(*callerCodeBlock).data(), callLinkInfo.callReturnLocation().labelAtOffset(0).executableAddress(), 875 878 toCString(listDump(callCases)).data())), 876 *vm, callerCodeBlock , exec->callerFrame(), callLinkInfo, callCases,879 *vm, callerCodeBlock->ownerExecutable(), exec->callerFrame(), callLinkInfo, callCases, 877 880 WTF::move(fastCounts))); 878 881 -
trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
r190522 r190546 577 577 && !structure->typeInfo().prohibitsPropertyCaching() 578 578 && !structure->typeInfo().newImpurePropertyFiresWatchpoints()) { 579 vm.heap.writeBarrier(codeBlock );579 vm.heap.writeBarrier(codeBlock->ownerExecutable()); 580 580 581 581 ConcurrentJITLocker locker(codeBlock->m_lock); … … 642 642 && baseCell == slot.base()) { 643 643 644 vm.heap.writeBarrier(codeBlock );644 vm.heap.writeBarrier(codeBlock->ownerExecutable()); 645 645 646 646 if (slot.type() == PutPropertySlot::NewProperty) { … … 659 659 ASSERT(chain); 660 660 pc[7].u.structureChain.set( 661 vm, codeBlock , chain);661 vm, codeBlock->ownerExecutable(), chain); 662 662 } 663 663 pc[8].u.putByIdFlags = static_cast<PutByIdFlags>( … … 1191 1191 if (callLinkInfo->isOnList()) 1192 1192 callLinkInfo->remove(); 1193 callLinkInfo->callee.set(vm, callerCodeBlock , callee);1194 callLinkInfo->lastSeenCallee.set(vm, callerCodeBlock , callee);1193 callLinkInfo->callee.set(vm, callerCodeBlock->ownerExecutable(), callee); 1194 callLinkInfo->lastSeenCallee.set(vm, callerCodeBlock->ownerExecutable(), callee); 1195 1195 callLinkInfo->machineCodeTarget = codePtr; 1196 1196 if (codeBlock) -
trunk/Source/JavaScriptCore/profiler/ProfilerOriginStack.cpp
r190522 r190546 53 53 for (unsigned i = 1; i < stack.size(); ++i) { 54 54 append(Origin( 55 database.ensureBytecodesFor(stack[i].inlineCallFrame->baselineCodeBlock .get()),55 database.ensureBytecodesFor(stack[i].inlineCallFrame->baselineCodeBlock()), 56 56 stack[i].bytecodeIndex)); 57 57 } -
trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp
r190522 r190546 232 232 auto& cacheWriteBarrier = pc[4].u.jsCell; 233 233 if (!cacheWriteBarrier) 234 cacheWriteBarrier.set(exec->vm(), exec->codeBlock() , constructor);234 cacheWriteBarrier.set(exec->vm(), exec->codeBlock()->ownerExecutable(), constructor); 235 235 else if (cacheWriteBarrier.unvalidatedGet() != JSCell::seenMultipleCalleeObjects() && cacheWriteBarrier.get() != constructor) 236 236 cacheWriteBarrier.setWithoutWriteBarrier(JSCell::seenMultipleCalleeObjects()); … … 251 251 if (otherStructure) 252 252 pc[3].u.toThisStatus = ToThisConflicted; 253 pc[2].u.structure.set(vm, exec->codeBlock() , myStructure);253 pc[2].u.structure.set(vm, exec->codeBlock()->ownerExecutable(), myStructure); 254 254 } 255 255 } else { … … 527 527 { 528 528 BEGIN(); 529 CodeBlock* codeBlock = exec->codeBlock();530 Heap::heap( codeBlock)->writeBarrier(codeBlock);529 ExecutableBase* ownerExecutable = exec->codeBlock()->ownerExecutable(); 530 Heap::heap(ownerExecutable)->writeBarrier(ownerExecutable); 531 531 END(); 532 532 } -
trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.h
r190522 r190546 130 130 131 131 ConcurrentJITLocker locker(codeBlock->m_lock); 132 pc[5].u.structure.set(exec->vm(), codeBlock , scope->structure());132 pc[5].u.structure.set(exec->vm(), codeBlock->ownerExecutable(), scope->structure()); 133 133 pc[6].u.operand = slot.cachedOffset(); 134 134 } … … 163 163 { 164 164 ConcurrentJITLocker locker(codeBlock->m_lock); 165 pc[5].u.structure.set(exec->vm(), codeBlock , structure);165 pc[5].u.structure.set(exec->vm(), codeBlock->ownerExecutable(), structure); 166 166 pc[6].u.operand = slot.cachedOffset(); 167 167 } -
trunk/Source/JavaScriptCore/runtime/Executable.cpp
r190522 r190546 61 61 m_numParametersForCall = NUM_PARAMETERS_NOT_COMPILED; 62 62 m_numParametersForConstruct = NUM_PARAMETERS_NOT_COMPILED; 63 64 if (classInfo() == FunctionExecutable::info()) {65 FunctionExecutable* executable = jsCast<FunctionExecutable*>(this);66 executable->m_codeBlockForCall.clear();67 executable->m_codeBlockForConstruct.clear();68 return;69 }70 71 if (classInfo() == EvalExecutable::info()) {72 EvalExecutable* executable = jsCast<EvalExecutable*>(this);73 executable->m_evalCodeBlock.clear();74 executable->m_unlinkedEvalCodeBlock.clear();75 return;76 }77 78 if (classInfo() == ProgramExecutable::info()) {79 ProgramExecutable* executable = jsCast<ProgramExecutable*>(this);80 executable->m_programCodeBlock.clear();81 executable->m_unlinkedProgramCodeBlock.clear();82 return;83 }84 85 if (classInfo() == ModuleProgramExecutable::info()) {86 ModuleProgramExecutable* executable = jsCast<ModuleProgramExecutable*>(this);87 executable->m_moduleProgramCodeBlock.clear();88 executable->m_unlinkedModuleProgramCodeBlock.clear();89 executable->m_moduleEnvironmentSymbolTable.clear();90 return;91 }92 93 #if ENABLE(WEBASSEMBLY)94 if (classInfo() == WebAssemblyExecutable::info()) {95 WebAssemblyExecutable* executable = jsCast<WebAssemblyExecutable*>(this);96 executable->m_codeBlockForCall.clear();97 return;98 }99 #endif100 101 ASSERT(classInfo() == NativeExecutable::info());102 63 } 103 64 … … 163 124 ASSERT(vm.heap.isDeferred()); 164 125 165 CodeBlock* oldCodeBlock = nullptr;126 RefPtr<CodeBlock> oldCodeBlock; 166 127 167 128 switch (codeType) { … … 172 133 ASSERT(kind == CodeForCall); 173 134 174 oldCodeBlock = executable->m_programCodeBlock .get();175 executable->m_programCodeBlock .setMayBeNull(vm, this, codeBlock);135 oldCodeBlock = executable->m_programCodeBlock; 136 executable->m_programCodeBlock = codeBlock; 176 137 break; 177 138 } … … 183 144 ASSERT(kind == CodeForCall); 184 145 185 oldCodeBlock = executable->m_moduleProgramCodeBlock .get();186 executable->m_moduleProgramCodeBlock .setMayBeNull(vm, this, codeBlock);146 oldCodeBlock = executable->m_moduleProgramCodeBlock; 147 executable->m_moduleProgramCodeBlock = codeBlock; 187 148 break; 188 149 } … … 194 155 ASSERT(kind == CodeForCall); 195 156 196 oldCodeBlock = executable->m_evalCodeBlock .get();197 executable->m_evalCodeBlock .setMayBeNull(vm, this, codeBlock);157 oldCodeBlock = executable->m_evalCodeBlock; 158 executable->m_evalCodeBlock = codeBlock; 198 159 break; 199 160 } … … 205 166 switch (kind) { 206 167 case CodeForCall: 207 oldCodeBlock = executable->m_codeBlockForCall .get();208 executable->m_codeBlockForCall .setMayBeNull(vm, this, codeBlock);168 oldCodeBlock = executable->m_codeBlockForCall; 169 executable->m_codeBlockForCall = codeBlock; 209 170 break; 210 171 case CodeForConstruct: 211 oldCodeBlock = executable->m_codeBlockForConstruct .get();212 executable->m_codeBlockForConstruct .setMayBeNull(vm, this, codeBlock);172 oldCodeBlock = executable->m_codeBlockForConstruct; 173 executable->m_codeBlockForConstruct = codeBlock; 213 174 break; 214 175 } … … 250 211 } 251 212 252 CodeBlock*ScriptExecutable::newCodeBlockFor(213 RefPtr<CodeBlock> ScriptExecutable::newCodeBlockFor( 253 214 CodeSpecializationKind kind, JSFunction* function, JSScope* scope, JSObject*& exception) 254 215 { … … 264 225 RELEASE_ASSERT(!executable->m_evalCodeBlock); 265 226 RELEASE_ASSERT(!function); 266 return EvalCodeBlock::create(vm,227 return adoptRef(new EvalCodeBlock( 267 228 executable, executable->m_unlinkedEvalCodeBlock.get(), scope, 268 executable->source().provider()) ;229 executable->source().provider())); 269 230 } 270 231 … … 274 235 RELEASE_ASSERT(!executable->m_programCodeBlock); 275 236 RELEASE_ASSERT(!function); 276 return ProgramCodeBlock::create(vm,237 return adoptRef(new ProgramCodeBlock( 277 238 executable, executable->m_unlinkedProgramCodeBlock.get(), scope, 278 executable->source().provider(), executable->source().startColumn()) ;239 executable->source().provider(), executable->source().startColumn())); 279 240 } 280 241 … … 284 245 RELEASE_ASSERT(!executable->m_moduleProgramCodeBlock); 285 246 RELEASE_ASSERT(!function); 286 return ModuleProgramCodeBlock::create(vm,247 return adoptRef(new ModuleProgramCodeBlock( 287 248 executable, executable->m_unlinkedModuleProgramCodeBlock.get(), scope, 288 executable->source().provider(), executable->source().startColumn()) ;249 executable->source().provider(), executable->source().startColumn())); 289 250 } 290 251 … … 316 277 unsigned startColumn = executable->source().startColumn(); 317 278 318 return FunctionCodeBlock::create(vm,319 executable, unlinkedCodeBlock, scope, provider, sourceOffset, startColumn) ;320 } 321 322 CodeBlock*ScriptExecutable::newReplacementCodeBlockFor(279 return adoptRef(new FunctionCodeBlock( 280 executable, unlinkedCodeBlock, scope, provider, sourceOffset, startColumn)); 281 } 282 283 PassRefPtr<CodeBlock> ScriptExecutable::newReplacementCodeBlockFor( 323 284 CodeSpecializationKind kind) 324 285 { … … 328 289 EvalCodeBlock* baseline = static_cast<EvalCodeBlock*>( 329 290 executable->m_evalCodeBlock->baselineVersion()); 330 EvalCodeBlock* result = EvalCodeBlock::create(vm(),331 CodeBlock::CopyParsedBlock, *baseline) ;332 result->setAlternative( *vm(),baseline);291 RefPtr<EvalCodeBlock> result = adoptRef(new EvalCodeBlock( 292 CodeBlock::CopyParsedBlock, *baseline)); 293 result->setAlternative(baseline); 333 294 return result; 334 295 } … … 339 300 ProgramCodeBlock* baseline = static_cast<ProgramCodeBlock*>( 340 301 executable->m_programCodeBlock->baselineVersion()); 341 ProgramCodeBlock* result = ProgramCodeBlock::create(vm(),342 CodeBlock::CopyParsedBlock, *baseline) ;343 result->setAlternative( *vm(),baseline);302 RefPtr<ProgramCodeBlock> result = adoptRef(new ProgramCodeBlock( 303 CodeBlock::CopyParsedBlock, *baseline)); 304 result->setAlternative(baseline); 344 305 return result; 345 306 } … … 350 311 ModuleProgramCodeBlock* baseline = static_cast<ModuleProgramCodeBlock*>( 351 312 executable->m_moduleProgramCodeBlock->baselineVersion()); 352 ModuleProgramCodeBlock* result = ModuleProgramCodeBlock::create(vm(),353 CodeBlock::CopyParsedBlock, *baseline) ;354 result->setAlternative( *vm(),baseline);313 RefPtr<ModuleProgramCodeBlock> result = adoptRef(new ModuleProgramCodeBlock( 314 CodeBlock::CopyParsedBlock, *baseline)); 315 result->setAlternative(baseline); 355 316 return result; 356 317 } … … 360 321 FunctionCodeBlock* baseline = static_cast<FunctionCodeBlock*>( 361 322 executable->codeBlockFor(kind)->baselineVersion()); 362 FunctionCodeBlock* result = FunctionCodeBlock::create(vm(),363 CodeBlock::CopyParsedBlock, *baseline) ;364 result->setAlternative( *vm(),baseline);323 RefPtr<FunctionCodeBlock> result = adoptRef(new FunctionCodeBlock( 324 CodeBlock::CopyParsedBlock, *baseline)); 325 result->setAlternative(baseline); 365 326 return result; 366 327 } … … 390 351 391 352 JSObject* exception = 0; 392 CodeBlock*codeBlock = newCodeBlockFor(kind, function, scope, exception);353 RefPtr<CodeBlock> codeBlock = newCodeBlockFor(kind, function, scope, exception); 393 354 if (!codeBlock) { 394 355 RELEASE_ASSERT(exception); … … 400 361 401 362 if (Options::useLLInt()) 402 setupLLInt(vm, codeBlock );363 setupLLInt(vm, codeBlock.get()); 403 364 else 404 setupJIT(vm, codeBlock );405 406 installCode(*codeBlock->vm(), codeBlock , codeBlock->codeType(), codeBlock->specializationKind());365 setupJIT(vm, codeBlock.get()); 366 367 installCode(*codeBlock->vm(), codeBlock.get(), codeBlock->codeType(), codeBlock->specializationKind()); 407 368 return 0; 408 369 } … … 542 503 ASSERT_GC_OBJECT_INHERITS(thisObject, info()); 543 504 ScriptExecutable::visitChildren(thisObject, visitor); 505 if (thisObject->m_evalCodeBlock) 506 thisObject->m_evalCodeBlock->visitAggregate(visitor); 544 507 visitor.append(&thisObject->m_unlinkedEvalCodeBlock); 545 if (thisObject->m_evalCodeBlock) 546 thisObject->m_evalCodeBlock->visitWeakly(visitor); 508 } 509 510 void EvalExecutable::clearCode() 511 { 512 m_evalCodeBlock = nullptr; 513 m_unlinkedEvalCodeBlock.clear(); 514 Base::clearCode(); 547 515 } 548 516 … … 651 619 visitor.append(&thisObject->m_unlinkedProgramCodeBlock); 652 620 if (thisObject->m_programCodeBlock) 653 thisObject->m_programCodeBlock->visitWeakly(visitor); 621 thisObject->m_programCodeBlock->visitAggregate(visitor); 622 } 623 624 void ProgramExecutable::clearCode() 625 { 626 m_programCodeBlock = nullptr; 627 m_unlinkedProgramCodeBlock.clear(); 628 Base::clearCode(); 654 629 } 655 630 … … 662 637 visitor.append(&thisObject->m_moduleEnvironmentSymbolTable); 663 638 if (thisObject->m_moduleProgramCodeBlock) 664 thisObject->m_moduleProgramCodeBlock->visitWeakly(visitor); 639 thisObject->m_moduleProgramCodeBlock->visitAggregate(visitor); 640 } 641 642 void ModuleProgramExecutable::clearCode() 643 { 644 m_moduleProgramCodeBlock = nullptr; 645 m_unlinkedModuleProgramCodeBlock.clear(); 646 m_moduleEnvironmentSymbolTable.clear(); 647 Base::clearCode(); 665 648 } 666 649 … … 685 668 ScriptExecutable::visitChildren(thisObject, visitor); 686 669 if (thisObject->m_codeBlockForCall) 687 thisObject->m_codeBlockForCall->visit Weakly(visitor);670 thisObject->m_codeBlockForCall->visitAggregate(visitor); 688 671 if (thisObject->m_codeBlockForConstruct) 689 thisObject->m_codeBlockForConstruct->visit Weakly(visitor);672 thisObject->m_codeBlockForConstruct->visitAggregate(visitor); 690 673 visitor.append(&thisObject->m_unlinkedExecutable); 691 674 visitor.append(&thisObject->m_singletonFunction); 675 } 676 677 void FunctionExecutable::clearCode() 678 { 679 m_codeBlockForCall = nullptr; 680 m_codeBlockForConstruct = nullptr; 681 Base::clearCode(); 692 682 } 693 683 … … 727 717 ExecutableBase::visitChildren(thisObject, visitor); 728 718 if (thisObject->m_codeBlockForCall) 729 thisObject->m_codeBlockForCall->visit Weakly(visitor);719 thisObject->m_codeBlockForCall->visitAggregate(visitor); 730 720 visitor.append(&thisObject->m_module); 721 } 722 723 void WebAssemblyExecutable::clearCode() 724 { 725 m_codeBlockForCall = nullptr; 726 Base::clearCode(); 731 727 } 732 728 … … 739 735 DeferGC deferGC(vm.heap); 740 736 741 WebAssemblyCodeBlock* codeBlock = WebAssemblyCodeBlock::create(vm,742 this, exec->lexicalGlobalObject()));743 744 WASMFunctionParser::compile(vm, codeBlock , m_module.get(), m_source, m_functionIndex);737 RefPtr<WebAssemblyCodeBlock> codeBlock = adoptRef(new WebAssemblyCodeBlock( 738 this, vm, exec->lexicalGlobalObject())); 739 740 WASMFunctionParser::compile(vm, codeBlock.get(), m_module.get(), m_source, m_functionIndex); 745 741 746 742 m_jitCodeForCall = codeBlock->jitCode(); … … 748 744 m_numParametersForCall = codeBlock->numParameters(); 749 745 750 m_codeBlockForCall .set(vm, this, codeBlock);746 m_codeBlockForCall = codeBlock; 751 747 752 748 Heap::heap(this)->writeBarrier(this); -
trunk/Source/JavaScriptCore/runtime/Executable.h
r190522 r190546 140 140 141 141 public: 142 static void clearCodeVirtual(ExecutableBase*); 143 142 144 PassRefPtr<JITCode> generatedJITCodeForCall() 143 145 { … … 305 307 306 308 private: 307 friend class ExecutableBase;308 309 309 NativeExecutable(VM& vm, NativeFunction function, NativeFunction constructor) 310 310 : ExecutableBase(vm, vm.nativeExecutableStructure.get(), NUM_PARAMETERS_IS_HOST) … … 377 377 void installCode(CodeBlock*); 378 378 void installCode(VM&, CodeBlock*, CodeType, CodeSpecializationKind); 379 CodeBlock*newCodeBlockFor(CodeSpecializationKind, JSFunction*, JSScope*, JSObject*& exception);380 CodeBlock*newReplacementCodeBlockFor(CodeSpecializationKind);379 RefPtr<CodeBlock> newCodeBlockFor(CodeSpecializationKind, JSFunction*, JSScope*, JSObject*& exception); 380 PassRefPtr<CodeBlock> newReplacementCodeBlockFor(CodeSpecializationKind); 381 381 382 382 JSObject* prepareForExecution(ExecState* exec, JSFunction* function, JSScope* scope, CodeSpecializationKind kind) … … 390 390 391 391 private: 392 friend class ExecutableBase;393 392 JSObject* prepareForExecutionImpl(ExecState*, JSFunction*, JSScope*, CodeSpecializationKind); 394 393 … … 449 448 DECLARE_INFO; 450 449 450 void clearCode(); 451 451 452 ExecutableInfo executableInfo() const { return ExecutableInfo(needsActivation(), usesEval(), isStrictMode(), false, false, ConstructorKind::None, false); } 452 453 … … 455 456 456 457 private: 457 friend class ExecutableBase;458 458 friend class ScriptExecutable; 459 459 EvalExecutable(ExecState*, const SourceCode&, bool); … … 461 461 static void visitChildren(JSCell*, SlotVisitor&); 462 462 463 WriteBarrier<EvalCodeBlock> m_evalCodeBlock;463 RefPtr<EvalCodeBlock> m_evalCodeBlock; 464 464 WriteBarrier<UnlinkedEvalCodeBlock> m_unlinkedEvalCodeBlock; 465 465 }; … … 502 502 DECLARE_INFO; 503 503 504 void clearCode(); 505 504 506 ExecutableInfo executableInfo() const { return ExecutableInfo(needsActivation(), usesEval(), isStrictMode(), false, false, ConstructorKind::None, false); } 505 507 506 508 private: 507 friend class ExecutableBase;508 509 friend class ScriptExecutable; 509 510 … … 513 514 514 515 WriteBarrier<UnlinkedProgramCodeBlock> m_unlinkedProgramCodeBlock; 515 WriteBarrier<ProgramCodeBlock> m_programCodeBlock;516 RefPtr<ProgramCodeBlock> m_programCodeBlock; 516 517 }; 517 518 … … 543 544 DECLARE_INFO; 544 545 546 void clearCode(); 547 545 548 ExecutableInfo executableInfo() const { return ExecutableInfo(needsActivation(), usesEval(), isStrictMode(), false, false, ConstructorKind::None, false); } 546 549 UnlinkedModuleProgramCodeBlock* unlinkedModuleProgramCodeBlock() { return m_unlinkedModuleProgramCodeBlock.get(); } … … 549 552 550 553 private: 551 friend class ExecutableBase;552 554 friend class ScriptExecutable; 553 555 … … 558 560 WriteBarrier<UnlinkedModuleProgramCodeBlock> m_unlinkedModuleProgramCodeBlock; 559 561 WriteBarrier<SymbolTable> m_moduleEnvironmentSymbolTable; 560 WriteBarrier<ModuleProgramCodeBlock> m_moduleProgramCodeBlock;562 RefPtr<ModuleProgramCodeBlock> m_moduleProgramCodeBlock; 561 563 }; 562 564 … … 599 601 bool isGeneratedForCall() const 600 602 { 601 return !!m_codeBlockForCall;603 return m_codeBlockForCall; 602 604 } 603 605 … … 609 611 bool isGeneratedForConstruct() const 610 612 { 611 return m_codeBlockForConstruct .get();613 return m_codeBlockForConstruct; 612 614 } 613 615 … … 675 677 DECLARE_INFO; 676 678 679 void clearCode(); 680 677 681 InferredValue* singletonFunction() { return m_singletonFunction.get(); } 678 682 679 683 private: 680 friend class ExecutableBase;681 684 FunctionExecutable( 682 685 VM&, const SourceCode&, UnlinkedFunctionExecutable*, unsigned firstLine, … … 688 691 689 692 WriteBarrier<UnlinkedFunctionExecutable> m_unlinkedExecutable; 690 WriteBarrier<FunctionCodeBlock> m_codeBlockForCall;691 WriteBarrier<FunctionCodeBlock> m_codeBlockForConstruct;693 RefPtr<FunctionCodeBlock> m_codeBlockForCall; 694 RefPtr<FunctionCodeBlock> m_codeBlockForConstruct; 692 695 RefPtr<TypeSet> m_returnStatementTypeSet; 693 696 unsigned m_parametersStartOffset; … … 717 720 DECLARE_INFO; 718 721 722 void clearCode(); 723 719 724 void prepareForExecution(ExecState*); 720 725 … … 725 730 726 731 private: 727 friend class ExecutableBase;728 732 WebAssemblyExecutable(VM&, const SourceCode&, JSWASMModule*, unsigned functionIndex); 729 733 … … 734 738 unsigned m_functionIndex; 735 739 736 WriteBarrier<WebAssemblyCodeBlock> m_codeBlockForCall;740 RefPtr<WebAssemblyCodeBlock> m_codeBlockForCall; 737 741 }; 738 742 #endif 739 743 740 } // namespace JSC 741 742 #endif // Executable_h 744 inline void ExecutableBase::clearCodeVirtual(ExecutableBase* executable) 745 { 746 switch (executable->type()) { 747 case EvalExecutableType: 748 return jsCast<EvalExecutable*>(executable)->clearCode(); 749 case ProgramExecutableType: 750 return jsCast<ProgramExecutable*>(executable)->clearCode(); 751 case FunctionExecutableType: 752 return jsCast<FunctionExecutable*>(executable)->clearCode(); 753 #if ENABLE(WEBASSEMBLY) 754 case WebAssemblyExecutableType: 755 return jsCast<WebAssemblyExecutable*>(executable)->clearCode(); 756 #endif 757 case ModuleProgramExecutableType: 758 return jsCast<ModuleProgramExecutable*>(executable)->clearCode(); 759 default: 760 return jsCast<NativeExecutable*>(executable)->clearCode(); 761 } 762 } 763 764 } 765 766 #endif -
trunk/Source/JavaScriptCore/runtime/VM.cpp
r190522 r190546 249 249 promiseDeferredStructure.set(*this, JSPromiseDeferred::createStructure(*this, 0, jsNull())); 250 250 internalPromiseDeferredStructure.set(*this, JSInternalPromiseDeferred::createStructure(*this, 0, jsNull())); 251 programCodeBlockStructure.set(*this, ProgramCodeBlock::createStructure(*this, 0, jsNull()));252 moduleProgramCodeBlockStructure.set(*this, ModuleProgramCodeBlock::createStructure(*this, 0, jsNull()));253 evalCodeBlockStructure.set(*this, EvalCodeBlock::createStructure(*this, 0, jsNull()));254 functionCodeBlockStructure.set(*this, FunctionCodeBlock::createStructure(*this, 0, jsNull()));255 #if ENABLE(WEBASSEMBLY)256 webAssemblyCodeBlockStructure.set(*this, WebAssemblyCodeBlock::createStructure(*this, 0, jsNull()));257 #endif258 259 251 iterationTerminator.set(*this, JSFinalObject::create(*this, JSFinalObject::createStructure(*this, 0, jsNull(), 1))); 260 252 nativeStdFunctionCellStructure.set(*this, NativeStdFunctionCell::createStructure(*this, 0, jsNull())); -
trunk/Source/JavaScriptCore/runtime/VM.h
r190522 r190546 310 310 Strong<Structure> internalPromiseDeferredStructure; 311 311 Strong<Structure> nativeStdFunctionCellStructure; 312 Strong<Structure> programCodeBlockStructure;313 Strong<Structure> moduleProgramCodeBlockStructure;314 Strong<Structure> evalCodeBlockStructure;315 Strong<Structure> functionCodeBlockStructure;316 Strong<Structure> webAssemblyCodeBlockStructure;317 318 312 Strong<JSCell> iterationTerminator; 319 313 Strong<JSCell> emptyPropertyNameEnumerator;
Note: See TracChangeset
for help on using the changeset viewer.