Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
77
Src/Wasabi/bfc/stack.cpp
Normal file
77
Src/Wasabi/bfc/stack.cpp
Normal file
|
@ -0,0 +1,77 @@
|
|||
#include "precomp_wasabi_bfc.h"
|
||||
#include "stack.h"
|
||||
|
||||
//#define STACK_SIZE_INCREMENT 250
|
||||
|
||||
// going from 250 to 32 decreases size of VM working set by several megabytes
|
||||
#define STACK_SIZE_INCREMENT 32
|
||||
|
||||
StackBase::StackBase()
|
||||
{
|
||||
nslots = 0;
|
||||
cur = 0;
|
||||
stack = NULL;
|
||||
}
|
||||
|
||||
StackBase::~StackBase()
|
||||
{
|
||||
if (stack != NULL) FREE(stack);
|
||||
}
|
||||
|
||||
int StackBase::push(void *item, int sizeofT, int increment)
|
||||
{
|
||||
if (increment <= 0) increment = STACK_SIZE_INCREMENT;
|
||||
if (stack == NULL) {
|
||||
nslots = increment;
|
||||
stack = (char*)MALLOC(sizeofT * nslots);
|
||||
} else if (cur >= nslots) {
|
||||
int newnslots = nslots + increment;
|
||||
stack = (char*)REALLOC(stack, sizeofT*newnslots);
|
||||
nslots = newnslots;
|
||||
}
|
||||
MEMCPY(stack + cur*sizeofT, item, sizeofT);
|
||||
cur++;
|
||||
return cur;
|
||||
}
|
||||
|
||||
int StackBase::peek() {
|
||||
return cur;
|
||||
}
|
||||
|
||||
int StackBase::peekAt(void *ptr, int n, int sizeofT) {
|
||||
if (ptr != NULL) MEMCPY(ptr, stack + (cur-1-n)*sizeofT, sizeofT);
|
||||
return cur;
|
||||
}
|
||||
|
||||
int StackBase::getRef(void **ptr, int n, int sizeofT) {
|
||||
if (ptr != NULL) *ptr = stack + (cur-1-n)*sizeofT;
|
||||
return cur;
|
||||
}
|
||||
|
||||
void *StackBase::top(int sizeofT) {
|
||||
ASSERT(cur >= 0);
|
||||
if (cur == 0) return NULL;
|
||||
return stack + (cur-1)*sizeofT;
|
||||
}
|
||||
|
||||
int StackBase::pop(void *ptr, int sizeofT) {
|
||||
ASSERT(cur >= 0);
|
||||
if (cur == 0) return 0;
|
||||
ASSERT(stack != NULL);
|
||||
--cur;
|
||||
if (ptr != NULL) MEMCPY(ptr, stack + cur*sizeofT, sizeofT);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int StackBase::isempty() {
|
||||
return cur == 0;
|
||||
}
|
||||
|
||||
void StackBase::purge() {
|
||||
ASSERT(isempty());
|
||||
if (stack != NULL) {
|
||||
FREE(stack);
|
||||
stack = NULL;
|
||||
}
|
||||
}
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue