⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 179865 in webkit


Ignore:
Timestamp:
Feb 9, 2015, 11:40:53 PM (12 years ago)
Author:
saambarati1@gmail.com
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):

Location:
trunk/Source/JavaScriptCore
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r179863 r179865  
     12015-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
    1182015-02-09  Filip Pizlo  <fpizlo@apple.com>
    219
  • 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.