From 2ac1364688cd3ee313661e82a336663551986fc8 Mon Sep 17 00:00:00 2001 From: Damien George Date: Tue, 3 Oct 2017 17:56:27 +1100 Subject: py/objset: Check that RHS of a binary op is a set/frozenset. CPython docs explicitly state that the RHS of a set/frozenset binary op must be a set to prevent user errors. It also preserves commutativity of the ops, eg: "abc" & set() is a TypeError, and so should be set() & "abc". This change actually decreases unix (x64) code by 160 bytes; it increases stm32 by 4 bytes and esp8266 by 28 bytes (but previous patch already introduced a much large saving). --- py/objset.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'py') diff --git a/py/objset.c b/py/objset.c index 6dede887c..80ed26334 100644 --- a/py/objset.c +++ b/py/objset.c @@ -463,6 +463,10 @@ STATIC mp_obj_t set_binary_op(mp_binary_op_t op, mp_obj_t lhs, mp_obj_t rhs) { #else bool update = true; #endif + if (op != MP_BINARY_OP_IN && !is_set_or_frozenset(rhs)) { + // For all ops except containment the RHS must be a set/frozenset + return MP_OBJ_NULL; + } switch (op) { case MP_BINARY_OP_OR: return set_union(lhs, rhs); -- cgit v1.2.3