#pragma once
#include "BAssert.h"
#include "BInline.h"
#include "Gigacage.h"
namespace bmalloc {
enum class HeapKind {
Primary,
PrimitiveGigacage,
JSValueGigacage
};
static constexpr unsigned numHeaps = 3;
BINLINE bool isGigacage(HeapKind heapKind)
{
switch (heapKind) {
case HeapKind::Primary:
return false;
case HeapKind::PrimitiveGigacage:
case HeapKind::JSValueGigacage:
return true;
}
BCRASH();
return false;
}
BINLINE Gigacage::Kind gigacageKind(HeapKind kind)
{
switch (kind) {
case HeapKind::Primary:
BCRASH();
return Gigacage::Primitive;
case HeapKind::PrimitiveGigacage:
return Gigacage::Primitive;
case HeapKind::JSValueGigacage:
return Gigacage::JSValue;
}
BCRASH();
return Gigacage::Primitive;
}
BINLINE HeapKind heapKind(Gigacage::Kind kind)
{
switch (kind) {
case Gigacage::ReservedForFlagsAndNotABasePtr:
RELEASE_BASSERT_NOT_REACHED();
case Gigacage::Primitive:
return HeapKind::PrimitiveGigacage;
case Gigacage::JSValue:
return HeapKind::JSValueGigacage;
}
BCRASH();
return HeapKind::Primary;
}
BINLINE bool isActiveHeapKindAfterEnsuringGigacage(HeapKind kind)
{
switch (kind) {
case HeapKind::PrimitiveGigacage:
case HeapKind::JSValueGigacage:
if (Gigacage::wasEnabled())
return true;
return false;
default:
return true;
}
}
BEXPORT bool isActiveHeapKind(HeapKind);
BINLINE HeapKind mapToActiveHeapKindAfterEnsuringGigacage(HeapKind kind)
{
switch (kind) {
case HeapKind::PrimitiveGigacage:
case HeapKind::JSValueGigacage:
if (Gigacage::wasEnabled())
return kind;
return HeapKind::Primary;
default:
return kind;
}
}
BEXPORT HeapKind mapToActiveHeapKind(HeapKind);
}