@@ -479,6 +479,11 @@ STATIC mp_obj_t set_unary_op(mp_uint_t op, mp_obj_t self_in) {
479
479
480
480
STATIC mp_obj_t set_binary_op (mp_uint_t op , mp_obj_t lhs , mp_obj_t rhs ) {
481
481
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
482
487
switch (op ) {
483
488
case MP_BINARY_OP_OR :
484
489
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
494
case MP_BINARY_OP_SUBTRACT :
490
495
return set_diff (2 , args );
491
496
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
+ }
494
503
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
+ }
497
510
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
+ }
500
517
case MP_BINARY_OP_INPLACE_SUBTRACT :
501
- return set_diff_int (2 , args , true );
518
+ return set_diff_int (2 , args , update );
502
519
case MP_BINARY_OP_LESS :
503
520
return set_issubset_proper (lhs , rhs );
504
521
case MP_BINARY_OP_MORE :
0 commit comments