Skip to content

Commit 2486c4f

Browse files
committed
py/objset: Fix inplace binary ops so frozensets are not modified.
1 parent 8a39e18 commit 2486c4f

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

py/objset.c

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,11 @@ STATIC mp_obj_t set_unary_op(mp_uint_t op, mp_obj_t self_in) {
479479

480480
STATIC mp_obj_t set_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs) {
481481
mp_obj_t args[] = {lhs, rhs};
482+
#if MICROPY_PY_BUILTINS_FROZENSET
483+
bool update = MP_OBJ_IS_TYPE(lhs, &mp_type_set);
484+
#else
485+
bool update = true;
486+
#endif
482487
switch (op) {
483488
case MP_BINARY_OP_OR:
484489
return set_union(lhs, rhs);
@@ -489,16 +494,28 @@ STATIC mp_obj_t set_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs) {
489494
case MP_BINARY_OP_SUBTRACT:
490495
return set_diff(2, args);
491496
case MP_BINARY_OP_INPLACE_OR:
492-
set_update(2, args);
493-
return lhs;
497+
if (update) {
498+
set_update(2, args);
499+
return lhs;
500+
} else {
501+
return set_union(lhs, rhs);
502+
}
494503
case MP_BINARY_OP_INPLACE_XOR:
495-
set_symmetric_difference_update(lhs, rhs);
496-
return lhs;
504+
if (update) {
505+
set_symmetric_difference_update(lhs, rhs);
506+
return lhs;
507+
} else {
508+
return set_symmetric_difference(lhs, rhs);
509+
}
497510
case MP_BINARY_OP_INPLACE_AND:
498-
set_intersect_int(lhs, rhs, true);
499-
return lhs;
511+
rhs = set_intersect_int(lhs, rhs, update);
512+
if (update) {
513+
return lhs;
514+
} else {
515+
return rhs;
516+
}
500517
case MP_BINARY_OP_INPLACE_SUBTRACT:
501-
return set_diff_int(2, args, true);
518+
return set_diff_int(2, args, update);
502519
case MP_BINARY_OP_LESS:
503520
return set_issubset_proper(lhs, rhs);
504521
case MP_BINARY_OP_MORE:

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy