Changeset 174226 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- Oct 2, 2014, 1:35:58 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r173125 r174226 169 169 JSTextPosition divot = m_start + m_ident.length(); 170 170 generator.emitExpressionInfo(divot, m_start, divot); 171 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident); 171 ResolveScopeInfo resolveScopeInfo; 172 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo); 172 173 RegisterID* finalDest = generator.finalDestination(dst); 173 RegisterID* result = generator.emitGetFromScope(finalDest, scope.get(), m_ident, ThrowIfNotFound );174 RegisterID* result = generator.emitGetFromScope(finalDest, scope.get(), m_ident, ThrowIfNotFound, resolveScopeInfo); 174 175 if (generator.vm()->typeProfiler()) { 175 generator.emitProfileType(finalDest, ProfileTypeBytecodeGetFromScope, &m_ident);176 generator.emitProfileType(finalDest, resolveScopeInfo.isLocal() ? ProfileTypeBytecodeGetFromLocalScope : ProfileTypeBytecodeGetFromScope, &m_ident); 176 177 generator.emitTypeProfilerExpressionInfo(m_position, JSTextPosition(-1, m_position.offset + m_ident.length(), -1)); 177 178 } … … 490 491 JSTextPosition newDivot = divotStart() + 4; 491 492 generator.emitExpressionInfo(newDivot, divotStart(), newDivot); 492 generator.emitResolveScope(callArguments.thisRegister(), generator.propertyNames().eval); 493 generator.emitGetFromScope(func.get(), callArguments.thisRegister(), generator.propertyNames().eval, ThrowIfNotFound); 493 ResolveScopeInfo resolveScopeInfo; 494 generator.emitResolveScope(callArguments.thisRegister(), generator.propertyNames().eval, resolveScopeInfo); 495 generator.emitGetFromScope(func.get(), callArguments.thisRegister(), generator.propertyNames().eval, ThrowIfNotFound, resolveScopeInfo); 494 496 return generator.emitCallEval(generator.finalDestination(dst, func.get()), func.get(), callArguments, divot(), divotStart(), divotEnd()); 495 497 } … … 538 540 JSTextPosition newDivot = divotStart() + m_ident.length(); 539 541 generator.emitExpressionInfo(newDivot, divotStart(), newDivot); 540 generator.emitResolveScope(callArguments.thisRegister(), m_ident); 541 generator.emitGetFromScope(func.get(), callArguments.thisRegister(), m_ident, ThrowIfNotFound); 542 ResolveScopeInfo resolveScopeInfo; 543 generator.emitResolveScope(callArguments.thisRegister(), m_ident, resolveScopeInfo); 544 generator.emitGetFromScope(func.get(), callArguments.thisRegister(), m_ident, ThrowIfNotFound, resolveScopeInfo); 542 545 RegisterID* ret = generator.emitCall(returnValue.get(), func.get(), expectedFunction, callArguments, divot(), divotStart(), divotEnd()); 543 546 if (generator.vm()->typeProfiler()) { … … 803 806 generator.emitReadOnlyExceptionIfNeeded(); 804 807 localReg = generator.emitMove(generator.tempDestination(dst), localReg); 805 } else if ( local.isCaptured() ||generator.vm()->typeProfiler()) {808 } else if (generator.vm()->typeProfiler()) { 806 809 RefPtr<RegisterID> tempDst = generator.finalDestination(dst); 807 810 ASSERT(dst != localReg); … … 819 822 820 823 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 821 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), ident); 822 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound); 824 ResolveScopeInfo resolveScopeInfo; 825 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo); 826 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound, resolveScopeInfo); 823 827 RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator); 824 generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound );828 generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound, resolveScopeInfo); 825 829 if (generator.vm()->typeProfiler()) { 826 generator.emitProfileType(value.get(), ProfileTypeBytecodePutToScope, &ident);830 generator.emitProfileType(value.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &ident); 827 831 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd()); 828 832 } … … 904 908 905 909 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 906 RefPtr<RegisterID> base = generator.emitResolveScope(generator.tempDestination(dst), m_ident); 910 ResolveScopeInfo resolveScopeInfo; 911 RefPtr<RegisterID> base = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo); 907 912 return generator.emitDeleteById(generator.finalDestination(dst, base.get()), base.get(), m_ident); 908 913 } … … 961 966 } 962 967 963 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident); 964 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound); 968 ResolveScopeInfo resolveScopeInfo; 969 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo); 970 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound, resolveScopeInfo); 965 971 if (dst == generator.ignoredResult()) 966 972 return 0; … … 993 999 generator.emitReadOnlyExceptionIfNeeded(); 994 1000 localReg = generator.emitMove(generator.tempDestination(dst), localReg); 995 } else if ( local.isCaptured() ||generator.vm()->typeProfiler()) {1001 } else if (generator.vm()->typeProfiler()) { 996 1002 RefPtr<RegisterID> tempDst = generator.tempDestination(dst); 997 1003 generator.emitMove(tempDst.get(), localReg); … … 1007 1013 1008 1014 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1009 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), ident); 1010 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound); 1015 ResolveScopeInfo resolveScopeInfo; 1016 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), ident, resolveScopeInfo); 1017 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound, resolveScopeInfo); 1011 1018 emitIncOrDec(generator, value.get(), m_operator); 1012 generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound );1019 generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound, resolveScopeInfo); 1013 1020 if (generator.vm()->typeProfiler()) { 1014 generator.emitProfileType(value.get(), ProfileTypeBytecodePutToScope, &ident);1021 generator.emitProfileType(value.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &ident); 1015 1022 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd()); 1016 1023 } … … 1506 1513 } 1507 1514 1508 if (local.isCaptured() 1509 || generator.vm()->typeProfiler() 1515 if (generator.vm()->typeProfiler() 1510 1516 || generator.leftHandSideNeedsCopy(m_rightHasAssignments, m_right->isPure(generator))) { 1511 1517 RefPtr<RegisterID> result = generator.newTemporary(); … … 1525 1531 1526 1532 generator.emitExpressionInfo(newDivot, divotStart(), newDivot); 1527 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident); 1528 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, ThrowIfNotFound); 1533 ResolveScopeInfo resolveScopeInfo; 1534 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo); 1535 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, ThrowIfNotFound, resolveScopeInfo); 1529 1536 RefPtr<RegisterID> result = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()), this); 1530 RegisterID* returnResult = generator.emitPutToScope(scope.get(), m_ident, result.get(), ThrowIfNotFound );1537 RegisterID* returnResult = generator.emitPutToScope(scope.get(), m_ident, result.get(), ThrowIfNotFound, resolveScopeInfo); 1531 1538 if (generator.vm()->typeProfiler()) { 1532 generator.emitProfileType(result.get(), ProfileTypeBytecodePutToScope, &m_ident);1539 generator.emitProfileType(result.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &m_ident); 1533 1540 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd()); 1534 1541 } … … 1545 1552 return generator.emitNode(dst, m_right); 1546 1553 } 1547 if (local.is Captured() || generator.vm()->typeProfiler()) {1554 if (local.isSpecial() || generator.vm()->typeProfiler()) { 1548 1555 RefPtr<RegisterID> tempDst = generator.tempDestination(dst); 1549 1556 generator.emitNode(tempDst.get(), m_right); … … 1561 1568 if (generator.isStrictMode()) 1562 1569 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1563 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident); 1570 ResolveScopeInfo resolveScopeInfo; 1571 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo); 1564 1572 if (dst == generator.ignoredResult()) 1565 1573 dst = 0; 1566 1574 RefPtr<RegisterID> result = generator.emitNode(dst, m_right); 1567 1575 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1568 RegisterID* returnResult = generator.emitPutToScope(scope.get(), m_ident, result.get(), generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound );1576 RegisterID* returnResult = generator.emitPutToScope(scope.get(), m_ident, result.get(), generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo); 1569 1577 if (generator.vm()->typeProfiler()) { 1570 generator.emitProfileType(result.get(), ProfileTypeBytecodePutToScope, &m_ident);1578 generator.emitProfileType(result.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &m_ident); 1571 1579 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd()); 1572 1580 } … … 1677 1685 1678 1686 // FIXME: Maybe call emitExpressionInfo here. 1679 if (local.is Captured() || generator.vm()->typeProfiler()) {1687 if (local.isSpecial() || generator.vm()->typeProfiler()) { 1680 1688 RefPtr<RegisterID> tempDst = generator.newTemporary(); 1681 1689 generator.emitNode(tempDst.get(), m_init); … … 1691 1699 return generator.emitInitGlobalConst(m_ident, value.get()); 1692 1700 1693 if (generator.codeType() != EvalCode) 1701 if (generator.codeType() != EvalCode) { 1702 1703 ResolveScopeInfo resolveScopeInfo; 1704 if (RefPtr<RegisterID> scope = generator.emitResolveConstantLocal(generator.newTemporary(), m_ident, resolveScopeInfo)) 1705 return generator.emitPutToScope(scope.get(), m_ident, value.get(), DoNotThrowIfNotFound, resolveScopeInfo); 1706 1694 1707 return value.get(); 1708 } 1695 1709 1696 1710 // FIXME: This will result in incorrect assignment if m_ident exists in an intervening with scope. 1697 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident); 1698 return generator.emitPutToScope(scope.get(), m_ident, value.get(), DoNotThrowIfNotFound); 1711 ResolveScopeInfo resolveScopeInfo; 1712 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo); 1713 return generator.emitPutToScope(scope.get(), m_ident, value.get(), DoNotThrowIfNotFound, resolveScopeInfo); 1699 1714 } 1700 1715 … … 1793 1808 generator.emitProfileType(local.get(), ProfileTypeBytecodeHasGlobalID, nullptr); 1794 1809 else { 1795 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident); 1796 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound); 1797 generator.emitProfileType(value.get(), ProfileTypeBytecodeGetFromScope, &m_ident); 1810 ResolveScopeInfo resolveScopeInfo; 1811 RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo); 1812 RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound, resolveScopeInfo); 1813 generator.emitProfileType(value.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodeGetFromLocalScope : ProfileTypeBytecodeGetFromScope, &m_ident); 1798 1814 } 1799 1815 … … 1956 1972 const Identifier& ident = static_cast<ResolveNode*>(m_lexpr)->identifier(); 1957 1973 Local local = generator.local(ident); 1958 if (local.isCaptured())1959 return nullptr;1960 1974 return local.get(); 1961 1975 } … … 1970 1984 const Identifier& ident = simpleBinding->boundProperty(); 1971 1985 Local local = generator.local(ident); 1972 if (local.is Captured())1986 if (local.isSpecial()) 1973 1987 return nullptr; 1974 1988 return local.get(); … … 1988 2002 if (generator.isStrictMode()) 1989 2003 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1990 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident); 2004 ResolveScopeInfo resolveScopeInfo; 2005 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo); 1991 2006 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1992 generator.emitPutToScope(scope, ident, propertyName, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound );2007 generator.emitPutToScope(scope, ident, propertyName, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo); 1993 2008 } 1994 2009 return; … … 2022 2037 const Identifier& ident = simpleBinding->boundProperty(); 2023 2038 Local local = generator.local(ident); 2024 if (!local.get() || local.is Captured()) {2039 if (!local.get() || local.isSpecial()) { 2025 2040 assignNode->bindings()->bindValue(generator, propertyName); 2026 2041 return; … … 2184 2199 if (generator.isStrictMode()) 2185 2200 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 2186 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident); 2201 ResolveScopeInfo resolveScopeInfo; 2202 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo); 2187 2203 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 2188 generator.emitPutToScope(scope, ident, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound );2204 generator.emitPutToScope(scope, ident, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo); 2189 2205 } 2190 2206 } else if (m_lexpr->isDotAccessorNode()) { … … 2823 2839 if (generator.isStrictMode()) 2824 2840 generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd()); 2825 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), m_boundProperty); 2841 ResolveScopeInfo resolveScopeInfo; 2842 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), m_boundProperty, resolveScopeInfo); 2826 2843 generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd()); 2827 generator.emitPutToScope(scope, m_boundProperty, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound );2844 generator.emitPutToScope(scope, m_boundProperty, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo); 2828 2845 if (generator.vm()->typeProfiler()) { 2829 generator.emitProfileType(value, ProfileTypeBytecodePutToScope, &m_boundProperty);2846 generator.emitProfileType(value, resolveScopeInfo.isLocal() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &m_boundProperty); 2830 2847 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd()); 2831 2848 }
Note:
See TracChangeset
for help on using the changeset viewer.