From 1172c0f891f47724a0850e72712a20e67f1188f1 Mon Sep 17 00:00:00 2001 From: GrieferAtWork Date: Sun, 8 Dec 2024 19:06:25 +0100 Subject: [PATCH] Fix `Set.operator repr` not filtering duplicate items --- src/deemon/objects/seq.c | 19 +++++++++++++++---- src/deemon/objects/set.c | 12 +++++++++--- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/deemon/objects/seq.c b/src/deemon/objects/seq.c index e9e5a9d7d..dadca712b 100644 --- a/src/deemon/objects/seq.c +++ b/src/deemon/objects/seq.c @@ -239,9 +239,10 @@ foreach_seq_printrepr_cb(void *arg, DeeObject *elem) { return result; } - -INTERN WUNUSED NONNULL((1, 2)) Dee_ssize_t DCALL -default_seq_printrepr(DeeObject *__restrict self, Dee_formatprinter_t printer, void *arg) { +PRIVATE WUNUSED NONNULL((1, 2, 4)) Dee_ssize_t DCALL +default_seq_printrepr_impl(DeeObject *__restrict self, + Dee_formatprinter_t printer, void *arg, + Dee_mh_seq_operator_foreach_t seq_foreach) { #define DO(err, expr) \ do { \ if unlikely((temp = (expr)) < 0) \ @@ -256,7 +257,7 @@ default_seq_printrepr(DeeObject *__restrict self, Dee_formatprinter_t printer, v data.fsprd_printer = printer; data.fsprd_arg = arg; data.fsprd_first = true; - DO(err, DeeObject_Foreach(self, &foreach_seq_printrepr_cb, &data)); + DO(err, (*seq_foreach)(self, &foreach_seq_printrepr_cb, &data)); DO(err, data.fsprd_first ? DeeFormat_PRINT(printer, arg, "}") : DeeFormat_PRINT(printer, arg, " }")); done: @@ -266,6 +267,16 @@ default_seq_printrepr(DeeObject *__restrict self, Dee_formatprinter_t printer, v #undef DO } +INTERN WUNUSED NONNULL((1, 2)) Dee_ssize_t DCALL +default_seq_printrepr(DeeObject *__restrict self, Dee_formatprinter_t printer, void *arg) { + return default_seq_printrepr_impl(self, printer, arg, DeeType_RequireSeqOperatorForeach(Dee_TYPE(self))); +} + +INTERN WUNUSED NONNULL((1, 2)) Dee_ssize_t DCALL +default_set_printrepr(DeeObject *__restrict self, Dee_formatprinter_t printer, void *arg) { + return default_seq_printrepr_impl(self, printer, arg, DeeType_RequireSetOperatorForeach(Dee_TYPE(self))); +} + PRIVATE WUNUSED NONNULL((1, 2)) DREF DeeObject *DCALL seq_mul(DeeObject *self, DeeObject *countob) { diff --git a/src/deemon/objects/set.c b/src/deemon/objects/set.c index c69647cac..f22450780 100644 --- a/src/deemon/objects/set.c +++ b/src/deemon/objects/set.c @@ -315,10 +315,14 @@ PRIVATE struct type_getset tpconst set_class_getsets[] = { }; +INTDEF WUNUSED NONNULL((1, 2)) Dee_ssize_t DCALL +default_set_printrepr(DeeObject *__restrict self, Dee_formatprinter_t printer, void *arg); + INTDEF int DCALL none_i1(void *UNUSED(a)); INTDEF int DCALL none_i2(void *UNUSED(a), void *UNUSED(b)); PRIVATE struct type_operator const set_operators[] = { +// TYPE_OPERATOR_FLAGS(OPERATOR_0007_REPR, METHOD_FCONSTCALL | METHOD_FCONSTCALL_IF_THISELEM_CONSTREPR), /* TODO: And THISELEM CONST_HASH+CONST_COMPARE_EQ */ TYPE_OPERATOR_FLAGS(OPERATOR_000D_INV, METHOD_FCONSTCALL), TYPE_OPERATOR_FLAGS(OPERATOR_0010_ADD, METHOD_FCONSTCALL), TYPE_OPERATOR_FLAGS(OPERATOR_0011_SUB, METHOD_FCONSTCALL), @@ -447,9 +451,11 @@ PUBLIC DeeTypeObject DeeSet_Type = { /* .tp_move_assign = */ NULL }, /* .tp_cast = */ { - /* .tp_str = */ NULL, - /* .tp_repr = */ NULL, /* TODO: "{ 10, 20, 30 } as Set" */ - /* .tp_bool = */ &DeeSet_OperatorBool + /* .tp_str = */ NULL, + /* .tp_repr = */ NULL, + /* .tp_bool = */ &DeeSet_OperatorBool, + /* .tp_print = */ NULL, + /* .tp_printrepr = */ &default_set_printrepr, }, /* .tp_call = */ NULL, /* .tp_visit = */ NULL,