Changeset 262613 in webkit for trunk/Source/JavaScriptCore/bytecompiler
- Timestamp:
- Jun 5, 2020, 4:25:43 AM (5 years ago)
- Location:
- trunk/Source/JavaScriptCore/bytecompiler
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r262567 r262613 1893 1893 SymbolTableEntry newEntry(varOffset, static_cast<unsigned>(entry.value.isConst() ? PropertyAttribute::ReadOnly : PropertyAttribute::None)); 1894 1894 symbolTable->add(NoLockingNecessary, entry.key.get(), newEntry); 1895 1896 // FIXME: only do this if there is an eval() within a nested scope --- otherwise it isn't needed. 1897 // https://bugs.webkit.org/show_bug.cgi?id=206663 1898 if (entry.value.isPrivateName()) 1899 symbolTable->addPrivateName(entry.key.get()); 1895 1900 } 1896 1901 } … … 2694 2699 } 2695 2700 2701 RegisterID* BytecodeGenerator::emitDirectGetByVal(RegisterID* dst, RegisterID* base, RegisterID* property) 2702 { 2703 OpGetPrivateName::emit(this, dst, base, property); 2704 return dst; 2705 } 2706 2696 2707 RegisterID* BytecodeGenerator::emitDirectPutByVal(RegisterID* base, RegisterID* property, RegisterID* value) 2697 2708 { 2698 OpPutByValDirect::emit(this, base, property, value, ecmaMode());2709 OpPutByValDirect::emit(this, base, property, value, PutByValFlags::createDirect(ecmaMode())); 2699 2710 return value; 2700 2711 } … … 2715 2726 { 2716 2727 OpPutInternalField::emit(this, base, index, value); 2728 return value; 2729 } 2730 2731 RegisterID* BytecodeGenerator::emitDefinePrivateField(RegisterID* base, RegisterID* property, RegisterID* value) 2732 { 2733 OpPutByValDirect::emit(this, base, property, value, PutByValFlags::createDefinePrivateField(ecmaMode())); 2734 return value; 2735 } 2736 2737 RegisterID* BytecodeGenerator::emitPrivateFieldPut(RegisterID* base, RegisterID* property, RegisterID* value) 2738 { 2739 OpPutByValDirect::emit(this, base, property, value, PutByValFlags::createPutPrivateField(ecmaMode())); 2717 2740 return value; 2718 2741 } -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r262354 r262613 814 814 RegisterID* emitPutByVal(RegisterID* base, RegisterID* property, RegisterID* value); 815 815 RegisterID* emitPutByVal(RegisterID* base, RegisterID* thisValue, RegisterID* property, RegisterID* value); 816 RegisterID* emitDirectGetByVal(RegisterID* dst, RegisterID* base, RegisterID* property); 816 817 RegisterID* emitDirectPutByVal(RegisterID* base, RegisterID* property, RegisterID* value); 817 818 RegisterID* emitDeleteByVal(RegisterID* dst, RegisterID* base, RegisterID* property); … … 819 820 RegisterID* emitGetInternalField(RegisterID* dst, RegisterID* base, unsigned index); 820 821 RegisterID* emitPutInternalField(RegisterID* base, unsigned index, RegisterID* value); 822 RegisterID* emitDefinePrivateField(RegisterID* base, RegisterID* property, RegisterID* value); 823 RegisterID* emitPrivateFieldPut(RegisterID* base, RegisterID* property, RegisterID* value); 821 824 822 825 void emitSuperSamplerBegin(); -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r262354 r262613 545 545 } 546 546 547 void PropertyListNode::emitDeclarePrivateFieldNames(BytecodeGenerator& generator, RegisterID* scope) 548 { 549 // Walk the list and declare any Private property names (e.g. `#foo`) in the provided scope. 550 RefPtr<RegisterID> createPrivateSymbol; 551 for (PropertyListNode* p = this; p; p = p->m_next) { 552 const PropertyNode& node = *p->m_node; 553 if (node.type() & PropertyNode::Private) { 554 if (!createPrivateSymbol) 555 createPrivateSymbol = generator.moveLinkTimeConstant(nullptr, LinkTimeConstant::createPrivateSymbol); 556 557 CallArguments arguments(generator, nullptr, 0); 558 generator.emitLoad(arguments.thisRegister(), jsUndefined()); 559 RefPtr<RegisterID> symbol = generator.emitCall(generator.finalDestination(nullptr, createPrivateSymbol.get()), createPrivateSymbol.get(), NoExpectedFunction, arguments, position(), position(), position(), DebuggableCall::No); 560 561 Variable var = generator.variable(*node.name()); 562 generator.emitPutToScope(scope, var, symbol.get(), DoNotThrowIfNotFound, InitializationMode::ConstInitialization); 563 } 564 } 565 } 566 547 567 RegisterID* PropertyListNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dstOrConstructor, RegisterID* prototype, Vector<JSTextPosition>* instanceFieldLocations) 548 568 { 549 // Fast case: this loop just handles regular value properties.550 569 PropertyListNode* p = this; 551 570 RegisterID* dst = nullptr; 571 572 // Fast case: this loop just handles regular value properties. 552 573 for (; p && (p->m_node->m_type & PropertyNode::Constant); p = p->m_next) { 553 574 dst = p->m_node->isInstanceClassProperty() ? prototype : dstOrConstructor; … … 711 732 void PropertyListNode::emitPutConstantProperty(BytecodeGenerator& generator, RegisterID* newObj, PropertyNode& node) 712 733 { 734 // Private fields are handled in the synthetic instanceFieldInitializer function, not here. 735 ASSERT(!(node.type() & PropertyNode::Private)); 736 713 737 bool shouldSetFunctionName = generator.shouldSetFunctionName(node.m_assign); 714 738 … … 841 865 842 866 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 843 RegisterID* ret; 844 if (baseIsSuper) { 845 RefPtr<RegisterID> thisValue = generator.ensureThis(); 846 ret = generator.emitGetById(finalDest.get(), base.get(), thisValue.get(), m_ident); 847 } else 848 ret = generator.emitGetById(finalDest.get(), base.get(), m_ident); 867 RegisterID* ret = emitGetPropertyValue(generator, finalDest.get(), base.get()); 868 849 869 generator.emitProfileType(finalDest.get(), divotStart(), divotEnd()); 850 870 return ret; 871 } 872 873 RegisterID* BaseDotNode::emitGetPropertyValue(BytecodeGenerator& generator, RegisterID* dst, RegisterID* base, RefPtr<RegisterID>& thisValue) 874 { 875 if (isPrivateField()) { 876 Variable var = generator.variable(m_ident); 877 ASSERT_WITH_MESSAGE(!var.local(), "Private Field names must be stored in captured variables"); 878 879 RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var); 880 RefPtr<RegisterID> privateName = generator.newTemporary(); 881 generator.emitGetFromScope(privateName.get(), scope.get(), var, DoNotThrowIfNotFound); 882 return generator.emitDirectGetByVal(dst, base, privateName.get()); 883 } 884 885 if (m_base->isSuperNode()) { 886 if (!thisValue) 887 thisValue = generator.ensureThis(); 888 return generator.emitGetById(dst, base, thisValue.get(), m_ident); 889 } 890 891 return generator.emitGetById(dst, base, m_ident); 892 } 893 894 RegisterID* BaseDotNode::emitGetPropertyValue(BytecodeGenerator& generator, RegisterID* dst, RegisterID* base) 895 { 896 RefPtr<RegisterID> thisValue; 897 return emitGetPropertyValue(generator, dst, base, thisValue); 898 } 899 900 RegisterID* BaseDotNode::emitPutProperty(BytecodeGenerator& generator, RegisterID* base, RegisterID* value, RefPtr<RegisterID>& thisValue) 901 { 902 if (isPrivateField()) { 903 Variable var = generator.variable(m_ident); 904 ASSERT_WITH_MESSAGE(!var.local(), "Private Field names must be stored in captured variables"); 905 906 RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var); 907 RefPtr<RegisterID> privateName = generator.newTemporary(); 908 generator.emitGetFromScope(privateName.get(), scope.get(), var, DoNotThrowIfNotFound); 909 return generator.emitPrivateFieldPut(base, privateName.get(), value); 910 } 911 912 if (m_base->isSuperNode()) { 913 if (!thisValue) 914 thisValue = generator.ensureThis(); 915 return generator.emitPutById(base, thisValue.get(), m_ident, value); 916 } 917 918 return generator.emitPutById(base, m_ident, value); 919 } 920 921 RegisterID* BaseDotNode::emitPutProperty(BytecodeGenerator& generator, RegisterID* base, RegisterID* value) 922 { 923 RefPtr<RegisterID> thisValue; 924 return emitPutProperty(generator, base, value, thisValue); 851 925 } 852 926 … … 1735 1809 } 1736 1810 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 1737 if (baseIsSuper) { 1738 RefPtr<RegisterID> superBase = emitSuperBaseForCallee(generator); 1739 generator.emitGetById(function.get(), superBase.get(), callArguments.thisRegister(), m_ident); 1740 } else 1741 generator.emitGetById(function.get(), callArguments.thisRegister(), m_ident); 1811 1812 RefPtr<RegisterID> base = baseIsSuper ? emitSuperBaseForCallee(generator) : callArguments.thisRegister(); 1813 emitGetPropertyValue(generator, function.get(), base.get()); 1742 1814 1743 1815 if (isOptionalChainBase()) … … 2129 2201 2130 2202 generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->divotStart(), dotAccessor->divotEnd()); 2203 2204 if (dotAccessor->isPrivateField()) { 2205 ASSERT(!baseIsSuper); 2206 Variable var = generator.variable(ident); 2207 RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var); 2208 RefPtr<RegisterID> privateName = generator.newTemporary(); 2209 generator.emitGetFromScope(privateName.get(), scope.get(), var, DoNotThrowIfNotFound); 2210 2211 RefPtr<RegisterID> value = generator.emitDirectGetByVal(generator.newTemporary(), base.get(), privateName.get()); 2212 RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.tempDestination(dst), value.get(), m_operator); 2213 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 2214 generator.emitPrivateFieldPut(base.get(), privateName.get(), value.get()); 2215 generator.emitProfileType(value.get(), divotStart(), divotEnd()); 2216 return generator.move(dst, oldValue.get()); 2217 } 2218 2131 2219 RefPtr<RegisterID> value; 2132 2220 RefPtr<RegisterID> thisValue; … … 2352 2440 generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->divotStart(), dotAccessor->divotEnd()); 2353 2441 RegisterID* value; 2442 if (dotAccessor->isPrivateField()) { 2443 ASSERT(!baseNode->isSuperNode()); 2444 Variable var = generator.variable(ident); 2445 RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var); 2446 RefPtr<RegisterID> privateName = generator.newTemporary(); 2447 generator.emitGetFromScope(privateName.get(), scope.get(), var, DoNotThrowIfNotFound); 2448 2449 value = generator.emitDirectGetByVal(propDst.get(), base.get(), privateName.get()); 2450 emitIncOrDec(generator, value, m_operator); 2451 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 2452 generator.emitPrivateFieldPut(base.get(), privateName.get(), value); 2453 generator.emitProfileType(value, divotStart(), divotEnd()); 2454 return generator.move(dst, propDst.get()); 2455 } 2456 2354 2457 RefPtr<RegisterID> thisValue; 2355 2458 if (baseNode->isSuperNode()) { … … 3194 3297 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 3195 3298 RefPtr<RegisterID> forwardResult = (dst == generator.ignoredResult()) ? result.get() : generator.move(generator.tempDestination(result.get()), result.get()); 3196 if (m_base->isSuperNode()) { 3197 RefPtr<RegisterID> thisValue = generator.ensureThis(); 3198 generator.emitPutById(base.get(), thisValue.get(), m_ident, forwardResult.get()); 3199 } else 3200 generator.emitPutById(base.get(), m_ident, forwardResult.get()); 3299 emitPutProperty(generator, base.get(), forwardResult.get()); 3201 3300 generator.emitProfileType(forwardResult.get(), divotStart(), divotEnd()); 3202 3301 return generator.move(dst, forwardResult.get()); … … 3210 3309 3211 3310 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 3212 RefPtr<RegisterID> value;3213 3311 RefPtr<RegisterID> thisValue; 3214 if (m_base->isSuperNode()) { 3215 thisValue = generator.ensureThis(); 3216 value = generator.emitGetById(generator.tempDestination(dst), base.get(), thisValue.get(), m_ident); 3217 } else 3218 value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); 3312 RefPtr<RegisterID> value = emitGetPropertyValue(generator, generator.tempDestination(dst), base.get(), thisValue); 3313 3219 3314 RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor())); 3220 3315 3221 3316 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 3222 RegisterID* ret; 3223 if (m_base->isSuperNode()) 3224 ret = generator.emitPutById(base.get(), thisValue.get(), m_ident, updatedValue); 3225 else 3226 ret = generator.emitPutById(base.get(), m_ident, updatedValue); 3317 RefPtr<RegisterID> ret = emitPutProperty(generator, base.get(), updatedValue, thisValue); 3227 3318 generator.emitProfileType(updatedValue, divotStart(), divotEnd()); 3228 return ret ;3319 return ret.get(); 3229 3320 } 3230 3321 … … 4699 4790 break; 4700 4791 } 4792 case DefineFieldNode::Type::PrivateName: { 4793 Variable var = generator.variable(*m_ident); 4794 ASSERT_WITH_MESSAGE(!var.local(), "Private Field names must be stored in captured variables"); 4795 4796 generator.emitExpressionInfo(position(), position(), position() + m_ident->length()); 4797 RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var); 4798 RefPtr<RegisterID> privateName = generator.newTemporary(); 4799 generator.emitGetFromScope(privateName.get(), scope.get(), var, DoNotThrowIfNotFound); 4800 generator.emitDefinePrivateField(generator.thisRegister(), privateName.get(), value.get()); 4801 break; 4802 } 4701 4803 case DefineFieldNode::Type::ComputedName: { 4702 4804 // FIXME: Improve performance of public class fields … … 4709 4811 4710 4812 generator.emitExpressionInfo(position(), position(), position() + 1); 4711 RefPtr<RegisterID> scope = generator.emitResolveScope( generator.newTemporary(), var);4813 RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var); 4712 4814 RefPtr<RegisterID> privateName = generator.newTemporary(); 4713 4815 generator.emitGetFromScope(privateName.get(), scope.get(), var, ThrowIfNotFound); … … 4801 4903 4802 4904 if (m_classElements) { 4905 m_classElements->emitDeclarePrivateFieldNames(generator, generator.scopeRegister()); 4906 4803 4907 Vector<JSTextPosition> instanceFieldLocations; 4804 4908 generator.emitDefineClassElements(m_classElements, constructor.get(), prototype.get(), instanceFieldLocations);
Note:
See TracChangeset
for help on using the changeset viewer.