Skip to content

Commit 2486c4f

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

1 file changed

Lines changed: 24 additions & 7 deletions

File tree

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)