int put_int64(Word at, int64_t l, int flags ARG_LD) { Word p; word r, m; int req; r = consInt(l); if ( valInt(r) == l ) { *at = r; return TRUE; } #if SIZEOF_VOIDP == 8 req = 3; #elif SIZEOF_VOIDP == 4 req = 4; #else #error "FIXME: Unsupported sizeof word" #endif if ( !hasGlobalSpace(req) ) { int rc = ensureGlobalSpace(req, flags); if ( rc != TRUE ) return rc; } p = gTop; gTop += req; #if SIZEOF_VOIDP == 8 r = consPtr(p, TAG_INTEGER|STG_GLOBAL); m = mkIndHdr(1, TAG_INTEGER); *p++ = m; *p++ = l; *p = m; #else #if SIZEOF_VOIDP == 4 r = consPtr(p, TAG_INTEGER|STG_GLOBAL); m = mkIndHdr(2, TAG_INTEGER); *p++ = m; #ifdef WORDS_BIGENDIAN *p++ = (word)(l>>32); *p++ = (word)l; #else *p++ = (word)l; *p++ = (word)(l>>32); #endif *p = m; #else #error "FIXME: Unsupported sizeof intptr_t." #endif #endif *at = r; return TRUE; }
Word allocGlobal__LD(size_t n ARG_LD) { Word result; if ( !hasGlobalSpace(n) ) { int rc; if ( (rc=ensureGlobalSpace(n, ALLOW_GC)) != TRUE ) { raiseStackOverflow(rc); return NULL; } } result = gTop; gTop += n; return result; }
static int globalMPZ(Word at, mpz_t mpz, int flags ARG_LD) { DEBUG(CHK_SECURE, assert(!onStackArea(global, at) && !onStackArea(local, at))); if ( mpz->_mp_alloc ) { Word p; size_t size; size_t wsz = mpz_wsize(mpz, &size); word m = mkIndHdr(wsz+1, TAG_INTEGER); if ( wsizeofInd(m) != wsz+1 ) { PL_error(NULL, 0, NULL, ERR_REPRESENTATION, ATOM_integer); return 0; } if ( !hasGlobalSpace(wsz+3) ) { int rc = ensureGlobalSpace(wsz+3, flags); if ( rc != TRUE ) return rc; } p = gTop; gTop += wsz+3; *at = consPtr(p, TAG_INTEGER|STG_GLOBAL); *p++ = m; p[wsz] = 0L; /* pad out */ p[wsz+1] = m; *p++ = (word)mpz->_mp_size; memcpy(p, mpz->_mp_d, size); } else /* already on the stack */ { Word p = (Word)mpz->_mp_d - 2; #ifndef NDEBUG size_t size; size_t wsz = mpz_wsize(mpz, &size); assert(p[0] == mkIndHdr(wsz+1, TAG_INTEGER)); #endif *at = consPtr(p, TAG_INTEGER|STG_GLOBAL); } return TRUE; }