Skip to content
Snippets Groups Projects
Commit 2486c4ff authored by Damien George's avatar Damien George
Browse files

py/objset: Fix inplace binary ops so frozensets are not modified.

parent 8a39e18f
No related branches found
No related tags found
No related merge requests found
...@@ -479,6 +479,11 @@ STATIC mp_obj_t set_unary_op(mp_uint_t op, mp_obj_t self_in) { ...@@ -479,6 +479,11 @@ STATIC mp_obj_t set_unary_op(mp_uint_t op, mp_obj_t self_in) {
STATIC mp_obj_t set_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs) { STATIC mp_obj_t set_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs) {
mp_obj_t args[] = {lhs, rhs}; mp_obj_t args[] = {lhs, rhs};
#if MICROPY_PY_BUILTINS_FROZENSET
bool update = MP_OBJ_IS_TYPE(lhs, &mp_type_set);
#else
bool update = true;
#endif
switch (op) { switch (op) {
case MP_BINARY_OP_OR: case MP_BINARY_OP_OR:
return set_union(lhs, rhs); 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) { ...@@ -489,16 +494,28 @@ STATIC mp_obj_t set_binary_op(mp_uint_t op, mp_obj_t lhs, mp_obj_t rhs) {
case MP_BINARY_OP_SUBTRACT: case MP_BINARY_OP_SUBTRACT:
return set_diff(2, args); return set_diff(2, args);
case MP_BINARY_OP_INPLACE_OR: case MP_BINARY_OP_INPLACE_OR:
if (update) {
set_update(2, args); set_update(2, args);
return lhs; return lhs;
} else {
return set_union(lhs, rhs);
}
case MP_BINARY_OP_INPLACE_XOR: case MP_BINARY_OP_INPLACE_XOR:
if (update) {
set_symmetric_difference_update(lhs, rhs); set_symmetric_difference_update(lhs, rhs);
return lhs; return lhs;
} else {
return set_symmetric_difference(lhs, rhs);
}
case MP_BINARY_OP_INPLACE_AND: case MP_BINARY_OP_INPLACE_AND:
set_intersect_int(lhs, rhs, true); rhs = set_intersect_int(lhs, rhs, update);
if (update) {
return lhs; return lhs;
} else {
return rhs;
}
case MP_BINARY_OP_INPLACE_SUBTRACT: case MP_BINARY_OP_INPLACE_SUBTRACT:
return set_diff_int(2, args, true); return set_diff_int(2, args, update);
case MP_BINARY_OP_LESS: case MP_BINARY_OP_LESS:
return set_issubset_proper(lhs, rhs); return set_issubset_proper(lhs, rhs);
case MP_BINARY_OP_MORE: case MP_BINARY_OP_MORE:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment