#include "irregexp/RegExpStack.h"
#include "vm/JSContext.h"
using namespace js;
using namespace js::irregexp;
RegExpStackScope::RegExpStackScope(JSContext* cx)
: regexp_stack(&cx->regexpStack.ref())
{}
RegExpStackScope::~RegExpStackScope()
{
regexp_stack->reset();
}
bool
irregexp::GrowBacktrackStack(JSRuntime* rt)
{
AutoUnsafeCallWithABI unsafe;
return rt->mainContextFromOwnThread()->regexpStack.ref().grow();
}
RegExpStack::RegExpStack()
: base_(nullptr), size(0), limit_(nullptr)
{}
RegExpStack::~RegExpStack()
{
js_free(base_);
}
bool
RegExpStack::init()
{
base_ = js_malloc(kMinimumStackSize);
if (!base_)
return false;
size = kMinimumStackSize;
updateLimit();
return true;
}
void
RegExpStack::reset()
{
MOZ_ASSERT(size >= kMinimumStackSize);
if (size != kMinimumStackSize) {
void* newBase = js_realloc(base_, kMinimumStackSize);
if (!newBase)
return;
base_ = newBase;
size = kMinimumStackSize;
updateLimit();
}
}
bool
RegExpStack::grow()
{
size_t newSize = size * 2;
if (newSize > kMaximumStackSize)
return false;
void* newBase = js_realloc(base_, newSize);
if (!newBase)
return false;
base_ = newBase;
size = newSize;
updateLimit();
return true;
}