Mypal/js/src/vm/SharedImmutableStringsCache...

123 lines
3.5 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* 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/. */
#include "vm/SharedImmutableStringsCache-inl.h"
#include "jsstr.h"
namespace js {
SharedImmutableString::SharedImmutableString(
ExclusiveData<SharedImmutableStringsCache::Inner>::Guard& locked,
SharedImmutableStringsCache::StringBox* box)
: cache_(locked)
, box_(box)
{
MOZ_ASSERT(box);
box->refcount++;
}
SharedImmutableString::SharedImmutableString(SharedImmutableString&& rhs)
: cache_(mozilla::Move(rhs.cache_))
, box_(rhs.box_)
{
MOZ_ASSERT(this != &rhs, "self move not allowed");
MOZ_ASSERT(rhs.box_);
MOZ_ASSERT(rhs.box_->refcount > 0);
rhs.box_ = nullptr;
}
SharedImmutableString&
SharedImmutableString::operator=(SharedImmutableString&& rhs) {
this->~SharedImmutableString();
new (this) SharedImmutableString(mozilla::Move(rhs));
return *this;
}
SharedImmutableTwoByteString::SharedImmutableTwoByteString(SharedImmutableString&& string)
: string_(mozilla::Move(string))
{ }
SharedImmutableTwoByteString::SharedImmutableTwoByteString(
ExclusiveData<SharedImmutableStringsCache::Inner>::Guard& locked,
SharedImmutableStringsCache::StringBox* box)
: string_(locked, box)
{
MOZ_ASSERT(box->length() % sizeof(char16_t) == 0);
}
SharedImmutableTwoByteString::SharedImmutableTwoByteString(SharedImmutableTwoByteString&& rhs)
: string_(mozilla::Move(rhs.string_))
{
MOZ_ASSERT(this != &rhs, "self move not allowed");
}
SharedImmutableTwoByteString&
SharedImmutableTwoByteString::operator=(SharedImmutableTwoByteString&& rhs)
{
this->~SharedImmutableTwoByteString();
new (this) SharedImmutableTwoByteString(mozilla::Move(rhs));
return *this;
}
SharedImmutableString::~SharedImmutableString() {
if (!box_)
return;
auto locked = cache_.inner_->lock();
MOZ_ASSERT(box_->refcount > 0);
box_->refcount--;
if (box_->refcount == 0)
box_->chars_.reset(nullptr);
}
SharedImmutableString
SharedImmutableString::clone() const
{
auto locked = cache_.inner_->lock();
MOZ_ASSERT(box_);
MOZ_ASSERT(box_->refcount > 0);
return SharedImmutableString(locked, box_);
}
SharedImmutableTwoByteString
SharedImmutableTwoByteString::clone() const
{
return SharedImmutableTwoByteString(string_.clone());
}
MOZ_MUST_USE mozilla::Maybe<SharedImmutableString>
SharedImmutableStringsCache::getOrCreate(OwnedChars&& chars, size_t length)
{
OwnedChars owned(mozilla::Move(chars));
MOZ_ASSERT(owned);
return getOrCreate(owned.get(), length, [&]() { return mozilla::Move(owned); });
}
MOZ_MUST_USE mozilla::Maybe<SharedImmutableString>
SharedImmutableStringsCache::getOrCreate(const char* chars, size_t length)
{
return getOrCreate(chars, length, [&]() { return DuplicateString(chars, length); });
}
MOZ_MUST_USE mozilla::Maybe<SharedImmutableTwoByteString>
SharedImmutableStringsCache::getOrCreate(OwnedTwoByteChars&& chars, size_t length)
{
OwnedTwoByteChars owned(mozilla::Move(chars));
MOZ_ASSERT(owned);
return getOrCreate(owned.get(), length, [&]() { return mozilla::Move(owned); });
}
MOZ_MUST_USE mozilla::Maybe<SharedImmutableTwoByteString>
SharedImmutableStringsCache::getOrCreate(const char16_t* chars, size_t length)
{
return getOrCreate(chars, length, [&]() { return DuplicateString(chars, length); });
}
} // namespace js