21 if (Chunk && Chunk->Next)
29void *InterpStack::grow(
size_t Size) {
30 assert(Size < ChunkSize -
sizeof(StackChunk) &&
"Object too large");
32 if (!Chunk ||
sizeof(StackChunk) + Chunk->size() + Size > ChunkSize) {
33 if (Chunk && Chunk->Next) {
36 StackChunk *Next =
new (malloc(ChunkSize)) StackChunk(Chunk);
43 auto *
Object =
reinterpret_cast<void *
>(Chunk->End);
49void *InterpStack::peekData(
size_t Size)
const {
50 assert(Chunk &&
"Stack is empty!");
52 StackChunk *Ptr = Chunk;
53 while (Size > Ptr->size()) {
56 assert(Ptr &&
"Offset too large");
59 return reinterpret_cast<void *
>(Ptr->End -
Size);
62void InterpStack::shrink(
size_t Size) {
63 assert(Chunk &&
"Chunk is empty!");
65 while (Size > Chunk->size()) {
66 Size -= Chunk->size();
69 Chunk->Next =
nullptr;
71 Chunk->End = Chunk->start();
73 assert(Chunk &&
"Offset too large");
void clear()
Clears the stack without calling any destructors.
~InterpStack()
Destroys the stack, freeing up storage.