Changeset 246636 in webkit
- Timestamp:
- Jun 20, 2019 9:21:50 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 26 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r246631 r246636 1 2019-06-18 Darin Adler <darin@apple.com> 2 3 Tidy up the remaining bits of the AtomicString to AtomString rename 4 https://bugs.webkit.org/show_bug.cgi?id=198990 5 6 Reviewed by Michael Catanzaro. 7 8 * js/dopey-rope-with-16-bit-propertyname-expected.txt: Rename to AtomString. 9 * js/dopey-rope-with-16-bit-propertyname.html: Ditto. 10 1 11 2019-06-19 Myles C. Maxfield <mmaxfield@apple.com> 2 12 -
trunk/LayoutTests/js/dopey-rope-with-16-bit-propertyname-expected.txt
r172727 r246636 1 Test that a 16-bit Atom icString containing only 8-bit characters doesn't confuse the JIT into thinking it's an 8-bit AtomicString.1 Test that a 16-bit AtomString containing only 8-bit characters doesn't confuse the JIT into thinking it's an 8-bit AtomString. 2 2 3 3 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -
trunk/LayoutTests/js/dopey-rope-with-16-bit-propertyname.html
r172727 r246636 8 8 <script> 9 9 10 description("Test that a 16-bit Atom icString containing only 8-bit characters doesn't confuse the JIT into thinking it's an 8-bit AtomicString.");10 description("Test that a 16-bit AtomString containing only 8-bit characters doesn't confuse the JIT into thinking it's an 8-bit AtomString."); 11 11 12 12 o = {}; … … 15 15 var test16bit = stringWithEmoji.substring(0, 4); 16 16 17 o[test16bit] = "this makes it an Atom icString";17 o[test16bit] = "this makes it an AtomString"; 18 18 19 19 globalRope = ""; -
trunk/Source/JavaScriptCore/ChangeLog
r246620 r246636 1 2019-06-18 Darin Adler <darin@apple.com> 2 3 Tidy up the remaining bits of the AtomicString to AtomString rename 4 https://bugs.webkit.org/show_bug.cgi?id=198990 5 6 Reviewed by Michael Catanzaro. 7 8 * dfg/DFGSpeculativeJIT.cpp: 9 (JSC::DFG::SpeculativeJIT::speculateStringIdentAndLoadStorage): Use flagIsAtom. 10 * dfg/DFGSpeculativeJIT32_64.cpp: 11 (JSC::DFG::SpeculativeJIT::compile): Ditto. 12 * dfg/DFGSpeculativeJIT64.cpp: 13 (JSC::DFG::SpeculativeJIT::compile): Ditto. 14 * ftl/FTLLowerDFGToB3.cpp: 15 (JSC::FTL::DFG::LowerDFGToB3::compileHasOwnProperty): Ditto. 16 (JSC::FTL::DFG::LowerDFGToB3::speculateStringIdent): Ditto. 17 1 18 2019-06-19 Alexey Shvayka <shvaikalesh@gmail.com> 2 19 -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r246563 r246636 10282 10282 MacroAssembler::Zero, 10283 10283 MacroAssembler::Address(storage, StringImpl::flagsOffset()), 10284 MacroAssembler::TrustedImm32(StringImpl::flagIsAtom ic())));10284 MacroAssembler::TrustedImm32(StringImpl::flagIsAtom()))); 10285 10285 10286 10286 m_interpreter.filter(edge, SpecStringIdent | ~SpecString); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
r246490 r246636 3900 3900 slowPath.append(m_jit.branchTest32( 3901 3901 MacroAssembler::Zero, MacroAssembler::Address(implGPR, StringImpl::flagsOffset()), 3902 MacroAssembler::TrustedImm32(StringImpl::flagIsAtom ic())));3902 MacroAssembler::TrustedImm32(StringImpl::flagIsAtom()))); 3903 3903 break; 3904 3904 } … … 3910 3910 slowPath.append(m_jit.branchTest32( 3911 3911 MacroAssembler::Zero, MacroAssembler::Address(implGPR, StringImpl::flagsOffset()), 3912 MacroAssembler::TrustedImm32(StringImpl::flagIsAtom ic())));3912 MacroAssembler::TrustedImm32(StringImpl::flagIsAtom()))); 3913 3913 auto hasUniquedImpl = m_jit.jump(); 3914 3914 -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
r246490 r246636 4467 4467 slowPath.append(m_jit.branchTest32( 4468 4468 MacroAssembler::Zero, MacroAssembler::Address(implGPR, StringImpl::flagsOffset()), 4469 MacroAssembler::TrustedImm32(StringImpl::flagIsAtom ic())));4469 MacroAssembler::TrustedImm32(StringImpl::flagIsAtom()))); 4470 4470 break; 4471 4471 } … … 4477 4477 slowPath.append(m_jit.branchTest32( 4478 4478 MacroAssembler::Zero, MacroAssembler::Address(implGPR, StringImpl::flagsOffset()), 4479 MacroAssembler::TrustedImm32(StringImpl::flagIsAtom ic())));4479 MacroAssembler::TrustedImm32(StringImpl::flagIsAtom()))); 4480 4480 auto hasUniquedImpl = m_jit.jump(); 4481 4481 -
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
r246563 r246636 10464 10464 lastNext = m_out.appendTo(isNonEmptyString, isAtomString); 10465 10465 uniquedStringImpl = m_out.loadPtr(keyAsValue, m_heaps.JSString_value); 10466 LValue isNotAtomic = m_out.testIsZero32(m_out.load32(uniquedStringImpl, m_heaps.StringImpl_hashAndFlags), m_out.constInt32(StringImpl::flagIsAtom ic()));10466 LValue isNotAtomic = m_out.testIsZero32(m_out.load32(uniquedStringImpl, m_heaps.StringImpl_hashAndFlags), m_out.constInt32(StringImpl::flagIsAtom())); 10467 10467 m_out.branch(isNotAtomic, rarely(slowCase), usually(isAtomString)); 10468 10468 … … 10496 10496 LValue implFromString = m_out.loadPtr(keyAsValue, m_heaps.JSString_value); 10497 10497 ValueFromBlock stringResult = m_out.anchor(implFromString); 10498 LValue isNotAtomic = m_out.testIsZero32(m_out.load32(implFromString, m_heaps.StringImpl_hashAndFlags), m_out.constInt32(StringImpl::flagIsAtom ic()));10498 LValue isNotAtomic = m_out.testIsZero32(m_out.load32(implFromString, m_heaps.StringImpl_hashAndFlags), m_out.constInt32(StringImpl::flagIsAtom())); 10499 10499 m_out.branch(isNotAtomic, rarely(slowCase), usually(hasUniquedStringImpl)); 10500 10500 … … 16422 16422 m_out.testIsZero32( 16423 16423 m_out.load32(stringImpl, m_heaps.StringImpl_hashAndFlags), 16424 m_out.constInt32(StringImpl::flagIsAtom ic())));16424 m_out.constInt32(StringImpl::flagIsAtom()))); 16425 16425 m_interpreter.filter(edge, SpecStringIdent | ~SpecString); 16426 16426 } -
trunk/Source/WTF/ChangeLog
r246632 r246636 1 2019-06-18 Darin Adler <darin@apple.com> 2 3 Tidy up the remaining bits of the AtomicString to AtomString rename 4 https://bugs.webkit.org/show_bug.cgi?id=198990 5 6 Reviewed by Michael Catanzaro. 7 8 * wtf/text/AtomString.cpp: Fix a comment. 9 * wtf/text/AtomString.h: Tweak formatting a bit. Use nullptr instead of 0. 10 Removed "using AtomicString = AtomString". 11 * wtf/text/AtomStringImpl.cpp: 12 (WTF::CStringTranslator::translate): Use setIsAtom instead of setIsAtomic. 13 (WTF::UCharBufferTranslator::translate): Ditto. 14 (WTF::HashAndUTF8CharactersTranslator::translate): Ditto. 15 (WTF::SubstringTranslator::translate): Ditto. 16 (WTF::LCharBufferTranslator::translate): Ditto. 17 (WTF::BufferFromStaticDataTranslator::translate): Ditto. 18 (WTF::AtomStringImpl::addSlowCase): Ditto. 19 (WTF::AtomStringImpl::lookUpSlowCase): Updated assertion message. 20 21 * wtf/text/AtomStringImpl.h: Tweaked the implementation of add. 22 Updated comments to say AtomString. 23 24 * wtf/text/AtomStringTable.cpp: 25 (WTF::AtomStringTable::~AtomStringTable): Use setIsAtom. 26 27 * wtf/text/StringImpl.h: Updated name of StringAtomic and 28 s_hashFlagStringKindIsAtom. Renamed to flagIsAtom and setIsAtom. 29 30 * wtf/text/WTFString.cpp: 31 (WTF::String::isSafeToSendToAnotherThread const): Updated comment. 32 1 33 2019-06-20 Carlos Garcia Campos <cgarcia@igalia.com> 2 34 -
trunk/Source/WTF/wtf/text/AtomString.cpp
r246490 r246636 40 40 41 41 // Convert short strings without allocating a new StringImpl, since 42 // there's a good chance these strings are already in the atom ic42 // there's a good chance these strings are already in the atom 43 43 // string table and so no memory allocation will be required. 44 44 unsigned length; -
trunk/Source/WTF/wtf/text/AtomString.h
r246490 r246636 1 1 /* 2 * Copyright (C) 2004-201 7Apple Inc. All rights reserved.2 * Copyright (C) 2004-2019 Apple Inc. All rights reserved. 3 3 * 4 4 * This library is free software; you can redistribute it and/or … … 91 91 const String& string() const { return m_string; }; 92 92 93 AtomStringImpl* impl() const { return static_cast<AtomStringImpl *>(m_string.impl()); } 93 // FIXME: What guarantees this isn't a SymbolImpl rather than an AtomStringImpl? 94 AtomStringImpl* impl() const { return static_cast<AtomStringImpl*>(m_string.impl()); } 94 95 95 96 bool is8Bit() const { return m_string.is8Bit(); } … … 133 134 WTF_EXPORT_PRIVATE AtomString convertToASCIIUppercase() const; 134 135 135 int toInt(bool* ok = 0) const { return m_string.toInt(ok); }136 double toDouble(bool* ok = 0) const { return m_string.toDouble(ok); }137 float toFloat(bool* ok = 0) const { return m_string.toFloat(ok); }136 int toInt(bool* ok = nullptr) const { return m_string.toInt(ok); } 137 double toDouble(bool* ok = nullptr) const { return m_string.toDouble(ok); } 138 float toFloat(bool* ok = nullptr) const { return m_string.toFloat(ok); } 138 139 bool percentage(int& p) const { return m_string.percentage(p); } 139 140 … … 146 147 147 148 #ifdef __OBJC__ 148 AtomString(NSString *);149 operator NSString *() const { return m_string; }149 AtomString(NSString *); 150 operator NSString *() const { return m_string; } 150 151 #endif 151 152 … … 178 179 }; 179 180 180 using AtomicString = AtomString; 181 182 static_assert(sizeof(AtomString) == sizeof(String), "AtomString and String must be same size!"); 181 static_assert(sizeof(AtomString) == sizeof(String), "AtomString and String must be the same size!"); 183 182 184 183 inline bool operator==(const AtomString& a, const AtomString& b) { return a.impl() == b.impl(); } … … 282 281 #ifdef __OBJC__ 283 282 284 inline AtomString::AtomString(NSString *string)283 inline AtomString::AtomString(NSString *string) 285 284 : m_string(AtomStringImpl::add((__bridge CFStringRef)string)) 286 285 { … … 289 288 #endif 290 289 291 // Define external global variables for the commonly used atom icstrings.290 // Define external global variables for the commonly used atom strings. 292 291 // These are only usable from the main thread. 293 292 extern WTF_EXPORT_PRIVATE LazyNeverDestroyed<AtomString> nullAtomData; … … 361 360 362 361 using WTF::AtomString; 363 using WTF::AtomicString;364 362 using WTF::nullAtom; 365 363 using WTF::emptyAtom; -
trunk/Source/WTF/wtf/text/AtomStringImpl.cpp
r246490 r246636 109 109 location = &StringImpl::create(characters).leakRef(); 110 110 location->setHash(hash); 111 location->setIsAtom ic(true);111 location->setIsAtom(true); 112 112 } 113 113 }; … … 160 160 location = &StringImpl::create8BitIfPossible(buf.characters, buf.length).leakRef(); 161 161 location->setHash(hash); 162 location->setIsAtom ic(true);162 location->setIsAtom(true); 163 163 } 164 164 }; … … 228 228 location = &newString.leakRef(); 229 229 location->setHash(hash); 230 location->setIsAtom ic(true);230 location->setIsAtom(true); 231 231 } 232 232 }; … … 271 271 location = &StringImpl::createSubstringSharingImpl(*buffer.baseString, buffer.start, buffer.length).leakRef(); 272 272 location->setHash(hash); 273 location->setIsAtom ic(true);273 location->setIsAtom(true); 274 274 } 275 275 }; … … 336 336 location = &StringImpl::create(buf.characters, buf.length).leakRef(); 337 337 location->setHash(hash); 338 location->setIsAtom ic(true);338 location->setIsAtom(true); 339 339 } 340 340 }; … … 357 357 location = &StringImpl::createWithoutCopying(buf.characters, buf.length).leakRef(); 358 358 location->setHash(hash); 359 location->setIsAtom ic(true);359 location->setIsAtom(true); 360 360 } 361 361 }; … … 438 438 return addSymbol(string); 439 439 440 ASSERT_WITH_MESSAGE(!string.isAtom(), "AtomStringImpl should not hit the slow case if the string is already a tomic.");440 ASSERT_WITH_MESSAGE(!string.isAtom(), "AtomStringImpl should not hit the slow case if the string is already an atom."); 441 441 442 442 AtomStringTableLocker locker; … … 445 445 if (addResult.isNewEntry) { 446 446 ASSERT(*addResult.iterator == &string); 447 string.setIsAtom ic(true);447 string.setIsAtom(true); 448 448 } 449 449 … … 468 468 } 469 469 470 ASSERT_WITH_MESSAGE(!string.isAtom(), "AtomStringImpl should not hit the slow case if the string is already a tomic.");470 ASSERT_WITH_MESSAGE(!string.isAtom(), "AtomStringImpl should not hit the slow case if the string is already an atom."); 471 471 472 472 AtomStringTableLocker locker; … … 475 475 if (addResult.isNewEntry) { 476 476 ASSERT(*addResult.iterator == &string); 477 string.setIsAtom ic(true);477 string.setIsAtom(true); 478 478 } 479 479 … … 487 487 auto& atomStringTable = stringTable(); 488 488 auto iterator = atomStringTable.find(string); 489 ASSERT_WITH_MESSAGE(iterator != atomStringTable.end(), "The string being removed is a tomicin the string table of an other thread!");489 ASSERT_WITH_MESSAGE(iterator != atomStringTable.end(), "The string being removed is an atom in the string table of an other thread!"); 490 490 ASSERT(string == *iterator); 491 491 atomStringTable.remove(iterator); … … 494 494 RefPtr<AtomStringImpl> AtomStringImpl::lookUpSlowCase(StringImpl& string) 495 495 { 496 ASSERT_WITH_MESSAGE(!string.isAtom(), "Atom icStringImpls should return from the fast case.");496 ASSERT_WITH_MESSAGE(!string.isAtom(), "AtomStringImpl objects should return from the fast case."); 497 497 498 498 if (!string.length()) -
trunk/Source/WTF/wtf/text/AtomStringImpl.h
r246490 r246636 1 1 /* 2 * Copyright (C) 2006 Apple Inc.2 * Copyright (C) 2006-2019 Apple Inc. All rights reserved. 3 3 * 4 4 * This library is free software; you can redistribute it and/or … … 50 50 { 51 51 if (!string) 52 return static_cast<AtomStringImpl*>(string);52 return nullptr; 53 53 return add(*string); 54 54 } … … 81 81 { 82 82 if (string.isAtom()) { 83 ASSERT_WITH_MESSAGE(!string.length() || isInAtomStringTable(&string), "The atom icstring comes from an other thread!");83 ASSERT_WITH_MESSAGE(!string.length() || isInAtomStringTable(&string), "The atom string comes from an other thread!"); 84 84 return static_cast<AtomStringImpl&>(string); 85 85 } … … 90 90 { 91 91 if (string.isAtom()) { 92 ASSERT_WITH_MESSAGE(!string.length() || isInAtomStringTable(&string), "The atom icstring comes from an other thread!");92 ASSERT_WITH_MESSAGE(!string.length() || isInAtomStringTable(&string), "The atom string comes from an other thread!"); 93 93 return static_cast<AtomStringImpl&>(string); 94 94 } … … 103 103 104 104 #if !ASSERT_DISABLED 105 // AtomicStringImpls created from StaticStringImpl will ASSERT 106 // in the generic ValueCheck<T>::checkConsistency 107 // as they are not allocated by fastMalloc. 108 // We don't currently have any way to detect that case 109 // so we ignore the consistency check for all AtomicStringImpls*. 110 template<> struct 111 ValueCheck<AtomStringImpl*> { 105 106 // AtomStringImpls created from StaticStringImpl will ASSERT in the generic ValueCheck<T>::checkConsistency, 107 // as they are not allocated by fastMalloc. We don't currently have any way to detect that case, so we don't 108 // do any consistency check for AtomStringImpl*. 109 110 template<> struct ValueCheck<AtomStringImpl*> { 112 111 static void checkConsistency(const AtomStringImpl*) { } 113 112 }; 114 113 115 template<> struct 116 ValueCheck<const AtomStringImpl*> { 114 template<> struct ValueCheck<const AtomStringImpl*> { 117 115 static void checkConsistency(const AtomStringImpl*) { } 118 116 }; 117 119 118 #endif 120 119 -
trunk/Source/WTF/wtf/text/AtomStringTable.cpp
r246490 r246636 33 33 { 34 34 for (auto* string : m_table) 35 string->setIsAtom ic(false);35 string->setIsAtom(false); 36 36 } 37 37 -
trunk/Source/WTF/wtf/text/StringImpl.cpp
r246490 r246636 103 103 #endif 104 104 105 StringImpl::StaticStringImpl StringImpl::s_ atomicEmptyString("", StringImpl::StringAtomic);105 StringImpl::StaticStringImpl StringImpl::s_emptyAtomString("", StringImpl::StringAtom); 106 106 107 107 StringImpl::~StringImpl() -
trunk/Source/WTF/wtf/text/StringImpl.h
r246490 r246636 198 198 static constexpr const unsigned s_flagStringKindCount = 4; 199 199 200 static constexpr const unsigned s_hashFlagStringKindIsAtom ic= 1u << (s_flagStringKindCount);200 static constexpr const unsigned s_hashFlagStringKindIsAtom = 1u << (s_flagStringKindCount); 201 201 static constexpr const unsigned s_hashFlagStringKindIsSymbol = 1u << (s_flagStringKindCount + 1); 202 static constexpr const unsigned s_hashMaskStringKind = s_hashFlagStringKindIsAtom ic| s_hashFlagStringKindIsSymbol;202 static constexpr const unsigned s_hashMaskStringKind = s_hashFlagStringKindIsAtom | s_hashFlagStringKindIsSymbol; 203 203 static constexpr const unsigned s_hashFlagDidReportCost = 1u << 3; 204 204 static constexpr const unsigned s_hashFlag8BitBuffer = 1u << 2; … … 207 207 enum StringKind { 208 208 StringNormal = 0u, // non-symbol, non-atomic 209 StringAtom ic = s_hashFlagStringKindIsAtomic, // non-symbol, atomic209 StringAtom = s_hashFlagStringKindIsAtom, // non-symbol, atomic 210 210 StringSymbol = s_hashFlagStringKindIsSymbol, // symbol, non-atomic 211 211 }; … … 266 266 static unsigned flagsOffset() { return OBJECT_OFFSETOF(StringImpl, m_hashAndFlags); } 267 267 static constexpr unsigned flagIs8Bit() { return s_hashFlag8BitBuffer; } 268 static constexpr unsigned flagIsAtom ic() { return s_hashFlagStringKindIsAtomic; }268 static constexpr unsigned flagIsAtom() { return s_hashFlagStringKindIsAtom; } 269 269 static constexpr unsigned flagIsSymbol() { return s_hashFlagStringKindIsSymbol; } 270 270 static constexpr unsigned maskStringKind() { return s_hashMaskStringKind; } … … 293 293 294 294 bool isSymbol() const { return m_hashAndFlags & s_hashFlagStringKindIsSymbol; } 295 bool isAtom() const { return m_hashAndFlags & s_hashFlagStringKindIsAtom ic; }296 void setIsAtom ic(bool);295 bool isAtom() const { return m_hashAndFlags & s_hashFlagStringKindIsAtom; } 296 void setIsAtom(bool); 297 297 298 298 bool isExternal() const { return bufferOwnership() == BufferExternal; } … … 360 360 // be a finite set of StaticStringImpls, their cost can be aggregated into a single 361 361 // system cost if needed. 362 // b. setIsAtom ic() is never called on a StaticStringImpl.363 // setIsAtom ic() asserts !isStatic().362 // b. setIsAtom() is never called on a StaticStringImpl. 363 // setIsAtom() asserts !isStatic(). 364 364 // c. setHash() is never called on a StaticStringImpl. 365 365 // StaticStringImpl's constructor sets the hash on construction. … … 372 372 }; 373 373 374 WTF_EXPORT_PRIVATE static StaticStringImpl s_ atomicEmptyString;375 ALWAYS_INLINE static StringImpl* empty() { return reinterpret_cast<StringImpl*>(&s_ atomicEmptyString); }374 WTF_EXPORT_PRIVATE static StaticStringImpl s_emptyAtomString; 375 ALWAYS_INLINE static StringImpl* empty() { return reinterpret_cast<StringImpl*>(&s_emptyAtomString); } 376 376 377 377 // FIXME: Does this really belong in StringImpl? … … 1032 1032 } 1033 1033 1034 inline void StringImpl::setIsAtom ic(bool isAtom)1034 inline void StringImpl::setIsAtom(bool isAtom) 1035 1035 { 1036 1036 ASSERT(!isStatic()); 1037 1037 ASSERT(!isSymbol()); 1038 1038 if (isAtom) 1039 m_hashAndFlags |= s_hashFlagStringKindIsAtom ic;1039 m_hashAndFlags |= s_hashFlagStringKindIsAtom; 1040 1040 else 1041 m_hashAndFlags &= ~s_hashFlagStringKindIsAtom ic;1041 m_hashAndFlags &= ~s_hashFlagStringKindIsAtom; 1042 1042 } 1043 1043 -
trunk/Source/WTF/wtf/text/WTFString.cpp
r246490 r246636 1 1 /* 2 2 * (C) 1999 Lars Knoll (knoll@kde.org) 3 * Copyright (C) 2004-201 7Apple Inc. All rights reserved.3 * Copyright (C) 2004-2019 Apple Inc. All rights reserved. 4 4 * Copyright (C) 2007-2009 Torch Mobile, Inc. 5 5 * … … 649 649 bool String::isSafeToSendToAnotherThread() const 650 650 { 651 // Atom icStrings are not safe to send between threadsas ~StringImpl()651 // AtomStrings are not safe to send between threads, as ~StringImpl() 652 652 // will try to remove them from the wrong AtomStringTable. 653 653 return isEmpty() || (m_impl->hasOneRef() && !m_impl->isAtom()); -
trunk/Source/WebCore/ChangeLog
r246634 r246636 1 2019-06-18 Darin Adler <darin@apple.com> 2 3 Tidy up the remaining bits of the AtomicString to AtomString rename 4 https://bugs.webkit.org/show_bug.cgi?id=198990 5 6 Reviewed by Michael Catanzaro. 7 8 * bindings/scripts/test/JS/JSTestObj.cpp: Updated names. 9 * bindings/scripts/test/TestObj.idl: Ditto. 10 11 * css/makeprop.pl: Updated comment. 12 * css/makevalues.pl: Ditto. 13 * html/FormController.cpp: 14 (WebCore::FormKeyGenerator::formKey): Ditto. 15 1 16 2019-06-20 Zalan Bujtas <zalan@apple.com> 2 17 -
trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp
r246490 r246636 1487 1487 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalString(JSC::ExecState*); 1488 1488 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalUSVString(JSC::ExecState*); 1489 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtom icString(JSC::ExecState*);1489 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtomString(JSC::ExecState*); 1490 1490 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalStringAndDefaultValue(JSC::ExecState*); 1491 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringAndDefaultValue(JSC::ExecState*);1491 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtomStringAndDefaultValue(JSC::ExecState*); 1492 1492 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalStringIsNull(JSC::ExecState*); 1493 1493 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalStringIsUndefined(JSC::ExecState*); 1494 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringIsNull(JSC::ExecState*);1494 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtomStringIsNull(JSC::ExecState*); 1495 1495 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalStringIsEmptyString(JSC::ExecState*); 1496 1496 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalUSVStringIsEmptyString(JSC::ExecState*); 1497 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringIsEmptyString(JSC::ExecState*);1497 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtomStringIsEmptyString(JSC::ExecState*); 1498 1498 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalDoubleIsNaN(JSC::ExecState*); 1499 1499 JSC::EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalFloatIsNaN(JSC::ExecState*); … … 2204 2204 { "methodWithOptionalString", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalString), (intptr_t) (0) } }, 2205 2205 { "methodWithOptionalUSVString", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalUSVString), (intptr_t) (0) } }, 2206 { "methodWithOptionalAtom icString", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalAtomicString), (intptr_t) (0) } },2206 { "methodWithOptionalAtomString", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalAtomString), (intptr_t) (0) } }, 2207 2207 { "methodWithOptionalStringAndDefaultValue", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalStringAndDefaultValue), (intptr_t) (0) } }, 2208 { "methodWithOptionalAtom icStringAndDefaultValue", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalAtomicStringAndDefaultValue), (intptr_t) (0) } },2208 { "methodWithOptionalAtomStringAndDefaultValue", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalAtomStringAndDefaultValue), (intptr_t) (0) } }, 2209 2209 { "methodWithOptionalStringIsNull", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalStringIsNull), (intptr_t) (0) } }, 2210 2210 { "methodWithOptionalStringIsUndefined", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalStringIsUndefined), (intptr_t) (0) } }, 2211 { "methodWithOptionalAtom icStringIsNull", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalAtomicStringIsNull), (intptr_t) (0) } },2211 { "methodWithOptionalAtomStringIsNull", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalAtomStringIsNull), (intptr_t) (0) } }, 2212 2212 { "methodWithOptionalStringIsEmptyString", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalStringIsEmptyString), (intptr_t) (0) } }, 2213 2213 { "methodWithOptionalUSVStringIsEmptyString", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalUSVStringIsEmptyString), (intptr_t) (0) } }, 2214 { "methodWithOptionalAtom icStringIsEmptyString", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalAtomicStringIsEmptyString), (intptr_t) (0) } },2214 { "methodWithOptionalAtomStringIsEmptyString", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalAtomStringIsEmptyString), (intptr_t) (0) } }, 2215 2215 { "methodWithOptionalDoubleIsNaN", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalDoubleIsNaN), (intptr_t) (0) } }, 2216 2216 { "methodWithOptionalFloatIsNaN", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsTestObjPrototypeFunctionMethodWithOptionalFloatIsNaN), (intptr_t) (0) } }, … … 6449 6449 } 6450 6450 6451 static inline JSC::EncodedJSValue jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringBody(JSC::ExecState* state, typename IDLOperation<JSTestObj>::ClassParameter castedThis, JSC::ThrowScope& throwScope)6451 static inline JSC::EncodedJSValue jsTestObjPrototypeFunctionMethodWithOptionalAtomStringBody(JSC::ExecState* state, typename IDLOperation<JSTestObj>::ClassParameter castedThis, JSC::ThrowScope& throwScope) 6452 6452 { 6453 6453 UNUSED_PARAM(state); … … 6456 6456 auto str = state->argument(0).isUndefined() ? nullAtom() : convert<IDLAtomStringAdaptor<IDLDOMString>>(*state, state->uncheckedArgument(0)); 6457 6457 RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); 6458 impl.methodWithOptionalAtom icString(WTFMove(str));6459 return JSValue::encode(jsUndefined()); 6460 } 6461 6462 EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtom icString(ExecState* state)6463 { 6464 return IDLOperation<JSTestObj>::call<jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringBody>(*state, "methodWithOptionalAtomicString");6458 impl.methodWithOptionalAtomString(WTFMove(str)); 6459 return JSValue::encode(jsUndefined()); 6460 } 6461 6462 EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtomString(ExecState* state) 6463 { 6464 return IDLOperation<JSTestObj>::call<jsTestObjPrototypeFunctionMethodWithOptionalAtomStringBody>(*state, "methodWithOptionalAtomString"); 6465 6465 } 6466 6466 … … 6481 6481 } 6482 6482 6483 static inline JSC::EncodedJSValue jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringAndDefaultValueBody(JSC::ExecState* state, typename IDLOperation<JSTestObj>::ClassParameter castedThis, JSC::ThrowScope& throwScope)6483 static inline JSC::EncodedJSValue jsTestObjPrototypeFunctionMethodWithOptionalAtomStringAndDefaultValueBody(JSC::ExecState* state, typename IDLOperation<JSTestObj>::ClassParameter castedThis, JSC::ThrowScope& throwScope) 6484 6484 { 6485 6485 UNUSED_PARAM(state); … … 6488 6488 auto str = state->argument(0).isUndefined() ? AtomString("foo", AtomString::ConstructFromLiteral) : convert<IDLAtomStringAdaptor<IDLDOMString>>(*state, state->uncheckedArgument(0)); 6489 6489 RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); 6490 impl.methodWithOptionalAtom icStringAndDefaultValue(WTFMove(str));6491 return JSValue::encode(jsUndefined()); 6492 } 6493 6494 EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringAndDefaultValue(ExecState* state)6495 { 6496 return IDLOperation<JSTestObj>::call<jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringAndDefaultValueBody>(*state, "methodWithOptionalAtomicStringAndDefaultValue");6490 impl.methodWithOptionalAtomStringAndDefaultValue(WTFMove(str)); 6491 return JSValue::encode(jsUndefined()); 6492 } 6493 6494 EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtomStringAndDefaultValue(ExecState* state) 6495 { 6496 return IDLOperation<JSTestObj>::call<jsTestObjPrototypeFunctionMethodWithOptionalAtomStringAndDefaultValueBody>(*state, "methodWithOptionalAtomStringAndDefaultValue"); 6497 6497 } 6498 6498 … … 6529 6529 } 6530 6530 6531 static inline JSC::EncodedJSValue jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringIsNullBody(JSC::ExecState* state, typename IDLOperation<JSTestObj>::ClassParameter castedThis, JSC::ThrowScope& throwScope)6531 static inline JSC::EncodedJSValue jsTestObjPrototypeFunctionMethodWithOptionalAtomStringIsNullBody(JSC::ExecState* state, typename IDLOperation<JSTestObj>::ClassParameter castedThis, JSC::ThrowScope& throwScope) 6532 6532 { 6533 6533 UNUSED_PARAM(state); … … 6536 6536 auto str = state->argument(0).isUndefined() ? nullAtom() : convert<IDLAtomStringAdaptor<IDLDOMString>>(*state, state->uncheckedArgument(0)); 6537 6537 RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); 6538 impl.methodWithOptionalAtom icStringIsNull(WTFMove(str));6539 return JSValue::encode(jsUndefined()); 6540 } 6541 6542 EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringIsNull(ExecState* state)6543 { 6544 return IDLOperation<JSTestObj>::call<jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringIsNullBody>(*state, "methodWithOptionalAtomicStringIsNull");6538 impl.methodWithOptionalAtomStringIsNull(WTFMove(str)); 6539 return JSValue::encode(jsUndefined()); 6540 } 6541 6542 EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtomStringIsNull(ExecState* state) 6543 { 6544 return IDLOperation<JSTestObj>::call<jsTestObjPrototypeFunctionMethodWithOptionalAtomStringIsNullBody>(*state, "methodWithOptionalAtomStringIsNull"); 6545 6545 } 6546 6546 … … 6577 6577 } 6578 6578 6579 static inline JSC::EncodedJSValue jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringIsEmptyStringBody(JSC::ExecState* state, typename IDLOperation<JSTestObj>::ClassParameter castedThis, JSC::ThrowScope& throwScope)6579 static inline JSC::EncodedJSValue jsTestObjPrototypeFunctionMethodWithOptionalAtomStringIsEmptyStringBody(JSC::ExecState* state, typename IDLOperation<JSTestObj>::ClassParameter castedThis, JSC::ThrowScope& throwScope) 6580 6580 { 6581 6581 UNUSED_PARAM(state); … … 6584 6584 auto str = state->argument(0).isUndefined() ? emptyAtom() : convert<IDLAtomStringAdaptor<IDLDOMString>>(*state, state->uncheckedArgument(0)); 6585 6585 RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); 6586 impl.methodWithOptionalAtom icStringIsEmptyString(WTFMove(str));6587 return JSValue::encode(jsUndefined()); 6588 } 6589 6590 EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringIsEmptyString(ExecState* state)6591 { 6592 return IDLOperation<JSTestObj>::call<jsTestObjPrototypeFunctionMethodWithOptionalAtom icStringIsEmptyStringBody>(*state, "methodWithOptionalAtomicStringIsEmptyString");6586 impl.methodWithOptionalAtomStringIsEmptyString(WTFMove(str)); 6587 return JSValue::encode(jsUndefined()); 6588 } 6589 6590 EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionMethodWithOptionalAtomStringIsEmptyString(ExecState* state) 6591 { 6592 return IDLOperation<JSTestObj>::call<jsTestObjPrototypeFunctionMethodWithOptionalAtomStringIsEmptyStringBody>(*state, "methodWithOptionalAtomStringIsEmptyString"); 6593 6593 } 6594 6594 -
trunk/Source/WebCore/bindings/scripts/test/TestObj.idl
r246490 r246636 221 221 void methodWithOptionalString(optional DOMString str); 222 222 void methodWithOptionalUSVString(optional USVString str); 223 void methodWithOptionalAtom icString(optional [AtomString] DOMString str);223 void methodWithOptionalAtomString(optional [AtomString] DOMString str); 224 224 void methodWithOptionalStringAndDefaultValue(optional DOMString str = "foo"); 225 void methodWithOptionalAtom icStringAndDefaultValue(optional [AtomString] DOMString str = "foo");225 void methodWithOptionalAtomStringAndDefaultValue(optional [AtomString] DOMString str = "foo"); 226 226 void methodWithOptionalStringIsNull(optional DOMString str = null); 227 227 void methodWithOptionalStringIsUndefined(optional DOMString str = "undefined"); 228 void methodWithOptionalAtom icStringIsNull(optional [AtomString] DOMString str = null);228 void methodWithOptionalAtomStringIsNull(optional [AtomString] DOMString str = null); 229 229 void methodWithOptionalStringIsEmptyString(optional DOMString str = ""); 230 230 void methodWithOptionalUSVStringIsEmptyString(optional USVString str = ""); 231 void methodWithOptionalAtom icStringIsEmptyString(optional [AtomString] DOMString str = "");231 void methodWithOptionalAtomStringIsEmptyString(optional [AtomString] DOMString str = ""); 232 232 void methodWithOptionalDoubleIsNaN(optional unrestricted double number = NaN); 233 233 void methodWithOptionalFloatIsNaN(optional unrestricted float number = NaN); -
trunk/Source/WebCore/css/makeprop.pl
r246490 r246636 370 370 String getPropertyNameString(CSSPropertyID id) 371 371 { 372 // We share the StringImpl with the Atom icStrings.372 // We share the StringImpl with the AtomStrings. 373 373 return getPropertyNameAtomString(id).string(); 374 374 } -
trunk/Source/WebCore/css/makevalues.pl
r246490 r246636 146 146 String getValueNameString(CSSValueID id) 147 147 { 148 // We share the StringImpl with the Atom icStrings.148 // We share the StringImpl with the AtomStrings. 149 149 return getValueNameAtomString(id).string(); 150 150 } -
trunk/Source/WebCore/html/FormController.cpp
r246490 r246636 327 327 auto signature = formSignature(*form); 328 328 auto nextIndex = m_formSignatureToNextIndexMap.add(signature, 0).iterator->value++; 329 // FIXME: Would be nice to have makeAtom icString to use here.329 // FIXME: Would be nice to have makeAtomString to use to optimize the case where the string already exists. 330 330 return makeString(signature, " #", nextIndex); 331 331 }).iterator->value; -
trunk/Tools/ChangeLog
r246632 r246636 1 2019-06-18 Darin Adler <darin@apple.com> 2 3 Tidy up the remaining bits of the AtomicString to AtomString rename 4 https://bugs.webkit.org/show_bug.cgi?id=198990 5 6 Reviewed by Michael Catanzaro. 7 8 * Scripts/do-webcore-rename: Removed already-done renames. 9 * TestWebKitAPI/Tests/WTF/StringImpl.cpp: Rename one use of "atomic". 10 1 11 2019-06-20 Carlos Garcia Campos <cgarcia@igalia.com> 2 12 -
trunk/Tools/Scripts/do-webcore-rename
r246490 r246636 103 103 my %renames = ( 104 104 # Renames go here in the form of: 105 "AtomicString" => "AtomString", 106 "AtomicStringCreationFromLiteral" => "AtomStringCreationFromLiteral", 107 "AtomicStringCreationFromLiteralUniqueness" => "AtomStringCreationFromLiteralUniqueness", 108 "AtomicStringExistingHash" => "AtomStringExistingHash", 109 "AtomicStringFromLiteralCannotOverflow" => "AtomStringFromLiteralCannotOverflow", 110 "AtomicStringFromLiteralNotEmpty" => "AtomStringFromLiteralNotEmpty", 111 "AtomicStringHash" => "AtomStringHash", 112 "AtomicStringImpl" => "AtomStringImpl", 113 "AtomicStringImplCF" => "AtomStringImplCF", 114 "AtomicStringNumberDouble" => "AtomStringNumberDouble", 115 "AtomicStringTable" => "AtomStringTable", 116 "AtomicStringTable" => "AtomStringTable", 117 "AtomicStringTableLocker" => "AtomStringTableLocker", 118 "AtomicString_h" => "AtomString_h", 119 "IDLAtomicStringAdaptor" => "IDLAtomStringAdaptor", 120 "IDLRequiresExistingAtomicStringAdaptor" => "IDLRequiresExistingAtomStringAdaptor", 121 "RequiresExistingAtomicString" => "RequiresExistingAtomString", 122 "StringImplNullSymbolToAtomicString" => "StringImplNullSymbolToAtomString", 123 "StringImplStaticToAtomicString" => "StringImplStaticToAtomString", 124 "StringImplSymbolToAtomicString" => "StringImplSymbolToAtomString", 125 "ToAtomicString" => "ToAtomString", 126 "ToAtomicStringOnEmpty" => "ToAtomStringOnEmpty", 127 "TokenAtomicStringInitializer" => "TokenAtomStringInitializer", 128 "WTFAtomicStringPrinter" => "WTFAtomStringPrinter", 129 "WTFAtomicString_SummaryProvider" => "WTFAtomString_SummaryProvider", 130 "atomicString" => "atomString", 131 "atomicString1" => "atomString1", 132 "atomicString2" => "atomString2", 133 "atomicStringTable" => "atomStringTable", 134 "atomicStringWithTemplate" => "atomStringWithTemplate", 135 "atomicStrings" => "atomStrings", 136 "checkCurrentAtomicStringTable" => "checkCurrentAtomStringTable", 137 "existingAtomicString" => "existingAtomString", 138 "existingEntryAtomicStringTable" => "existingEntryAtomStringTable", 139 "getPropertyNameAtomicString" => "getPropertyNameAtomString", 140 "getValueNameAtomicString" => "getValueNameAtomString", 141 "isAtomic" => "isAtom", 142 "isAtomicString" => "isAtomString", 143 "isInAtomicStringTable" => "isInAtomStringTable", 144 "m_atomicStringTable" => "m_atomStringTable", 145 "m_currentAtomicStringTable" => "m_currentAtomStringTable", 146 "m_defaultAtomicStringTable" => "m_defaultAtomStringTable", 147 "m_entryAtomicStringTable" => "m_entryAtomStringTable", 148 "oldAtomicStringTable" => "oldAtomStringTable", 149 "propertyNameToAtomicString" => "propertyNameToAtomString", 150 "resolveRopeToAtomicString" => "resolveRopeToAtomString", 151 "resolveRopeToExistingAtomicString" => "resolveRopeToExistingAtomString", 152 "setCurrentAtomicStringTable" => "setCurrentAtomStringTable", 153 "shouldUseAtomicString" => "shouldUseAtomString", 154 "testAtomicStringNumber" => "testAtomStringNumber", 155 "toAtomicString" => "toAtomString", 156 "toExistingAtomicString" => "toExistingAtomString", 157 "useAtomicString" => "useAtomString", 105 "flagIsAtomic" => "flagIsAtom", 158 106 ); 159 107 160 108 my %renamesContemplatedForTheFuture = ( 161 "setDOMException" => "propagateException",162 "setDOMExceptionSlow" => "propagateExceptionSlowPath",163 164 "PassRefPtr" => "DeprecatedPassRefPtr",165 166 109 "HTMLPlugInImageElement" => "HTMLEmbeddedObjectElement", 167 110 "isPlugInImageElement" => "isEmbeddedObjectElement", … … 174 117 "ErrorInstance" => "JSError", 175 118 176 "TreeShared" => "TreeRefCounted",177 178 119 "StringImpl" => "SharedString", 179 120 … … 187 128 "runtime_object" => "BridgedObject", 188 129 "objc_runtime" => "ObjCBridge", 189 190 "WTF_UNICODE_H" => "Unicode_h",191 "WTF_UNICODE_ICU_H" => "UnicodeICU_h",192 "UnicodeIcu" => "UnicodeICU",193 130 194 131 "LegacyWebArchive" => "WebArchive", -
trunk/Tools/TestWebKitAPI/Tests/WTF/StringImpl.cpp
r246490 r246636 790 790 791 791 792 TEST(WTF, ExternalStringAtom ic)792 TEST(WTF, ExternalStringAtom) 793 793 { 794 794 constexpr LChar buffer[] = "hello";
Note: See TracChangeset
for help on using the changeset viewer.