Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-immutables for
openSUSE:Factory checked in at 2022-10-14 15:40:23
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-immutables (Old)
and /work/SRC/openSUSE:Factory/.python-immutables.new.2275 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-immutables"
Fri Oct 14 15:40:23 2022 rev:11 rq:1010135 version:0.19
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-immutables/python-immutables.changes
2022-08-24 15:10:55.208490454 +0200
+++
/work/SRC/openSUSE:Factory/.python-immutables.new.2275/python-immutables.changes
2022-10-14 15:40:40.131730999 +0200
@@ -1,0 +2,6 @@
+Wed Oct 12 03:36:57 UTC 2022 - Yogalakshmi Arunachalam <[email protected]>
+
+- Update to version 0.19
+ * Support for Python 3.11
+
+-------------------------------------------------------------------
Old:
----
immutables-0.18.tar.gz
New:
----
immutables-0.19.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-immutables.spec ++++++
--- /var/tmp/diff_new_pack.5JFoYl/_old 2022-10-14 15:40:40.663731888 +0200
+++ /var/tmp/diff_new_pack.5JFoYl/_new 2022-10-14 15:40:40.663731888 +0200
@@ -19,7 +19,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%define skip_python2 1
Name: python-immutables
-Version: 0.18
+Version: 0.19
Release: 0
Summary: Immutable collections for Python
License: Apache-2.0
++++++ immutables-0.18.tar.gz -> immutables-0.19.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/immutables-0.18/PKG-INFO new/immutables-0.19/PKG-INFO
--- old/immutables-0.18/PKG-INFO 2022-05-22 08:24:35.646268800 +0200
+++ new/immutables-0.19/PKG-INFO 2022-09-14 19:31:46.379966700 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: immutables
-Version: 0.18
+Version: 0.19
Summary: Immutable Collections
Home-page: https://github.com/MagicStack/immutables
Author: MagicStack Inc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/immutables-0.18/immutables/_map.h
new/immutables-0.19/immutables/_map.h
--- old/immutables-0.18/immutables/_map.h 2022-05-22 08:24:25.000000000
+0200
+++ new/immutables-0.19/immutables/_map.h 2022-09-14 19:31:40.000000000
+0200
@@ -4,6 +4,17 @@
#include <stdint.h>
#include "Python.h"
+/*
+HAMT tree is shaped by hashes of keys. Every group of 5 bits of a hash denotes
+the exact position of the key in one level of the tree. Since we're using
+32 bit hashes, we can have at most 7 such levels. Although if there are
+two distinct keys with equal hashes, they will have to occupy the same
+cell in the 7th level of the tree -- so we'd put them in a "collision" node.
+Which brings the total possible tree depth to 8. Read more about the actual
+layout of the HAMT tree in `_map.c`.
+
+This constant is used to define a datastucture for storing iteration state.
+*/
#define _Py_HAMT_MAX_TREE_DEPTH 8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/immutables-0.18/immutables/_version.py
new/immutables-0.19/immutables/_version.py
--- old/immutables-0.18/immutables/_version.py 2022-05-22 08:24:25.000000000
+0200
+++ new/immutables-0.19/immutables/_version.py 2022-09-14 19:31:40.000000000
+0200
@@ -10,4 +10,4 @@
# supported platforms, publish the packages on PyPI, merge the PR
# to the target branch, create a Git tag pointing to the commit.
-__version__ = '0.18'
+__version__ = '0.19'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/immutables-0.18/immutables/pythoncapi_compat.h
new/immutables-0.19/immutables/pythoncapi_compat.h
--- old/immutables-0.18/immutables/pythoncapi_compat.h 2022-05-22
08:24:25.000000000 +0200
+++ new/immutables-0.19/immutables/pythoncapi_compat.h 2022-09-14
19:31:40.000000000 +0200
@@ -26,27 +26,29 @@
// the inline keyword in C (only in C++): use __inline instead.
#if (defined(_MSC_VER) && _MSC_VER < 1900 \
&& !defined(__cplusplus) && !defined(inline))
-# define PYCAPI_COMPAT_INLINE(TYPE static __inline TYPE
+# define PYCAPI_COMPAT_STATIC_INLINE(TYPE) static __inline TYPE
#else
# define PYCAPI_COMPAT_STATIC_INLINE(TYPE) static inline TYPE
#endif
-// C++ compatibility
-#ifdef __cplusplus
-# define PYCAPI_COMPAT_CAST(TYPE, EXPR) reinterpret_cast<TYPE>(EXPR)
-# define PYCAPI_COMPAT_NULL nullptr
-#else
-# define PYCAPI_COMPAT_CAST(TYPE, EXPR) ((TYPE)(EXPR))
-# define PYCAPI_COMPAT_NULL NULL
+#ifndef _Py_CAST
+# define _Py_CAST(type, expr) ((type)(expr))
+#endif
+
+// On C++11 and newer, _Py_NULL is defined as nullptr on C++11,
+// otherwise it is defined as NULL.
+#ifndef _Py_NULL
+# if defined(__cplusplus) && __cplusplus >= 201103
+# define _Py_NULL nullptr
+# else
+# define _Py_NULL NULL
+# endif
#endif
// Cast argument to PyObject* type.
#ifndef _PyObject_CAST
-# define _PyObject_CAST(op) PYCAPI_COMPAT_CAST(PyObject*, op)
-#endif
-#ifndef _PyObject_CAST_CONST
-# define _PyObject_CAST_CONST(op) PYCAPI_COMPAT_CAST(const PyObject*, op)
+# define _PyObject_CAST(op) _Py_CAST(PyObject*, op)
#endif
@@ -74,30 +76,6 @@
#endif
-// See https://bugs.python.org/issue42522
-#if !defined(_Py_StealRef)
-PYCAPI_COMPAT_STATIC_INLINE(PyObject*)
-__Py_StealRef(PyObject *obj)
-{
- Py_DECREF(obj);
- return obj;
-}
-#define _Py_StealRef(obj) __Py_StealRef(_PyObject_CAST(obj))
-#endif
-
-
-// See https://bugs.python.org/issue42522
-#if !defined(_Py_XStealRef)
-PYCAPI_COMPAT_STATIC_INLINE(PyObject*)
-__Py_XStealRef(PyObject *obj)
-{
- Py_XDECREF(obj);
- return obj;
-}
-#define _Py_XStealRef(obj) __Py_XStealRef(_PyObject_CAST(obj))
-#endif
-
-
// bpo-39573 added Py_SET_REFCNT() to Python 3.9.0a4
#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_REFCNT)
PYCAPI_COMPAT_STATIC_INLINE(void)
@@ -171,27 +149,28 @@
PYCAPI_COMPAT_STATIC_INLINE(PyCodeObject*)
PyFrame_GetCode(PyFrameObject *frame)
{
- assert(frame != PYCAPI_COMPAT_NULL);
- assert(frame->f_code != PYCAPI_COMPAT_NULL);
- return PYCAPI_COMPAT_CAST(PyCodeObject*, Py_NewRef(frame->f_code));
+ assert(frame != _Py_NULL);
+ assert(frame->f_code != _Py_NULL);
+ return _Py_CAST(PyCodeObject*, Py_NewRef(frame->f_code));
}
#endif
PYCAPI_COMPAT_STATIC_INLINE(PyCodeObject*)
_PyFrame_GetCodeBorrow(PyFrameObject *frame)
{
- return PYCAPI_COMPAT_CAST(PyCodeObject *,
- _Py_StealRef(PyFrame_GetCode(frame)));
+ PyCodeObject *code = PyFrame_GetCode(frame);
+ Py_DECREF(code);
+ return code;
}
-// bpo-40421 added PyFrame_GetCode() to Python 3.9.0b1
+// bpo-40421 added PyFrame_GetBack() to Python 3.9.0b1
#if PY_VERSION_HEX < 0x030900B1 && !defined(PYPY_VERSION)
PYCAPI_COMPAT_STATIC_INLINE(PyFrameObject*)
PyFrame_GetBack(PyFrameObject *frame)
{
- assert(frame != PYCAPI_COMPAT_NULL);
- return PYCAPI_COMPAT_CAST(PyFrameObject*, Py_XNewRef(frame->f_back));
+ assert(frame != _Py_NULL);
+ return _Py_CAST(PyFrameObject*, Py_XNewRef(frame->f_back));
}
#endif
@@ -199,8 +178,66 @@
PYCAPI_COMPAT_STATIC_INLINE(PyFrameObject*)
_PyFrame_GetBackBorrow(PyFrameObject *frame)
{
- return PYCAPI_COMPAT_CAST(PyFrameObject *,
- _Py_XStealRef(PyFrame_GetBack(frame)));
+ PyFrameObject *back = PyFrame_GetBack(frame);
+ Py_XDECREF(back);
+ return back;
+}
+#endif
+
+
+// bpo-40421 added PyFrame_GetLocals() to Python 3.11.0a7
+#if PY_VERSION_HEX < 0x030B00A7 && !defined(PYPY_VERSION)
+PYCAPI_COMPAT_STATIC_INLINE(PyObject*)
+PyFrame_GetLocals(PyFrameObject *frame)
+{
+#if PY_VERSION_HEX >= 0x030400B1
+ if (PyFrame_FastToLocalsWithError(frame) < 0) {
+ return NULL;
+ }
+#else
+ PyFrame_FastToLocals(frame);
+#endif
+ return Py_NewRef(frame->f_locals);
+}
+#endif
+
+
+// bpo-40421 added PyFrame_GetGlobals() to Python 3.11.0a7
+#if PY_VERSION_HEX < 0x030B00A7 && !defined(PYPY_VERSION)
+PYCAPI_COMPAT_STATIC_INLINE(PyObject*)
+PyFrame_GetGlobals(PyFrameObject *frame)
+{
+ return Py_NewRef(frame->f_globals);
+}
+#endif
+
+
+// bpo-40421 added PyFrame_GetBuiltins() to Python 3.11.0a7
+#if PY_VERSION_HEX < 0x030B00A7 && !defined(PYPY_VERSION)
+PYCAPI_COMPAT_STATIC_INLINE(PyObject*)
+PyFrame_GetBuiltins(PyFrameObject *frame)
+{
+ return Py_NewRef(frame->f_builtins);
+}
+#endif
+
+
+// bpo-40421 added PyFrame_GetLasti() to Python 3.11.0b1
+#if PY_VERSION_HEX < 0x030B00B1 && !defined(PYPY_VERSION)
+PYCAPI_COMPAT_STATIC_INLINE(int)
+PyFrame_GetLasti(PyFrameObject *frame)
+{
+#if PY_VERSION_HEX >= 0x030A00A7
+ // bpo-27129: Since Python 3.10.0a7, f_lasti is an instruction offset,
+ // not a bytes offset anymore. Python uses 16-bit "wordcode" (2 bytes)
+ // instructions.
+ if (frame->f_lasti < 0) {
+ return -1;
+ }
+ return frame->f_lasti * 2;
+#else
+ return frame->f_lasti;
+#endif
}
#endif
@@ -210,7 +247,7 @@
PYCAPI_COMPAT_STATIC_INLINE(PyInterpreterState *)
PyThreadState_GetInterpreter(PyThreadState *tstate)
{
- assert(tstate != PYCAPI_COMPAT_NULL);
+ assert(tstate != _Py_NULL);
return tstate->interp;
}
#endif
@@ -221,8 +258,8 @@
PYCAPI_COMPAT_STATIC_INLINE(PyFrameObject*)
PyThreadState_GetFrame(PyThreadState *tstate)
{
- assert(tstate != PYCAPI_COMPAT_NULL);
- return PYCAPI_COMPAT_CAST(PyFrameObject *, Py_XNewRef(tstate->frame));
+ assert(tstate != _Py_NULL);
+ return _Py_CAST(PyFrameObject *, Py_XNewRef(tstate->frame));
}
#endif
@@ -230,8 +267,9 @@
PYCAPI_COMPAT_STATIC_INLINE(PyFrameObject*)
_PyThreadState_GetFrameBorrow(PyThreadState *tstate)
{
- return PYCAPI_COMPAT_CAST(PyFrameObject*,
- _Py_XStealRef(PyThreadState_GetFrame(tstate)));
+ PyFrameObject *frame = PyThreadState_GetFrame(tstate);
+ Py_XDECREF(frame);
+ return frame;
}
#endif
@@ -245,11 +283,11 @@
PyInterpreterState *interp;
tstate = PyThreadState_GET();
- if (tstate == PYCAPI_COMPAT_NULL) {
+ if (tstate == _Py_NULL) {
Py_FatalError("GIL released (tstate is NULL)");
}
interp = tstate->interp;
- if (interp == PYCAPI_COMPAT_NULL) {
+ if (interp == _Py_NULL) {
Py_FatalError("no current interpreter");
}
return interp;
@@ -262,7 +300,7 @@
PYCAPI_COMPAT_STATIC_INLINE(uint64_t)
PyThreadState_GetID(PyThreadState *tstate)
{
- assert(tstate != PYCAPI_COMPAT_NULL);
+ assert(tstate != _Py_NULL);
return tstate->id;
}
#endif
@@ -286,8 +324,8 @@
PYCAPI_COMPAT_STATIC_INLINE(void)
PyThreadState_LeaveTracing(PyThreadState *tstate)
{
- int use_tracing = (tstate->c_tracefunc != PYCAPI_COMPAT_NULL
- || tstate->c_profilefunc != PYCAPI_COMPAT_NULL);
+ int use_tracing = (tstate->c_tracefunc != _Py_NULL
+ || tstate->c_profilefunc != _Py_NULL);
tstate->tracing--;
#if PY_VERSION_HEX >= 0x030A00A1
tstate->cframe->use_tracing = use_tracing;
@@ -322,11 +360,11 @@
// bpo-1635741 added PyModule_AddObjectRef() to Python 3.10.0a3
#if PY_VERSION_HEX < 0x030A00A3
PYCAPI_COMPAT_STATIC_INLINE(int)
-PyModule_AddObjectRef(PyObject *mod, const char *name, PyObject *value)
+PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value)
{
int res;
Py_XINCREF(value);
- res = PyModule_AddObject(mod, name, value);
+ res = PyModule_AddObject(module, name, value);
if (res < 0) {
Py_XDECREF(value);
}
@@ -338,7 +376,7 @@
// bpo-40024 added PyModule_AddType() to Python 3.9.0a5
#if PY_VERSION_HEX < 0x030900A5
PYCAPI_COMPAT_STATIC_INLINE(int)
-PyModule_AddType(PyObject *mod, PyTypeObject *type)
+PyModule_AddType(PyObject *module, PyTypeObject *type)
{
const char *name, *dot;
@@ -348,13 +386,13 @@
// inline _PyType_Name()
name = type->tp_name;
- assert(name != PYCAPI_COMPAT_NULL);
+ assert(name != _Py_NULL);
dot = strrchr(name, '.');
- if (dot != PYCAPI_COMPAT_NULL) {
+ if (dot != _Py_NULL) {
name = dot + 1;
}
- return PyModule_AddObjectRef(mod, name, _PyObject_CAST(type));
+ return PyModule_AddObjectRef(module, name, _PyObject_CAST(type));
}
#endif
@@ -375,7 +413,7 @@
PYCAPI_COMPAT_STATIC_INLINE(int)
PyObject_GC_IsFinalized(PyObject *obj)
{
- PyGC_Head *gc = PYCAPI_COMPAT_CAST(PyGC_Head *, obj) - 1;
+ PyGC_Head *gc = _Py_CAST(PyGC_Head*, obj) - 1;
return (PyObject_IS_GC(obj) && _PyGCHead_FINALIZED(gc));
}
#endif
@@ -384,10 +422,10 @@
// bpo-39573 added Py_IS_TYPE() to Python 3.9.0a4
#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_IS_TYPE)
PYCAPI_COMPAT_STATIC_INLINE(int)
-_Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) {
- return ob->ob_type == type;
+_Py_IS_TYPE(PyObject *ob, PyTypeObject *type) {
+ return Py_TYPE(ob) == type;
}
-#define Py_IS_TYPE(ob, type) _Py_IS_TYPE(_PyObject_CAST_CONST(ob), type)
+#define Py_IS_TYPE(ob, type) _Py_IS_TYPE(_PyObject_CAST(ob), type)
#endif
@@ -430,6 +468,44 @@
#endif
+// gh-92154 added PyCode_GetCode() to Python 3.11.0b1
+#if PY_VERSION_HEX < 0x030B00B1 && !defined(PYPY_VERSION)
+PYCAPI_COMPAT_STATIC_INLINE(PyObject*)
+PyCode_GetCode(PyCodeObject *code)
+{
+ return Py_NewRef(code->co_code);
+}
+#endif
+
+
+// gh-95008 added PyCode_GetVarnames() to Python 3.11.0rc1
+#if PY_VERSION_HEX < 0x030B00C1 && !defined(PYPY_VERSION)
+PYCAPI_COMPAT_STATIC_INLINE(PyObject*)
+PyCode_GetVarnames(PyCodeObject *code)
+{
+ return Py_NewRef(code->co_varnames);
+}
+#endif
+
+// gh-95008 added PyCode_GetFreevars() to Python 3.11.0rc1
+#if PY_VERSION_HEX < 0x030B00C1 && !defined(PYPY_VERSION)
+PYCAPI_COMPAT_STATIC_INLINE(PyObject*)
+PyCode_GetFreevars(PyCodeObject *code)
+{
+ return Py_NewRef(code->co_freevars);
+}
+#endif
+
+// gh-95008 added PyCode_GetCellvars() to Python 3.11.0rc1
+#if PY_VERSION_HEX < 0x030B00C1 && !defined(PYPY_VERSION)
+PYCAPI_COMPAT_STATIC_INLINE(PyObject*)
+PyCode_GetCellvars(PyCodeObject *code)
+{
+ return Py_NewRef(code->co_cellvars);
+}
+#endif
+
+
// Py_UNUSED() was added to Python 3.4.0b2.
#if PY_VERSION_HEX < 0x030400B2 && !defined(Py_UNUSED)
# if defined(__GNUC__) || defined(__clang__)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/immutables-0.18/immutables.egg-info/PKG-INFO
new/immutables-0.19/immutables.egg-info/PKG-INFO
--- old/immutables-0.18/immutables.egg-info/PKG-INFO 2022-05-22
08:24:34.000000000 +0200
+++ new/immutables-0.19/immutables.egg-info/PKG-INFO 2022-09-14
19:31:46.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: immutables
-Version: 0.18
+Version: 0.19
Summary: Immutable Collections
Home-page: https://github.com/MagicStack/immutables
Author: MagicStack Inc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/immutables-0.18/immutables.egg-info/requires.txt
new/immutables-0.19/immutables.egg-info/requires.txt
--- old/immutables-0.18/immutables.egg-info/requires.txt 2022-05-22
08:24:35.000000000 +0200
+++ new/immutables-0.19/immutables.egg-info/requires.txt 2022-09-14
19:31:46.000000000 +0200
@@ -3,7 +3,7 @@
typing-extensions>=3.7.4.3
[test]
-flake8~=3.8.4
-pycodestyle~=2.6.0
-mypy==0.942
+flake8~=5.0.4
+pycodestyle~=2.9.1
+mypy==0.971
pytest~=6.2.4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/immutables-0.18/pyproject.toml
new/immutables-0.19/pyproject.toml
--- old/immutables-0.18/pyproject.toml 2022-05-22 08:24:25.000000000 +0200
+++ new/immutables-0.19/pyproject.toml 2022-09-14 19:31:40.000000000 +0200
@@ -1,7 +1,3 @@
-[project]
-name = 'immutables'
-requires-python = ">=3.6"
-
[build-system]
requires = ["setuptools>=42", "wheel"]
build-backend = "setuptools.build_meta"
@@ -13,6 +9,7 @@
filterwarnings = "default"
[tool.mypy]
+files = "immutables"
incremental = true
strict = true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/immutables-0.18/setup.py new/immutables-0.19/setup.py
--- old/immutables-0.18/setup.py 2022-05-22 08:24:25.000000000 +0200
+++ new/immutables-0.19/setup.py 2022-09-14 19:31:40.000000000 +0200
@@ -8,9 +8,9 @@
# pycodestyle is a dependency of flake8, but it must be frozen because
# their combination breaks too often
# (example breakage: https://gitlab.com/pycqa/flake8/issues/427)
- 'flake8~=3.8.4',
- 'pycodestyle~=2.6.0',
- 'mypy==0.942',
+ 'flake8~=5.0.4',
+ 'pycodestyle~=2.9.1',
+ 'mypy==0.971',
'pytest~=6.2.4',
]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/immutables-0.18/tests/test_mypy.py
new/immutables-0.19/tests/test_mypy.py
--- old/immutables-0.18/tests/test_mypy.py 2022-05-22 08:24:25.000000000
+0200
+++ new/immutables-0.19/tests/test_mypy.py 2022-09-14 19:31:40.000000000
+0200
@@ -1,4 +1,5 @@
import os
+import sys
try:
import mypy.test.testcmdline
@@ -20,7 +21,19 @@
this_file_dir = os.path.dirname(os.path.realpath(__file__))
test_data_prefix = os.path.join(this_file_dir, 'test-data')
+ parent_dir = os.path.dirname(this_file_dir)
+
+ mypy_path = os.environ.get("MYPYPATH")
+ if mypy_path:
+ mypy_path = parent_dir + os.pathsep + mypy_path
+ else:
+ mypy_path = parent_dir
class ImmuMypyTest(mypy.test.testcmdline.PythonCmdlineSuite):
data_prefix = test_data_prefix
files = ['check-immu.test']
+
+ def run_case(self, testcase):
+ if sys.version_info >= (3, 7):
+ os.environ["MYPYPATH"] = mypy_path
+ super().run_case(testcase)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/immutables-0.18/tests/test_none_keys.py
new/immutables-0.19/tests/test_none_keys.py
--- old/immutables-0.18/tests/test_none_keys.py 2022-05-22 08:24:25.000000000
+0200
+++ new/immutables-0.19/tests/test_none_keys.py 2022-09-14 19:31:40.000000000
+0200
@@ -6,8 +6,8 @@
none_hash = map_hash(None)
-assert(none_hash != 1)
-assert(none_hash.bit_length() <= 32)
+assert none_hash != 1
+assert none_hash.bit_length() <= 32
none_hash_u = ctypes.c_size_t(none_hash).value
not_collision = 0xffffffff & (~none_hash_u)
@@ -15,7 +15,7 @@
mask = 0x7ffffffff
none_collisions = [none_hash_u & (mask >> shift)
for shift in reversed(range(0, 32, 5))]
-assert(len(none_collisions) == 7)
+assert len(none_collisions) == 7
none_collisions = [
ctypes.c_ssize_t(h | (not_collision & (mask << shift))).value
for shift, h in zip(range(5, 37, 5), none_collisions)