aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-10-11 15:50:19 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-10-11 15:50:19 -0400
commit436d2e02debe058e9968935e742e397c19de628a (patch)
treec51d08a586ead5c4f22d3f2d12695c4a7cf6cbca /src
parent7e8604daeb9239e1669c5414dd6caa37af30c4ff (diff)
Improvements to set support and updating docs
Diffstat (limited to 'src')
-rw-r--r--src/compile/lists.c2
-rw-r--r--src/stdlib/tables.c13
-rw-r--r--src/typecheck.c3
3 files changed, 11 insertions, 7 deletions
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: {