Mercurial > cpython-lru_cache-weakref
annotate Parser/bitset.c @ 80661:94de77bd0b4b 2.7
Issue #16194: document imp.load_dynamic problems
when read several extension modules from the same binary object file.
| author | Andrew Svetlov <andrew.svetlov@gmail.com> |
|---|---|
| date | Thu, 29 Nov 2012 19:51:28 +0200 |
| parents | fd25030223b0 |
| children |
| rev | line source |
|---|---|
| 145 | 1 |
| 86 | 2 /* Bitset primitives used by the parser generator */ |
| 6 | 3 |
| 86 | 4 #include "pgenheaders.h" |
| 6 | 5 #include "bitset.h" |
| 6 | |
| 7 bitset | |
| 13659 | 8 newbitset(int nbits) |
| 6 | 9 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
10 int nbytes = NBYTES(nbits); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
11 bitset ss = (char *)PyObject_MALLOC(sizeof(BYTE) * nbytes); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
12 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
13 if (ss == NULL) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
14 Py_FatalError("no mem for bitset"); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
15 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
16 ss += nbytes; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
17 while (--nbytes >= 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
18 *--ss = 0; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
19 return ss; |
| 6 | 20 } |
| 21 | |
| 22 void | |
| 13659 | 23 delbitset(bitset ss) |
| 6 | 24 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
25 PyObject_FREE(ss); |
| 6 | 26 } |
| 27 | |
| 28 int | |
| 13659 | 29 addbit(bitset ss, int ibit) |
| 6 | 30 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
31 int ibyte = BIT2BYTE(ibit); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
32 BYTE mask = BIT2MASK(ibit); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
33 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
34 if (ss[ibyte] & mask) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
35 return 0; /* Bit already set */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
36 ss[ibyte] |= mask; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
37 return 1; |
| 6 | 38 } |
| 39 | |
| 40 #if 0 /* Now a macro */ | |
| 41 int | |
| 13659 | 42 testbit(bitset ss, int ibit) |
| 6 | 43 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
44 return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0; |
| 6 | 45 } |
| 46 #endif | |
| 47 | |
| 48 int | |
| 13659 | 49 samebitset(bitset ss1, bitset ss2, int nbits) |
| 6 | 50 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
51 int i; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
52 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
53 for (i = NBYTES(nbits); --i >= 0; ) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
54 if (*ss1++ != *ss2++) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
55 return 0; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
56 return 1; |
| 6 | 57 } |
| 58 | |
| 59 void | |
| 13659 | 60 mergebitset(bitset ss1, bitset ss2, int nbits) |
| 6 | 61 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
62 int i; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
63 |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
64 for (i = NBYTES(nbits); --i >= 0; ) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
37585
diff
changeset
|
65 *ss1++ |= *ss2++; |
| 6 | 66 } |
