Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Kirill Smelkov
cpython
Commits
8f67d089
Commit
8f67d089
authored
14 years ago
by
Benjamin Peterson
Browse files
Options
Download
Email Patches
Plain Diff
make hashes always the size of pointers; introduce Py_hash_t #9778
parent
6fb45752
Changes
31
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
84 additions
and
77 deletions
+84
-77
Doc/c-api/object.rst
Doc/c-api/object.rst
+7
-2
Doc/c-api/typeobj.rst
Doc/c-api/typeobj.rst
+4
-4
Include/bytesobject.h
Include/bytesobject.h
+1
-1
Include/datetime.h
Include/datetime.h
+2
-2
Include/dictobject.h
Include/dictobject.h
+5
-8
Include/object.h
Include/object.h
+5
-5
Include/pyport.h
Include/pyport.h
+4
-1
Include/setobject.h
Include/setobject.h
+5
-8
Include/unicodeobject.h
Include/unicodeobject.h
+1
-1
Include/weakrefobject.h
Include/weakrefobject.h
+1
-1
Misc/NEWS
Misc/NEWS
+6
-0
Modules/_datetimemodule.c
Modules/_datetimemodule.c
+7
-7
Modules/_pickle.c
Modules/_pickle.c
+1
-1
Objects/bytesobject.c
Objects/bytesobject.c
+2
-2
Objects/classobject.c
Objects/classobject.c
+2
-2
Objects/codeobject.c
Objects/codeobject.c
+2
-2
Objects/complexobject.c
Objects/complexobject.c
+2
-2
Objects/descrobject.c
Objects/descrobject.c
+2
-2
Objects/dictobject.c
Objects/dictobject.c
+24
-25
Objects/floatobject.c
Objects/floatobject.c
+1
-1
No files found.
Doc/c-api/object.rst
View file @
8f67d089
...
...
@@ -247,15 +247,20 @@ is considered sufficient for this determination.
*NULL* on failure.
.. c:function::
long
PyObject_Hash(PyObject *o)
.. c:function::
Py_hash_t
PyObject_Hash(PyObject *o)
.. index:: builtin: hash
Compute and return the hash value of an object *o*. On failure, return ``-1``.
This is the equivalent of the Python expression ``hash(o)``.
.. versionchanged:: 3.2
.. c:function:: long PyObject_HashNotImplemented(PyObject *o)
The return type is now Py_hash_t. This is a signed integer the same size
as Py_ssize_t.
.. c:function:: Py_hash_t PyObject_HashNotImplemented(PyObject *o)
Set a :exc:`TypeError` indicating that ``type(o)`` is not hashable and return ``-1``.
This function receives special treatment when stored in a ``tp_hash`` slot,
...
...
This diff is collapsed.
Click to expand it.
Doc/c-api/typeobj.rst
View file @
8f67d089
...
...
@@ -306,10 +306,10 @@ type objects) *must* have the :attr:`ob_size` field.
An optional pointer to a function that implements the built-in function
:func:`hash`.
The signature is the same as for :c:func:`PyObject_Hash`; it must return a
C
long
. The value ``-1`` should not be returned as a
normal return value; when an
error occurs during the computation of the hash
value, the function should set
an exception and return ``-1``.
The signature is the same as for :c:func:`PyObject_Hash`; it must return a
value of the type Py_hash_t
. The value ``-1`` should not be returned as a
normal return value; when an
error occurs during the computation of the hash
value, the function should set
an exception and return ``-1``.
This field can be set explicitly to :c:func:`PyObject_HashNotImplemented` to
block inheritance of the hash method from a parent type. This is interpreted
...
...
This diff is collapsed.
Click to expand it.
Include/bytesobject.h
View file @
8f67d089
...
...
@@ -29,7 +29,7 @@ functions should be applied to nil objects.
typedef
struct
{
PyObject_VAR_HEAD
long
ob_shash
;
Py_hash_t
ob_shash
;
char
ob_sval
[
1
];
/* Invariants:
...
...
This diff is collapsed.
Click to expand it.
Include/datetime.h
View file @
8f67d089
...
...
@@ -34,7 +34,7 @@ extern "C" {
typedef
struct
{
PyObject_HEAD
long
hashcode
;
/* -1 when unknown */
Py_hash_t
hashcode
;
/* -1 when unknown */
int
days
;
/* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */
int
seconds
;
/* 0 <= seconds < 24*3600 is invariant */
int
microseconds
;
/* 0 <= microseconds < 1000000 is invariant */
...
...
@@ -51,7 +51,7 @@ typedef struct
*/
#define _PyTZINFO_HEAD \
PyObject_HEAD \
long
hashcode;
\
Py_hash_t
hashcode; \
char hastzinfo;
/* boolean flag */
/* No _PyDateTime_BaseTZInfo is allocated; it's just to have something
...
...
This diff is collapsed.
Click to expand it.
Include/dictobject.h
View file @
8f67d089
...
...
@@ -48,11 +48,8 @@ meaning otherwise.
#define PyDict_MINSIZE 8
typedef
struct
{
/* Cached hash code of me_key. Note that hash codes are C longs.
* We have to use Py_ssize_t instead because dict_popitem() abuses
* me_hash to hold a search finger.
*/
Py_ssize_t
me_hash
;
/* Cached hash code of me_key. */
Py_hash_t
me_hash
;
PyObject
*
me_key
;
PyObject
*
me_value
;
}
PyDictEntry
;
...
...
@@ -84,7 +81,7 @@ struct _dictobject {
* setitem calls.
*/
PyDictEntry
*
ma_table
;
PyDictEntry
*
(
*
ma_lookup
)(
PyDictObject
*
mp
,
PyObject
*
key
,
long
hash
);
PyDictEntry
*
(
*
ma_lookup
)(
PyDictObject
*
mp
,
PyObject
*
key
,
Py_hash_t
hash
);
PyDictEntry
ma_smalltable
[
PyDict_MINSIZE
];
};
...
...
@@ -116,14 +113,14 @@ PyAPI_FUNC(void) PyDict_Clear(PyObject *mp);
PyAPI_FUNC
(
int
)
PyDict_Next
(
PyObject
*
mp
,
Py_ssize_t
*
pos
,
PyObject
**
key
,
PyObject
**
value
);
PyAPI_FUNC
(
int
)
_PyDict_Next
(
PyObject
*
mp
,
Py_ssize_t
*
pos
,
PyObject
**
key
,
PyObject
**
value
,
long
*
hash
);
PyObject
*
mp
,
Py_ssize_t
*
pos
,
PyObject
**
key
,
PyObject
**
value
,
Py_hash_t
*
hash
);
PyAPI_FUNC
(
PyObject
*
)
PyDict_Keys
(
PyObject
*
mp
);
PyAPI_FUNC
(
PyObject
*
)
PyDict_Values
(
PyObject
*
mp
);
PyAPI_FUNC
(
PyObject
*
)
PyDict_Items
(
PyObject
*
mp
);
PyAPI_FUNC
(
Py_ssize_t
)
PyDict_Size
(
PyObject
*
mp
);
PyAPI_FUNC
(
PyObject
*
)
PyDict_Copy
(
PyObject
*
mp
);
PyAPI_FUNC
(
int
)
PyDict_Contains
(
PyObject
*
mp
,
PyObject
*
key
);
PyAPI_FUNC
(
int
)
_PyDict_Contains
(
PyObject
*
mp
,
PyObject
*
key
,
long
hash
);
PyAPI_FUNC
(
int
)
_PyDict_Contains
(
PyObject
*
mp
,
PyObject
*
key
,
Py_hash_t
hash
);
PyAPI_FUNC
(
PyObject
*
)
_PyDict_NewPresized
(
Py_ssize_t
minused
);
PyAPI_FUNC
(
void
)
_PyDict_MaybeUntrack
(
PyObject
*
mp
);
PyAPI_FUNC
(
int
)
_PyDict_HasOnlyStringKeys
(
PyObject
*
mp
);
...
...
This diff is collapsed.
Click to expand it.
Include/object.h
View file @
8f67d089
...
...
@@ -275,7 +275,7 @@ typedef PyObject *(*getattrofunc)(PyObject *, PyObject *);
typedef
int
(
*
setattrfunc
)(
PyObject
*
,
char
*
,
PyObject
*
);
typedef
int
(
*
setattrofunc
)(
PyObject
*
,
PyObject
*
,
PyObject
*
);
typedef
PyObject
*
(
*
reprfunc
)(
PyObject
*
);
typedef
long
(
*
hashfunc
)(
PyObject
*
);
typedef
Py_hash_t
(
*
hashfunc
)(
PyObject
*
);
typedef
PyObject
*
(
*
richcmpfunc
)
(
PyObject
*
,
PyObject
*
,
int
);
typedef
PyObject
*
(
*
getiterfunc
)
(
PyObject
*
);
typedef
PyObject
*
(
*
iternextfunc
)
(
PyObject
*
);
...
...
@@ -440,8 +440,8 @@ PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *);
PyAPI_FUNC
(
PyObject
*
)
PyObject_GenericGetAttr
(
PyObject
*
,
PyObject
*
);
PyAPI_FUNC
(
int
)
PyObject_GenericSetAttr
(
PyObject
*
,
PyObject
*
,
PyObject
*
);
PyAPI_FUNC
(
long
)
PyObject_Hash
(
PyObject
*
);
PyAPI_FUNC
(
long
)
PyObject_HashNotImplemented
(
PyObject
*
);
PyAPI_FUNC
(
Py_hash_t
)
PyObject_Hash
(
PyObject
*
);
PyAPI_FUNC
(
Py_hash_t
)
PyObject_HashNotImplemented
(
PyObject
*
);
PyAPI_FUNC
(
int
)
PyObject_IsTrue
(
PyObject
*
);
PyAPI_FUNC
(
int
)
PyObject_Not
(
PyObject
*
);
PyAPI_FUNC
(
int
)
PyCallable_Check
(
PyObject
*
);
...
...
@@ -470,8 +470,8 @@ PyAPI_FUNC(int) Py_ReprEnter(PyObject *);
PyAPI_FUNC
(
void
)
Py_ReprLeave
(
PyObject
*
);
/* Helpers for hash functions */
PyAPI_FUNC
(
long
)
_Py_HashDouble
(
double
);
PyAPI_FUNC
(
long
)
_Py_HashPointer
(
void
*
);
PyAPI_FUNC
(
Py_hash_t
)
_Py_HashDouble
(
double
);
PyAPI_FUNC
(
Py_hash_t
)
_Py_HashPointer
(
void
*
);
/* Helper for passing objects to printf and the like */
#define PyObject_REPR(obj) _PyUnicode_AsString(PyObject_Repr(obj))
...
...
This diff is collapsed.
Click to expand it.
Include/pyport.h
View file @
8f67d089
...
...
@@ -130,7 +130,7 @@ Used in: PY_LONG_LONG
_PyHash_Double in Objects/object.c. Numeric hashes are based on
reduction modulo the prime 2**_PyHASH_BITS - 1. */
#if SIZEOF_
LONG
>= 8
#if SIZEOF_
VOID_P
>= 8
#define _PyHASH_BITS 61
#else
#define _PyHASH_BITS 31
...
...
@@ -177,6 +177,9 @@ typedef Py_intptr_t Py_ssize_t;
# error "Python needs a typedef for Py_ssize_t in pyport.h."
#endif
/* Py_hash_t is the same size as a pointer. */
typedef
Py_ssize_t
Py_hash_t
;
/* Largest possible value of size_t.
SIZE_MAX is part of C99, so it might be defined on some
platforms. If it is not defined, (size_t)-1 is a portable
...
...
This diff is collapsed.
Click to expand it.
Include/setobject.h
View file @
8f67d089
...
...
@@ -22,11 +22,8 @@ no meaning otherwise.
#define PySet_MINSIZE 8
typedef
struct
{
/* Cached hash code of the key. Note that hash codes are C longs.
* We have to use Py_ssize_t instead because set_pop() abuses
* the hash field to hold a search finger.
*/
Py_ssize_t
hash
;
/* Cached hash code of the key. */
Py_hash_t
hash
;
PyObject
*
key
;
}
setentry
;
...
...
@@ -53,10 +50,10 @@ struct _setobject {
* saves repeated runtime null-tests.
*/
setentry
*
table
;
setentry
*
(
*
lookup
)(
PySetObject
*
so
,
PyObject
*
key
,
long
hash
);
setentry
*
(
*
lookup
)(
PySetObject
*
so
,
PyObject
*
key
,
Py_hash_t
hash
);
setentry
smalltable
[
PySet_MINSIZE
];
long
hash
;
/* only used by frozenset objects */
Py_hash_t
hash
;
/* only used by frozenset objects */
PyObject
*
weakreflist
;
/* List of weak references */
};
...
...
@@ -93,7 +90,7 @@ PyAPI_FUNC(int) PySet_Clear(PyObject *set);
PyAPI_FUNC
(
int
)
PySet_Contains
(
PyObject
*
anyset
,
PyObject
*
key
);
PyAPI_FUNC
(
int
)
PySet_Discard
(
PyObject
*
set
,
PyObject
*
key
);
PyAPI_FUNC
(
int
)
PySet_Add
(
PyObject
*
set
,
PyObject
*
key
);
PyAPI_FUNC
(
int
)
_PySet_NextEntry
(
PyObject
*
set
,
Py_ssize_t
*
pos
,
PyObject
**
key
,
long
*
hash
);
PyAPI_FUNC
(
int
)
_PySet_NextEntry
(
PyObject
*
set
,
Py_ssize_t
*
pos
,
PyObject
**
key
,
Py_hash_t
*
hash
);
PyAPI_FUNC
(
PyObject
*
)
PySet_Pop
(
PyObject
*
set
);
PyAPI_FUNC
(
int
)
_PySet_Update
(
PyObject
*
set
,
PyObject
*
iterable
);
...
...
This diff is collapsed.
Click to expand it.
Include/unicodeobject.h
View file @
8f67d089
...
...
@@ -372,7 +372,7 @@ typedef struct {
PyObject_HEAD
Py_ssize_t
length
;
/* Length of raw Unicode data in buffer */
Py_UNICODE
*
str
;
/* Raw Unicode buffer */
long
hash
;
/* Hash value; -1 if not set */
Py_hash_t
hash
;
/* Hash value; -1 if not set */
int
state
;
/* != 0 if interned. In this case the two
* references from the dictionary to this object
* are *not* counted in ob_refcnt. */
...
...
This diff is collapsed.
Click to expand it.
Include/weakrefobject.h
View file @
8f67d089
...
...
@@ -27,7 +27,7 @@ struct _PyWeakReference {
/* A cache for wr_object's hash code. As usual for hashes, this is -1
* if the hash code isn't known yet.
*/
long
hash
;
Py_hash_t
hash
;
/* If wr_object is weakly referenced, wr_object has a doubly-linked NULL-
* terminated list of weak references to it. These are the list pointers.
...
...
This diff is collapsed.
Click to expand it.
Misc/NEWS
View file @
8f67d089
...
...
@@ -93,6 +93,12 @@ Extensions
- The Unicode database was updated to 6.0.0.
C-API
-----
- Issue #9778: Hash values are now always the size of pointers. A new Py_hash_t
type has been introduced.
Tools/Demos
-----------
...
...
This diff is collapsed.
Click to expand it.
Modules/_datetimemodule.c
View file @
8f67d089
...
...
@@ -1843,7 +1843,7 @@ delta_richcompare(PyObject *self, PyObject *other, int op)
static
PyObject
*
delta_getstate
(
PyDateTime_Delta
*
self
);
static
long
static
Py_hash_t
delta_hash
(
PyDateTime_Delta
*
self
)
{
if
(
self
->
hashcode
==
-
1
)
{
...
...
@@ -2777,11 +2777,11 @@ date_replace(PyDateTime_Date *self, PyObject *args, PyObject *kw)
/*
Borrowed from stringobject.c, originally it was string_hash()
*/
static
long
static
Py_hash_t
generic_hash
(
unsigned
char
*
data
,
int
len
)
{
register
unsigned
char
*
p
;
register
long
x
;
register
Py_hash_t
x
;
p
=
(
unsigned
char
*
)
data
;
x
=
*
p
<<
7
;
...
...
@@ -2797,7 +2797,7 @@ generic_hash(unsigned char *data, int len)
static
PyObject
*
date_getstate
(
PyDateTime_Date
*
self
);
static
long
static
Py_hash_t
date_hash
(
PyDateTime_Date
*
self
)
{
if
(
self
->
hashcode
==
-
1
)
...
...
@@ -3246,7 +3246,7 @@ timezone_richcompare(PyDateTime_TimeZone *self,
return
delta_richcompare
(
self
->
offset
,
other
->
offset
,
op
);
}
static
long
static
Py_hash_t
timezone_hash
(
PyDateTime_TimeZone
*
self
)
{
return
delta_hash
((
PyDateTime_Delta
*
)
self
->
offset
);
...
...
@@ -3751,7 +3751,7 @@ time_richcompare(PyObject *self, PyObject *other, int op)
return
result
;
}
static
long
static
Py_hash_t
time_hash
(
PyDateTime_Time
*
self
)
{
if
(
self
->
hashcode
==
-
1
)
{
...
...
@@ -4640,7 +4640,7 @@ datetime_richcompare(PyObject *self, PyObject *other, int op)
return
result
;
}
static
long
static
Py_hash_t
datetime_hash
(
PyDateTime_DateTime
*
self
)
{
if
(
self
->
hashcode
==
-
1
)
{
...
...
This diff is collapsed.
Click to expand it.
Modules/_pickle.c
View file @
8f67d089
...
...
@@ -486,7 +486,7 @@ _PyMemoTable_Lookup(PyMemoTable *self, PyObject *key)
size_t
mask
=
(
size_t
)
self
->
mt_mask
;
PyMemoEntry
*
table
=
self
->
mt_table
;
PyMemoEntry
*
entry
;
long
hash
=
(
long
)
key
>>
3
;
Py_hash_t
hash
=
(
Py_hash_t
)
key
>>
3
;
i
=
hash
&
mask
;
entry
=
&
table
[
i
];
...
...
This diff is collapsed.
Click to expand it.
Objects/bytesobject.c
View file @
8f67d089
...
...
@@ -868,12 +868,12 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op)
return
result
;
}
static
long
static
Py_hash_t
bytes_hash
(
PyBytesObject
*
a
)
{
register
Py_ssize_t
len
;
register
unsigned
char
*
p
;
register
long
x
;
register
Py_hash_t
x
;
if
(
a
->
ob_shash
!=
-
1
)
return
a
->
ob_shash
;
...
...
This diff is collapsed.
Click to expand it.
Objects/classobject.c
View file @
8f67d089
...
...
@@ -263,10 +263,10 @@ method_repr(PyMethodObject *a)
return
result
;
}
static
long
static
Py_hash_t
method_hash
(
PyMethodObject
*
a
)
{
long
x
,
y
;
Py_hash_t
x
,
y
;
if
(
a
->
im_self
==
NULL
)
x
=
PyObject_Hash
(
Py_None
);
else
...
...
This diff is collapsed.
Click to expand it.
Objects/codeobject.c
View file @
8f67d089
...
...
@@ -417,10 +417,10 @@ code_richcompare(PyObject *self, PyObject *other, int op)
return
res
;
}
static
long
static
Py_hash_t
code_hash
(
PyCodeObject
*
co
)
{
long
h
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
;
Py_hash_t
h
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
;
h0
=
PyObject_Hash
(
co
->
co_name
);
if
(
h0
==
-
1
)
return
-
1
;
h1
=
PyObject_Hash
(
co
->
co_code
);
...
...
This diff is collapsed.
Click to expand it.
Objects/complexobject.c
View file @
8f67d089
...
...
@@ -394,7 +394,7 @@ complex_repr(PyComplexObject *v)
return
complex_format
(
v
,
0
,
'r'
);
}
static
long
static
Py_hash_t
complex_hash
(
PyComplexObject
*
v
)
{
unsigned
long
hashreal
,
hashimag
,
combined
;
...
...
@@ -413,7 +413,7 @@ complex_hash(PyComplexObject *v)
combined
=
hashreal
+
_PyHASH_IMAG
*
hashimag
;
if
(
combined
==
(
unsigned
long
)
-
1
)
combined
=
(
unsigned
long
)
-
2
;
return
(
long
)
combined
;
return
(
Py_hash_t
)
combined
;
}
/* This macro may return! */
...
...
This diff is collapsed.
Click to expand it.
Objects/descrobject.c
View file @
8f67d089
...
...
@@ -916,10 +916,10 @@ wrapper_richcompare(PyObject *a, PyObject *b, int op)
return
v
;
}
static
long
static
Py_hash_t
wrapper_hash
(
wrapperobject
*
wp
)
{
in
t
x
,
y
;
Py_hash_
t
x
,
y
;
x
=
_Py_HashPointer
(
wp
->
descr
);
if
(
x
==
-
1
)
return
-
1
;
...
...
This diff is collapsed.
Click to expand it.
Objects/dictobject.c
View file @
8f67d089
...
...
@@ -318,7 +318,7 @@ the caller can (if it wishes) add the <key, value> pair to the returned
PyDictEntry*.
*/
static
PyDictEntry
*
lookdict
(
PyDictObject
*
mp
,
PyObject
*
key
,
register
long
hash
)
lookdict
(
PyDictObject
*
mp
,
PyObject
*
key
,
register
Py_hash_t
hash
)
{
register
size_t
i
;
register
size_t
perturb
;
...
...
@@ -407,7 +407,7 @@ lookdict(PyDictObject *mp, PyObject *key, register long hash)
* This is valuable because dicts with only unicode keys are very common.
*/
static
PyDictEntry
*
lookdict_unicode
(
PyDictObject
*
mp
,
PyObject
*
key
,
register
long
hash
)
lookdict_unicode
(
PyDictObject
*
mp
,
PyObject
*
key
,
register
Py_hash_t
hash
)
{
register
size_t
i
;
register
size_t
perturb
;
...
...
@@ -527,7 +527,7 @@ Eats a reference to key and one to value.
Returns -1 if an error occurred, or 0 on success.
*/
static
int
insertdict
(
register
PyDictObject
*
mp
,
PyObject
*
key
,
long
hash
,
PyObject
*
value
)
insertdict
(
register
PyDictObject
*
mp
,
PyObject
*
key
,
Py_hash_t
hash
,
PyObject
*
value
)
{
PyObject
*
old_value
;
register
PyDictEntry
*
ep
;
...
...
@@ -555,7 +555,7 @@ insertdict(register PyDictObject *mp, PyObject *key, long hash, PyObject *value)
Py_DECREF
(
dummy
);
}
ep
->
me_key
=
key
;
ep
->
me_hash
=
(
Py_ssize_t
)
hash
;
ep
->
me_hash
=
hash
;
ep
->
me_value
=
value
;
mp
->
ma_used
++
;
}
...
...
@@ -571,7 +571,7 @@ Note that no refcounts are changed by this routine; if needed, the caller
is responsible for incref'ing `key` and `value`.
*/
static
void
insertdict_clean
(
register
PyDictObject
*
mp
,
PyObject
*
key
,
long
hash
,
insertdict_clean
(
register
PyDictObject
*
mp
,
PyObject
*
key
,
Py_hash_t
hash
,
PyObject
*
value
)
{
register
size_t
i
;
...
...
@@ -590,7 +590,7 @@ insertdict_clean(register PyDictObject *mp, PyObject *key, long hash,
assert
(
ep
->
me_value
==
NULL
);
mp
->
ma_fill
++
;
ep
->
me_key
=
key
;
ep
->
me_hash
=
(
Py_ssize_t
)
hash
;
ep
->
me_hash
=
hash
;
ep
->
me_value
=
value
;
mp
->
ma_used
++
;
}
...
...
@@ -667,8 +667,7 @@ dictresize(PyDictObject *mp, Py_ssize_t minused)
for
(
ep
=
oldtable
;
i
>
0
;
ep
++
)
{
if
(
ep
->
me_value
!=
NULL
)
{
/* active entry */
--
i
;
insertdict_clean
(
mp
,
ep
->
me_key
,
(
long
)
ep
->
me_hash
,
ep
->
me_value
);
insertdict_clean
(
mp
,
ep
->
me_key
,
ep
->
me_hash
,
ep
->
me_value
);
}
else
if
(
ep
->
me_key
!=
NULL
)
{
/* dummy entry */
--
i
;
...
...
@@ -713,7 +712,7 @@ _PyDict_NewPresized(Py_ssize_t minused)
PyObject
*
PyDict_GetItem
(
PyObject
*
op
,
PyObject
*
key
)
{
long
hash
;
Py_hash_t
hash
;
PyDictObject
*
mp
=
(
PyDictObject
*
)
op
;
PyDictEntry
*
ep
;
PyThreadState
*
tstate
;
...
...
@@ -763,7 +762,7 @@ PyDict_GetItem(PyObject *op, PyObject *key)
PyObject
*
PyDict_GetItemWithError
(
PyObject
*
op
,
PyObject
*
key
)
{
long
hash
;
Py_hash_t
hash
;
PyDictObject
*
mp
=
(
PyDictObject
*
)
op
;
PyDictEntry
*
ep
;
...
...
@@ -796,7 +795,7 @@ int
PyDict_SetItem
(
register
PyObject
*
op
,
PyObject
*
key
,
PyObject
*
value
)
{
register
PyDictObject
*
mp
;
register
long
hash
;
register
Py_hash_t
hash
;
register
Py_ssize_t
n_used
;
if
(
!
PyDict_Check
(
op
))
{
...
...
@@ -842,7 +841,7 @@ int
PyDict_DelItem
(
PyObject
*
op
,
PyObject
*
key
)
{
register
PyDictObject
*
mp
;
register
long
hash
;
register
Py_hash_t
hash
;
register
PyDictEntry
*
ep
;
PyObject
*
old_value
,
*
old_key
;
...
...
@@ -988,7 +987,7 @@ PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
/* Internal version of PyDict_Next that returns a hash value in addition to the key and value.*/
int
_PyDict_Next
(
PyObject
*
op
,
Py_ssize_t
*
ppos
,
PyObject
**
pkey
,
PyObject
**
pvalue
,
long
*
phash
)
_PyDict_Next
(
PyObject
*
op
,
Py_ssize_t
*
ppos
,
PyObject
**
pkey
,
PyObject
**
pvalue
,
Py_hash_t
*
phash
)
{
register
Py_ssize_t
i
;
register
Py_ssize_t
mask
;
...
...
@@ -1006,7 +1005,7 @@ _PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue,
*
ppos
=
i
+
1
;
if
(
i
>
mask
)
return
0
;
*
phash
=
(
long
)(
ep
[
i
].
me_hash
)
;
*
phash
=
ep
[
i
].
me_hash
;
if
(
pkey
)
*
pkey
=
ep
[
i
].
me_key
;
if
(
pvalue
)
...
...
@@ -1128,7 +1127,7 @@ static PyObject *
dict_subscript
(
PyDictObject
*
mp
,
register
PyObject
*
key
)
{
PyObject
*
v
;
long
hash
;
Py_hash_t
hash
;
PyDictEntry
*
ep
;
assert
(
mp
->
ma_table
!=
NULL
);
if
(
!
PyUnicode_CheckExact
(
key
)
||
...
...
@@ -1322,7 +1321,7 @@ dict_fromkeys(PyObject *cls, PyObject *args)
PyObject
*
oldvalue
;
Py_ssize_t
pos
=
0
;
PyObject
*
key
;
long
hash
;
Py_hash_t
hash
;
if
(
dictresize
(
mp
,
Py_SIZE
(
seq
)))
return
NULL
;
...
...
@@ -1340,7 +1339,7 @@ dict_fromkeys(PyObject *cls, PyObject *args)
PyDictObject
*
mp
=
(
PyDictObject
*
)
d
;
Py_ssize_t
pos
=
0
;
PyObject
*
key
;
long
hash
;
Py_hash_t
hash
;
if
(
dictresize
(
mp
,
PySet_GET_SIZE
(
seq
)))
return
NULL
;
...
...
@@ -1549,7 +1548,7 @@ PyDict_Merge(PyObject *a, PyObject *b, int override)
Py_INCREF
(
entry
->
me_key
);
Py_INCREF
(
entry
->
me_value
);
if
(
insertdict
(
mp
,
entry
->
me_key
,
(
long
)
entry
->
me_hash
,
entry
->
me_hash
,
entry
->
me_value
)
!=
0
)
return
-
1
;
}
...
...
@@ -1732,7 +1731,7 @@ dict_richcompare(PyObject *v, PyObject *w, int op)
static
PyObject
*
dict_contains
(
register
PyDictObject
*
mp
,
PyObject
*
key
)
{
long
hash
;
Py_hash_t
hash
;
PyDictEntry
*
ep
;
if
(
!
PyUnicode_CheckExact
(
key
)
||
...
...
@@ -1753,7 +1752,7 @@ dict_get(register PyDictObject *mp, PyObject *args)
PyObject
*
key
;
PyObject
*
failobj
=
Py_None
;
PyObject
*
val
=
NULL
;
long
hash
;
Py_hash_t
hash
;
PyDictEntry
*
ep
;
if
(
!
PyArg_UnpackTuple
(
args
,
"get"
,
1
,
2
,
&
key
,
&
failobj
))
...
...
@@ -1782,7 +1781,7 @@ dict_setdefault(register PyDictObject *mp, PyObject *args)
PyObject
*
key
;
PyObject
*
failobj
=
Py_None
;
PyObject
*
val
=
NULL
;
long
hash
;
Py_hash_t
hash
;
PyDictEntry
*
ep
;
if
(
!
PyArg_UnpackTuple
(
args
,
"setdefault"
,
1
,
2
,
&
key
,
&
failobj
))
...
...
@@ -1818,7 +1817,7 @@ dict_clear(register PyDictObject *mp)
static
PyObject
*
dict_pop
(
PyDictObject
*
mp
,
PyObject
*
args
)
{
long
hash
;
Py_hash_t
hash
;
PyDictEntry
*
ep
;
PyObject
*
old_value
,
*
old_key
;
PyObject
*
key
,
*
deflt
=
NULL
;
...
...
@@ -1864,7 +1863,7 @@ dict_pop(PyDictObject *mp, PyObject *args)
static
PyObject
*
dict_popitem
(
PyDictObject
*
mp
)
{
Py_
ssize
_t
i
=
0
;
Py_
hash
_t
i
=
0
;
PyDictEntry
*
ep
;
PyObject
*
res
;
...
...
@@ -2039,7 +2038,7 @@ static PyMethodDef mapp_methods[] = {
int
PyDict_Contains
(
PyObject
*
op
,
PyObject
*
key
)
{
long
hash
;
Py_hash_t
hash
;
PyDictObject
*
mp
=
(
PyDictObject
*
)
op
;
PyDictEntry
*
ep
;
...
...
@@ -2055,7 +2054,7 @@ PyDict_Contains(PyObject *op, PyObject *key)
/* Internal version of PyDict_Contains used when the hash value is already known */
int
_PyDict_Contains
(
PyObject
*
op
,
PyObject
*
key
,
long
hash
)
_PyDict_Contains
(
PyObject
*
op
,
PyObject
*
key
,
Py_hash_t
hash
)
{
PyDictObject
*
mp
=
(
PyDictObject
*
)
op
;
PyDictEntry
*
ep
;
...
...
This diff is collapsed.
Click to expand it.
Objects/floatobject.c
View file @
8f67d089
...
...
@@ -522,7 +522,7 @@ float_richcompare(PyObject *v, PyObject *w, int op)
return
Py_NotImplemented
;
}
static
long
static
Py_hash_t
float_hash
(
PyFloatObject
*
v
)
{
return
_Py_HashDouble
(
v
->
ob_fval
);
...
...
This diff is collapsed.
Click to expand it.
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment