Changeset 220053 in webkit
- Timestamp:
- Jul 30, 2017 9:57:15 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r220047 r220053 1 2017-07-30 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [WTF] Introduce Private Symbols 4 https://bugs.webkit.org/show_bug.cgi?id=174935 5 6 Reviewed by Darin Adler. 7 8 Use SymbolImpl::isPrivate(). 9 10 * builtins/BuiltinNames.cpp: 11 * builtins/BuiltinNames.h: 12 (JSC::BuiltinNames::isPrivateName): Deleted. 13 * builtins/BuiltinUtils.h: 14 * bytecode/BytecodeIntrinsicRegistry.cpp: 15 (JSC::BytecodeIntrinsicRegistry::lookup): 16 * runtime/CommonIdentifiers.cpp: 17 (JSC::CommonIdentifiers::isPrivateName): Deleted. 18 * runtime/CommonIdentifiers.h: 19 * runtime/ExceptionHelpers.cpp: 20 (JSC::createUndefinedVariableError): 21 * runtime/Identifier.h: 22 (JSC::Identifier::isPrivateName): 23 * runtime/IdentifierInlines.h: 24 (JSC::identifierToSafePublicJSValue): 25 * runtime/ObjectConstructor.cpp: 26 (JSC::objectConstructorAssign): 27 (JSC::defineProperties): 28 (JSC::setIntegrityLevel): 29 (JSC::testIntegrityLevel): 30 (JSC::ownPropertyKeys): 31 * runtime/PrivateName.h: 32 (JSC::PrivateName::PrivateName): 33 * runtime/PropertyName.h: 34 (JSC::PropertyName::isPrivateName): 35 * runtime/ProxyObject.cpp: 36 (JSC::performProxyGet): 37 (JSC::ProxyObject::performInternalMethodGetOwnProperty): 38 (JSC::ProxyObject::performHasProperty): 39 (JSC::ProxyObject::performPut): 40 (JSC::ProxyObject::performDelete): 41 (JSC::ProxyObject::performDefineOwnProperty): 42 1 43 2017-07-29 Keith Miller <keith_miller@apple.com> 2 44 -
trunk/Source/JavaScriptCore/builtins/BuiltinNames.cpp
r219731 r220053 39 39 #undef INITIALIZE_BUILTIN_STATIC_SYMBOLS 40 40 41 #define INITIALIZE_BUILTIN_PRIVATE_NAMES(name) SymbolImpl::StaticSymbolImpl name##PrivateName { "PrivateSymbol." #name };41 #define INITIALIZE_BUILTIN_PRIVATE_NAMES(name) SymbolImpl::StaticSymbolImpl name##PrivateName { "PrivateSymbol." #name, SymbolImpl::s_flagIsPrivate }; 42 42 JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_BUILTIN_PRIVATE_NAMES) 43 43 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_BUILTIN_PRIVATE_NAMES) 44 44 #undef INITIALIZE_BUILTIN_PRIVATE_NAMES 45 45 46 SymbolImpl::StaticSymbolImpl dollarVMPrivateName { "PrivateSymbol.$vm" };46 SymbolImpl::StaticSymbolImpl dollarVMPrivateName { "PrivateSymbol.$vm", SymbolImpl::s_flagIsPrivate }; 47 47 48 48 } // namespace Symbols -
trunk/Source/JavaScriptCore/builtins/BuiltinNames.h
r219731 r220053 32 32 33 33 namespace JSC { 34 35 #define INITIALIZE_BUILTIN_NAMES_IN_JSC(name) , m_##name(JSC::Identifier::fromString(vm, #name)), m_##name##PrivateName(JSC::Identifier::fromUid(vm, &static_cast<SymbolImpl&>(JSC::Symbols::name##PrivateName))) 36 #define INITIALIZE_BUILTIN_SYMBOLS(name) , m_##name##Symbol(JSC::Identifier::fromUid(vm, &static_cast<SymbolImpl&>(JSC::Symbols::name##Symbol))), m_##name##SymbolPrivateIdentifier(JSC::Identifier::fromString(vm, #name "Symbol")) 37 #define DECLARE_BUILTIN_SYMBOLS(name) const JSC::Identifier m_##name##Symbol; const JSC::Identifier m_##name##SymbolPrivateIdentifier; 38 #define DECLARE_BUILTIN_SYMBOL_ACCESSOR(name) \ 39 const JSC::Identifier& name##Symbol() const { return m_##name##Symbol; } 34 40 35 41 #define JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(macro) \ … … 218 224 } 219 225 220 bool isPrivateName(SymbolImpl& uid) const;221 bool isPrivateName(UniquedStringImpl& uid) const;222 bool isPrivateName(const Identifier&) const;223 226 const Identifier* lookUpPrivateName(const Identifier&) const; 224 227 const Identifier& lookUpPublicName(const Identifier&) const; … … 244 247 }; 245 248 246 inline bool BuiltinNames::isPrivateName(SymbolImpl& uid) const247 {248 return m_privateToPublicMap.contains(&uid);249 }250 251 inline bool BuiltinNames::isPrivateName(UniquedStringImpl& uid) const252 {253 if (!uid.isSymbol())254 return false;255 return m_privateToPublicMap.contains(&uid);256 }257 258 inline bool BuiltinNames::isPrivateName(const Identifier& ident) const259 {260 if (ident.isNull())261 return false;262 return isPrivateName(*ident.impl());263 }264 265 249 inline const Identifier* BuiltinNames::lookUpPrivateName(const Identifier& ident) const 266 250 { -
trunk/Source/JavaScriptCore/builtins/BuiltinUtils.h
r219731 r220053 31 31 namespace JSC { 32 32 33 #define INITIALIZE_BUILTIN_NAMES(name) , m_##name(JSC::Identifier::fromString(vm, #name)), m_##name##PrivateName(JSC::Identifier::fromUid(JSC::PrivateName(JSC::PrivateName::Description, ASCIILiteral("PrivateSymbol." #name)))) 34 #define INITIALIZE_BUILTIN_NAMES_IN_JSC(name) , m_##name(JSC::Identifier::fromString(vm, #name)), m_##name##PrivateName(JSC::Identifier::fromUid(vm, &static_cast<SymbolImpl&>(JSC::Symbols::name##PrivateName))) 33 #define INITIALIZE_BUILTIN_NAMES(name) , m_##name(JSC::Identifier::fromString(vm, #name)), m_##name##PrivateName(JSC::Identifier::fromUid(JSC::PrivateName(JSC::PrivateName::PrivateSymbol, ASCIILiteral("PrivateSymbol." #name)))) 35 34 #define DECLARE_BUILTIN_NAMES(name) const JSC::Identifier m_##name; const JSC::Identifier m_##name##PrivateName; 36 35 #define DECLARE_BUILTIN_IDENTIFIER_ACCESSOR(name) \ 37 36 const JSC::Identifier& name##PublicName() const { return m_##name; } \ 38 37 const JSC::Identifier& name##PrivateName() const { return m_##name##PrivateName; } 39 40 #define INITIALIZE_BUILTIN_SYMBOLS(name) , m_##name##Symbol(JSC::Identifier::fromUid(vm, &static_cast<SymbolImpl&>(JSC::Symbols::name##Symbol))), m_##name##SymbolPrivateIdentifier(JSC::Identifier::fromString(vm, #name "Symbol"))41 #define DECLARE_BUILTIN_SYMBOLS(name) const JSC::Identifier m_##name##Symbol; const JSC::Identifier m_##name##SymbolPrivateIdentifier;42 #define DECLARE_BUILTIN_SYMBOL_ACCESSOR(name) \43 const JSC::Identifier& name##Symbol() const { return m_##name##Symbol; }44 38 45 39 class Identifier; -
trunk/Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp
r218794 r220053 78 78 BytecodeIntrinsicNode::EmitterType BytecodeIntrinsicRegistry::lookup(const Identifier& ident) const 79 79 { 80 if (! m_vm.propertyNames->isPrivateName(ident))80 if (!ident.isPrivateName()) 81 81 return nullptr; 82 82 auto iterator = m_bytecodeIntrinsicMap.find(ident.impl()); -
trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.cpp
r202280 r220053 52 52 } 53 53 54 bool CommonIdentifiers::isPrivateName(SymbolImpl& uid) const55 {56 return m_builtinNames->isPrivateName(uid);57 }58 59 bool CommonIdentifiers::isPrivateName(UniquedStringImpl& uid) const60 {61 return m_builtinNames->isPrivateName(uid);62 }63 64 bool CommonIdentifiers::isPrivateName(const Identifier& ident) const65 {66 return m_builtinNames->isPrivateName(ident);67 }68 69 54 const Identifier* CommonIdentifiers::lookUpPrivateName(const Identifier& ident) const 70 55 { -
trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h
r219012 r220053 439 439 #undef JSC_IDENTIFIER_DECLARE_PRIVATE_WELL_KNOWN_SYMBOL_GLOBAL 440 440 441 bool isPrivateName(SymbolImpl& uid) const;442 bool isPrivateName(UniquedStringImpl& uid) const;443 bool isPrivateName(const Identifier&) const;444 445 441 const Identifier* lookUpPrivateName(const Identifier&) const; 446 442 Identifier lookUpPublicName(const Identifier&) const; -
trunk/Source/JavaScriptCore/runtime/ExceptionHelpers.cpp
r218794 r220053 83 83 JSObject* createUndefinedVariableError(ExecState* exec, const Identifier& ident) 84 84 { 85 if ( exec->propertyNames().isPrivateName(ident)) {85 if (ident.isPrivateName()) { 86 86 String message(makeString("Can't find private variable: @", exec->propertyNames().lookUpPublicName(ident).string())); 87 87 return createReferenceError(exec, message); -
trunk/Source/JavaScriptCore/runtime/Identifier.h
r218794 r220053 140 140 bool isEmpty() const { return m_string.isEmpty(); } 141 141 bool isSymbol() const { return !isNull() && impl()->isSymbol(); } 142 bool isPrivateName() const { return isSymbol() && static_cast<const SymbolImpl*>(impl())->isPrivate(); } 142 143 143 144 friend bool operator==(const Identifier&, const Identifier&); -
trunk/Source/JavaScriptCore/runtime/IdentifierInlines.h
r206525 r220053 144 144 inline JSValue identifierToSafePublicJSValue(VM& vm, const Identifier& identifier) 145 145 { 146 if (identifier.isSymbol() && ! vm.propertyNames->isPrivateName(identifier))146 if (identifier.isSymbol() && !identifier.isPrivateName()) 147 147 return Symbol::create(vm, static_cast<SymbolImpl&>(*identifier.impl())); 148 148 return jsString(&vm, identifier.impl()); -
trunk/Source/JavaScriptCore/runtime/ObjectConstructor.cpp
r218790 r220053 357 357 for (unsigned j = 0; j < numProperties; j++) { 358 358 const auto& propertyName = properties[j]; 359 if (propertyName.isSymbol() && ! vm.propertyNames->isPrivateName(propertyName)) {359 if (propertyName.isSymbol() && !propertyName.isPrivateName()) { 360 360 assign(propertyName); 361 361 RETURN_IF_EXCEPTION(scope, { }); … … 566 566 for (size_t i = 0; i < numProperties; i++) { 567 567 Identifier propertyName = propertyNames[i]; 568 if ( vm.propertyNames->isPrivateName(propertyName))568 if (propertyName.isPrivateName()) 569 569 continue; 570 570 object->methodTable(vm)->defineOwnProperty(object, exec, propertyName, descriptors[i], true); … … 632 632 for (PropertyNameArray::const_iterator iter = properties.begin(); iter != end; ++iter) { 633 633 Identifier propertyName = *iter; 634 if ( vm.propertyNames->isPrivateName(propertyName))634 if (propertyName.isPrivateName()) 635 635 continue; 636 636 … … 681 681 for (PropertyNameArray::const_iterator iter = keys.begin(); iter != end; ++iter) { 682 682 Identifier propertyName = *iter; 683 if ( vm.propertyNames->isPrivateName(propertyName))683 if (propertyName.isPrivateName()) 684 684 continue; 685 685 … … 869 869 const auto& identifier = properties[i]; 870 870 ASSERT(identifier.isSymbol()); 871 if (! vm.propertyNames->isPrivateName(identifier)) {871 if (!identifier.isPrivateName()) { 872 872 if (filterPropertyIfNeeded(identifier)) 873 873 keys->push(exec, Symbol::create(vm, static_cast<SymbolImpl&>(*identifier.impl()))); … … 883 883 for (size_t i = 0; i < numProperties; i++) { 884 884 const auto& identifier = properties[i]; 885 if (identifier.isSymbol()) { 886 if (!vm.propertyNames->isPrivateName(identifier)) 887 propertySymbols.append(identifier); 888 } else { 885 if (identifier.isSymbol() && !identifier.isPrivateName()) 886 propertySymbols.append(identifier); 887 else { 889 888 if (filterPropertyIfNeeded(identifier)) 890 889 keys->push(exec, jsOwnedString(exec, identifier.string())); -
trunk/Source/JavaScriptCore/runtime/PrivateName.h
r218794 r220053 49 49 } 50 50 51 enum PrivateSymbolTag { PrivateSymbol }; 52 explicit PrivateName(PrivateSymbolTag, const String& description) 53 : m_uid(PrivateSymbolImpl::create(*description.impl())) 54 { 55 } 56 51 57 PrivateName(const PrivateName& privateName) 52 58 : m_uid(privateName.m_uid.copyRef()) -
trunk/Source/JavaScriptCore/runtime/PropertyName.h
r219981 r220053 56 56 { 57 57 return m_impl && m_impl->isSymbol(); 58 } 59 60 bool isPrivateName() const 61 { 62 return isSymbol() && static_cast<const SymbolImpl*>(m_impl)->isPrivate(); 58 63 } 59 64 -
trunk/Source/JavaScriptCore/runtime/ProxyObject.cpp
r217108 r220053 136 136 }; 137 137 138 if ( vm.propertyNames->isPrivateName(Identifier::fromUid(&vm, propertyName.uid())))138 if (propertyName.isPrivateName()) 139 139 return performDefaultGet(); 140 140 … … 200 200 }; 201 201 202 if ( vm.propertyNames->isPrivateName(Identifier::fromUid(&vm, propertyName.uid()))) {202 if (propertyName.isPrivateName()) { 203 203 scope.release(); 204 204 return performDefaultGetOwnProperty(); … … 306 306 }; 307 307 308 if ( vm.propertyNames->isPrivateName(Identifier::fromUid(&vm, propertyName.uid()))) {308 if (propertyName.isPrivateName()) { 309 309 scope.release(); 310 310 return performDefaultHasProperty(); … … 408 408 } 409 409 410 if ( vm.propertyNames->isPrivateName(Identifier::fromUid(&vm, propertyName.uid()))) {410 if (propertyName.isPrivateName()) { 411 411 scope.release(); 412 412 return performDefaultPut(); … … 605 605 } 606 606 607 if ( vm.propertyNames->isPrivateName(Identifier::fromUid(&vm, propertyName.uid()))) {607 if (propertyName.isPrivateName()) { 608 608 scope.release(); 609 609 return performDefaultDelete(); … … 796 796 }; 797 797 798 if ( vm.propertyNames->isPrivateName(Identifier::fromUid(&vm, propertyName.uid())))798 if (propertyName.isPrivateName()) 799 799 return performDefaultDefineOwnProperty(); 800 800 -
trunk/Source/WTF/ChangeLog
r220049 r220053 1 2017-07-30 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [WTF] Introduce Private Symbols 4 https://bugs.webkit.org/show_bug.cgi?id=174935 5 6 Reviewed by Darin Adler. 7 8 Upcoming proposal of class fields[1] requires private fields. 9 The simple way to implement it is adding a property with a private symbol. 10 Currently, we have private symbols for internal properties. They are usual 11 Symbols managed by the hash table. So basically private symbols are statically 12 created in BuiltinNames. However this new proposal encourages users to create 13 such private symbols more and more. 14 15 So, this patch introduces notion of "Private" into WTF SymbolImpl. This patch 16 adds PrivateSymbolImpl. This is SymbolImpl with "Private" flag. We do not need 17 to look up the symbol from the hash table to check whether the given symbol 18 is a private one. 19 20 [1]: https://github.com/tc39/proposal-class-fields 21 22 * wtf/text/StringImpl.h: 23 * wtf/text/SymbolImpl.cpp: 24 (WTF::PrivateSymbolImpl::create): 25 (WTF::PrivateSymbolImpl::createNullSymbol): 26 * wtf/text/SymbolImpl.h: 27 (WTF::SymbolImpl::isPrivate): 28 (WTF::SymbolImpl::StaticSymbolImpl::StaticSymbolImpl): 29 (WTF::SymbolImpl::SymbolImpl): 30 (WTF::PrivateSymbolImpl::PrivateSymbolImpl): 31 1 32 2017-07-30 Brady Eidson <beidson@apple.com> 2 33 -
trunk/Source/WTF/wtf/text/StringImpl.h
r219731 r220053 191 191 friend class AtomicStringImpl; 192 192 friend class SymbolImpl; 193 friend class PrivateSymbolImpl; 193 194 friend class RegisteredSymbolImpl; 194 195 -
trunk/Source/WTF/wtf/text/SymbolImpl.cpp
r218066 r220053 57 57 } 58 58 59 Ref<PrivateSymbolImpl> PrivateSymbolImpl::create(StringImpl& rep) 60 { 61 auto* ownerRep = (rep.bufferOwnership() == BufferSubstring) ? rep.substringBuffer() : &rep; 62 ASSERT(ownerRep->bufferOwnership() != BufferSubstring); 63 if (rep.is8Bit()) 64 return adoptRef(*new PrivateSymbolImpl(rep.m_data8, rep.length(), *ownerRep)); 65 return adoptRef(*new PrivateSymbolImpl(rep.m_data16, rep.length(), *ownerRep)); 66 } 67 68 Ref<PrivateSymbolImpl> PrivateSymbolImpl::createNullSymbol() 69 { 70 return adoptRef(*new PrivateSymbolImpl); 71 } 72 59 73 Ref<RegisteredSymbolImpl> RegisteredSymbolImpl::create(StringImpl& rep, SymbolRegistry& symbolRegistry) 60 74 { -
trunk/Source/WTF/wtf/text/SymbolImpl.h
r219731 r220053 37 37 public: 38 38 using Flags = unsigned; 39 static constexpr const Flags s_flagDefault = 0u; 40 static constexpr const Flags s_flagIsNullSymbol = 0b01u; 41 static constexpr const Flags s_flagIsRegistered = 0b10u; 39 static constexpr Flags s_flagDefault = 0u; 40 static constexpr Flags s_flagIsNullSymbol = 0b001u; 41 static constexpr Flags s_flagIsRegistered = 0b010u; 42 static constexpr Flags s_flagIsPrivate = 0b100u; 42 43 43 44 unsigned hashForSymbol() const { return m_hashForSymbol; } 44 45 bool isNullSymbol() const { return m_flags & s_flagIsNullSymbol; } 45 46 bool isRegistered() const { return m_flags & s_flagIsRegistered; } 47 bool isPrivate() const { return m_flags & s_flagIsPrivate; } 46 48 47 49 SymbolRegistry* symbolRegistry() const; … … 56 58 public: 57 59 template<unsigned characterCount> 58 constexpr StaticSymbolImpl(const char (&characters)[characterCount] )60 constexpr StaticSymbolImpl(const char (&characters)[characterCount], Flags flags = s_flagDefault) 59 61 : StringImplShape(s_refCountFlagIsStaticString, characterCount - 1, characters, 60 62 s_hashFlag8BitBuffer | s_hashFlagDidReportCost | StringSymbol | BufferInternal | (StringHasher::computeLiteralHashAndMaskTop8Bits(characters) << s_flagCount), ConstructWithConstExpr) 61 63 , m_hashForSymbol(StringHasher::computeLiteralHashAndMaskTop8Bits(characters) << s_flagCount) 64 , m_flags(flags) 62 65 { 63 66 } 64 67 65 68 template<unsigned characterCount> 66 constexpr StaticSymbolImpl(const char16_t (&characters)[characterCount] )69 constexpr StaticSymbolImpl(const char16_t (&characters)[characterCount], Flags flags = s_flagDefault) 67 70 : StringImplShape(s_refCountFlagIsStaticString, characterCount - 1, characters, 68 71 s_hashFlagDidReportCost | StringSymbol | BufferInternal | (StringHasher::computeLiteralHashAndMaskTop8Bits(characters) << s_flagCount), ConstructWithConstExpr) 69 72 , m_hashForSymbol(StringHasher::computeLiteralHashAndMaskTop8Bits(characters) << s_flagCount) 73 , m_flags(flags) 70 74 { 71 75 } … … 78 82 StringImpl* m_owner { nullptr }; // We do not make StaticSymbolImpl BufferSubstring. Thus we can make this nullptr. 79 83 unsigned m_hashForSymbol; 80 Flags m_flags { s_flagDefault };84 Flags m_flags; 81 85 }; 82 86 … … 104 108 } 105 109 106 SymbolImpl( )110 SymbolImpl(Flags flags = s_flagDefault) 107 111 : UniquedStringImpl(CreateSymbol) 108 112 , m_owner(StringImpl::empty()) 109 113 , m_hashForSymbol(nextHashForSymbol()) 110 , m_flags( s_flagIsNullSymbol)114 , m_flags(flags | s_flagIsNullSymbol) 111 115 { 112 116 ASSERT(StringImpl::tailOffset<StringImpl*>() == OBJECT_OFFSETOF(SymbolImpl, m_owner)); … … 120 124 }; 121 125 static_assert(sizeof(SymbolImpl) == sizeof(SymbolImpl::StaticSymbolImpl), ""); 126 127 class PrivateSymbolImpl : public SymbolImpl { 128 public: 129 WTF_EXPORT_STRING_API static Ref<PrivateSymbolImpl> createNullSymbol(); 130 WTF_EXPORT_STRING_API static Ref<PrivateSymbolImpl> create(StringImpl& rep); 131 132 private: 133 PrivateSymbolImpl(const LChar* characters, unsigned length, Ref<StringImpl>&& base) 134 : SymbolImpl(characters, length, WTFMove(base), s_flagIsPrivate) 135 { 136 } 137 138 PrivateSymbolImpl(const UChar* characters, unsigned length, Ref<StringImpl>&& base) 139 : SymbolImpl(characters, length, WTFMove(base), s_flagIsPrivate) 140 { 141 } 142 143 PrivateSymbolImpl() 144 : SymbolImpl(s_flagIsPrivate) 145 { 146 } 147 }; 122 148 123 149 class RegisteredSymbolImpl : public SymbolImpl { … … 194 220 195 221 using WTF::SymbolImpl; 222 using WTF::PrivateSymbolImpl; 196 223 using WTF::RegisteredSymbolImpl; -
trunk/Tools/ChangeLog
r220052 r220053 1 2017-07-30 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [WTF] Introduce Private Symbols 4 https://bugs.webkit.org/show_bug.cgi?id=174935 5 6 Reviewed by Darin Adler. 7 8 * TestWebKitAPI/Tests/WTF/StringImpl.cpp: 9 (TestWebKitAPI::TEST): 10 1 11 2017-07-30 Darin Adler <darin@apple.com> 2 12 -
trunk/Tools/TestWebKitAPI/Tests/WTF/StringImpl.cpp
r219725 r220053 531 531 auto reference = SymbolImpl::createNullSymbol(); 532 532 ASSERT_TRUE(reference->isSymbol()); 533 ASSERT_FALSE(reference->isPrivate()); 533 534 ASSERT_TRUE(reference->isNullSymbol()); 534 535 ASSERT_FALSE(reference->isAtomic()); … … 542 543 auto reference = SymbolImpl::create(original); 543 544 ASSERT_TRUE(reference->isSymbol()); 545 ASSERT_FALSE(reference->isPrivate()); 544 546 ASSERT_FALSE(reference->isNullSymbol()); 545 547 ASSERT_FALSE(reference->isAtomic()); … … 552 554 auto emptyReference = SymbolImpl::create(empty); 553 555 ASSERT_TRUE(emptyReference->isSymbol()); 556 ASSERT_FALSE(emptyReference->isPrivate()); 554 557 ASSERT_FALSE(emptyReference->isNullSymbol()); 555 558 ASSERT_FALSE(emptyReference->isAtomic()); … … 560 563 } 561 564 565 TEST(WTF, StringImplCreatePrivateSymbol) 566 { 567 auto original = stringFromUTF8("original"); 568 auto reference = PrivateSymbolImpl::create(original); 569 ASSERT_TRUE(reference->isSymbol()); 570 ASSERT_TRUE(reference->isPrivate()); 571 ASSERT_FALSE(reference->isNullSymbol()); 572 ASSERT_FALSE(reference->isAtomic()); 573 ASSERT_FALSE(original->isSymbol()); 574 ASSERT_FALSE(original->isAtomic()); 575 ASSERT_EQ(original->length(), reference->length()); 576 ASSERT_TRUE(equal(reference.ptr(), "original")); 577 578 auto empty = stringFromUTF8(""); 579 auto emptyReference = PrivateSymbolImpl::create(empty); 580 ASSERT_TRUE(emptyReference->isSymbol()); 581 ASSERT_TRUE(emptyReference->isPrivate()); 582 ASSERT_FALSE(emptyReference->isNullSymbol()); 583 ASSERT_FALSE(emptyReference->isAtomic()); 584 ASSERT_FALSE(empty->isSymbol()); 585 ASSERT_TRUE(empty->isAtomic()); 586 ASSERT_EQ(empty->length(), emptyReference->length()); 587 ASSERT_TRUE(equal(emptyReference.ptr(), "")); 588 } 589 562 590 TEST(WTF, StringImplSymbolToAtomicString) 563 591 { … … 565 593 auto reference = SymbolImpl::create(original); 566 594 ASSERT_TRUE(reference->isSymbol()); 595 ASSERT_FALSE(reference->isPrivate()); 567 596 ASSERT_FALSE(reference->isAtomic()); 568 597 … … 584 613 auto reference = SymbolImpl::createNullSymbol(); 585 614 ASSERT_TRUE(reference->isSymbol()); 615 ASSERT_FALSE(reference->isPrivate()); 586 616 ASSERT_FALSE(reference->isAtomic()); 587 617 … … 691 721 } 692 722 723 static SymbolImpl::StaticSymbolImpl staticSymbol {"Cocoa"}; 724 static SymbolImpl::StaticSymbolImpl staticPrivateSymbol {"Cocoa", SymbolImpl::s_flagIsPrivate }; 725 726 TEST(WTF, StaticSymbolImpl) 727 { 728 auto& symbol = static_cast<SymbolImpl&>(staticSymbol); 729 ASSERT_TRUE(symbol.isSymbol()); 730 ASSERT_FALSE(symbol.isPrivate()); 731 } 732 733 TEST(WTF, StaticPrivateSymbolImpl) 734 { 735 auto& symbol = static_cast<SymbolImpl&>(staticPrivateSymbol); 736 ASSERT_TRUE(symbol.isSymbol()); 737 ASSERT_TRUE(symbol.isPrivate()); 738 } 739 693 740 } // namespace TestWebKitAPI
Note: See TracChangeset
for help on using the changeset viewer.