diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /js/src/vm/SharedImmutableStringsCache-inl.h | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'js/src/vm/SharedImmutableStringsCache-inl.h')
-rw-r--r-- | js/src/vm/SharedImmutableStringsCache-inl.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/js/src/vm/SharedImmutableStringsCache-inl.h b/js/src/vm/SharedImmutableStringsCache-inl.h new file mode 100644 index 000000000..6a6373c0a --- /dev/null +++ b/js/src/vm/SharedImmutableStringsCache-inl.h @@ -0,0 +1,76 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef vm_SharedImmutableStringsCache_inl_h +#define vm_SharedImmutableStringsCache_inl_h + +#include "vm/SharedImmutableStringsCache.h" + +namespace js { + +template <typename IntoOwnedChars> +MOZ_MUST_USE mozilla::Maybe<SharedImmutableString> +SharedImmutableStringsCache::getOrCreate(const char* chars, size_t length, + IntoOwnedChars intoOwnedChars) +{ + MOZ_ASSERT(inner_); + MOZ_ASSERT(chars); + Hasher::Lookup lookup(Hasher::hashLongString(chars, length), chars, length); + + auto locked = inner_->lock(); + if (!locked->set.initialized() && !locked->set.init()) + return mozilla::Nothing(); + + auto entry = locked->set.lookupForAdd(lookup); + if (!entry) { + OwnedChars ownedChars(intoOwnedChars()); + if (!ownedChars) + return mozilla::Nothing(); + MOZ_ASSERT(ownedChars.get() == chars || + memcmp(ownedChars.get(), chars, length) == 0); + auto box = StringBox::Create(mozilla::Move(ownedChars), length); + if (!box || !locked->set.add(entry, mozilla::Move(box))) + return mozilla::Nothing(); + } + + MOZ_ASSERT(entry && *entry); + return mozilla::Some(SharedImmutableString(locked, entry->get())); +} + +template <typename IntoOwnedTwoByteChars> +MOZ_MUST_USE mozilla::Maybe<SharedImmutableTwoByteString> +SharedImmutableStringsCache::getOrCreate(const char16_t* chars, size_t length, + IntoOwnedTwoByteChars intoOwnedTwoByteChars) { + MOZ_ASSERT(inner_); + MOZ_ASSERT(chars); + auto hash = Hasher::hashLongString(reinterpret_cast<const char*>(chars), + length * sizeof(char16_t)); + Hasher::Lookup lookup(hash, chars, length); + + auto locked = inner_->lock(); + if (!locked->set.initialized() && !locked->set.init()) + return mozilla::Nothing(); + + auto entry = locked->set.lookupForAdd(lookup); + if (!entry) { + OwnedTwoByteChars ownedTwoByteChars(intoOwnedTwoByteChars()); + if (!ownedTwoByteChars) + return mozilla::Nothing(); + MOZ_ASSERT(ownedTwoByteChars.get() == chars || + memcmp(ownedTwoByteChars.get(), chars, length * sizeof(char16_t)) == 0); + OwnedChars ownedChars(reinterpret_cast<char*>(ownedTwoByteChars.release())); + auto box = StringBox::Create(mozilla::Move(ownedChars), length * sizeof(char16_t)); + if (!box || !locked->set.add(entry, mozilla::Move(box))) + return mozilla::Nothing(); + } + + MOZ_ASSERT(entry && *entry); + return mozilla::Some(SharedImmutableTwoByteString(locked, entry->get())); +} + +} // namespace js + +#endif // vm_SharedImmutableStringsCache_inl_h |