aboutsummaryrefslogtreecommitdiff
path: root/compile.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-08-12 17:57:14 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-08-12 17:57:14 -0400
commitea80fefa057a8c7ddf8541e8bd76ebf2c77e1166 (patch)
tree67fb80eb62f1f7a1741867929858012ac672014f /compile.c
parent6aabed4fcc6823466e78593b93ceadd095f7463f (diff)
Bugfix some issues with table keys/values
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/compile.c b/compile.c
index 0cfeab8e..f5472d23 100644
--- a/compile.c
+++ b/compile.c
@@ -2422,19 +2422,18 @@ 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, 1, false), ";\n"
- "ARRAY_INCREF(t->entries);\n"
- "t->entries; })");
+ return CORD_all("(", compile_to_pointer_depth(env, f->fielded, 0, false), ").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, 1, false), ";\n"
- "ARRAY_INCREF(t->entries);\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("({ array_t *entries = &(", compile_to_pointer_depth(env, f->fielded, 0, false), ").entries;\n"
+ "ARRAY_INCREF(*entries);\n"
+ "array_t values = *entries;\n"
+ "values.data += ", CORD_asprintf("%zu", offset), ";\n"
+ "values; })");
} else if (streq(f->field, "fallback")) {
return CORD_all("(", compile_to_pointer_depth(env, f->fielded, 0, false), ").fallback");
}