0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ (binaryfunc)set_and, /*nb_and*/ (binaryfunc)set_xor, /*nb_xor*/ (binaryfunc)set_or, /*nb_or*/}; PyDoc_STRVAR(frozenset_doc,"frozenset(iterable) --> frozenset object\n\\n\Build an immutable unordered collection of unique elements."); PyTypeObject PyFrozenSet_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, /* ob_size */ "frozenset", /* tp_name */ sizeof(PySetObject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)set_dealloc, /* tp_dealloc */ (printfunc)set_tp_print, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ set_nocmp, /* tp_compare */ (reprfunc)set_repr, /* tp_repr */ &frozenset_as_number, /* tp_as_number */ &set_as_sequence, /* tp_as_sequence */ 0, /* tp_as_mapping */ frozenset_hash, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES | Py_TPFLAGS_BASETYPE, /* tp_flags */ frozenset_doc, /* tp_doc */ (traverseproc)set_traverse, /* tp_traverse */ (inquiry)set_clear_internal, /* tp_clear */ (richcmpfunc)set_richcompare, /* tp_richcompare */ offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */ (getiterfunc)set_iter, /* tp_iter */ 0, /* tp_iternext */ frozenset_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ PyType_GenericAlloc, /* tp_alloc */ frozenset_new, /* tp_new */ PyObject_GC_Del, /* tp_free */}; /***** C API functions *************************************************/ PyObject *PySet_New(PyObject *iterable){ return make_new_set(&PySet_Type, iterable);} PyObject *PyFrozenSet_New(PyObject *iterable){ PyObject *args, *result; if (iterable == NULL) args = PyTuple_New(0); else args = PyTuple_Pack(1, iterable); if (args == NULL) return NULL; result = frozenset_new(&PyFrozenSet_Type, args, NULL); Py_DECREF(args); return result;} Py_ssize_tPySet_Size(PyObject *anyset){ if (!PyAnySet_Check(anyset)) { PyErr_BadInternalCall(); return -1; } return PySet_GET_SIZE(anyset);} intPySet_Clear(PyObject *set){ if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) { PyErr_BadInternalCall(); return -1; } return set_clear_internal((PySetObject *)set);} intPySet_Contains(PyObject *anyset, PyObject *key){ if (!PyAnySet_Check(anyset)) { PyErr_BadInternalCall(); return -1; } return set_contains_key((PySetObject *)anyset, key);} intPySet_Discard(PyObject *set, PyObject *key){ if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) { PyErr_BadInternalCall(); return -1; } return set_discard_key((PySetObject *)set, key);} intPySet_Add(PyObject *set, PyObject *key){ if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) { PyErr_BadInternalCall(); return -1; } return set_add_key((PySetObject *)set, key);} int_PySet_Next(PyObject *set, Py_ssize_t *pos, PyObject **key){ setentry *entry_ptr; if (!PyAnySet_Check(set)) { PyErr_BadInternalCall(); return -1; } if (set_next((PySetObject *)set, pos, &entry_ptr) == 0) return 0; *key = entry_ptr->key; return 1;} int_PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, long *hash){ setentry *entry; if (!PyAnySet_Check(set)) { PyErr_BadInternalCall(); return -1; } if (set_next((PySetObject *)set, pos, &entry) == 0) return 0; *key = entry->key; *hash = entry->hash; return 1;} PyObject *PySet_Pop(PyObject *set){ if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) { PyErr_BadInternalCall(); return NULL; } return set_pop((PySetObject *)set);} int_PySet_Update(PyObject *set, PyObject *iterable){ if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) { PyErr_BadInternalCall(); return -1; } return set_update_internal((PySetObject *)set, iterable);} #ifdef Py_DEBUG /* Test code to be called with any three element set. Returns True and original set is restored. */ #define assertRaises(call_return_value, exception) \ do { \ assert(call_return_value); \ assert(PyErr_ExceptionMatches(exception)); \ PyErr_Clear(); \ } while(0) static PyObject *test_c_api(PySetObject *so){ Py_ssize_t count; char *s; Py_ssize_t i; PyObject *elem, *dup, *t, *f, *dup2; PyObject *ob = (PyObject *)so; /* Verify preconditions and exercise type/size checks */ assert(PyAnySet_Check(ob)); assert(PyAnySet_CheckExact(ob)); assert(!PyFrozenSet_CheckExact(ob)); assert(PySet_Size(ob) == 3); assert(PySet_GET_SIZE(ob) == 3); /* Raise TypeError for non-iterable constructor arguments */ assertRaises(PySet_New(Py_None) == NULL, PyExc_TypeError); assertRaises(PyFrozenSet_New(Py_None) == NULL, PyExc_TypeError); /* Raise TypeError for unhashable key */ dup = PySet_New(ob); assertRaises(PySet_Discard(ob, dup) == -1, PyExc_TypeError); assertRaises(PySet_Contains(ob, dup) == -1, PyExc_TypeError); assertRaises(PySet_Add(ob, dup) == -1, PyExc_TypeError); /* Exercise successful pop, contains, add, and discard */ elem = PySet_Pop(ob); assert(PySet_Contains(ob, elem) == 0); assert(PySet_GET_SIZE(ob) == 2); assert(PySet_Add(ob, elem) == 0); assert(PySet_Contains(ob, elem) == 1); assert(PySet_GET_SIZE(ob) == 3); assert(PySet_Discard(ob, elem) == 1); assert(PySet_GET_SIZE(ob) == 2); assert(PySet_Discard(ob, elem) == 0); assert(PySet_GET_SIZE(ob) == 2); /* Exercise clear */ dup2 = PySet_New(dup); assert(PySet_Clear(dup2) == 0); assert(PySet_Size(dup2) == 0); Py_DECREF(dup2); /* Raise SystemError on clear or update of frozen set */ f = PyFrozenSet_New(dup); assertRaises(PySet_Clear(f) == -1, PyExc_SystemError); assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError); Py_DECREF(f); /* Exercise direct iteration */ i = 0, count = 0; while (_PySet_Next((PyObject *)dup, &i, &elem)) { s = PyString_AsString(elem); assert(s && (s[0] == 'a' || s[0] == 'b' || s[0] == 'c')); count++; } assert(count == 3); /* Exercise updates */ dup2 = PySet_New(NULL); assert(_PySet_Update(dup2, dup) == 0); assert(PySet_Size(dup2) == 3); assert(_PySet_Update(dup2, dup) == 0); assert(PySet_Size(dup2) == 3); Py_DECREF(dup2); /* Raise SystemError when self argument is not a set or frozenset. */ t = PyTuple_New(0); assertRaises(PySet_Size(t) == -1, PyExc_SystemError); assertRaises(PySet_Contains(t, elem) == -1, PyExc_SystemError); Py_DECREF(t); /* Raise SystemError when self argument is not a set. */ f = PyFrozenSet_New(dup); assert(PySet_Size(f) == 3); assert(PyFrozenSet_CheckExact(f)); assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError); assertRaises(PySet_Discard(f, elem) == -1, PyExc_SystemError); assertRaises(PySet_Pop(f) == NULL, PyExc_SystemError); Py_DECREF(f); /* Raise KeyError when popping from an empty set */ assert(PyNumber_InPlaceSubtract(ob, ob) == ob); Py_DECREF(ob); assert(PySet_GET_SIZE(ob) == 0); assertRaises(PySet_Pop(ob) == NULL, PyExc_KeyError); /* Restore the set from the copy using the PyNumber API */ assert(PyNumber_InPlaceOr(ob, dup) == ob); Py_DECREF(ob); /* Verify constructors accept NULL arguments */ f = PySet_New(NULL); assert(f != NULL); assert(PySet_GET_SIZE(f) == 0); Py_DECREF(f); f = PyFrozenSet_New(NULL); assert(f != NULL); assert(PyFrozenSet_CheckExact(f)); assert(PySet_GET_SIZE(f) == 0); Py_DECREF(f); Py_DECREF(elem); Py_DECREF(dup); Py_RETURN_TRUE;} #undef assertRaises #endifLines 2001–2312 of 2312. Previous lines
0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ (binaryfunc)set_and, /*nb_and*/ (binaryfunc)set_xor, /*nb_xor*/ (binaryfunc)set_or, /*nb_or*/ }; PyDoc_STRVAR(frozenset_doc, "frozenset(iterable) --> frozenset object\n\ \n\ Build an immutable unordered collection of unique elements."); PyTypeObject PyFrozenSet_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, /* ob_size */ "frozenset", /* tp_name */ sizeof(PySetObject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)set_dealloc, /* tp_dealloc */ (printfunc)set_tp_print, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ set_nocmp, /* tp_compare */ (reprfunc)set_repr, /* tp_repr */ &frozenset_as_number, /* tp_as_number */ &set_as_sequence, /* tp_as_sequence */ 0, /* tp_as_mapping */ frozenset_hash, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES | Py_TPFLAGS_BASETYPE, /* tp_flags */ frozenset_doc, /* tp_doc */ (traverseproc)set_traverse, /* tp_traverse */ (inquiry)set_clear_internal, /* tp_clear */ (richcmpfunc)set_richcompare, /* tp_richcompare */ offsetof(PySetObject, weakreflist), /* tp_weaklistoffset */ (getiterfunc)set_iter, /* tp_iter */ 0, /* tp_iternext */ frozenset_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ PyType_GenericAlloc, /* tp_alloc */ frozenset_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ }; /***** C API functions *************************************************/ PyObject * PySet_New(PyObject *iterable) { return make_new_set(&PySet_Type, iterable); } PyObject * PyFrozenSet_New(PyObject *iterable) { PyObject *args, *result; if (iterable == NULL) args = PyTuple_New(0); else args = PyTuple_Pack(1, iterable); if (args == NULL) return NULL; result = frozenset_new(&PyFrozenSet_Type, args, NULL); Py_DECREF(args); return result; } Py_ssize_t PySet_Size(PyObject *anyset) { if (!PyAnySet_Check(anyset)) { PyErr_BadInternalCall(); return -1; } return PySet_GET_SIZE(anyset); } int PySet_Clear(PyObject *set) { if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) { PyErr_BadInternalCall(); return -1; } return set_clear_internal((PySetObject *)set); } int PySet_Contains(PyObject *anyset, PyObject *key) { if (!PyAnySet_Check(anyset)) { PyErr_BadInternalCall(); return -1; } return set_contains_key((PySetObject *)anyset, key); } int PySet_Discard(PyObject *set, PyObject *key) { if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) { PyErr_BadInternalCall(); return -1; } return set_discard_key((PySetObject *)set, key); } int PySet_Add(PyObject *set, PyObject *key) { if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) { PyErr_BadInternalCall(); return -1; } return set_add_key((PySetObject *)set, key); } int _PySet_Next(PyObject *set, Py_ssize_t *pos, PyObject **key) { setentry *entry_ptr; if (!PyAnySet_Check(set)) { PyErr_BadInternalCall(); return -1; } if (set_next((PySetObject *)set, pos, &entry_ptr) == 0) return 0; *key = entry_ptr->key; return 1; } int _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, long *hash) { setentry *entry; if (!PyAnySet_Check(set)) { PyErr_BadInternalCall(); return -1; } if (set_next((PySetObject *)set, pos, &entry) == 0) return 0; *key = entry->key; *hash = entry->hash; return 1; } PyObject * PySet_Pop(PyObject *set) { if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) { PyErr_BadInternalCall(); return NULL; } return set_pop((PySetObject *)set); } int _PySet_Update(PyObject *set, PyObject *iterable) { if (!PyType_IsSubtype(set->ob_type, &PySet_Type)) { PyErr_BadInternalCall(); return -1; } return set_update_internal((PySetObject *)set, iterable); } #ifdef Py_DEBUG /* Test code to be called with any three element set. Returns True and original set is restored. */ #define assertRaises(call_return_value, exception) \ do { \ assert(call_return_value); \ assert(PyErr_ExceptionMatches(exception)); \ PyErr_Clear(); \ } while(0) static PyObject * test_c_api(PySetObject *so) { Py_ssize_t count; char *s; Py_ssize_t i; PyObject *elem, *dup, *t, *f, *dup2; PyObject *ob = (PyObject *)so; /* Verify preconditions and exercise type/size checks */ assert(PyAnySet_Check(ob)); assert(PyAnySet_CheckExact(ob)); assert(!PyFrozenSet_CheckExact(ob)); assert(PySet_Size(ob) == 3); assert(PySet_GET_SIZE(ob) == 3); /* Raise TypeError for non-iterable constructor arguments */ assertRaises(PySet_New(Py_None) == NULL, PyExc_TypeError); assertRaises(PyFrozenSet_New(Py_None) == NULL, PyExc_TypeError); /* Raise TypeError for unhashable key */ dup = PySet_New(ob); assertRaises(PySet_Discard(ob, dup) == -1, PyExc_TypeError); assertRaises(PySet_Contains(ob, dup) == -1, PyExc_TypeError); assertRaises(PySet_Add(ob, dup) == -1, PyExc_TypeError); /* Exercise successful pop, contains, add, and discard */ elem = PySet_Pop(ob); assert(PySet_Contains(ob, elem) == 0); assert(PySet_GET_SIZE(ob) == 2); assert(PySet_Add(ob, elem) == 0); assert(PySet_Contains(ob, elem) == 1); assert(PySet_GET_SIZE(ob) == 3); assert(PySet_Discard(ob, elem) == 1); assert(PySet_GET_SIZE(ob) == 2); assert(PySet_Discard(ob, elem) == 0); assert(PySet_GET_SIZE(ob) == 2); /* Exercise clear */ dup2 = PySet_New(dup); assert(PySet_Clear(dup2) == 0); assert(PySet_Size(dup2) == 0); Py_DECREF(dup2); /* Raise SystemError on clear or update of frozen set */ f = PyFrozenSet_New(dup); assertRaises(PySet_Clear(f) == -1, PyExc_SystemError); assertRaises(_PySet_Update(f, dup) == -1, PyExc_SystemError); Py_DECREF(f); /* Exercise direct iteration */ i = 0, count = 0; while (_PySet_Next((PyObject *)dup, &i, &elem)) { s = PyString_AsString(elem); assert(s && (s[0] == 'a' || s[0] == 'b' || s[0] == 'c')); count++; } assert(count == 3); /* Exercise updates */ dup2 = PySet_New(NULL); assert(_PySet_Update(dup2, dup) == 0); assert(PySet_Size(dup2) == 3); assert(_PySet_Update(dup2, dup) == 0); assert(PySet_Size(dup2) == 3); Py_DECREF(dup2); /* Raise SystemError when self argument is not a set or frozenset. */ t = PyTuple_New(0); assertRaises(PySet_Size(t) == -1, PyExc_SystemError); assertRaises(PySet_Contains(t, elem) == -1, PyExc_SystemError); Py_DECREF(t); /* Raise SystemError when self argument is not a set. */ f = PyFrozenSet_New(dup); assert(PySet_Size(f) == 3); assert(PyFrozenSet_CheckExact(f)); assertRaises(PySet_Add(f, elem) == -1, PyExc_SystemError); assertRaises(PySet_Discard(f, elem) == -1, PyExc_SystemError); assertRaises(PySet_Pop(f) == NULL, PyExc_SystemError); Py_DECREF(f); /* Raise KeyError when popping from an empty set */ assert(PyNumber_InPlaceSubtract(ob, ob) == ob); Py_DECREF(ob); assert(PySet_GET_SIZE(ob) == 0); assertRaises(PySet_Pop(ob) == NULL, PyExc_KeyError); /* Restore the set from the copy using the PyNumber API */ assert(PyNumber_InPlaceOr(ob, dup) == ob); Py_DECREF(ob); /* Verify constructors accept NULL arguments */ f = PySet_New(NULL); assert(f != NULL); assert(PySet_GET_SIZE(f) == 0); Py_DECREF(f); f = PyFrozenSet_New(NULL); assert(f != NULL); assert(PyFrozenSet_CheckExact(f)); assert(PySet_GET_SIZE(f) == 0); Py_DECREF(f); Py_DECREF(elem); Py_DECREF(dup); Py_RETURN_TRUE; } #undef assertRaises #endif