void MiniPS::dump(GenBuffer::Writable& out_, VALUE v, unsigned indent) { if (v==Qnull) out_ << "null"; else if (v==Qtrue) out_ << "true"; else if (v==Qfalse) out_ << "false"; else if ((v&1)!=0) out_ << (v/2); /* prints a signed integer */ else { Value *vp=RVALUE(v); unsigned ty=vp->getType(); if (ty==T_STRING) { SimBuffer::Static s((char*)vp->begin_(), vp->getLength()); SimBuffer::B b; b.appendDumpPS(s, true); out_ << b; } else if (ty==T_SNAME || ty==T_ENAME) { out_.vi_write((char*)vp->begin_(), vp->getLength()); } else if (ty==T_REAL) { RREAL(v)->dump(out_); } else if (ty==T_ARRAY) { if (!vp->isDumping()) { /* Imp: thread-safe locking */ RARRAY(v)->dump(out_, indent); } else out_ << "[...]"; } else if (ty==T_DICT) { if (!vp->isDumping()) { /* Imp: thread-safe locking */ RDICT(v)->dump(out_, indent); } else out_ << "<<...>>"; } else assert(0 && "unknown MiniPS type"); } }
UniqueRange AllocateVM(size_t size, vm::PageType pageType, int prot) { const UniqueRange::pointer p = vm::Allocate(size, pageType, prot); static volatile IdxDeleter idxDeleter; if(idxDeleter == 0) // (optional optimization) RegisterUniqueRangeDeleter(vm::Free, &idxDeleter); return RVALUE(UniqueRange(p, size, idxDeleter)); }
void MiniPS::delete0(VALUE v) { if (isDirect(v)) return; Value *vp=RVALUE(v); unsigned ty=vp->getType(); if (ty==T_DICT) RDICT(v)->free(); else if (ty==T_ARRAY) RARRAY(v)->free(); else if (ty==T_VOID) ; else if (vp->hasPtr()) delete [] vp->begin_(); delete vp; /* BUGFIX at Sat Sep 7 12:50:13 CEST 2002 */ }
UniqueRange Allocate(size_t size, size_t alignment) { ENSURE(is_pow2(alignment)); if(alignment <= (size_t)idxDeleterBits) alignment = idxDeleterBits+1; const size_t alignedSize = round_up(size, alignment); const UniqueRange::pointer p = rtl_AllocateAligned(alignedSize, alignment); return RVALUE(UniqueRange(p, size, idxDeleterAligned)); }
UniqueRange AllocateAligned(size_t size, size_t alignment) { ENSURE(is_pow2(alignment)); alignment = std::max(alignment, allocationAlignment); const size_t alignedSize = round_up(size, alignment); const UniqueRange::pointer p = rtl_AllocateAligned(alignedSize, alignment); static volatile IdxDeleter idxDeleterAligned; if(idxDeleterAligned == 0) // (optional optimization) RegisterUniqueRangeDeleter(FreeAligned, &idxDeleterAligned); return RVALUE(UniqueRange(p, size, idxDeleterAligned)); }
unsigned MiniPS::getType(VALUE v) { return (v&1)!=0 ? T_INTEGER : v+0U>Qmax_+0U ? RVALUE(v)->getType() : v==Qnull ? T_NULL+0/*avoid gcc-3.0 ld bug*/ : T_BOOLEAN; }