Commit Graph

294 Commits

Author SHA1 Message Date
Raymond Hettinger a3626bc5bd Issue #24583: Fix crash when set is mutated while being updated. 2015-07-15 23:50:14 -07:00
Raymond Hettinger 5d2385ff6f Neaten-up a little bit. 2015-07-08 11:52:27 -07:00
Raymond Hettinger 9632a7d735 Issue 24581: Revert c9782a9ac031 pending a stronger test for mutation during iteration. 2015-07-07 15:29:24 -07:00
Raymond Hettinger 11ce8e6c37 Minor bit of factoring-out common code. 2015-07-06 19:08:49 -07:00
Raymond Hettinger 3dbc11cadd Tighten-up code in the set iterator to use an entry pointer rather than indexing. 2015-07-06 19:03:01 -07:00
Raymond Hettinger ef6bd7d963 Tighten-up code in set_next() to use an entry pointer rather than indexing. 2015-07-06 08:43:37 -07:00
Raymond Hettinger b48d6a63ff Bring related functions add/contains/discard together in the code. 2015-07-05 16:27:44 -07:00
Raymond Hettinger 73799b181e Change add/contains/discard calls to pass the key and hash instead of an entry struct. 2015-07-05 16:06:10 -07:00
Raymond Hettinger dc28d5a198 Clean-up call patterns for add/contains/discard to better match the caller's needs. 2015-07-05 10:03:20 -07:00
Raymond Hettinger ac2ef65c32 Make the unicode equality test an external function rather than in-lining it.
The real benefit of the unicode specialized function comes from
bypassing the overhead of PyObject_RichCompareBool() and not
from being in-lined (especially since there was almost no shared
data between the caller and callee).  Also, the in-lining was
having a negative effect on code generation for the callee.
2015-07-04 16:04:44 -07:00
Raymond Hettinger e186c7674c Make sure the dummy percentage calculation won't overflow. 2015-07-04 11:28:35 -07:00
Raymond Hettinger c2480dc0c4 Minor cleanup. 2015-07-04 08:46:31 -07:00
Raymond Hettinger b322326f48 Minor nit: Make the style of checking error return values more consistent. 2015-07-03 23:37:16 -07:00
Raymond Hettinger 4897300276 Minor factoring: move redundant resize scaling logic into the resize function. 2015-07-03 20:00:03 -07:00
Raymond Hettinger 3c1f52e829 Call set_lookkey() directly to avoid unnecessary memory spills and reloads. 2015-07-03 18:31:09 -07:00
Raymond Hettinger 15f0869609 Move insertion resize logic into set_insert_key().
Simplifies the code a little bit and does the resize check
only when a new key is added (giving a small speed up in
the case where the key already exists).

Fixes possible bug in set_merge() where the set_insert_key()
call relies on a big resize at the start to make enough room
for the keys but is vulnerable to a comparision callback that
could cause the table to shrink in the middle of the merge.

Also, changed the resize threshold from two-thirds of the
mask+1 to just two-thirds.  The plus one offset gave no
real benefit (afterall, the two-thirds mark is just a
heuristic and isn't a precise cut-off).
2015-07-03 17:21:17 -07:00
Raymond Hettinger 2eff9e9441 Minor refactoring. Move reference count logic into function that adds entry. 2015-06-27 22:03:35 -07:00
Raymond Hettinger 91672617d5 Minor tweeak to tighten the inner-loop. 2015-06-26 02:50:21 -07:00
Raymond Hettinger 38bb95e49d Minor code cleanup. 2015-06-24 01:22:19 -07:00
Raymond Hettinger 7e3592dca6 Harmonize the bottom of the outer loop with its entry point
giving a small simplification.  Timings show that hash
pre-check seems only benefit the inner-loop (the linear probes).
2015-06-21 10:47:20 -07:00
Raymond Hettinger 6ee588f14e Restore quick exit (no freeslot check) for common case (found null on first probe). 2015-06-20 21:39:51 -07:00
Yury Selivanov 7aa5341164 Reverting my previous commit.
Something went horribly wrong when I was doing `hg rebase`.
2015-05-30 10:57:56 -04:00
Serhiy Storchaka e90982111a Issue #24115: Update uses of PyObject_IsTrue(), PyObject_Not(),
PyObject_IsInstance(), PyObject_RichCompareBool() and _PyDict_Contains()
to check for and handle errors correctly.
2015-05-30 17:48:54 +03:00
Serhiy Storchaka ac5569b1fa Issue #24115: Update uses of PyObject_IsTrue(), PyObject_Not(),
PyObject_IsInstance(), PyObject_RichCompareBool() and _PyDict_Contains()
to check for and handle errors correctly.
2015-05-30 17:48:19 +03:00
Serhiy Storchaka fa494fd883 Issue #24115: Update uses of PyObject_IsTrue(), PyObject_Not(),
PyObject_IsInstance(), PyObject_RichCompareBool() and _PyDict_Contains()
to check for and handle errors correctly.
2015-05-30 17:45:22 +03:00
Raymond Hettinger 8651a50475 Issue #23359: Specialize set_lookkey intoa lookup function and an insert function. 2015-05-27 10:37:20 -07:00
Raymond Hettinger 5af9e13c18 Minor stylistic and consistency cleanup. 2015-05-13 01:44:36 -07:00
Raymond Hettinger 1bd8d75be3 Issue #23290: Optimize set_merge() for cases where the target is empty.
(Contributed by Serhiy Storchaka.)
2015-05-13 01:26:14 -07:00
Raymond Hettinger 438f9134cf Mirco-optimizations to reduce register spills and reloads observed on CLANG and GCC. 2015-02-09 06:48:29 -06:00
Raymond Hettinger 8249282622 Minor code clean up. 2015-02-04 08:37:02 -08:00
Raymond Hettinger 06bb1226d1 Issue 23359: Reduce size of code in set_lookkey. Only do linear probes when there is no wrap-around.
Nice simplification contributed by Serhiy Storchaka :-)
2015-02-03 08:15:30 -08:00
Raymond Hettinger c658d85487 Issue 23359: Tighten inner search loop for sets (don't and-mask every entry lookup). 2015-02-02 08:35:00 -08:00
Raymond Hettinger 59ecabd12a Keep the definition of i consistent between set_lookkey() and set_insert_clean(). 2015-01-31 02:45:12 -08:00
Raymond Hettinger 9edd753229 Minor tweak to improve code clarity. 2015-01-30 20:09:23 -08:00
Raymond Hettinger 06a1c8dfa0 Fix typo in a comment. 2015-01-30 18:02:15 -08:00
Raymond Hettinger f8d1a31e70 Revert unintended part of the commit (the key==dummy test wasn't supposed to change). 2015-01-26 22:06:43 -08:00
Raymond Hettinger a5ebbf6295 Remove unneeded dummy test from the set search loop (when the hashes match we know the key is not a dummy). 2015-01-26 21:54:35 -08:00
Raymond Hettinger 3037e84ad1 Issue #23269: Tighten search_loop in set_insert_clean()
Instead of masking and shifting every loopup, move the wrap-around
test outside of the inner-loop.
2015-01-26 21:33:48 -08:00
Raymond Hettinger b335dfe7fa Set the hash values of dummy entries to -1. Improves quality of entry->hash == hash tests. 2015-01-25 16:38:52 -08:00
Raymond Hettinger 4d45c1069b Update out-of-date comments. 2015-01-25 16:27:40 -08:00
Raymond Hettinger 93035c44fd Issue #23119: Simplify setobject by inlining the special case for unicode equality testing. 2015-01-25 16:12:49 -08:00
Raymond Hettinger ed741d4ff0 A hybrid of and-masking and a conditional-set-to-zero produce even faster search loop. 2015-01-18 21:25:15 -08:00
Raymond Hettinger bd9b200b87 Update copyright for 2015 updates. 2015-01-18 16:10:30 -08:00
Raymond Hettinger 9cd6a789c6 Clean-up, simplify, and slightly speed-up bounds logic in set_pop().
Elsewhere in the setobject.c code we do a bitwise-and with the mask
instead of using a conditional to reset to zero on wrap-around.
Using that same technique here use gives cleaner, faster, and more
consistent code.
2015-01-18 16:06:18 -08:00
Raymond Hettinger 1202a4733e Issue 23261: Clean-up the hack to store the set.pop() search finger in a hash field instead of the setobject. 2015-01-18 13:12:42 -08:00
Raymond Hettinger 8edf27c134 Small clean-up. Factor-out common code for add, contains, and discard function pairs. 2014-12-26 23:08:58 -08:00
Raymond Hettinger 08e3dc0ad6 Issue #23107: Tighten-up loops in setobject.c
* Move the test for an exact key match to after a hash match
* Use "used" as a loop counter instead of "fill"
* Minor improvements to variable names and code consistency
2014-12-26 20:14:00 -08:00
Victor Stinner 12174a5dca Issue #22156: Fix "comparison between signed and unsigned integers" compiler
warnings in the Objects/ subdirectory.

PyType_FromSpecWithBases() and PyType_FromSpec() now reject explicitly negative
slot identifiers.
2014-08-15 23:17:38 +02:00
Raymond Hettinger 426d9958a2 Add development comments to setobject.c 2014-05-18 21:40:20 +01:00
Eric V. Smith 6ba5665fc7 Fix typo in comment. 2014-01-14 08:15:03 -05:00
Raymond Hettinger 74fc8c47f6 Add comments to frozenset_hash().
Also, provide a minor hint to the compiler on how to group the xors.
2014-01-05 12:00:31 -08:00
Raymond Hettinger e259f13874 Minor code clean-up. Keep the C-API all in one section. 2013-12-15 11:56:14 -08:00
Raymond Hettinger 710a67edfc Note that LINEAR_PROBES can be set to zero. 2013-09-21 20:17:31 -07:00
Raymond Hettinger 4ef0528b97 Minor beautification. Put updates and declarations in a more logical order. 2013-09-21 15:39:49 -07:00
Raymond Hettinger 0ce1953bf7 When LINEAR_PROBES=0, let the compiler remove the dead code on its own. 2013-09-21 14:07:18 -07:00
Raymond Hettinger c70a2b7bb9 Make the linear probe sequence clearer. 2013-09-21 14:02:55 -07:00
Raymond Hettinger 8408dc581e Issue 18771: Make it possible to set the number linear probes at compile-time. 2013-09-15 14:57:15 -07:00
Raymond Hettinger 742d8716ff Put the defines in the logical section and fix indentation. 2013-09-08 00:25:57 -07:00
Raymond Hettinger 583cd03fd1 Minor code beautification. 2013-09-07 22:06:35 -07:00
Raymond Hettinger 4ea9080da9 Improve code clarity by removing two unattractive macros. 2013-09-07 21:01:29 -07:00
Raymond Hettinger 8f8839e10a Remove the freelist scheme for setobjects.
The setobject freelist was consuming memory but not providing much value.
Even when a freelisted setobject was available, most of the setobject
fields still needed to be initialized and the small table still required
a memset().  This meant that the custom freelisting scheme for sets was
providing almost no incremental benefit over the default Python freelist
scheme used by _PyObject_Malloc() in Objects/obmalloc.c.
2013-09-07 20:26:50 -07:00
Raymond Hettinger 04fd9dd52b Small rearrangement to bring together the three functions for probing the hash table. 2013-09-07 17:41:01 -07:00
Raymond Hettinger ae7b00e2d3 Move the overview comment to the top of the file. 2013-09-07 15:05:00 -07:00
Raymond Hettinger c56e0e3980 Minor touchups. 2013-09-02 16:32:27 -07:00
Raymond Hettinger 69492dab07 Factor-out the common code for setting a KeyError. 2013-09-02 15:59:26 -07:00
Raymond Hettinger a35adf5b09 Instead of XORed indicies, switch to a hybrid of linear probing and open addressing.
Modern processors tend to make consecutive memory accesses cheaper than
random probes into memory.

Small sets can fit into L1 cache, so they get less benefit.  But they do
come out ahead because the consecutive probes don't probe the same key
more than once and because the randomization step occurs less frequently
(or not at all).

For the open addressing step, putting the perturb shift before the index
calculation gets the upper bits into play sooner.
2013-09-02 03:23:21 -07:00
Raymond Hettinger 6c3c1ccd1b Update copyright. 2013-08-31 21:34:24 -07:00
Raymond Hettinger 95c0d67581 Further reduce the cost of hash collisions by inspecting an additional nearby entry. 2013-08-31 21:27:08 -07:00
Raymond Hettinger afe890923f Tighten-up the lookkey() logic and beautify the code a bit.
Use less code by moving many of the steps from the initial
lookup into the main search loop.

Beautify the code but keep the overall logic unchanged.
2013-08-28 20:59:31 -07:00
Antoine Pitrou 9d95254bb7 Issue #18772: fix the gdb plugin after the set implementation changes 2013-08-24 21:07:07 +02:00
Raymond Hettinger bfc1e1a9cd Add the same dummy type that is used in dictionaries. 2013-08-23 03:22:15 -05:00
Raymond Hettinger fcf3b500ba Issue 18797: Remove unneeded refcount adjustments for dummy objects.
It suffices to keep just one reference when the object is created.
2013-08-22 08:20:31 -07:00
Raymond Hettinger 5bb1b1dd6f Hoist the global dummy lookup out of the inner loop for set_merge(). 2013-08-21 01:34:18 -07:00
Raymond Hettinger 929cbac307 Remove a redundant hash table probe (this was artifact from an earlier draft of the patch). 2013-08-20 23:03:28 -07:00
Raymond Hettinger ae9e616a00 Issue 18772: Restore set dummy object back to unicode and restore the identity checks in lookkey().
The Gdb prettyprint plugin depended on the dummy object being displayable.
Other solutions besides a unicode object are possible.  For now, get it
back up and running.

The identity checks in lookkey() need to be there to prevent the dummy
object from leaking through Py_RichCompareBool() into user code in the
rare circumstance where the dummy's hash value exactly matches the hash
value of the actual key being looked up.
2013-08-20 22:28:24 -07:00
Raymond Hettinger 3c0a4f5def Issue18771: Reduce the cost of hash collisions for set objects. 2013-08-19 07:36:04 -07:00
Raymond Hettinger 07351a0449 Remove the else-clause because the conditions are no longer mutually exclusive. 2013-08-17 02:39:46 -07:00
Raymond Hettinger 237b34b074 Use a known unique object for the dummy entry.
This lets us run PyObject_RichCompareBool() without
first needing to check whether the entry is a dummy.
2013-08-17 02:31:53 -07:00
Raymond Hettinger 8ad3919577 Hoist the global "dummy" lookup outside of the reinsertion loop. 2013-08-15 02:18:55 -07:00
Antoine Pitrou 9ed5f27266 Issue #18722: Remove uses of the "register" keyword in C code. 2013-08-13 20:18:52 +02:00
Raymond Hettinger c629d4c9a2 Replace outdated optimization with clearer code that compiles better.
Letting the compiler decide how to optimize the multiply by five
gives it the freedom to make better choices for the best technique
for a given target machine.

For example, GCC on x86_64 produces a little bit better code:

Old-way (3 steps with a data dependency between each step):

    shrq    $5, %r13
    leaq    1(%rbx,%r13), %rax
    leaq    (%rax,%rbx,4), %rbx

New-way (3 steps with no dependency between the first two steps
         which can be run in parallel):

    leaq    (%rbx,%rbx,4), %rax     # i*5
    shrq    $5, %r13                # perturb >>= PERTURB_SHIFT
    leaq    1(%r13,%rax), %rbx      # 1 + perturb + i*5
2013-08-05 22:24:50 -07:00
Raymond Hettinger c86d7e989c Silence compiler warning for an unused declaration 2013-08-04 12:00:36 -07:00
Antoine Pitrou 5e946bacef Fix compilation warning with gcc 4.8 (unused typedef) 2013-06-18 23:28:18 +02:00
Gregory P. Smith c2176e46d7 Fix the internals of our hash functions to used unsigned values during hash
computation as the overflow behavior of signed integers is undefined.

NOTE: This change is smaller compared to 3.2 as much of this cleanup had
already been done.  I added the comment that my change in 3.2 added so that the
code would match up.  Otherwise this just adds or synchronizes appropriate UL
designations on some constants to be pedantic.

In practice we require compiling everything with -fwrapv which forces overflow
to be defined as twos compliment but this keeps the code cleaner for checkers
or in the case where someone has compiled it without -fwrapv or their
compiler's equivalent.

Found by Clang trunk's Undefined Behavior Sanitizer (UBSan).

Cleanup only - no functionality or hash values change.
2012-12-10 18:32:53 -08:00
Gregory P. Smith 27cbcd6241 Fix the internals of our hash functions to used unsigned values during hash
computation as the overflow behavior of signed integers is undefined.

In practice we require compiling everything with -fwrapv which forces overflow
to be defined as twos compliment but this keeps the code cleaner for checkers
or in the case where someone has compiled it without -fwrapv or their
compiler's equivalent.

Found by Clang trunk's Undefined Behavior Sanitizer (UBSan).

Cleanup only - no functionality or hash values change.
2012-12-10 18:15:46 -08:00
Ezio Melotti 0e1af282b8 Fix typo. 2012-09-28 16:43:40 +03:00
David Malcolm 49526f48fc Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues 2012-06-22 14:55:41 -04:00
Antoine Pitrou a701388de1 Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI. 2012-04-05 00:04:20 +02:00
Kristján Valur Jónsson 31668b8f7a Issue #14288: Serialization support for builtin iterators. 2012-04-03 10:49:41 +00:00
Antoine Pitrou 093ce9cd8c Issue #6695: Full garbage collection runs now clear the freelist of set objects.
Initial patch by Matthias Troffaes.
2011-12-16 11:24:27 +01:00
Benjamin Peterson 1cebc207ea merge 3.2 2011-10-30 14:24:59 -04:00
Benjamin Peterson 2b50a01d11 remove unused variable 2011-10-30 14:24:44 -04:00
Petri Lehtinen c34f5c256a Fix the return value of set_discard (issue #10519) 2011-10-30 14:35:39 +02:00
Petri Lehtinen e0aa803714 Fix the return value of set_discard (issue #10519) 2011-10-30 14:35:12 +02:00
Petri Lehtinen 7c5e34d8a3 Avoid unnecessary recursive function calls (#closes #10519) 2011-10-30 13:57:45 +02:00
Petri Lehtinen 5acc27ebe4 Avoid unnecessary recursive function calls (closes #10519) 2011-10-30 13:56:41 +02:00
Martin v. Löwis bd928fef42 Rename _Py_identifier to _Py_IDENTIFIER. 2011-10-14 10:20:37 +02:00
Martin v. Löwis 1ee1b6fe0d Use identifier API for PyObject_GetAttrString. 2011-10-10 18:11:30 +02:00
Martin v. Löwis d63a3b8beb Implement PEP 393. 2011-09-28 07:41:54 +02:00
Mark Dickinson 57e683e53e Issue #1621: Fix undefined behaviour in bytes.__hash__, str.__hash__, tuple.__hash__, frozenset.__hash__ and set indexing operations. 2011-09-24 18:18:40 +01:00