mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			104 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "parts.h"
 | |
| #include "util.h"
 | |
| 
 | |
| static PyObject *
 | |
| hash_getfuncdef(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
 | |
| {
 | |
|     // bind PyHash_GetFuncDef()
 | |
|     PyHash_FuncDef *def = PyHash_GetFuncDef();
 | |
| 
 | |
|     PyObject *types = PyImport_ImportModule("types");
 | |
|     if (types == NULL) {
 | |
|         return NULL;
 | |
|     }
 | |
| 
 | |
|     PyObject *result = PyObject_CallMethod(types, "SimpleNamespace", NULL);
 | |
|     Py_DECREF(types);
 | |
|     if (result == NULL) {
 | |
|         return NULL;
 | |
|     }
 | |
| 
 | |
|     // ignore PyHash_FuncDef.hash
 | |
| 
 | |
|     PyObject *value = PyUnicode_FromString(def->name);
 | |
|     int res = PyObject_SetAttrString(result, "name", value);
 | |
|     Py_DECREF(value);
 | |
|     if (res < 0) {
 | |
|         return NULL;
 | |
|     }
 | |
| 
 | |
|     value = PyLong_FromLong(def->hash_bits);
 | |
|     res = PyObject_SetAttrString(result, "hash_bits", value);
 | |
|     Py_DECREF(value);
 | |
|     if (res < 0) {
 | |
|         return NULL;
 | |
|     }
 | |
| 
 | |
|     value = PyLong_FromLong(def->seed_bits);
 | |
|     res = PyObject_SetAttrString(result, "seed_bits", value);
 | |
|     Py_DECREF(value);
 | |
|     if (res < 0) {
 | |
|         return NULL;
 | |
|     }
 | |
| 
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| 
 | |
| static PyObject *
 | |
| long_from_hash(Py_hash_t hash)
 | |
| {
 | |
|     Py_BUILD_ASSERT(sizeof(long long) >= sizeof(hash));
 | |
|     return PyLong_FromLongLong(hash);
 | |
| }
 | |
| 
 | |
| 
 | |
| static PyObject *
 | |
| hash_pointer(PyObject *Py_UNUSED(module), PyObject *arg)
 | |
| {
 | |
|     void *ptr = PyLong_AsVoidPtr(arg);
 | |
|     if (ptr == NULL && PyErr_Occurred()) {
 | |
|         return NULL;
 | |
|     }
 | |
| 
 | |
|     Py_hash_t hash = Py_HashPointer(ptr);
 | |
|     return long_from_hash(hash);
 | |
| }
 | |
| 
 | |
| 
 | |
| static PyObject *
 | |
| hash_buffer(PyObject *Py_UNUSED(module), PyObject *args)
 | |
| {
 | |
|     char *ptr;
 | |
|     Py_ssize_t len;
 | |
|     if (!PyArg_ParseTuple(args, "y#", &ptr, &len)) {
 | |
|         return NULL;
 | |
|     }
 | |
| 
 | |
|     Py_hash_t hash = Py_HashBuffer(ptr, len);
 | |
|     return long_from_hash(hash);
 | |
| }
 | |
| 
 | |
| 
 | |
| static PyObject *
 | |
| object_generichash(PyObject *Py_UNUSED(module), PyObject *arg)
 | |
| {
 | |
|     NULLABLE(arg);
 | |
|     Py_hash_t hash = PyObject_GenericHash(arg);
 | |
|     return long_from_hash(hash);
 | |
| }
 | |
| 
 | |
| 
 | |
| static PyMethodDef test_methods[] = {
 | |
|     {"hash_getfuncdef", hash_getfuncdef, METH_NOARGS},
 | |
|     {"hash_pointer", hash_pointer, METH_O},
 | |
|     {"hash_buffer", hash_buffer, METH_VARARGS},
 | |
|     {"object_generichash", object_generichash, METH_O},
 | |
|     {NULL},
 | |
| };
 | |
| 
 | |
| int
 | |
| _PyTestCapi_Init_Hash(PyObject *m)
 | |
| {
 | |
|     return PyModule_AddFunctions(m, test_methods);
 | |
| }
 | 
