@@ -375,7 +375,7 @@ static NyImmBitSetObject *mutbitset_as_noncomplemented_immbitset_subtype(
375
375
NyMutBitSetObject * v , PyTypeObject * type );
376
376
static NyBitField * mutbitset_findpos_ins (NyMutBitSetObject * v , NyBit pos );
377
377
static NyBitField * mutbitset_findpos (NyMutBitSetObject * v , NyBit pos );
378
- static NySetField * mutbitset_getrange_mut (NyMutBitSetObject * v , NySetField * * shi );
378
+ static int mutbitset_getrange_mut (NyMutBitSetObject * v , NySetField * * slo , NySetField * * shi );
379
379
static int mutbitset_iop_iterable (NyMutBitSetObject * ms , int op , PyObject * v );
380
380
static NyMutBitSetObject * mutbitset_new_from_arg (PyObject * arg );
381
381
static int mutbitset_reset (NyMutBitSetObject * v , NyImmBitSetObject * set );
@@ -972,24 +972,25 @@ sf_getrange(NySetField *v, NyBitField **shi)
972
972
}
973
973
974
974
975
- static NyBitField *
976
- sf_getrange_mut (NySetField * sf , NyBitField * * shi )
975
+ static int
976
+ sf_getrange_mut (NySetField * sf , NyBitField * * slo , NyBitField * * shi )
977
977
{
978
978
if (Py_REFCNT (sf -> set ) > 1 ) {
979
979
NyImmBitSetObject * oset = sf -> set ;
980
980
NyBit lo = sf -> lo - oset -> ob_field ;
981
981
NyBit hi = sf -> hi - oset -> ob_field ;
982
982
NyImmBitSetObject * set = NyImmBitSet_New (Py_SIZE (oset )?Py_SIZE (oset ):8 );
983
983
if (!set )
984
- return 0 ;
984
+ return -1 ;
985
985
fp_move (set -> ob_field , oset -> ob_field , Py_SIZE (oset ));
986
986
sf -> lo = set -> ob_field + lo ;
987
987
sf -> hi = set -> ob_field + hi ;
988
988
sf -> set = set ;
989
989
Py_DECREF (oset );
990
990
}
991
+ * slo = sf -> lo ;
991
992
* shi = sf -> hi ;
992
- return sf -> lo ;
993
+ return 0 ;
993
994
}
994
995
995
996
static int
@@ -1179,17 +1180,17 @@ mutbitset_findpos_ins(NyMutBitSetObject *v, NyBit pos)
1179
1180
return f ;
1180
1181
{
1181
1182
NySetField * lo , * hi ;
1182
- hi = 0 ; /* Avoid warning */
1183
- lo = mutbitset_getrange_mut ( v , & hi ) ;
1183
+ if ( mutbitset_getrange_mut ( v , & lo , & hi ) < 0 )
1184
+ return NULL ;
1184
1185
sf = setfield_binsearch (lo , hi , pos );
1185
1186
assert (lo <= sf && sf < hi );
1186
1187
assert (lo -> pos <= pos );
1187
1188
assert (sf >= lo );
1188
1189
}
1189
1190
{
1190
1191
NyBitField * lo , * hi ;
1191
- lo = sf_getrange_mut (sf , & hi );
1192
- ( void ) lo ;
1192
+ if ( sf_getrange_mut (sf , & lo , & hi ) < 0 )
1193
+ return NULL ;
1193
1194
f = bitfield_binsearch (sf -> lo , sf -> hi , pos );
1194
1195
if (ins ) {
1195
1196
if (!(f < sf -> hi && f -> pos == pos ))
@@ -1217,15 +1218,15 @@ mutbitset_getrange(NyMutBitSetObject *v, NySetField **shi)
1217
1218
return union_getrange (v -> root , shi );
1218
1219
}
1219
1220
1220
- static NySetField *
1221
- mutbitset_getrange_mut (NyMutBitSetObject * v , NySetField * * shi )
1221
+ static int
1222
+ mutbitset_getrange_mut (NyMutBitSetObject * v , NySetField * * slo , NySetField * * shi )
1222
1223
{
1223
1224
NyUnionObject * root = v -> root ;
1224
1225
if (Py_REFCNT (root ) > 1 ) {
1225
1226
NyUnionObject * nroot = PyObject_NewVar (NyUnionObject , & NyUnion_Type , Py_SIZE (root ));
1226
1227
NyBit i ;
1227
1228
if (!nroot )
1228
- return 0 ;
1229
+ return -1 ;
1229
1230
nroot -> cur_size = root -> cur_size ;
1230
1231
sfp_move (nroot -> ob_field , root -> ob_field , root -> cur_size );
1231
1232
for (i = 0 ; i < nroot -> cur_size ; i ++ ) {
@@ -1240,7 +1241,8 @@ mutbitset_getrange_mut(NyMutBitSetObject *v, NySetField **shi)
1240
1241
Py_DECREF (root );
1241
1242
root = nroot ;
1242
1243
}
1243
- return union_getrange (root , shi );
1244
+ * slo = union_getrange (root , shi );
1245
+ return 0 ;
1244
1246
}
1245
1247
1246
1248
static NyImmBitSetObject *
@@ -1529,8 +1531,12 @@ mutbitset_iop_fields(NyMutBitSetObject *v, int op, NyBitField *w, NyBit n)
1529
1531
break ;
1530
1532
case NyBits_AND :
1531
1533
end_w = w + n ;
1532
- for (s = mutbitset_getrange_mut (v , & end_s ); s < end_s ; s ++ )
1533
- for (f = sf_getrange_mut (s , & end_f ); f < end_f ; f ++ ) {
1534
+ if (mutbitset_getrange_mut (v , & s , & end_s ) < 0 )
1535
+ return -1 ;
1536
+ for (; s < end_s ; s ++ ) {
1537
+ if (sf_getrange_mut (s , & f , & end_f ) < 0 )
1538
+ return -1 ;
1539
+ for (; f < end_f ; f ++ ) {
1534
1540
while (w < end_w && f -> pos > w -> pos )
1535
1541
w ++ ;
1536
1542
if (w < end_w && w -> pos == f -> pos ) {
@@ -1540,6 +1546,7 @@ mutbitset_iop_fields(NyMutBitSetObject *v, int op, NyBitField *w, NyBit n)
1540
1546
f -> bits = 0 ;
1541
1547
}
1542
1548
}
1549
+ }
1543
1550
break ;
1544
1551
case NyBits_SUBR : {
1545
1552
NyBit i ;
@@ -1550,8 +1557,12 @@ mutbitset_iop_fields(NyMutBitSetObject *v, int op, NyBitField *w, NyBit n)
1550
1557
}
1551
1558
}
1552
1559
end_w = w + n ;
1553
- for (s = mutbitset_getrange_mut (v , & end_s ); s < end_s ; s ++ )
1554
- for (f = sf_getrange_mut (s , & end_f ); f < end_f ; f ++ ) {
1560
+ if (mutbitset_getrange_mut (v , & s , & end_s ) < 0 )
1561
+ return -1 ;
1562
+ for (; s < end_s ; s ++ ) {
1563
+ if (sf_getrange_mut (s , & f , & end_f ) < 0 )
1564
+ return -1 ;
1565
+ for (; f < end_f ; f ++ ) {
1555
1566
while (w < end_w && f -> pos > w -> pos )
1556
1567
w ++ ;
1557
1568
if (w < end_w && w -> pos == f -> pos ) {
@@ -1561,6 +1572,7 @@ mutbitset_iop_fields(NyMutBitSetObject *v, int op, NyBitField *w, NyBit n)
1561
1572
f -> bits = 0 ;
1562
1573
}
1563
1574
}
1575
+ }
1564
1576
}
1565
1577
break ;
1566
1578
default :
@@ -1600,9 +1612,13 @@ mutbitset_iop_bits(NyMutBitSetObject *v, int op, NyBit pos, NyBits *bits, NyBit
1600
1612
pos ++ ;
1601
1613
}
1602
1614
break ;
1603
- case NyBits_AND : {
1604
- for (s = mutbitset_getrange_mut (v , & end_s ); s < end_s ; s ++ )
1605
- for (f = sf_getrange_mut (s , & end_f ); f < end_f ; f ++ ) {
1615
+ case NyBits_AND :
1616
+ if (mutbitset_getrange_mut (v , & s , & end_s ) < 0 )
1617
+ return -1 ;
1618
+ for (; s < end_s ; s ++ ) {
1619
+ if (sf_getrange_mut (s , & f , & end_f ) < 0 )
1620
+ return -1 ;
1621
+ for (; f < end_f ; f ++ ) {
1606
1622
while (n > 0 && f -> pos > pos ) {
1607
1623
n -- ;
1608
1624
pos ++ ;
@@ -1626,19 +1642,24 @@ mutbitset_iop_bits(NyMutBitSetObject *v, int op, NyBit pos, NyBits *bits, NyBit
1626
1642
return -1 ;
1627
1643
}
1628
1644
}
1629
- for (s = mutbitset_getrange_mut (v , & end_s ); s < end_s ; s ++ )
1630
- for (f = sf_getrange_mut (s , & end_f ); f < end_f ; f ++ ) {
1631
- while (n > 0 && f -> pos > pos ) {
1632
- n -- ;
1633
- pos ++ ;
1634
- bits ++ ;
1635
- }
1636
- if (n > 0 && f -> pos == pos ) {
1637
- f -> bits = ~f -> bits & * bits ++ ;
1638
- n -- ;
1639
- pos ++ ;
1640
- } else {
1641
- f -> bits = 0 ;
1645
+ if (mutbitset_getrange_mut (v , & s , & end_s ) < 0 )
1646
+ return -1 ;
1647
+ for (; s < end_s ; s ++ ) {
1648
+ if (sf_getrange_mut (s , & f , & end_f ) < 0 )
1649
+ return -1 ;
1650
+ for (; f < end_f ; f ++ ) {
1651
+ while (n > 0 && f -> pos > pos ) {
1652
+ n -- ;
1653
+ pos ++ ;
1654
+ bits ++ ;
1655
+ }
1656
+ if (n > 0 && f -> pos == pos ) {
1657
+ f -> bits = ~f -> bits & * bits ++ ;
1658
+ n -- ;
1659
+ pos ++ ;
1660
+ } else {
1661
+ f -> bits = 0 ;
1662
+ }
1642
1663
}
1643
1664
}
1644
1665
}
@@ -1725,35 +1746,45 @@ mutbitset_iop_mutset(NyMutBitSetObject *v, int op, NyMutBitSetObject *w)
1725
1746
case NyBits_OR :
1726
1747
case NyBits_XOR :
1727
1748
case NyBits_SUB :
1728
- for (s = mutbitset_getrange (w , & end_s ); s < end_s ; s ++ )
1749
+ for (s = mutbitset_getrange (w , & end_s ); s < end_s ; s ++ )
1729
1750
for (f = sf_getrange (s , & end_f ); f < end_f ; f ++ )
1730
1751
if (mutbitset_iop_field (v , op , f ) == -1 )
1731
1752
return -1 ;
1732
- break ;
1753
+ break ;
1733
1754
case NyBits_AND :
1734
- for (s = mutbitset_getrange_mut (v , & end_s ); s < end_s ; s ++ )
1735
- for (f = sf_getrange_mut (s , & end_f ); f < end_f ; f ++ ) {
1755
+ if (mutbitset_getrange_mut (v , & s , & end_s ) < 0 )
1756
+ return -1 ;
1757
+ for (; s < end_s ; s ++ ) {
1758
+ if (sf_getrange_mut (s , & f , & end_f ) < 0 )
1759
+ return -1 ;
1760
+ for (; f < end_f ; f ++ ) {
1736
1761
wf = mutbitset_findpos (w , f -> pos );
1737
1762
if (wf )
1738
1763
f -> bits &= wf -> bits ;
1739
1764
else
1740
1765
f -> bits = 0 ;
1741
1766
}
1742
- break ;
1767
+ }
1768
+ break ;
1743
1769
case NyBits_SUBR :
1744
- for (s = mutbitset_getrange (w , & end_s ); s < end_s ; s ++ )
1770
+ for (s = mutbitset_getrange (w , & end_s ); s < end_s ; s ++ )
1745
1771
for (f = sf_getrange (s , & end_f ); f < end_f ; f ++ )
1746
1772
if (!mutbitset_findpos_ins (v , f -> pos ))
1747
1773
return -1 ;
1748
- for (s = mutbitset_getrange_mut (v , & end_s ); s < end_s ; s ++ )
1749
- for (f = sf_getrange_mut (s , & end_f ); f < end_f ; f ++ ) {
1774
+ if (mutbitset_getrange_mut (v , & s , & end_s ) < 0 )
1775
+ return -1 ;
1776
+ for (; s < end_s ; s ++ ) {
1777
+ if (sf_getrange_mut (s , & f , & end_f ) < 0 )
1778
+ return -1 ;
1779
+ for (; f < end_f ; f ++ ) {
1750
1780
wf = mutbitset_findpos (w , f -> pos );
1751
1781
if (wf )
1752
1782
f -> bits = ~f -> bits & wf -> bits ;
1753
1783
else
1754
1784
f -> bits = 0 ;
1755
1785
}
1756
- break ;
1786
+ }
1787
+ break ;
1757
1788
default :
1758
1789
PyErr_SetString (PyExc_ValueError ,
1759
1790
"Invalid mutbitset_iop_fields() operation" );
@@ -2442,8 +2473,12 @@ NyMutBitSet_pop(NyMutBitSetObject *v, NyBit i)
2442
2473
return -1 ;
2443
2474
}
2444
2475
if (i == - 1 ) {
2445
- for (end_s = mutbitset_getrange_mut (v , & s ); -- s >= end_s ;)
2446
- for (end_f = sf_getrange_mut (s , & f ); -- f >= end_f ;) {
2476
+ if (mutbitset_getrange_mut (v , & end_s , & s ) < 0 )
2477
+ return -1 ;
2478
+ for (; -- s >= end_s ;) {
2479
+ if (sf_getrange_mut (s , & end_f , & f ) < 0 )
2480
+ return -1 ;
2481
+ for (; -- f >= end_f ;) {
2447
2482
if (f -> bits ) {
2448
2483
j = bits_last (f -> bits );
2449
2484
ret = f -> pos * NyBits_N + j ;
@@ -2455,9 +2490,14 @@ NyMutBitSet_pop(NyMutBitSetObject *v, NyBit i)
2455
2490
return ret ;
2456
2491
}
2457
2492
}
2493
+ }
2458
2494
} else if (i == 0 ) {
2459
- for (s = mutbitset_getrange_mut (v , & end_s ); s < end_s ; s ++ )
2460
- for (f = sf_getrange_mut (s , & end_f ); f < end_f ; f ++ ) {
2495
+ if (mutbitset_getrange_mut (v , & s , & end_s ) < 0 )
2496
+ return -1 ;
2497
+ for (; s < end_s ; s ++ ) {
2498
+ if (sf_getrange_mut (s , & f , & end_f ) < 0 )
2499
+ return -1 ;
2500
+ for (; f < end_f ; f ++ ) {
2461
2501
if (f -> bits ) {
2462
2502
j = bits_first (f -> bits );
2463
2503
ret = f -> pos * NyBits_N + j ;
@@ -2469,6 +2509,7 @@ NyMutBitSet_pop(NyMutBitSetObject *v, NyBit i)
2469
2509
return ret ;
2470
2510
}
2471
2511
}
2512
+ }
2472
2513
} else {
2473
2514
PyErr_SetString (PyExc_IndexError , "pop(): index must be 0 or -1" );
2474
2515
return -1 ;
0 commit comments