void tvec_allocbuffer(union tvec_regval *rv)
{
unsigned char *p; size_t n;
+ size_t m = rv->buf.m, a = rv->buf.a, off;
if (rv->buf.p) free(rv->buf.p - rv->buf.off);
- if (rv->buf.m < 2) {
- rv->buf.p = x_alloc(&arena_stdlib, rv->buf.sz); rv->buf.off = 0;
+ if (m < 2) {
+ p = x_alloc(&arena_stdlib, rv->buf.sz); off = 0;
} else {
- p = x_alloc(&arena_stdlib, rv->buf.sz + rv->buf.m - 1);
- n = (size_t)p%rv->buf.m;
- rv->buf.off = (rv->buf.a - n + rv->buf.m)%rv->buf.m;
- rv->buf.p = p + rv->buf.off;
+ p = x_alloc(&arena_stdlib, rv->buf.sz + m - 1);
+ if (!(m&(m - 1))) off = (a - (size_t)p)&(m - 1);
+ else off = (a + m - (size_t)p%m)%m;
}
+ rv->buf.p = p + off; rv->buf.off = off;
memset(rv->buf.p, '?', rv->buf.sz);
}