// // Get element from specified position // CDT & VMArgStack::GetElement(const INT_32 iPos) { if (iPos >= iMaxStackSize) { throw StackUnderflow(0); } if (iPos < iStackPointer) { throw StackOverflow(0); } return aStack[iPos]; }
// // Push element into stack // INT_32 VMArgStack::PushElement(const CDT & oCDT) { if (iStackPointer == 0) { throw StackOverflow(0); } --iStackPointer; aStack[iStackPointer] = oCDT; return iStackPointer; }
void PushToStack(PolyObject *obj, PolyWord *currentPtr = 0, POLYUNSIGNED originalLength = 0) { // If we don't have all the threads running we start a new one but // only once we have several items on the stack. Otherwise we // can end up creating a task that terminates almost immediately. if (nInUse >= nThreads || msp < 2 || ! ForkNew(obj)) { if (msp < MARK_STACK_SIZE) { markStack[msp++] = obj; if (currentPtr != 0) { locPtr++; if (locPtr == LARGECACHE_SIZE) locPtr = 0; largeObjectCache[locPtr].base = obj; largeObjectCache[locPtr].current = currentPtr; } } else StackOverflow(obj); } // else the new task is processing it. }
void RecursiveScanWithStack::PushToStack(PolyObject *obj) { if (stack == 0 || stack->sp == RSTACK_SEGMENT_SIZE) { if (stack != 0 && stack->nextStack != 0) stack = stack->nextStack; else { // Need a new segment try { RScanStack *s = new RScanStack; s->lastStack = stack; if (stack != 0) stack->nextStack = s; stack = s; } catch (std::bad_alloc &) { StackOverflow(); return; } } } stack->stack[stack->sp++] = obj; }