cinap_lenrekadd hg and python4bb9e2215 years agoHistory
2312 lines · 54.2 KB · C
RawDownload
	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 #endif

Lines 2001–2312 of 2312. Previous lines