RecordedStatuses.cpp [plain text]
#include "config.h"
#include "RecordedStatuses.h"
namespace JSC {
RecordedStatuses& RecordedStatuses::operator=(RecordedStatuses&& other)
{
calls = WTFMove(other.calls);
gets = WTFMove(other.gets);
puts = WTFMove(other.puts);
ins = WTFMove(other.ins);
deletes = WTFMove(other.deletes);
shrinkToFit();
return *this;
}
RecordedStatuses::RecordedStatuses(RecordedStatuses&& other)
{
*this = WTFMove(other);
}
CallLinkStatus* RecordedStatuses::addCallLinkStatus(const CodeOrigin& codeOrigin, const CallLinkStatus& status)
{
auto statusPtr = makeUnique<CallLinkStatus>(status);
CallLinkStatus* result = statusPtr.get();
calls.append(std::make_pair(codeOrigin, WTFMove(statusPtr)));
return result;
}
GetByStatus* RecordedStatuses::addGetByStatus(const CodeOrigin& codeOrigin, const GetByStatus& status)
{
auto statusPtr = makeUnique<GetByStatus>(status);
GetByStatus* result = statusPtr.get();
gets.append(std::make_pair(codeOrigin, WTFMove(statusPtr)));
return result;
}
PutByIdStatus* RecordedStatuses::addPutByIdStatus(const CodeOrigin& codeOrigin, const PutByIdStatus& status)
{
auto statusPtr = makeUnique<PutByIdStatus>(status);
PutByIdStatus* result = statusPtr.get();
puts.append(std::make_pair(codeOrigin, WTFMove(statusPtr)));
return result;
}
InByIdStatus* RecordedStatuses::addInByIdStatus(const CodeOrigin& codeOrigin, const InByIdStatus& status)
{
auto statusPtr = makeUnique<InByIdStatus>(status);
InByIdStatus* result = statusPtr.get();
ins.append(std::make_pair(codeOrigin, WTFMove(statusPtr)));
return result;
}
DeleteByStatus* RecordedStatuses::addDeleteByStatus(const CodeOrigin& codeOrigin, const DeleteByStatus& status)
{
auto statusPtr = makeUnique<DeleteByStatus>(status);
DeleteByStatus* result = statusPtr.get();
deletes.append(std::make_pair(codeOrigin, WTFMove(statusPtr)));
return result;
}
void RecordedStatuses::visitAggregate(SlotVisitor& slotVisitor)
{
for (auto& pair : gets)
pair.second->visitAggregate(slotVisitor);
for (auto& pair : deletes)
pair.second->visitAggregate(slotVisitor);
}
void RecordedStatuses::markIfCheap(SlotVisitor& slotVisitor)
{
for (auto& pair : gets)
pair.second->markIfCheap(slotVisitor);
for (auto& pair : puts)
pair.second->markIfCheap(slotVisitor);
for (auto& pair : ins)
pair.second->markIfCheap(slotVisitor);
for (auto& pair : deletes)
pair.second->markIfCheap(slotVisitor);
}
void RecordedStatuses::finalizeWithoutDeleting(VM& vm)
{
auto finalize = [&] (auto& vector) {
for (auto& pair : vector) {
if (!pair.second->finalize(vm))
*pair.second = { };
}
};
forEachVector(finalize);
}
void RecordedStatuses::finalize(VM& vm)
{
auto finalize = [&] (auto& vector) {
vector.removeAllMatching(
[&] (auto& pair) -> bool {
return !*pair.second || !pair.second->finalize(vm);
});
vector.shrinkToFit();
};
forEachVector(finalize);
}
void RecordedStatuses::shrinkToFit()
{
forEachVector([] (auto& vector) { vector.shrinkToFit(); });
}
}