Changeset 262354 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- May 30, 2020, 8:20:40 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r262233 r262354 1853 1853 } 1854 1854 1855 if (structureContext && structureContext->base() == base.get()) { 1855 auto canUseFastHasOwnProperty = [&] { 1856 if (!structureContext) 1857 return false; 1858 if (!structureContext->baseVariable()) 1859 return false; 1860 if (m_base->isResolveNode()) 1861 return generator.variable(static_cast<ResolveNode*>(m_base)->identifier()) == structureContext->baseVariable().value(); 1862 if (m_base->isThisNode()) { 1863 // After generator.ensureThis (which must be invoked in |base|'s materialization), we can ensure that |this| is in local this-register. 1864 ASSERT(base); 1865 return generator.variable(generator.propertyNames().thisIdentifier, ThisResolutionType::Local) == structureContext->baseVariable().value(); 1866 } 1867 return false; 1868 }; 1869 1870 if (canUseFastHasOwnProperty()) { 1871 // It is possible that base register is variable and each for-in body replaces JS object in the base register with a different one. 1872 // Even though, this is OK since HasOwnStructureProperty will reject the replaced JS object. 1856 1873 Ref<Label> realCall = generator.newLabel(); 1857 1874 Ref<Label> end = generator.newLabel(); … … 3748 3765 generator.emitNode(generator.ignoredResult(), m_lexpr); 3749 3766 3767 RefPtr<RegisterID> base = generator.newTemporary(); 3750 3768 RefPtr<RegisterID> length; 3751 3769 RefPtr<RegisterID> enumerator; 3752 3770 3753 RefPtr<RegisterID> base = generator.emitNode(m_expr);3771 generator.emitNode(base.get(), m_expr); 3754 3772 RefPtr<RegisterID> local = this->tryGetBoundLocal(generator); 3755 3773 RefPtr<RegisterID> enumeratorIndex; 3774 3775 Optional<Variable> baseVariable; 3776 if (m_expr->isResolveNode()) 3777 baseVariable = generator.variable(static_cast<ResolveNode*>(m_expr)->identifier()); 3778 else if (m_expr->isThisNode()) { 3779 // After generator.ensureThis (which must be invoked in |base|'s materialization), we can ensure that |this| is in local this-register. 3780 ASSERT(base); 3781 baseVariable = generator.variable(generator.propertyNames().thisIdentifier, ThisResolutionType::Local); 3782 } 3756 3783 3757 3784 // Pause at the assignment expression for each for..in iteration. … … 3829 3856 generator.emitProfileControlFlow(profilerStartOffset); 3830 3857 3831 generator.pushStructureForInScope(local.get(), enumeratorIndex.get(), propertyName.get(), enumerator.get(), base .get());3858 generator.pushStructureForInScope(local.get(), enumeratorIndex.get(), propertyName.get(), enumerator.get(), baseVariable); 3832 3859 generator.emitNode(dst, m_statement); 3833 3860 generator.popStructureForInScope(local.get());
Note:
See TracChangeset
for help on using the changeset viewer.