Mercurial > cpython-lru_cache-weakref
annotate Lib/test/test_mutants.py @ 54294:dba767bc3155 legacy-trunk
remove mention of old ctypes version
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Sat, 23 May 2009 20:59:09 +0000 |
| parents | 08ca476f8a34 |
| children | 7caf54ce529e |
| rev | line source |
|---|---|
|
24364
aa0d2d51fbde
Get rid of relative imports in all unittests. Now anything that
Barry Warsaw <barry@python.org>
parents:
18023
diff
changeset
|
1 from test.test_support import verbose, TESTFN |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
2 import random |
|
18017
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
3 import os |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
4 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
5 # From SF bug #422121: Insecurities in dict comparison. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
6 |
|
17772
01b5043a4509
Repair typos in comments.
Tim Peters <tim.peters@gmail.com>
parents:
17756
diff
changeset
|
7 # Safety of code doing comparisons has been an historical Python weak spot. |
|
01b5043a4509
Repair typos in comments.
Tim Peters <tim.peters@gmail.com>
parents:
17756
diff
changeset
|
8 # The problem is that comparison of structures written in C *naturally* |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
9 # wants to hold on to things like the size of the container, or "the |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
10 # biggest" containee so far, across a traversal of the container; but |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
11 # code to do containee comparisons can call back into Python and mutate |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
12 # the container in arbitrary ways while the C loop is in midstream. If the |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
13 # C code isn't extremely paranoid about digging things out of memory on |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
14 # each trip, and artificially boosting refcounts for the duration, anything |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
15 # from infinite loops to OS crashes can result (yes, I use Windows <wink>). |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
16 # |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
17 # The other problem is that code designed to provoke a weakness is usually |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
18 # white-box code, and so catches only the particular vulnerabilities the |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
19 # author knew to protect against. For example, Python's list.sort() code |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
20 # went thru many iterations as one "new" vulnerability after another was |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
21 # discovered. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
22 # |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
23 # So the dict comparison test here uses a black-box approach instead, |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
24 # generating dicts of various sizes at random, and performing random |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
25 # mutations on them at random times. This proved very effective, |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
26 # triggering at least six distinct failure modes the first 20 times I |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
27 # ran it. Indeed, at the start, the driver never got beyond 6 iterations |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
28 # before the test died. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
29 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
30 # The dicts are global to make it easy to mutate tham from within functions. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
31 dict1 = {} |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
32 dict2 = {} |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
33 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
34 # The current set of keys in dict1 and dict2. These are materialized as |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
35 # lists to make it easy to pick a dict key at random. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
36 dict1keys = [] |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
37 dict2keys = [] |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
38 |
| 35940 | 39 # Global flag telling maybe_mutate() whether to *consider* mutating. |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
40 mutate = 0 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
41 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
42 # If global mutate is true, consider mutating a dict. May or may not |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
43 # mutate a dict even if mutate is true. If it does decide to mutate a |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
44 # dict, it picks one of {dict1, dict2} at random, and deletes a random |
|
17774
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
45 # entry from it; or, more rarely, adds a random element. |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
46 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
47 def maybe_mutate(): |
|
17774
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
48 global mutate |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
49 if not mutate: |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
50 return |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
51 if random.random() < 0.5: |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
52 return |
|
17774
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
53 |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
54 if random.random() < 0.5: |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
55 target, keys = dict1, dict1keys |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
56 else: |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
57 target, keys = dict2, dict2keys |
|
17774
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
58 |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
59 if random.random() < 0.2: |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
60 # Insert a new key. |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
61 mutate = 0 # disable mutation until key inserted |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
62 while 1: |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
63 newkey = Horrid(random.randrange(100)) |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
64 if newkey not in target: |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
65 break |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
66 target[newkey] = Horrid(random.randrange(100)) |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
67 keys.append(newkey) |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
68 mutate = 1 |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
69 |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
70 elif keys: |
|
4b2fdaebbfe5
Make test_mutants stronger by also adding random keys during comparisons.
Tim Peters <tim.peters@gmail.com>
parents:
17772
diff
changeset
|
71 # Delete a key at random. |
|
34957
3767cdaa6728
This test relied on short-circuiting details of dictobject.py to avoid
Armin Rigo <arigo@tunes.org>
parents:
24364
diff
changeset
|
72 mutate = 0 # disable mutation until key deleted |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
73 i = random.randrange(len(keys)) |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
74 key = keys[i] |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
75 del target[key] |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
76 del keys[i] |
|
34957
3767cdaa6728
This test relied on short-circuiting details of dictobject.py to avoid
Armin Rigo <arigo@tunes.org>
parents:
24364
diff
changeset
|
77 mutate = 1 |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
78 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
79 # A horrid class that triggers random mutations of dict1 and dict2 when |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
80 # instances are compared. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
81 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
82 class Horrid: |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
83 def __init__(self, i): |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
84 # Comparison outcomes are determined by the value of i. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
85 self.i = i |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
86 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
87 # An artificial hashcode is selected at random so that we don't |
|
17772
01b5043a4509
Repair typos in comments.
Tim Peters <tim.peters@gmail.com>
parents:
17756
diff
changeset
|
88 # have any systematic relationship between comparison outcomes |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
89 # (based on self.i and other.i) and relative position within the |
|
17772
01b5043a4509
Repair typos in comments.
Tim Peters <tim.peters@gmail.com>
parents:
17756
diff
changeset
|
90 # hash vector (based on hashcode). |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
91 self.hashcode = random.randrange(1000000000) |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
92 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
93 def __hash__(self): |
|
39745
08ca476f8a34
Fix SF bug #1546288, crash in dict_equal.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35940
diff
changeset
|
94 return 42 |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
95 return self.hashcode |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
96 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
97 def __cmp__(self, other): |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
98 maybe_mutate() # The point of the test. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
99 return cmp(self.i, other.i) |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
100 |
|
39745
08ca476f8a34
Fix SF bug #1546288, crash in dict_equal.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35940
diff
changeset
|
101 def __eq__(self, other): |
|
08ca476f8a34
Fix SF bug #1546288, crash in dict_equal.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35940
diff
changeset
|
102 maybe_mutate() # The point of the test. |
|
08ca476f8a34
Fix SF bug #1546288, crash in dict_equal.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35940
diff
changeset
|
103 return self.i == other.i |
|
08ca476f8a34
Fix SF bug #1546288, crash in dict_equal.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35940
diff
changeset
|
104 |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
105 def __repr__(self): |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
106 return "Horrid(%d)" % self.i |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
107 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
108 # Fill dict d with numentries (Horrid(i), Horrid(j)) key-value pairs, |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
109 # where i and j are selected at random from the candidates list. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
110 # Return d.keys() after filling. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
111 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
112 def fill_dict(d, candidates, numentries): |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
113 d.clear() |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
114 for i in xrange(numentries): |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
115 d[Horrid(random.choice(candidates))] = \ |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
116 Horrid(random.choice(candidates)) |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
117 return d.keys() |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
118 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
119 # Test one pair of randomly generated dicts, each with n entries. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
120 # Note that dict comparison is trivial if they don't have the same number |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
121 # of entires (then the "shorter" dict is instantly considered to be the |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
122 # smaller one, without even looking at the entries). |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
123 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
124 def test_one(n): |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
125 global mutate, dict1, dict2, dict1keys, dict2keys |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
126 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
127 # Fill the dicts without mutating them. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
128 mutate = 0 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
129 dict1keys = fill_dict(dict1, range(n), n) |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
130 dict2keys = fill_dict(dict2, range(n), n) |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
131 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
132 # Enable mutation, then compare the dicts so long as they have the |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
133 # same size. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
134 mutate = 1 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
135 if verbose: |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
136 print "trying w/ lengths", len(dict1), len(dict2), |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
137 while dict1 and len(dict1) == len(dict2): |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
138 if verbose: |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
139 print ".", |
|
39745
08ca476f8a34
Fix SF bug #1546288, crash in dict_equal.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35940
diff
changeset
|
140 if random.random() < 0.5: |
|
08ca476f8a34
Fix SF bug #1546288, crash in dict_equal.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35940
diff
changeset
|
141 c = cmp(dict1, dict2) |
|
08ca476f8a34
Fix SF bug #1546288, crash in dict_equal.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35940
diff
changeset
|
142 else: |
|
08ca476f8a34
Fix SF bug #1546288, crash in dict_equal.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35940
diff
changeset
|
143 c = dict1 == dict2 |
|
17756
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
144 if verbose: |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
145 print |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
146 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
147 # Run test_one n times. At the start (before the bugs were fixed), 20 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
148 # consecutive runs of this test each blew up on or before the sixth time |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
149 # test_one was run. So n doesn't have to be large to get an interesting |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
150 # test. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
151 # OTOH, calling with large n is also interesting, to ensure that the fixed |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
152 # code doesn't hold on to refcounts *too* long (in which case memory would |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
153 # leak). |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
154 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
155 def test(n): |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
156 for i in xrange(n): |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
157 test_one(random.randrange(1, 100)) |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
158 |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
159 # See last comment block for clues about good values for n. |
|
a06a704260e9
SF bug #422121 Insecurities in dict comparison.
Tim Peters <tim.peters@gmail.com>
parents:
diff
changeset
|
160 test(100) |
|
18017
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
161 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
162 ########################################################################## |
| 18018 | 163 # Another segfault bug, distilled by Michael Hudson from a c.l.py post. |
|
18017
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
164 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
165 class Child: |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
166 def __init__(self, parent): |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
167 self.__dict__['parent'] = parent |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
168 def __getattr__(self, attr): |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
169 self.parent.a = 1 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
170 self.parent.b = 1 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
171 self.parent.c = 1 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
172 self.parent.d = 1 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
173 self.parent.e = 1 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
174 self.parent.f = 1 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
175 self.parent.g = 1 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
176 self.parent.h = 1 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
177 self.parent.i = 1 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
178 return getattr(self.parent, attr) |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
179 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
180 class Parent: |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
181 def __init__(self): |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
182 self.a = Child(self) |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
183 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
184 # Hard to say what this will print! May vary from time to time. But |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
185 # we're specifically trying to test the tp_print slot here, and this is |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
186 # the clearest way to do it. We print the result to a temp file so that |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
187 # the expected-output file doesn't need to change. |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
188 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
189 f = open(TESTFN, "w") |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
190 print >> f, Parent().__dict__ |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
191 f.close() |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
192 os.unlink(TESTFN) |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
193 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
194 ########################################################################## |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
195 # And another core-dumper from Michael Hudson. |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
196 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
197 dict = {} |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
198 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
199 # Force dict to malloc its table. |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
200 for i in range(1, 10): |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
201 dict[i] = i |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
202 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
203 f = open(TESTFN, "w") |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
204 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
205 class Machiavelli: |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
206 def __repr__(self): |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
207 dict.clear() |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
208 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
209 # Michael sez: "doesn't crash without this. don't know why." |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
210 # Tim sez: "luck of the draw; crashes with or without for me." |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
211 print >> f |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
212 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
213 return `"machiavelli"` |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
214 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
215 def __hash__(self): |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
216 return 0 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
217 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
218 dict[Machiavelli()] = Machiavelli() |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
219 |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
220 print >> f, str(dict) |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
221 f.close() |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
222 os.unlink(TESTFN) |
|
facff5f50fcc
Coredumpers from Michael Hudson, mutating dicts while printing or
Tim Peters <tim.peters@gmail.com>
parents:
17774
diff
changeset
|
223 del f, dict |
|
18023
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
224 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
225 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
226 ########################################################################## |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
227 # And another core-dumper from Michael Hudson. |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
228 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
229 dict = {} |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
230 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
231 # let's force dict to malloc its table |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
232 for i in range(1, 10): |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
233 dict[i] = i |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
234 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
235 class Machiavelli2: |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
236 def __eq__(self, other): |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
237 dict.clear() |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
238 return 1 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
239 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
240 def __hash__(self): |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
241 return 0 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
242 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
243 dict[Machiavelli2()] = Machiavelli2() |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
244 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
245 try: |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
246 dict[Machiavelli2()] |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
247 except KeyError: |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
248 pass |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
249 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
250 del dict |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
251 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
252 ########################################################################## |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
253 # And another core-dumper from Michael Hudson. |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
254 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
255 dict = {} |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
256 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
257 # let's force dict to malloc its table |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
258 for i in range(1, 10): |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
259 dict[i] = i |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
260 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
261 class Machiavelli3: |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
262 def __init__(self, id): |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
263 self.id = id |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
264 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
265 def __eq__(self, other): |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
266 if self.id == other.id: |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
267 dict.clear() |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
268 return 1 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
269 else: |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
270 return 0 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
271 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
272 def __repr__(self): |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
273 return "%s(%s)"%(self.__class__.__name__, self.id) |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
274 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
275 def __hash__(self): |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
276 return 0 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
277 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
278 dict[Machiavelli3(1)] = Machiavelli3(0) |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
279 dict[Machiavelli3(2)] = Machiavelli3(0) |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
280 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
281 f = open(TESTFN, "w") |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
282 try: |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
283 try: |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
284 print >> f, dict[Machiavelli3(2)] |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
285 except KeyError: |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
286 pass |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
287 finally: |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
288 f.close() |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
289 os.unlink(TESTFN) |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
290 |
|
8d2bbbbf2cb9
lookdict: stop more insane core-dump mutating comparison cases. Should
Tim Peters <tim.peters@gmail.com>
parents:
18018
diff
changeset
|
291 del dict |
| 35940 | 292 del dict1, dict2, dict1keys, dict2keys |
