|
|
|
@ -34,6 +34,11 @@ |
|
|
|
|
HB_BEGIN_DECLS |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef HB_DEBUG_BUFFER |
|
|
|
|
#define HB_DEBUG_BUFFER (HB_DEBUG+0) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static hb_buffer_t _hb_buffer_nil = { |
|
|
|
|
HB_OBJECT_HEADER_STATIC, |
|
|
|
|
|
|
|
|
@ -388,10 +393,28 @@ hb_buffer_t::reverse_clusters (void) |
|
|
|
|
reverse_range (start, i); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline void |
|
|
|
|
dump_var_allocation (const hb_buffer_t *buffer) |
|
|
|
|
{ |
|
|
|
|
char buf[80]; |
|
|
|
|
for (unsigned int i = 0; i < 8; i++) |
|
|
|
|
buf[i] = '0' + buffer->allocated_var_bytes[i]; |
|
|
|
|
buf[8] = '\0'; |
|
|
|
|
DEBUG_MSG (BUFFER, buffer, |
|
|
|
|
"Current var allocation: %s", |
|
|
|
|
buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void hb_buffer_t::allocate_var (unsigned int byte_i, unsigned int count, const char *owner) |
|
|
|
|
{ |
|
|
|
|
assert (byte_i < 8 && byte_i + count < 8); |
|
|
|
|
|
|
|
|
|
if (DEBUG (BUFFER)) |
|
|
|
|
dump_var_allocation (this); |
|
|
|
|
DEBUG_MSG (BUFFER, this, |
|
|
|
|
"Allocating var bytes %d..%d for %s", |
|
|
|
|
byte_i, byte_i + count - 1, owner); |
|
|
|
|
|
|
|
|
|
for (unsigned int i = byte_i; i < byte_i + count; i++) { |
|
|
|
|
assert (!allocated_var_bytes[i]); |
|
|
|
|
allocated_var_bytes[i]++; |
|
|
|
@ -401,13 +424,25 @@ void hb_buffer_t::allocate_var (unsigned int byte_i, unsigned int count, const c |
|
|
|
|
|
|
|
|
|
void hb_buffer_t::deallocate_var (unsigned int byte_i, unsigned int count, const char *owner) |
|
|
|
|
{ |
|
|
|
|
DEBUG_MSG (BUFFER, this, |
|
|
|
|
"Deallocating var bytes %d..%d for %s", |
|
|
|
|
byte_i, byte_i + count - 1, owner); |
|
|
|
|
|
|
|
|
|
assert (byte_i < 8 && byte_i + count < 8); |
|
|
|
|
for (unsigned int i = byte_i; i < byte_i + count; i++) { |
|
|
|
|
assert (allocated_var_bytes[i] && allocated_var_owner[i] == owner); |
|
|
|
|
allocated_var_bytes[i]--; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (DEBUG (BUFFER)) |
|
|
|
|
dump_var_allocation (this); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void hb_buffer_t::deallocate_var_all (void) |
|
|
|
|
{ |
|
|
|
|
memset (allocated_var_bytes, 0, sizeof (allocated_var_bytes)); |
|
|
|
|
memset (allocated_var_owner, 0, sizeof (allocated_var_owner)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Public API */ |
|
|
|
|
|
|
|
|
|