@@ -479,6 +479,11 @@ STATIC mp_obj_t set_unary_op(mp_uint_t op, mp_obj_t self_in) {
479479
480480STATIC 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