Hello.

I was reading source code for bltinmodule.c and found probably erroneus
stuff in filter function. I'm newbie to python inners and don't know if
attached code is worth for a patch submission.

I would appreciate if someone could take a look at it and if it's ok
then i'll make submission, otherwise just drop it.
TIA

Ruslan
Index: bltinmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/bltinmodule.c,v
retrieving revision 2.321
diff -c -r2.321 bltinmodule.c
*** bltinmodule.c	11 Mar 2005 06:49:40 -0000	2.321
--- bltinmodule.c	19 Jul 2005 21:02:30 -0000
***************
*** 224,231 ****
  
  	/* Pre-allocate argument list tuple. */
  	arg = PyTuple_New(1);
! 	if (arg == NULL)
! 		goto Fail_arg;
  
  	/* Get a result list. */
  	if (PyList_Check(seq) && seq->ob_refcnt == 1) {
--- 224,233 ----
  
  	/* Pre-allocate argument list tuple. */
  	arg = PyTuple_New(1);
! 	if (arg == NULL) {
!                 Py_DECREF(it);
!                 return NULL;
!         }
  
  	/* Get a result list. */
  	if (PyList_Check(seq) && seq->ob_refcnt == 1) {
***************
*** 295,301 ****
  	Py_DECREF(result);
  Fail_it:
  	Py_DECREF(it);
- Fail_arg:
  	Py_DECREF(arg);
  	return NULL;
  }
--- 297,302 ----
***************
*** 525,531 ****
  		return NULL;
  	}
  	if (globals != Py_None && !PyDict_Check(globals)) {
! 		PyErr_SetString(PyExc_TypeError, PyMapping_Check(globals) ? 
  			"globals must be a real dict; try eval(expr, {}, mapping)"
  			: "globals must be a dict");
  		return NULL;
--- 526,532 ----
  		return NULL;
  	}
  	if (globals != Py_None && !PyDict_Check(globals)) {
! 		PyErr_SetString(PyExc_TypeError, PyMapping_Check(globals) ?
  			"globals must be a real dict; try eval(expr, {}, mapping)"
  			: "globals must be a dict");
  		return NULL;
***************
*** 1190,1200 ****
  	if (kwds != NULL && PyDict_Check(kwds) && PyDict_Size(kwds)) {
  		keyfunc = PyDict_GetItemString(kwds, "key");
  		if (PyDict_Size(kwds)!=1  ||  keyfunc == NULL) {
! 			PyErr_Format(PyExc_TypeError, 
  				"%s() got an unexpected keyword argument", name);
  			return NULL;
  		}
! 	} 
  
  	it = PyObject_GetIter(v);
  	if (it == NULL)
--- 1191,1201 ----
  	if (kwds != NULL && PyDict_Check(kwds) && PyDict_Size(kwds)) {
  		keyfunc = PyDict_GetItemString(kwds, "key");
  		if (PyDict_Size(kwds)!=1  ||  keyfunc == NULL) {
! 			PyErr_Format(PyExc_TypeError,
  				"%s() got an unexpected keyword argument", name);
  			return NULL;
  		}
! 	}
  
  	it = PyObject_GetIter(v);
  	if (it == NULL)
***************
*** 1908,1914 ****
  		Py_DECREF(newlist);
  		return NULL;
  	}
! 	
  	newargs = PyTuple_GetSlice(args, 1, 4);
  	if (newargs == NULL) {
  		Py_DECREF(newlist);
--- 1909,1915 ----
  		Py_DECREF(newlist);
  		return NULL;
  	}
! 
  	newargs = PyTuple_GetSlice(args, 1, 4);
  	if (newargs == NULL) {
  		Py_DECREF(newlist);
***************
*** 2536,2556 ****
  		if (ok) {
  			int reslen;
  			if (!PyUnicode_Check(item)) {
! 				PyErr_SetString(PyExc_TypeError, 
  				"can't filter unicode to unicode:"
  				" __getitem__ returned different type");
  				Py_DECREF(item);
  				goto Fail_1;
  			}
  			reslen = PyUnicode_GET_SIZE(item);
! 			if (reslen == 1) 
  				PyUnicode_AS_UNICODE(result)[j++] =
  					PyUnicode_AS_UNICODE(item)[0];
  			else {
  				/* do we need more space? */
  				int need = j + reslen + len - i - 1;
  				if (need > outlen) {
! 					/* overallocate, 
  					   to avoid reallocations */
  					if (need < 2 * outlen)
  						need = 2 * outlen;
--- 2537,2557 ----
  		if (ok) {
  			int reslen;
  			if (!PyUnicode_Check(item)) {
! 				PyErr_SetString(PyExc_TypeError,
  				"can't filter unicode to unicode:"
  				" __getitem__ returned different type");
  				Py_DECREF(item);
  				goto Fail_1;
  			}
  			reslen = PyUnicode_GET_SIZE(item);
! 			if (reslen == 1)
  				PyUnicode_AS_UNICODE(result)[j++] =
  					PyUnicode_AS_UNICODE(item)[0];
  			else {
  				/* do we need more space? */
  				int need = j + reslen + len - i - 1;
  				if (need > outlen) {
! 					/* overallocate,
  					   to avoid reallocations */
  					if (need < 2 * outlen)
  						need = 2 * outlen;
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to