Changeset 262233 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- May 27, 2020, 7:43:25 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r261895 r262233 1825 1825 generator.emitLabel(end.get()); 1826 1826 } 1827 generator.emitProfileType(returnValue.get(), divotStart(), divotEnd()); 1828 return returnValue.get(); 1829 } 1830 1831 RegisterID* HasOwnPropertyFunctionCallDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1832 { 1833 RefPtr<RegisterID> returnValue = generator.finalDestination(dst); 1834 RefPtr<RegisterID> base = generator.emitNode(m_base); 1835 1836 if (m_base->isOptionalChainBase()) 1837 generator.emitOptionalCheck(base.get()); 1838 1839 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 1840 1841 RefPtr<RegisterID> function = generator.emitGetById(generator.newTemporary(), base.get(), generator.propertyNames().hasOwnProperty); 1842 if (isOptionalChainBase()) 1843 generator.emitOptionalCheck(function.get()); 1844 1845 RELEASE_ASSERT(m_args->m_listNode && m_args->m_listNode->m_expr && !m_args->m_listNode->m_next); 1846 ExpressionNode* argument = m_args->m_listNode->m_expr; 1847 RELEASE_ASSERT(argument->isResolveNode()); 1848 StructureForInContext* structureContext = nullptr; 1849 Variable argumentVariable = generator.variable(static_cast<ResolveNode*>(argument)->identifier()); 1850 if (argumentVariable.isLocal()) { 1851 RegisterID* property = argumentVariable.local(); 1852 structureContext = generator.findStructureForInContext(property); 1853 } 1854 1855 if (structureContext && structureContext->base() == base.get()) { 1856 Ref<Label> realCall = generator.newLabel(); 1857 Ref<Label> end = generator.newLabel(); 1858 1859 unsigned branchInsnOffset = generator.emitWideJumpIfNotFunctionHasOwnProperty(function.get(), realCall.get()); 1860 generator.emitHasOwnStructureProperty(returnValue.get(), base.get(), generator.emitNode(argument), structureContext->enumerator()); 1861 generator.emitJump(end.get()); 1862 1863 generator.emitLabel(realCall.get()); 1864 { 1865 CallArguments callArguments(generator, m_args); 1866 generator.move(callArguments.thisRegister(), base.get()); 1867 generator.emitCallInTailPosition(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd(), DebuggableCall::Yes); 1868 } 1869 1870 generator.emitLabel(end.get()); 1871 1872 generator.recordHasOwnStructurePropertyInForInLoop(*structureContext, branchInsnOffset, realCall); 1873 } else { 1874 CallArguments callArguments(generator, m_args); 1875 generator.move(callArguments.thisRegister(), base.get()); 1876 generator.emitCallInTailPosition(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd(), DebuggableCall::Yes); 1877 } 1878 1827 1879 generator.emitProfileType(returnValue.get(), divotStart(), divotEnd()); 1828 1880 return returnValue.get(); … … 3696 3748 generator.emitNode(generator.ignoredResult(), m_lexpr); 3697 3749 3698 RefPtr<RegisterID> base = generator.newTemporary();3699 3750 RefPtr<RegisterID> length; 3700 3751 RefPtr<RegisterID> enumerator; 3701 3752 3702 generator.emitNode(base.get(),m_expr);3753 RefPtr<RegisterID> base = generator.emitNode(m_expr); 3703 3754 RefPtr<RegisterID> local = this->tryGetBoundLocal(generator); 3704 3755 RefPtr<RegisterID> enumeratorIndex; … … 3778 3829 generator.emitProfileControlFlow(profilerStartOffset); 3779 3830 3780 generator.pushStructureForInScope(local.get(), enumeratorIndex.get(), propertyName.get(), enumerator.get() );3831 generator.pushStructureForInScope(local.get(), enumeratorIndex.get(), propertyName.get(), enumerator.get(), base.get()); 3781 3832 generator.emitNode(dst, m_statement); 3782 3833 generator.popStructureForInScope(local.get());
Note:
See TracChangeset
for help on using the changeset viewer.