Decrease memory footprint of storing blocks.

This commit is contained in:
2026-08-21 21:36:28 +01:00
parent 556bb631f6
commit 9680a18e05
2 changed files with 7 additions and 7 deletions
+3 -3
View File
@@ -121,9 +121,9 @@ struct ParseStateLeaf : ParseState {
void *state; void *state;
uint32_t n; uint32_t n;
uint32_t cap; uint32_t cap;
uint32_t *blocks; uint16_t *blocks;
static constexpr uint32_t IS_CLOSING = 1ull << 31; static constexpr uint16_t IS_CLOSING = 0x8000;
static constexpr uint32_t LINE_MASK = ~IS_CLOSING; static constexpr uint16_t LINE_MASK = 0x7fff;
}; };
struct TreeCursor { struct TreeCursor {
+4 -4
View File
@@ -248,10 +248,10 @@ void Parser::modify(vase::Vase &vase, uint64_t target, uint64_t count) {
continue; continue;
if (c.leaf->n == c.leaf->cap) { if (c.leaf->n == c.leaf->cap) {
uint32_t cap = c.leaf->cap ? c.leaf->cap * 2 : 8; uint32_t cap = c.leaf->cap ? c.leaf->cap * 2 : 8;
c.leaf->blocks = (uint32_t *)realloc(c.leaf->blocks, cap * sizeof(uint32_t)); c.leaf->blocks = (uint16_t *)realloc(c.leaf->blocks, cap * sizeof(uint16_t));
c.leaf->cap = cap; c.leaf->cap = cap;
} }
c.leaf->blocks[c.leaf->n++] = t << 31 | (at - chunk_start); c.leaf->blocks[c.leaf->n++] = t << 15 | (at - chunk_start);
} }
at++; at++;
} }
@@ -269,7 +269,7 @@ uint64_t Parser::next_closing(uint64_t line) {
while (c.leaf) { while (c.leaf) {
auto *leaf = c.leaf; auto *leaf = c.leaf;
for (uint32_t i = 0; i < leaf->n; ++i) { for (uint32_t i = 0; i < leaf->n; ++i) {
uint32_t block = leaf->blocks[i]; uint16_t block = leaf->blocks[i];
uint32_t pos = block & ParseStateLeaf::LINE_MASK; uint32_t pos = block & ParseStateLeaf::LINE_MASK;
if (first_leaf && pos <= relative) if (first_leaf && pos <= relative)
continue; continue;
@@ -300,7 +300,7 @@ uint64_t Parser::prev_opening(uint64_t line) {
while (c.leaf) { while (c.leaf) {
auto *leaf = c.leaf; auto *leaf = c.leaf;
for (int32_t i = (int32_t)leaf->n - 1; i >= 0; --i) { for (int32_t i = (int32_t)leaf->n - 1; i >= 0; --i) {
uint32_t block = leaf->blocks[i]; uint16_t block = leaf->blocks[i];
uint32_t pos = block & ParseStateLeaf::LINE_MASK; uint32_t pos = block & ParseStateLeaf::LINE_MASK;
if (first_leaf && pos >= relative) if (first_leaf && pos >= relative)
continue; continue;