| 5875 | } |
| 5876 | |
| 5877 | static int Hasher_init(Hasher *self, PyObject *args, PyObject *kwargs) { |
| 5878 | // Positional seed |
| 5879 | Py_ssize_t nargs = PyTuple_Size(args); |
| 5880 | if (nargs > 1) { |
| 5881 | PyErr_SetString(PyExc_TypeError, "Hasher() takes at most 1 positional argument"); |
| 5882 | return -1; |
| 5883 | } |
| 5884 | PyObject *seed_obj = nargs == 1 ? PyTuple_GET_ITEM(args, 0) : NULL; |
| 5885 | // Keyword seed |
| 5886 | if (kwargs) { |
| 5887 | PyObject *kw_seed = PyDict_GetItemString(kwargs, "seed"); |
| 5888 | if (kw_seed) { |
| 5889 | if (seed_obj) { |
| 5890 | PyErr_SetString(PyExc_TypeError, "seed specified twice"); |
| 5891 | return -1; |
| 5892 | } |
| 5893 | seed_obj = kw_seed; |
| 5894 | } |
| 5895 | // Check for unexpected kwargs |
| 5896 | Py_ssize_t pos = 0; |
| 5897 | PyObject *key, *value; |
| 5898 | while (PyDict_Next(kwargs, &pos, &key, &value)) { |
| 5899 | if (PyUnicode_CompareWithASCIIString(key, "seed") != 0) { |
| 5900 | PyErr_Format(PyExc_TypeError, "unexpected keyword argument: %S", key); |
| 5901 | return -1; |
| 5902 | } |
| 5903 | } |
| 5904 | } |
| 5905 | unsigned long long seed = 0ULL; |
| 5906 | if (seed_obj) { |
| 5907 | if (!PyLong_Check(seed_obj)) { |
| 5908 | PyErr_SetString(PyExc_TypeError, "seed must be an integer"); |
| 5909 | return -1; |
| 5910 | } |
| 5911 | seed = PyLong_AsUnsignedLongLong(seed_obj); |
| 5912 | if (PyErr_Occurred()) return -1; |
| 5913 | } |
| 5914 | self->seed = (sz_u64_t)seed; |
| 5915 | sz_hash_state_init(&self->state, self->seed); |
| 5916 | return 0; |
| 5917 | } |
| 5918 | |
| 5919 | static PyObject *Hasher_update(PyObject *self_obj, PyObject *arg) { |
| 5920 | Hasher *self = (Hasher *)self_obj; |
nothing calls this directly
no test coverage detected
searching dependent graphs…