commit eb80b3fc5644546f8a06ed1665392b6f90a8a3d5
parent f8e38ad61126db546feffb16dce3fb4c7781ffba
Author: Jake Koroman <jake@jakekoroman.com>
Date: Tue, 16 Sep 2025 19:15:05 -0400
jrk_Arena fixups.
Diffstat:
M | jrk.h | | | 47 | +++++++++++++++++++++++++++++------------------ |
1 file changed, 29 insertions(+), 18 deletions(-)
diff --git a/jrk.h b/jrk.h
@@ -125,20 +125,22 @@ char *jrk_tmpstrings_pushf(char *, ...);
} \
} while (0)
-#define jrk_arena_da_reserve(arena, da, expected_capacity) \
- do { \
- if ((da)->capacity == 0) { \
- (da)->capacity = JRK_DA_DEFAULT_INIT_CAPACITY; \
- (da)->items = jrk_arena_push(arena, (da)->capacity); \
- break; \
- } \
- if ((expected_capacity) > (da)->capacity) { \
- u64 old_cap = (da)->capacity; \
- while ((expected_capacity) > (da)->capacity) { \
- (da)->capacity *= 2; \
- } \
- (da)->items = jrk_arena_resize((arena), (da)->items, old_cap, (da)->capacity); \
- } \
+#define jrk_arena_da_reserve(arena, da, expected_capacity) \
+ do { \
+ if ((da)->capacity == 0) { \
+ (da)->capacity = JRK_DA_DEFAULT_INIT_CAPACITY; \
+ (da)->items = jrk_arena_push(arena, (da)->capacity * sizeof(*(da)->items)); \
+ break; \
+ } \
+ if ((expected_capacity) > (da)->capacity) { \
+ u64 old_cap = (da)->capacity; \
+ while ((expected_capacity) > (da)->capacity) { \
+ (da)->capacity *= 2; \
+ } \
+ u64 old_size = old_cap * sizeof(*(da)->items); \
+ u64 new_size = (da)->capacity * sizeof(*(da)->items); \
+ (da)->items = jrk_arena_resize((arena), (da)->items, old_size, new_size); \
+ } \
} while (0)
#define jrk_arena_da_append(arena, da, item) \
@@ -379,11 +381,15 @@ jrk_arena_push(jrk_Arena *arena, u64 n)
jrk_assertv(arena->offset + n <= arena->capacity,
"jrk_arena_push(%p, %ld): arena push requires %ld bytes but has a capacity of %ld bytes",
arena, n, arena->offset + n, arena->capacity);
-
void *result = &arena->data[arena->offset];
arena->prev_offset = arena->offset;
arena->offset += n;
memset(result, 0, n);
+
+#ifdef JRK_ARENA_DIAGNOSTICS
+ printf("pushed(%p, %ld)\n offset: %ld\n prev_offset: %ld\n", arena, n, arena->offset, arena->prev_offset);
+#endif
+
return result;
}
@@ -400,6 +406,11 @@ jrk_arena_resize(jrk_Arena *arena, void *old, u64 old_size, u64 new_size)
void *result = NULL;
+#ifdef JRK_ARENA_DIAGNOSTICS
+ printf("resize(%p, %p, %ld, %ld): resizing\n",
+ arena, old, old_size, new_size);
+#endif
+
if (old == &arena->data[arena->prev_offset]) {
result = old;
arena->offset = new_size;
@@ -407,8 +418,8 @@ jrk_arena_resize(jrk_Arena *arena, void *old, u64 old_size, u64 new_size)
result = &arena->data[arena->offset];
arena->prev_offset = arena->offset;
arena->offset += new_size;
- memset(result, 0, new_size);
memmove(result, old, old_size);
+ memset(result + old_size, 0, new_size - old_size);
}
return result;
@@ -498,8 +509,8 @@ jrk_arena_sb_append_buf_at(jrk_Arena *arena, jrk_StringBuilder *sb, char *buf, u
void
jrk_sb_append_buf_at(jrk_StringBuilder *sb, char *buf, u64 size, u64 idx)
{
- jrk_assertv(idx < sb->count, "jrk_sb_append_buf_at(%p, %p, %ld, %ld): idx is greater than sb->count",
- sb, buf, size, idx);
+ jrk_assertv(idx < sb->count, "jrk_sb_append_buf_at(%p, %p, %ld, %ld): idx is greater than sb->count (%ld > %ld)",
+ sb, buf, size, idx, idx, sb->count);
u64 new_size = sb->count + size;
char *temp = jrk_emalloc(new_size);