Changeset 179865 in webkit
- Timestamp:
- Feb 9, 2015, 11:40:53 PM (12 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 1 added
- 2 edited
-
ChangeLog (modified) (1 diff)
-
bytecompiler/NodesCodegen.cpp (modified) (7 diffs)
-
tests/typeProfiler/loop.js (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r179863 r179865 1 2015-02-09 Saam Barati <saambarati1@gmail.com> 2 3 JSC's Type Profiler doesn't profile the type of the looping variable in ForOf/ForIn loops 4 https://bugs.webkit.org/show_bug.cgi?id=141241 5 6 Reviewed by Filip Pizlo. 7 8 Type information is now recorded for ForIn and ForOf statements. 9 It was an oversight to not have these statements profiled before. 10 11 * bytecompiler/NodesCodegen.cpp: 12 (JSC::ForInNode::emitLoopHeader): 13 (JSC::ForOfNode::emitBytecode): 14 * tests/typeProfiler/loop.js: Added. 15 (testForIn): 16 (testForOf): 17 1 18 2015-02-09 Filip Pizlo <fpizlo@apple.com> 2 19 -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r179371 r179865 2028 2028 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 2029 2029 generator.emitPutToScope(scope, ident, propertyName, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo); 2030 } 2030 if (generator.vm()->typeProfiler()) 2031 generator.emitProfileType(propertyName, resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &ident); 2032 } 2033 if (generator.vm()->typeProfiler()) 2034 generator.emitTypeProfilerExpressionInfo(m_lexpr->position(), JSTextPosition(-1, m_lexpr->position().offset + ident.length(), -1)); 2031 2035 return; 2032 2036 } … … 2037 2041 generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd()); 2038 2042 generator.emitPutById(base, ident, propertyName); 2043 if (generator.vm()->typeProfiler()) { 2044 generator.emitProfileType(propertyName, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr); 2045 generator.emitTypeProfilerExpressionInfo(assignNode->divotStart(), assignNode->divotEnd()); 2046 } 2039 2047 return; 2040 2048 } … … 2045 2053 generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd()); 2046 2054 generator.emitPutByVal(base.get(), subscript, propertyName); 2055 if (generator.vm()->typeProfiler()) { 2056 generator.emitProfileType(propertyName, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr); 2057 generator.emitTypeProfilerExpressionInfo(assignNode->divotStart(), assignNode->divotEnd()); 2058 } 2047 2059 return; 2048 2060 } … … 2064 2076 } 2065 2077 generator.emitMove(local.get(), propertyName); 2078 if (generator.vm()->typeProfiler()) 2079 generator.emitTypeProfilerExpressionInfo(m_lexpr->position(), JSTextPosition(-1, m_lexpr->position().offset + ident.length(), -1)); 2066 2080 return; 2067 2081 } … … 2236 2250 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 2237 2251 generator.emitPutToScope(scope, ident, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo); 2252 if (generator.vm()->typeProfiler()) 2253 generator.emitProfileType(value, resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &ident); 2238 2254 } 2255 if (generator.vm()->typeProfiler()) 2256 generator.emitTypeProfilerExpressionInfo(m_lexpr->position(), JSTextPosition(-1, m_lexpr->position().offset + ident.length(), -1)); 2239 2257 } else if (m_lexpr->isDotAccessorNode()) { 2240 2258 DotAccessorNode* assignNode = static_cast<DotAccessorNode*>(m_lexpr); … … 2244 2262 generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd()); 2245 2263 generator.emitPutById(base.get(), ident, value); 2264 if (generator.vm()->typeProfiler()) { 2265 generator.emitProfileType(value, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr); 2266 generator.emitTypeProfilerExpressionInfo(assignNode->divotStart(), assignNode->divotEnd()); 2267 } 2246 2268 } else if (m_lexpr->isBracketAccessorNode()) { 2247 2269 BracketAccessorNode* assignNode = static_cast<BracketAccessorNode*>(m_lexpr); … … 2251 2273 generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd()); 2252 2274 generator.emitPutByVal(base.get(), subscript, value); 2275 if (generator.vm()->typeProfiler()) { 2276 generator.emitProfileType(value, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr); 2277 generator.emitTypeProfilerExpressionInfo(assignNode->divotStart(), assignNode->divotEnd()); 2278 } 2253 2279 } else { 2254 2280 ASSERT(m_lexpr->isDeconstructionNode());
Note:
See TracChangeset
for help on using the changeset viewer.