Ignore:
Timestamp:
Feb 9, 2015, 11:40:53 PM (10 years ago)
Author:
[email protected]
Message:

JSC's Type Profiler doesn't profile the type of the looping variable in ForOf/ForIn loops
https://bugs.webkit.org/show_bug.cgi?id=141241

Reviewed by Filip Pizlo.

Type information is now recorded for ForIn and ForOf statements.
It was an oversight to not have these statements profiled before.

  • bytecompiler/NodesCodegen.cpp:

(JSC::ForInNode::emitLoopHeader):
(JSC::ForOfNode::emitBytecode):

  • tests/typeProfiler/loop.js: Added.

(testForIn):
(testForOf):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r179371 r179865  
    20282028            generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    20292029            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));
    20312035        return;
    20322036    }
     
    20372041        generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd());
    20382042        generator.emitPutById(base, ident, propertyName);
     2043        if (generator.vm()->typeProfiler()) {
     2044            generator.emitProfileType(propertyName, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
     2045            generator.emitTypeProfilerExpressionInfo(assignNode->divotStart(), assignNode->divotEnd());
     2046        }
    20392047        return;
    20402048    }
     
    20452053        generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd());
    20462054        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        }
    20472059        return;
    20482060    }
     
    20642076        }
    20652077        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));
    20662080        return;
    20672081    }
     
    22362250                generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    22372251                generator.emitPutToScope(scope, ident, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo);
     2252                if (generator.vm()->typeProfiler())
     2253                    generator.emitProfileType(value, resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &ident);
    22382254            }
     2255            if (generator.vm()->typeProfiler())
     2256                generator.emitTypeProfilerExpressionInfo(m_lexpr->position(), JSTextPosition(-1, m_lexpr->position().offset + ident.length(), -1));
    22392257        } else if (m_lexpr->isDotAccessorNode()) {
    22402258            DotAccessorNode* assignNode = static_cast<DotAccessorNode*>(m_lexpr);
     
    22442262            generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd());
    22452263            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            }
    22462268        } else if (m_lexpr->isBracketAccessorNode()) {
    22472269            BracketAccessorNode* assignNode = static_cast<BracketAccessorNode*>(m_lexpr);
     
    22512273            generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd());
    22522274            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            }
    22532279        } else {
    22542280            ASSERT(m_lexpr->isDeconstructionNode());
Note: See TracChangeset for help on using the changeset viewer.