From ea80fefa057a8c7ddf8541e8bd76ebf2c77e1166 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Mon, 12 Aug 2024 17:57:14 -0400 Subject: Bugfix some issues with table keys/values --- compile.c | 13 ++++++------- typecheck.c | 2 ++ 2 files changed, 8 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"); } diff --git a/typecheck.c b/typecheck.c index 88d862bb..6616b38f 100644 --- a/typecheck.c +++ b/typecheck.c @@ -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; -- cgit v1.2.3