Bugfix some issues with table keys/values

This commit is contained in:
Bruce Hill 2024-08-12 17:57:14 -04:00
parent 6aabed4fcc
commit ea80fefa05
2 changed files with 8 additions and 7 deletions

View File

@ -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");
}

View File

@ -1303,6 +1303,8 @@ bool can_be_mutated(env_t *env, ast_t *ast)
case FieldAccess: {
auto access = Match(ast, FieldAccess);
type_t *fielded_type = get_type(env, access->fielded);
if (fielded_type->tag == TableType && streq(access->field, "values"))
return false;
if (fielded_type->tag == PointerType) {
auto ptr = Match(fielded_type, PointerType);
return !ptr->is_readonly;