libexpr: alloc list storage as a (length, vla) type

memory overhead is minimal and performance impact not measurable. once
we've done something like this for all value types that don't fit in a
single machine word we can cut a word from Value, offsetting the cost.

Change-Id: I9813bacd7e851957ad3426aed8f74033179a4212
This commit is contained in:
eldritch horrors
2025-09-28 00:02:20 +02:00
parent d37a5d4000
commit aa96b00182
12 changed files with 201 additions and 157 deletions
+42 -38
View File
@@ -82,12 +82,12 @@ TEST_F(ValuePrintingTests, tList)
Value vTwo;
vTwo.mkInt(2);
Value vList = evaluator.mem.newList(5);
vList._list.elems[0] = &vOne;
vList._list.elems[1] = &vTwo;
vList._list.size = 3;
auto vList = evaluator.mem.newList(5);
vList->elems[0] = &vOne;
vList->elems[1] = &vTwo;
vList->size = 3;
test(vList, "[ 1 2 «nullptr» ]");
test(Value(NewValueAs::list, vList), "[ 1 2 «nullptr» ]");
}
TEST_F(ValuePrintingTests, vThunk)
@@ -260,12 +260,13 @@ TEST_F(ValuePrintingTests, depthList)
Value vNested;
vNested.mkAttrs(builder2.finish());
Value vList = evaluator.mem.newList(5);
vList._list.elems[0] = &vOne;
vList._list.elems[1] = &vTwo;
vList._list.elems[2] = &vNested;
vList._list.size = 3;
auto list = evaluator.mem.newList(5);
list->elems[0] = &vOne;
list->elems[1] = &vTwo;
list->elems[2] = &vNested;
list->size = 3;
Value vList{NewValueAs::list, list};
test(vList, "[ 1 2 { ... } ]", PrintOptions { .maxDepth = 1 });
test(vList, "[ 1 2 { nested = { ... }; one = 1; two = 2; } ]", PrintOptions { .maxDepth = 2 });
test(vList, "[ 1 2 { nested = { one = 1; two = 2; }; one = 1; two = 2; } ]", PrintOptions { .maxDepth = 3 });
@@ -533,16 +534,17 @@ TEST_F(ValuePrintingTests, ansiColorsList)
Value vTwo;
vTwo.mkInt(2);
Value vList = evaluator.mem.newList(5);
vList._list.elems[0] = &vOne;
vList._list.elems[1] = &vTwo;
vList._list.size = 3;
auto vList = evaluator.mem.newList(5);
vList->elems[0] = &vOne;
vList->elems[1] = &vTwo;
vList->size = 3;
test(vList,
"[ " ANSI_CYAN "1" ANSI_NORMAL " " ANSI_CYAN "2" ANSI_NORMAL " " ANSI_MAGENTA "«nullptr»" ANSI_NORMAL " ]",
PrintOptions {
.ansiColors = true
});
test(
Value(NewValueAs::list, vList),
"[ " ANSI_CYAN "1" ANSI_NORMAL " " ANSI_CYAN "2" ANSI_NORMAL " " ANSI_MAGENTA
"«nullptr»" ANSI_NORMAL " ]",
PrintOptions{.ansiColors = true}
);
}
TEST_F(ValuePrintingTests, ansiColorsLambda)
@@ -671,16 +673,16 @@ TEST_F(ValuePrintingTests, ansiColorsListRepeated)
Value vInner;
vInner.mkAttrs(innerBuilder.finish());
Value vList = evaluator.mem.newList(3);
vList._list.elems[0] = &vInner;
vList._list.elems[1] = &vInner;
vList._list.size = 2;
auto vList = evaluator.mem.newList(3);
vList->elems[0] = &vInner;
vList->elems[1] = &vInner;
vList->size = 2;
test(vList,
"[ { x = " ANSI_CYAN "0" ANSI_NORMAL "; } " ANSI_MAGENTA "«repeated»" ANSI_NORMAL " ]",
PrintOptions {
.ansiColors = true
});
test(
Value(NewValueAs::list, vList),
"[ { x = " ANSI_CYAN "0" ANSI_NORMAL "; } " ANSI_MAGENTA "«repeated»" ANSI_NORMAL " ]",
PrintOptions{.ansiColors = true}
);
}
TEST_F(ValuePrintingTests, listRepeated)
@@ -694,11 +696,12 @@ TEST_F(ValuePrintingTests, listRepeated)
Value vInner;
vInner.mkAttrs(innerBuilder.finish());
Value vList = evaluator.mem.newList(3);
vList._list.elems[0] = &vInner;
vList._list.elems[1] = &vInner;
vList._list.size = 2;
auto list = evaluator.mem.newList(3);
list->elems[0] = &vInner;
list->elems[1] = &vInner;
list->size = 2;
Value vList(NewValueAs::list, list);
test(vList, "[ { x = 0; } «repeated» ]", PrintOptions { });
test(vList,
"[ { x = 0; } { x = 0; } ]",
@@ -751,10 +754,11 @@ TEST_F(ValuePrintingTests, ansiColorsListElided)
Value vTwo;
vTwo.mkInt(2);
Value vList = evaluator.mem.newList(4);
vList._list.elems[0] = &vOne;
vList._list.elems[1] = &vTwo;
vList._list.size = 2;
auto list = evaluator.mem.newList(4);
Value vList{NewValueAs::list, list};
list->elems[0] = &vOne;
list->elems[1] = &vTwo;
list->size = 2;
test(vList,
"[ " ANSI_CYAN "1" ANSI_NORMAL " " ANSI_FAINT "«1 item elided»" ANSI_NORMAL " ]",
@@ -766,8 +770,8 @@ TEST_F(ValuePrintingTests, ansiColorsListElided)
Value vThree;
vThree.mkInt(3);
vList._list.elems[2] = &vThree;
vList._list.size = 3;
list->elems[2] = &vThree;
list->size = 3;
test(vList,
"[ " ANSI_CYAN "1" ANSI_NORMAL " " ANSI_FAINT "«2 items elided»" ANSI_NORMAL " ]",