aboutsummaryrefslogtreecommitdiff
path: root/compile.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-02-29 12:54:29 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-02-29 12:54:29 -0500
commit0f34bd8f534d605d6043387ab0b1fc7f621eb489 (patch)
tree863a3b43dfb3a3e48e5889ba0f5ba93ed444d9f6 /compile.c
parentdcd4fd77976a7e8a9ef1f4778514f36f883c27c4 (diff)
Bump refcounts for .keys/.values
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/compile.c b/compile.c
index 838524e1..536de03e 100644
--- a/compile.c
+++ b/compile.c
@@ -909,17 +909,19 @@ CORD compile(env_t *env, ast_t *ast)
}
case TableType: {
if (streq(f->field, "keys")) {
- return CORD_all("({ table_t $t = ", compile_to_pointer_depth(env, f->fielded, 0, false), ";\n"
- "(array_t){.data = $t.entries.data,\n .length=$t.entries.length,\n .stride=$t.entries.stride,\n .data_refcount=3};})");
+ return CORD_all("({ table_t *$t = ", compile_to_pointer_depth(env, f->fielded, 1, false), ";\n"
+ "$t->entries.data_refcount = 3;\n"
+ "$t->entries; })");
} else if (streq(f->field, "values")) {
auto table = Match(value_t, TableType);
size_t offset = type_size(table->key_type);
size_t align = type_align(table->value_type);
if (align > 1 && offset % align > 0)
offset += align - (offset % align);
- return CORD_all("({ table_t $t = ", compile_to_pointer_depth(env, f->fielded, 0, false), ";\n"
- "(array_t){.data = $t.entries.data + ", CORD_asprintf("%zu", offset),
- ",\n .length=$t.entries.length,\n .stride=$t.entries.stride,\n .data_refcount=3};})");
+ return CORD_all("({ table_t *$t = ", compile_to_pointer_depth(env, f->fielded, 1, false), ";\n"
+ "$t->entries.data_refcount = 3;\n"
+ "(array_t){.data = $t->entries.data + ", CORD_asprintf("%zu", offset),
+ ",\n .length=$t->entries.length,\n .stride=$t->entries.stride,\n .data_refcount=3};})");
} else if (streq(f->field, "fallback")) {
return CORD_all("(", compile_to_pointer_depth(env, f->fielded, 0, false), ").fallback");
} else if (streq(f->field, "default")) {