static ERTS_INLINE Eterm make_unique_monotonic_integer_value(Eterm *hp, Uint hsz, Uint64 raw, int positive) { Eterm res; #ifdef DEBUG Eterm *end_hp = hp + hsz; #endif if (positive) { Uint64 value = raw+1; res = hsz ? erts_uint64_to_big(value, &hp) : make_small(value); } else { Sint64 value = ((Sint64) raw) + ERTS_UNIQUE_MONOTONIC_OFFSET; if (hsz == 0) res = make_small(value); else { #if defined(ARCH_32) res = erts_sint64_to_big(value, &hp); #else res = erts_uint64_to_big((Uint64) value, &hp); #endif } } ASSERT(end_hp == hp); return res; }
ERL_NIF_TERM enif_make_long(ErlNifEnv* env, long i) { if (IS_SSMALL(i)) { return make_small(i); } #if SIZEOF_LONG == ERTS_SIZEOF_ETERM return small_to_big(i, alloc_heap(env,2)); #elif SIZEOF_LONG == 8 ensure_heap(env,3); return erts_sint64_to_big(i, &env->hp); #endif }