mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 dc2d0f4654
			
		
	
	
		dc2d0f4654
		
			
		
	
	
	
	
		
			
			Use different function names between _testcapi and _testlimitedcapi to not confuse the WASI linker.
		
			
				
	
	
		
			189 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "parts.h"
 | |
| #include "util.h"
 | |
| 
 | |
| static PyObject *
 | |
| set_check(PyObject *self, PyObject *obj)
 | |
| {
 | |
|     NULLABLE(obj);
 | |
|     RETURN_INT(PySet_Check(obj));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| set_checkexact(PyObject *self, PyObject *obj)
 | |
| {
 | |
|     NULLABLE(obj);
 | |
|     RETURN_INT(PySet_CheckExact(obj));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| frozenset_check(PyObject *self, PyObject *obj)
 | |
| {
 | |
|     NULLABLE(obj);
 | |
|     RETURN_INT(PyFrozenSet_Check(obj));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| frozenset_checkexact(PyObject *self, PyObject *obj)
 | |
| {
 | |
|     NULLABLE(obj);
 | |
|     RETURN_INT(PyFrozenSet_CheckExact(obj));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| anyset_check(PyObject *self, PyObject *obj)
 | |
| {
 | |
|     NULLABLE(obj);
 | |
|     RETURN_INT(PyAnySet_Check(obj));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| anyset_checkexact(PyObject *self, PyObject *obj)
 | |
| {
 | |
|     NULLABLE(obj);
 | |
|     RETURN_INT(PyAnySet_CheckExact(obj));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| set_new(PyObject *self, PyObject *args)
 | |
| {
 | |
|     PyObject *iterable = NULL;
 | |
|     if (!PyArg_ParseTuple(args, "|O", &iterable)) {
 | |
|         return NULL;
 | |
|     }
 | |
|     return PySet_New(iterable);
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| frozenset_new(PyObject *self, PyObject *args)
 | |
| {
 | |
|     PyObject *iterable = NULL;
 | |
|     if (!PyArg_ParseTuple(args, "|O", &iterable)) {
 | |
|         return NULL;
 | |
|     }
 | |
|     return PyFrozenSet_New(iterable);
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| set_size(PyObject *self, PyObject *obj)
 | |
| {
 | |
|     NULLABLE(obj);
 | |
|     RETURN_SIZE(PySet_Size(obj));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| set_contains(PyObject *self, PyObject *args)
 | |
| {
 | |
|     PyObject *obj, *item;
 | |
|     if (!PyArg_ParseTuple(args, "OO", &obj, &item)) {
 | |
|         return NULL;
 | |
|     }
 | |
|     NULLABLE(obj);
 | |
|     NULLABLE(item);
 | |
|     RETURN_INT(PySet_Contains(obj, item));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| set_add(PyObject *self, PyObject *args)
 | |
| {
 | |
|     PyObject *obj, *item;
 | |
|     if (!PyArg_ParseTuple(args, "OO", &obj, &item)) {
 | |
|         return NULL;
 | |
|     }
 | |
|     NULLABLE(obj);
 | |
|     NULLABLE(item);
 | |
|     RETURN_INT(PySet_Add(obj, item));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| set_discard(PyObject *self, PyObject *args)
 | |
| {
 | |
|     PyObject *obj, *item;
 | |
|     if (!PyArg_ParseTuple(args, "OO", &obj, &item)) {
 | |
|         return NULL;
 | |
|     }
 | |
|     NULLABLE(obj);
 | |
|     NULLABLE(item);
 | |
|     RETURN_INT(PySet_Discard(obj, item));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| set_pop(PyObject *self, PyObject *obj)
 | |
| {
 | |
|     NULLABLE(obj);
 | |
|     return PySet_Pop(obj);
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| set_clear(PyObject *self, PyObject *obj)
 | |
| {
 | |
|     NULLABLE(obj);
 | |
|     RETURN_INT(PySet_Clear(obj));
 | |
| }
 | |
| 
 | |
| static PyObject *
 | |
| test_frozenset_add_in_capi(PyObject *self, PyObject *Py_UNUSED(obj))
 | |
| {
 | |
|     // Test that `frozenset` can be used with `PySet_Add`,
 | |
|     // when frozenset is just created in CAPI.
 | |
|     PyObject *fs = PyFrozenSet_New(NULL);
 | |
|     if (fs == NULL) {
 | |
|         return NULL;
 | |
|     }
 | |
|     PyObject *num = PyLong_FromLong(1);
 | |
|     if (num == NULL) {
 | |
|         goto error;
 | |
|     }
 | |
|     if (PySet_Add(fs, num) < 0) {
 | |
|         goto error;
 | |
|     }
 | |
|     int contains = PySet_Contains(fs, num);
 | |
|     if (contains < 0) {
 | |
|         goto error;
 | |
|     }
 | |
|     else if (contains == 0) {
 | |
|         goto unexpected;
 | |
|     }
 | |
|     Py_DECREF(fs);
 | |
|     Py_DECREF(num);
 | |
|     Py_RETURN_NONE;
 | |
| 
 | |
| unexpected:
 | |
|     PyErr_SetString(PyExc_ValueError, "set does not contain expected value");
 | |
| error:
 | |
|     Py_DECREF(fs);
 | |
|     Py_XDECREF(num);
 | |
|     return NULL;
 | |
| }
 | |
| 
 | |
| static PyMethodDef test_methods[] = {
 | |
|     {"set_check", set_check, METH_O},
 | |
|     {"set_checkexact", set_checkexact, METH_O},
 | |
|     {"frozenset_check", frozenset_check, METH_O},
 | |
|     {"frozenset_checkexact", frozenset_checkexact, METH_O},
 | |
|     {"anyset_check", anyset_check, METH_O},
 | |
|     {"anyset_checkexact", anyset_checkexact, METH_O},
 | |
| 
 | |
|     {"set_new", set_new, METH_VARARGS},
 | |
|     {"frozenset_new", frozenset_new, METH_VARARGS},
 | |
| 
 | |
|     {"set_size", set_size, METH_O},
 | |
|     {"set_contains", set_contains, METH_VARARGS},
 | |
|     {"set_add", set_add, METH_VARARGS},
 | |
|     {"set_discard", set_discard, METH_VARARGS},
 | |
|     {"set_pop", set_pop, METH_O},
 | |
|     {"set_clear", set_clear, METH_O},
 | |
| 
 | |
|     {"test_frozenset_add_in_capi", test_frozenset_add_in_capi, METH_NOARGS},
 | |
| 
 | |
|     {NULL},
 | |
| };
 | |
| 
 | |
| int
 | |
| _PyTestLimitedCAPI_Init_Set(PyObject *m)
 | |
| {
 | |
|     if (PyModule_AddFunctions(m, test_methods) < 0) {
 | |
|         return -1;
 | |
|     }
 | |
| 
 | |
|     return 0;
 | |
| }
 |