[issue1816] sys.cmd_flags patch

Christian Heimes report at bugs.python.org
Sun Jan 13 23:41:21 CET 2008


Christian Heimes added the comment:

Does anybody see a problem with this repr slot implementation for
structseq? It gives this output:

>>> os.stat(".")
<posix.stat_result st_mode=16832, st_ino=11666571L, st_dev=65025L,
st_nlink=20, st_uid=1000, st_gid=1000, st_size=4096L,
st_atime=1200261754, st_mtime=1200261721, st_ctime=1200261721>

static PyObject *
structseq_repr(PyStructSequence *obj)
{
	PyObject *tup, *val, *repr;
	PyTypeObject *typ = Py_TYPE(obj);
	int i, len;
	char buf[250+5]; /* "...>\0" */
	char *cname, *crepr;
	char *pbuf = buf;
 	char *endbuf = &buf[250];

	*pbuf++ = '<';
	strncpy(pbuf, typ->tp_name, 50);
	pbuf += strlen(typ->tp_name) > 50 ? 50 : strlen(typ->tp_name);
	*pbuf++ = ' ';

	if ((tup = make_tuple(obj)) == NULL) {
		return NULL;
	}
	for (i=0; i < VISIBLE_SIZE(obj); i++) {
		cname = typ->tp_members[i].name;
		val = PyTuple_GetItem(tup, i);
		if (cname == NULL || val == NULL) {
			return NULL;
		}
		repr = PyObject_Repr(val);
		if (repr == NULL) {
			Py_DECREF(tup);
			return NULL;
		}
		crepr = PyString_AsString(repr);
		if (crepr == NULL) {
			Py_DECREF(tup);
			Py_DECREF(repr);
			return NULL;
		}
		len = strlen(cname) + strlen(crepr) + 3;
		if ((pbuf+len) < endbuf) {
			strcpy(pbuf, cname);
			pbuf += strlen(cname);
			*pbuf++ = '=';
			strcpy(pbuf, crepr);
			pbuf += strlen(crepr);
			*pbuf++ = ',';
			*pbuf++ = ' ';
			Py_DECREF(repr);
		}
		else {
			strcpy(pbuf, "...");
			pbuf += 5;
			Py_DECREF(repr);
			break;
		}
	}
	Py_DECREF(tup);

	pbuf-=2;
	*pbuf++ = '>';
	*pbuf = '\0';

	repr = PyString_FromString(buf);
	return repr;
}

__________________________________
Tracker <report at bugs.python.org>
<http://bugs.python.org/issue1816>
__________________________________


More information about the Python-bugs-list mailing list