Changeset 272580 in webkit for trunk/Source/JavaScriptCore/bytecompiler
- Timestamp:
- Feb 9, 2021, 8:30:24 AM (4 years ago)
- Location:
- trunk/Source/JavaScriptCore/bytecompiler
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r270874 r272580 290 290 } 291 291 292 BytecodeGenerator::BytecodeGenerator(VM& vm, ProgramNode* programNode, UnlinkedProgramCodeBlock* codeBlock, OptionSet<CodeGenerationMode> codeGenerationMode, const RefPtr<TDZEnvironmentLink>& parentScopeTDZVariables, ECMAMode ecmaMode)292 BytecodeGenerator::BytecodeGenerator(VM& vm, ProgramNode* programNode, UnlinkedProgramCodeBlock* codeBlock, OptionSet<CodeGenerationMode> codeGenerationMode, const RefPtr<TDZEnvironmentLink>& parentScopeTDZVariables, const PrivateNameEnvironment*, ECMAMode ecmaMode) 293 293 : BytecodeGeneratorBase(makeUnique<UnlinkedCodeBlockGenerator>(vm, codeBlock), CodeBlock::llintBaselineCalleeSaveSpaceAsVirtualRegisters()) 294 294 , m_codeGenerationMode(codeGenerationMode) … … 337 337 } 338 338 339 BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionNode* functionNode, UnlinkedFunctionCodeBlock* codeBlock, OptionSet<CodeGenerationMode> codeGenerationMode, const RefPtr<TDZEnvironmentLink>& parentScopeTDZVariables, ECMAMode ecmaMode)339 BytecodeGenerator::BytecodeGenerator(VM& vm, FunctionNode* functionNode, UnlinkedFunctionCodeBlock* codeBlock, OptionSet<CodeGenerationMode> codeGenerationMode, const RefPtr<TDZEnvironmentLink>& parentScopeTDZVariables, const PrivateNameEnvironment* parentPrivateNameEnvironment, ECMAMode ecmaMode) 340 340 : BytecodeGeneratorBase(makeUnique<UnlinkedCodeBlockGenerator>(vm, codeBlock), CodeBlock::llintBaselineCalleeSaveSpaceAsVirtualRegisters()) 341 341 , m_codeGenerationMode(codeGenerationMode) … … 360 360 , m_derivedContextType(codeBlock->derivedContextType()) 361 361 { 362 pushPrivateAccessNames(parentPrivateNameEnvironment); 363 362 364 SymbolTable* functionSymbolTable = SymbolTable::create(m_vm); 363 365 functionSymbolTable->setUsesNonStrictEval(m_usesNonStrictEval); … … 708 710 case ConstructorKind::Base: 709 711 emitCreateThis(&m_thisRegister); 712 if (Options::usePrivateMethods() && privateBrandRequirement() == PrivateBrandRequirement::Needed) 713 emitInstallPrivateBrand(&m_thisRegister); 714 710 715 emitInstanceFieldInitializationIfNeeded(&m_thisRegister, &m_calleeRegister, m_scopeNode->position(), m_scopeNode->position(), m_scopeNode->position()); 711 716 break; … … 839 844 } 840 845 841 BytecodeGenerator::BytecodeGenerator(VM& vm, EvalNode* evalNode, UnlinkedEvalCodeBlock* codeBlock, OptionSet<CodeGenerationMode> codeGenerationMode, const RefPtr<TDZEnvironmentLink>& parentScopeTDZVariables, ECMAMode ecmaMode)846 BytecodeGenerator::BytecodeGenerator(VM& vm, EvalNode* evalNode, UnlinkedEvalCodeBlock* codeBlock, OptionSet<CodeGenerationMode> codeGenerationMode, const RefPtr<TDZEnvironmentLink>& parentScopeTDZVariables, const PrivateNameEnvironment* parentPrivateNameEnvironment, ECMAMode ecmaMode) 842 847 : BytecodeGeneratorBase(makeUnique<UnlinkedCodeBlockGenerator>(vm, codeBlock), CodeBlock::llintBaselineCalleeSaveSpaceAsVirtualRegisters()) 843 848 , m_codeGenerationMode(codeGenerationMode) … … 857 862 m_codeBlock->setNumParameters(1); 858 863 864 pushPrivateAccessNames(parentPrivateNameEnvironment); 865 859 866 m_cachedParentTDZ = parentScopeTDZVariables; 860 867 … … 902 909 } 903 910 904 BytecodeGenerator::BytecodeGenerator(VM& vm, ModuleProgramNode* moduleProgramNode, UnlinkedModuleProgramCodeBlock* codeBlock, OptionSet<CodeGenerationMode> codeGenerationMode, const RefPtr<TDZEnvironmentLink>& parentScopeTDZVariables, ECMAMode ecmaMode)911 BytecodeGenerator::BytecodeGenerator(VM& vm, ModuleProgramNode* moduleProgramNode, UnlinkedModuleProgramCodeBlock* codeBlock, OptionSet<CodeGenerationMode> codeGenerationMode, const RefPtr<TDZEnvironmentLink>& parentScopeTDZVariables, const PrivateNameEnvironment*, ECMAMode ecmaMode) 905 912 : BytecodeGeneratorBase(makeUnique<UnlinkedCodeBlockGenerator>(vm, codeBlock), CodeBlock::llintBaselineCalleeSaveSpaceAsVirtualRegisters()) 906 913 , m_codeGenerationMode(codeGenerationMode) … … 1894 1901 // FIXME: only do this if there is an eval() within a nested scope --- otherwise it isn't needed. 1895 1902 // https://bugs.webkit.org/show_bug.cgi?id=206663 1896 if (entry.value.isPrivateName()) 1897 symbolTable->addPrivateName(entry.key.get()); 1903 if (entry.value.isPrivateField()) 1904 symbolTable->addPrivateName(entry.key.get(), PrivateNameEntry(PrivateNameEntry::Traits::IsDeclared)); 1905 else if (entry.value.isPrivateMethod()) 1906 symbolTable->addPrivateName(entry.key.get(), PrivateNameEntry(PrivateNameEntry::Traits::IsDeclared | PrivateNameEntry::Traits::IsMethod)); 1898 1907 } 1899 1908 } … … 2715 2724 } 2716 2725 2717 RegisterID* BytecodeGenerator::emit DirectGetByVal(RegisterID* dst, RegisterID* base, RegisterID* property)2726 RegisterID* BytecodeGenerator::emitGetPrivateName(RegisterID* dst, RegisterID* base, RegisterID* property) 2718 2727 { 2719 2728 OpGetPrivateName::emit(this, dst, base, property); … … 2751 2760 } 2752 2761 2762 void BytecodeGenerator::emitCreatePrivateBrand(RegisterID* scope, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 2763 { 2764 RefPtr<RegisterID> createPrivateSymbol = moveLinkTimeConstant(nullptr, LinkTimeConstant::createPrivateSymbol); 2765 2766 CallArguments arguments(*this, nullptr, 0); 2767 emitLoad(arguments.thisRegister(), jsUndefined()); 2768 RegisterID* newSymbol = emitCall(finalDestination(nullptr, createPrivateSymbol.get()), createPrivateSymbol.get(), NoExpectedFunction, arguments, divot, divotStart, divotEnd, DebuggableCall::No); 2769 2770 Variable privateBrandVar = variable(propertyNames().builtinNames().privateBrandPrivateName()); 2771 2772 emitPutToScope(scope, privateBrandVar, newSymbol, DoNotThrowIfNotFound, InitializationMode::Initialization); 2773 } 2774 2775 void BytecodeGenerator::emitInstallPrivateBrand(RegisterID* target) 2776 { 2777 Variable privateBrandVar = variable(propertyNames().builtinNames().privateBrandPrivateName()); 2778 RefPtr<RegisterID> privateBrandVarScope = emitResolveScope(nullptr, privateBrandVar); 2779 RegisterID* privateBrandSymbol = emitGetPrivateBrand(newTemporary(), privateBrandVarScope.get()); 2780 OpSetPrivateBrand::emit(this, target, privateBrandSymbol); 2781 } 2782 2783 RegisterID* BytecodeGenerator::emitGetPrivateBrand(RegisterID* dst, RegisterID* scope) 2784 { 2785 Variable privateBrandVar = variable(propertyNames().builtinNames().privateBrandPrivateName()); 2786 return emitGetFromScope(dst, scope, privateBrandVar, ThrowIfNotFound); 2787 } 2788 2753 2789 RegisterID* BytecodeGenerator::emitPrivateFieldPut(RegisterID* base, RegisterID* property, RegisterID* value) 2754 2790 { 2755 2791 OpPutPrivateName::emit(this, base, property, value, PrivateFieldPutKind::set()); 2756 2792 return value; 2793 } 2794 2795 void BytecodeGenerator::emitCheckPrivateBrand(RegisterID* base, RegisterID* brandSymbol) 2796 { 2797 OpCheckPrivateBrand::emit(this, base, brandSymbol); 2757 2798 } 2758 2799 … … 2889 2930 } 2890 2931 } 2932 } 2933 2934 bool BytecodeGenerator::isPrivateMethod(const Identifier& ident) 2935 { 2936 for (unsigned i = m_privateNamesStack.size(); i--; ) { 2937 auto& map = m_privateNamesStack[i]; 2938 auto it = map.find(ident.impl()); 2939 if (it != map.end()) 2940 return it->value.isMethod(); 2941 } 2942 2943 return false; 2944 } 2945 2946 void BytecodeGenerator::pushPrivateAccessNames(const PrivateNameEnvironment* environment) 2947 { 2948 if (!environment || !environment->size()) 2949 return; 2950 2951 m_privateNamesStack.append(*environment); 2952 } 2953 2954 void BytecodeGenerator::popPrivateAccessNames() 2955 { 2956 ASSERT(m_privateNamesStack.size()); 2957 m_privateNamesStack.removeLast(); 2891 2958 } 2892 2959 … … 2910 2977 2911 2978 m_TDZStack.append(TDZStackEntry { WTFMove(map), nullptr }); 2979 } 2980 2981 Optional<PrivateNameEnvironment> BytecodeGenerator::getAvailablePrivateAccessNames() 2982 { 2983 PrivateNameEnvironment result; 2984 SmallPtrSet<UniquedStringImpl*, 16> excludedNames; 2985 for (unsigned i = m_privateNamesStack.size(); i--; ) { 2986 auto& map = m_privateNamesStack[i]; 2987 for (auto& entry : map) { 2988 if (entry.value.isPrivateMethodOrAcessor()) { 2989 if (!excludedNames.contains(entry.key.get())) { 2990 result.add(entry.key, entry.value); 2991 excludedNames.add(entry.key.get()); 2992 } 2993 } else 2994 excludedNames.add(entry.key.get()); 2995 } 2996 } 2997 2998 if (!result.size()) 2999 return WTF::nullopt; 3000 return result; 2912 3001 } 2913 3002 … … 3121 3210 3122 3211 RegisterID* BytecodeGenerator::emitNewDefaultConstructor(RegisterID* dst, ConstructorKind constructorKind, const Identifier& name, 3123 const Identifier& ecmaName, const SourceCode& classSource, NeedsClassFieldInitializer needsClassFieldInitializer )3124 { 3125 UnlinkedFunctionExecutable* executable = m_vm.builtinExecutables()->createDefaultConstructor(constructorKind, name, needsClassFieldInitializer );3212 const Identifier& ecmaName, const SourceCode& classSource, NeedsClassFieldInitializer needsClassFieldInitializer, PrivateBrandRequirement privateBrandRequirement) 3213 { 3214 UnlinkedFunctionExecutable* executable = m_vm.builtinExecutables()->createDefaultConstructor(constructorKind, name, needsClassFieldInitializer, privateBrandRequirement); 3126 3215 executable->setInvalidTypeProfilingOffsets(); 3127 3216 executable->setEcmaName(ecmaName); … … 3147 3236 3148 3237 auto variablesUnderTDZ = getVariablesUnderTDZ(); 3238 Optional<PrivateNameEnvironment> parentPrivateNameEnvironment = getAvailablePrivateAccessNames(); 3149 3239 SourceParseMode parseMode = SourceParseMode::ClassFieldInitializerMode; 3150 3240 ConstructAbility constructAbility = ConstructAbility::CannotConstruct; … … 3153 3243 FunctionMetadataNode metadata(parserArena(), JSTokenLocation(), JSTokenLocation(), 0, 0, 0, 0, 0, alwaysStrictInClass, ConstructorKind::None, superBinding, 0, parseMode, false); 3154 3244 metadata.finishParsing(m_scopeNode->source(), Identifier(), FunctionMode::MethodDefinition); 3155 auto initializer = UnlinkedFunctionExecutable::create(m_vm, m_scopeNode->source(), &metadata, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, constructAbility, scriptMode(), WTFMove(variablesUnderTDZ), newDerivedContextType, NeedsClassFieldInitializer::No);3245 auto initializer = UnlinkedFunctionExecutable::create(m_vm, m_scopeNode->source(), &metadata, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, constructAbility, scriptMode(), WTFMove(variablesUnderTDZ), WTFMove(parentPrivateNameEnvironment), newDerivedContextType, NeedsClassFieldInitializer::No, PrivateBrandRequirement::None); 3156 3246 initializer->setClassFieldLocations(WTFMove(classFieldLocations)); 3157 3247 -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r270874 r272580 409 409 typedef DeclarationStacks::FunctionStack FunctionStack; 410 410 411 BytecodeGenerator(VM&, ProgramNode*, UnlinkedProgramCodeBlock*, OptionSet<CodeGenerationMode>, const RefPtr<TDZEnvironmentLink>&, ECMAMode);412 BytecodeGenerator(VM&, FunctionNode*, UnlinkedFunctionCodeBlock*, OptionSet<CodeGenerationMode>, const RefPtr<TDZEnvironmentLink>&, ECMAMode);413 BytecodeGenerator(VM&, EvalNode*, UnlinkedEvalCodeBlock*, OptionSet<CodeGenerationMode>, const RefPtr<TDZEnvironmentLink>&, ECMAMode);414 BytecodeGenerator(VM&, ModuleProgramNode*, UnlinkedModuleProgramCodeBlock*, OptionSet<CodeGenerationMode>, const RefPtr<TDZEnvironmentLink>&, ECMAMode);411 BytecodeGenerator(VM&, ProgramNode*, UnlinkedProgramCodeBlock*, OptionSet<CodeGenerationMode>, const RefPtr<TDZEnvironmentLink>&, const PrivateNameEnvironment*, ECMAMode); 412 BytecodeGenerator(VM&, FunctionNode*, UnlinkedFunctionCodeBlock*, OptionSet<CodeGenerationMode>, const RefPtr<TDZEnvironmentLink>&, const PrivateNameEnvironment*, ECMAMode); 413 BytecodeGenerator(VM&, EvalNode*, UnlinkedEvalCodeBlock*, OptionSet<CodeGenerationMode>, const RefPtr<TDZEnvironmentLink>&, const PrivateNameEnvironment*, ECMAMode); 414 BytecodeGenerator(VM&, ModuleProgramNode*, UnlinkedModuleProgramCodeBlock*, OptionSet<CodeGenerationMode>, const RefPtr<TDZEnvironmentLink>&, const PrivateNameEnvironment*, ECMAMode); 415 415 416 416 ~BytecodeGenerator(); … … 426 426 bool usesEval() const { return m_scopeNode->usesEval(); } 427 427 bool usesThis() const { return m_scopeNode->usesThis(); } 428 PrivateBrandRequirement privateBrandRequirement() const { return m_codeBlock->privateBrandRequirement(); } 428 429 ConstructorKind constructorKind() const { return m_codeBlock->constructorKind(); } 429 430 SuperBinding superBinding() const { return m_codeBlock->superBinding(); } … … 432 433 433 434 template<typename Node, typename UnlinkedCodeBlock> 434 static ParserError generate(VM& vm, Node* node, const SourceCode& sourceCode, UnlinkedCodeBlock* unlinkedCodeBlock, OptionSet<CodeGenerationMode> codeGenerationMode, const RefPtr<TDZEnvironmentLink>& parentScopeTDZVariables, ECMAMode ecmaMode)435 static ParserError generate(VM& vm, Node* node, const SourceCode& sourceCode, UnlinkedCodeBlock* unlinkedCodeBlock, OptionSet<CodeGenerationMode> codeGenerationMode, const RefPtr<TDZEnvironmentLink>& parentScopeTDZVariables, const PrivateNameEnvironment* privateNameEnvironment, ECMAMode ecmaMode) 435 436 { 436 437 MonotonicTime before; … … 439 440 440 441 DeferGC deferGC(vm.heap); 441 auto bytecodeGenerator = makeUnique<BytecodeGenerator>(vm, node, unlinkedCodeBlock, codeGenerationMode, parentScopeTDZVariables, ecmaMode);442 auto bytecodeGenerator = makeUnique<BytecodeGenerator>(vm, node, unlinkedCodeBlock, codeGenerationMode, parentScopeTDZVariables, privateNameEnvironment, ecmaMode); 442 443 auto result = bytecodeGenerator->generate(); 443 444 … … 775 776 RegisterID* emitNewFunction(RegisterID* dst, FunctionMetadataNode*); 776 777 RegisterID* emitNewFunctionExpression(RegisterID* dst, FuncExprNode*); 777 RegisterID* emitNewDefaultConstructor(RegisterID* dst, ConstructorKind, const Identifier& name, const Identifier& ecmaName, const SourceCode& classSource, NeedsClassFieldInitializer );778 RegisterID* emitNewDefaultConstructor(RegisterID* dst, ConstructorKind, const Identifier& name, const Identifier& ecmaName, const SourceCode& classSource, NeedsClassFieldInitializer, PrivateBrandRequirement); 778 779 RegisterID* emitNewClassFieldInitializerFunction(RegisterID* dst, Vector<JSTextPosition>&& classFieldLocations, bool isDerived); 779 780 RegisterID* emitNewArrowFunctionExpression(RegisterID*, ArrowFuncExprNode*); … … 816 817 RegisterID* emitPutByVal(RegisterID* base, RegisterID* property, RegisterID* value); 817 818 RegisterID* emitPutByVal(RegisterID* base, RegisterID* thisValue, RegisterID* property, RegisterID* value); 818 RegisterID* emitDirectGetByVal(RegisterID* dst, RegisterID* base, RegisterID* property);819 819 RegisterID* emitDirectPutByVal(RegisterID* base, RegisterID* property, RegisterID* value); 820 820 RegisterID* emitDeleteByVal(RegisterID* dst, RegisterID* base, RegisterID* property); … … 824 824 RegisterID* emitDefinePrivateField(RegisterID* base, RegisterID* property, RegisterID* value); 825 825 RegisterID* emitPrivateFieldPut(RegisterID* base, RegisterID* property, RegisterID* value); 826 RegisterID* emitGetPrivateName(RegisterID* dst, RegisterID* base, RegisterID* property); 827 828 void emitCreatePrivateBrand(RegisterID* dst, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd); 829 void emitInstallPrivateBrand(RegisterID* target); 830 RegisterID* emitGetPrivateBrand(RegisterID* dst, RegisterID* scope); 831 void emitCheckPrivateBrand(RegisterID* base, RegisterID* brand); 826 832 827 833 void emitSuperSamplerBegin(); … … 1177 1183 1178 1184 NeedsClassFieldInitializer needsClassFieldInitializer = metadata->isConstructorAndNeedsClassFieldInitializer() ? NeedsClassFieldInitializer::Yes : NeedsClassFieldInitializer::No; 1185 PrivateBrandRequirement privateBrandRequirement = metadata->privateBrandRequirement(); 1179 1186 if (SourceParseModeSet(SourceParseMode::ArrowFunctionMode, SourceParseMode::AsyncArrowFunctionMode, SourceParseMode::AsyncArrowFunctionBodyMode).contains(metadata->parseMode())) { 1180 1187 if (constructorKind() == ConstructorKind::Extends || isDerivedConstructorContext()) { 1181 1188 newDerivedContextType = DerivedContextType::DerivedConstructorContext; 1182 1189 needsClassFieldInitializer = m_codeBlock->needsClassFieldInitializer(); 1190 privateBrandRequirement = m_codeBlock->privateBrandRequirement(); 1183 1191 } 1184 1192 else if (m_codeBlock->isClassContext() || isDerivedClassContext()) … … 1187 1195 1188 1196 auto optionalVariablesUnderTDZ = getVariablesUnderTDZ(); 1197 Optional<PrivateNameEnvironment> parentPrivateNameEnvironment = getAvailablePrivateAccessNames(); 1189 1198 1190 1199 // FIXME: These flags, ParserModes and propagation to XXXCodeBlocks should be reorganized. … … 1195 1204 constructAbility = ConstructAbility::CanConstruct; 1196 1205 1197 return UnlinkedFunctionExecutable::create(m_vm, m_scopeNode->source(), metadata, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, constructAbility, scriptMode(), WTFMove(optionalVariablesUnderTDZ), newDerivedContextType, needsClassFieldInitializer);1206 return UnlinkedFunctionExecutable::create(m_vm, m_scopeNode->source(), metadata, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, constructAbility, scriptMode(), WTFMove(optionalVariablesUnderTDZ), WTFMove(parentPrivateNameEnvironment), newDerivedContextType, needsClassFieldInitializer, privateBrandRequirement); 1198 1207 } 1199 1208 1200 1209 RefPtr<TDZEnvironmentLink> getVariablesUnderTDZ(); 1210 Optional<PrivateNameEnvironment> getAvailablePrivateAccessNames(); 1201 1211 1202 1212 RegisterID* emitConstructVarargs(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, int32_t firstVarArgOffset, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd, DebuggableCall); … … 1254 1264 } 1255 1265 1266 bool isPrivateMethod(const Identifier&); 1267 1268 void pushPrivateAccessNames(const PrivateNameEnvironment*); 1269 void popPrivateAccessNames(); 1270 1256 1271 private: 1257 1272 OptionSet<CodeGenerationMode> m_codeGenerationMode; … … 1267 1282 RefPtr<TDZEnvironmentLink> m_cachedParentTDZ; 1268 1283 Vector<TDZStackEntry> m_TDZStack; 1284 Vector<PrivateNameEnvironment> m_privateNamesStack; 1269 1285 Optional<size_t> m_varScopeLexicalScopeStackIndex; 1270 1286 void pushTDZVariables(const VariableEnvironment&, TDZCheckOptimization, TDZRequirement); -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r272243 r272580 564 564 for (PropertyListNode* p = this; p; p = p->m_next) { 565 565 const PropertyNode& node = *p->m_node; 566 if (node.type() & PropertyNode::Private ) {566 if (node.type() & PropertyNode::PrivateField) { 567 567 if (!createPrivateSymbol) 568 568 createPrivateSymbol = generator.moveLinkTimeConstant(nullptr, LinkTimeConstant::createPrivateSymbol); … … 590 590 emitSaveComputedFieldName(generator, *p->m_node); 591 591 592 if (p->isInstanceClassField() ) {592 if (p->isInstanceClassField() && !(p->m_node->type() & PropertyNode::PrivateMethod)) { 593 593 ASSERT(instanceFieldLocations); 594 594 instanceFieldLocations->append(p->position()); … … 758 758 { 759 759 // Private fields are handled in a synthetic classFieldInitializer function, not here. 760 ASSERT(!(node.type() & PropertyNode::Private ));760 ASSERT(!(node.type() & PropertyNode::PrivateField)); 761 761 762 762 if (PropertyNode::isUnderscoreProtoSetter(generator.vm(), node)) { … … 783 783 if (node.isClassProperty()) { 784 784 ASSERT(node.needsSuperBinding()); 785 786 if (node.type() & PropertyNode::PrivateMethod) { 787 Variable var = generator.variable(*node.name()); 788 generator.emitPutToScope(generator.scopeRegister(), var, value.get(), DoNotThrowIfNotFound, InitializationMode::ConstInitialization); 789 return; 790 } 791 792 RefPtr<RegisterID> propertyNameRegister; 785 793 if (node.name()) 786 794 propertyName = generator.emitLoad(nullptr, *node.name()); … … 911 919 RegisterID* BaseDotNode::emitGetPropertyValue(BytecodeGenerator& generator, RegisterID* dst, RegisterID* base, RefPtr<RegisterID>& thisValue) 912 920 { 913 if (isPrivateField()) { 921 if (isPrivateMember()) { 922 if (generator.isPrivateMethod(identifier())) { 923 Variable var = generator.variable(identifier()); 924 RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var); 925 926 RegisterID* privateBrandSymbol = generator.emitGetPrivateBrand(generator.newTemporary(), scope.get()); 927 generator.emitCheckPrivateBrand(base, privateBrandSymbol); 928 929 return generator.emitGetFromScope(dst, scope.get(), var, ThrowIfNotFound); 930 } 931 914 932 Variable var = generator.variable(m_ident); 915 933 ASSERT_WITH_MESSAGE(!var.local(), "Private Field names must be stored in captured variables"); … … 918 936 RefPtr<RegisterID> privateName = generator.newTemporary(); 919 937 generator.emitGetFromScope(privateName.get(), scope.get(), var, DoNotThrowIfNotFound); 920 return generator.emit DirectGetByVal(dst, base, privateName.get());938 return generator.emitGetPrivateName(dst, base, privateName.get()); 921 939 } 922 940 … … 938 956 RegisterID* BaseDotNode::emitPutProperty(BytecodeGenerator& generator, RegisterID* base, RegisterID* value, RefPtr<RegisterID>& thisValue) 939 957 { 940 if (isPrivateField()) { 958 if (isPrivateMember()) { 959 auto identifierName = identifier(); 960 if (generator.isPrivateMethod(identifierName)) { 961 Variable var = generator.variable(identifierName); 962 RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var); 963 964 RegisterID* privateBrandSymbol = generator.emitGetPrivateBrand(generator.newTemporary(), scope.get()); 965 generator.emitCheckPrivateBrand(base, privateBrandSymbol); 966 967 generator.emitThrowTypeError("Trying to access a not defined private setter"); 968 } 969 941 970 Variable var = generator.variable(m_ident); 942 971 ASSERT_WITH_MESSAGE(!var.local(), "Private Field names must be stored in captured variables"); … … 1096 1125 1097 1126 // Initialize instance fields after super-call. 1127 if (Options::usePrivateMethods() && generator.privateBrandRequirement() == PrivateBrandRequirement::Needed) 1128 generator.emitInstallPrivateBrand(generator.thisRegister()); 1129 1098 1130 if (generator.needsClassFieldInitializer() == NeedsClassFieldInitializer::Yes) { 1099 1131 ASSERT(generator.isConstructor() || generator.isDerivedConstructorContext()); … … 1101 1133 generator.emitInstanceFieldInitializationIfNeeded(generator.thisRegister(), func.get(), divot(), divotStart(), divotEnd()); 1102 1134 } 1103 1104 1135 return ret; 1105 1136 } … … 2255 2286 generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->divotStart(), dotAccessor->divotEnd()); 2256 2287 2257 if (dotAccessor->isPrivate Field()) {2288 if (dotAccessor->isPrivateMember()) { 2258 2289 ASSERT(!baseIsSuper); 2259 2290 Variable var = generator.variable(ident); … … 2262 2293 generator.emitGetFromScope(privateName.get(), scope.get(), var, DoNotThrowIfNotFound); 2263 2294 2264 RefPtr<RegisterID> value = generator.emit DirectGetByVal(generator.newTemporary(), base.get(), privateName.get());2295 RefPtr<RegisterID> value = generator.emitGetPrivateName(generator.newTemporary(), base.get(), privateName.get()); 2265 2296 RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.tempDestination(dst), value.get(), m_operator); 2266 2297 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); … … 2494 2525 generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->divotStart(), dotAccessor->divotEnd()); 2495 2526 RegisterID* value; 2496 if (dotAccessor->isPrivate Field()) {2527 if (dotAccessor->isPrivateMember()) { 2497 2528 ASSERT(!baseNode->isSuperNode()); 2498 2529 Variable var = generator.variable(ident); … … 2501 2532 generator.emitGetFromScope(privateName.get(), scope.get(), var, DoNotThrowIfNotFound); 2502 2533 2503 value = generator.emit DirectGetByVal(propDst.get(), base.get(), privateName.get());2534 value = generator.emitGetPrivateName(propDst.get(), base.get(), privateName.get()); 2504 2535 emitIncOrDec(generator, value, m_operator); 2505 2536 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); … … 4916 4947 generator.pushLexicalScope(this, BytecodeGenerator::TDZCheckOptimization::Optimize, BytecodeGenerator::NestedScopeType::IsNested); 4917 4948 4949 bool hasPrivateNames = !!m_lexicalVariables.privateNamesSize(); 4950 bool shouldEmitPrivateBrand = m_lexicalVariables.hasPrivateMethodOrAccessor(); 4951 if (hasPrivateNames) 4952 generator.pushPrivateAccessNames(m_lexicalVariables.privateNameEnvironment()); 4953 if (shouldEmitPrivateBrand) 4954 generator.emitCreatePrivateBrand(generator.scopeRegister(), m_position, m_position, m_position); 4955 4918 4956 RefPtr<RegisterID> superclass; 4919 4957 if (m_classHeritage) { … … 4926 4964 4927 4965 auto needsClassFieldInitializer = this->hasInstanceFields() ? NeedsClassFieldInitializer::Yes : NeedsClassFieldInitializer::No; 4928 4966 auto privateBrandRequirement = shouldEmitPrivateBrand ? PrivateBrandRequirement::Needed : PrivateBrandRequirement::None; 4929 4967 if (m_constructorExpression) { 4930 4968 ASSERT(m_constructorExpression->isFuncExprNode()); … … 4933 4971 metadata->setClassSource(m_classSource); 4934 4972 metadata->setNeedsClassFieldInitializer(needsClassFieldInitializer == NeedsClassFieldInitializer::Yes); 4973 metadata->setPrivateBrandRequirement(privateBrandRequirement); 4935 4974 constructor = generator.emitNode(constructor.get(), m_constructorExpression); 4936 4975 needsHomeObject = m_classHeritage || metadata->superBinding() == SuperBinding::Needed; 4937 4976 } else 4938 constructor = generator.emitNewDefaultConstructor(constructor.get(), m_classHeritage ? ConstructorKind::Extends : ConstructorKind::Base, m_name, ecmaName(), m_classSource, needsClassFieldInitializer );4977 constructor = generator.emitNewDefaultConstructor(constructor.get(), m_classHeritage ? ConstructorKind::Extends : ConstructorKind::Base, m_name, ecmaName(), m_classSource, needsClassFieldInitializer, privateBrandRequirement); 4939 4978 4940 4979 const auto& propertyNames = generator.propertyNames(); … … 5014 5053 if (m_needsLexicalScope) 5015 5054 generator.popLexicalScope(this); 5055 5056 if (hasPrivateNames) 5057 generator.popPrivateAccessNames(); 5016 5058 5017 5059 return generator.move(generator.finalDestination(dst, constructor.get()), constructor.get());
Note:
See TracChangeset
for help on using the changeset viewer.