From 436d2e02debe058e9968935e742e397c19de628a Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sat, 11 Oct 2025 15:50:19 -0400 Subject: Improvements to set support and updating docs --- src/compile/lists.c | 2 +- src/stdlib/tables.c | 13 ++++++++----- src/typecheck.c | 3 ++- 3 files changed, 11 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/compile/lists.c b/src/compile/lists.c index d9fb46a3..bb94eb1d 100644 --- a/src/compile/lists.c +++ b/src/compile/lists.c @@ -253,7 +253,7 @@ Text_t compile_list_method_call(env_t *env, ast_t *ast) { } else if (streq(call->name, "unique")) { self = compile_to_pointer_depth(env, call->self, 0, false); (void)compile_arguments(env, ast, NULL, call->args); - return Texts("Table$from_entries(", self, ", Table$info(", compile_type_info(item_t), ", &Void$info)).entries"); + return Texts("Table$from_entries(", self, ", Table$info(", compile_type_info(item_t), ", &Empty$$info))"); } else if (streq(call->name, "pop")) { EXPECT_POINTER(); arg_t *arg_spec = new (arg_t, .name = "index", .type = INT_TYPE, .default_val = FakeAST(Int, "-1")); diff --git a/src/stdlib/tables.c b/src/stdlib/tables.c index fdd85b56..3c78b770 100644 --- a/src/stdlib/tables.c +++ b/src/stdlib/tables.c @@ -390,8 +390,10 @@ PUREFUNC public bool Table$equal(const void *vx, const void *vy, const TypeInfo_ void *x_key = x->entries.data + i * x->entries.stride; void *y_value = Table$get_raw(*y, x_key, type); if (!y_value) return false; - void *x_value = x_key + offset; - if (!generic_equal(y_value, x_value, value_type)) return false; + if (value_type->size > 0) { + void *x_value = x_key + offset; + if (!generic_equal(y_value, x_value, value_type)) return false; + } } return true; } @@ -439,7 +441,7 @@ PUREFUNC public int32_t Table$compare(const void *vx, const void *vy, const Type void *y_value = key + value_offset(type); void *x_value = Table$get_raw(*x, key, type); - if (!x_value || !generic_equal(x_value, y_value, table.value)) { + if (!x_value || (table.value->size > 0 && !generic_equal(x_value, y_value, table.value))) { if (mismatched_key == NULL || generic_compare(key, mismatched_key, table.key) < 0) mismatched_key = key; } } @@ -589,7 +591,7 @@ Table_t Table$intersection(Table_t a, Table_t b, const TypeInfo_t *type) { void *key = GET_ENTRY(*t, i); void *a_value = key + offset; void *b_value = Table$get(b, key, type); - if (b_value && generic_equal(a_value, b_value, type->TableInfo.value)) + if (b_value && (type->TableInfo.value->size == 0 || generic_equal(a_value, b_value, type->TableInfo.value))) Table$set(&result, key, a_value, type); } } @@ -650,7 +652,8 @@ Table_t Table$without(Table_t a, Table_t b, const TypeInfo_t *type) { void *key = GET_ENTRY(*t, i); void *a_value = key + offset; void *b_value = Table$get(b, key, type); - if (!b_value || !generic_equal(a_value, b_value, type->TableInfo.value)) + if (!b_value + || (type->TableInfo.value->size > 0 && !generic_equal(a_value, b_value, type->TableInfo.value))) Table$set(&result, key, a_value, type); } } diff --git a/src/typecheck.c b/src/typecheck.c index 9342f069..67fb1168 100644 --- a/src/typecheck.c +++ b/src/typecheck.c @@ -969,7 +969,8 @@ type_t *get_type(env_t *env, ast_t *ast) { else if (streq(call->name, "sort")) return Type(VoidType); else if (streq(call->name, "sorted")) return self_value_t; else if (streq(call->name, "to")) return self_value_t; - else if (streq(call->name, "unique")) return Type(ListType, .item_type = item_type); + else if (streq(call->name, "unique")) + return Type(TableType, .key_type = item_type, .value_type = EMPTY_TYPE); else code_err(ast, "There is no '", call->name, "' method for lists"); } case TableType: { -- cgit v1.2.3