1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #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;
- }
- }
|