mirror of https://github.com/python/cpython
repr's converted to using PyString_FromFormat() instead of sprintf'ing
into a hardcoded char* buffer. Closes patch #454743.
This commit is contained in:
parent
dadace004b
commit
7ce3694a52
|
@ -184,28 +184,22 @@ buffer_compare(PyBufferObject *self, PyBufferObject *other)
|
|||
static PyObject *
|
||||
buffer_repr(PyBufferObject *self)
|
||||
{
|
||||
char buf[300];
|
||||
char *status = self->b_readonly ? "read-only" : "read-write";
|
||||
|
||||
if ( self->b_base == NULL )
|
||||
{
|
||||
sprintf(buf, "<%s buffer ptr %p, size %d at %p>",
|
||||
status,
|
||||
self->b_ptr,
|
||||
self->b_size,
|
||||
self);
|
||||
}
|
||||
return PyString_FromFormat("<%s buffer ptr %p, size %d at %p>",
|
||||
status,
|
||||
self->b_ptr,
|
||||
self->b_size,
|
||||
self);
|
||||
else
|
||||
{
|
||||
sprintf(buf, "<%s buffer for %p, ptr %p, size %d at %p>",
|
||||
return PyString_FromFormat(
|
||||
"<%s buffer for %p, ptr %p, size %d at %p>",
|
||||
status,
|
||||
self->b_base,
|
||||
self->b_ptr,
|
||||
self->b_size,
|
||||
self);
|
||||
}
|
||||
|
||||
return PyString_FromString(buf);
|
||||
}
|
||||
|
||||
static long
|
||||
|
|
|
@ -62,14 +62,12 @@ cell_compare(PyCellObject *a, PyCellObject *b)
|
|||
static PyObject *
|
||||
cell_repr(PyCellObject *op)
|
||||
{
|
||||
char buf[256];
|
||||
|
||||
if (op->ob_ref == NULL)
|
||||
sprintf(buf, "<cell at %p: empty>", op);
|
||||
else
|
||||
sprintf(buf, "<cell at %p: %.80s object at %p>",
|
||||
op, op->ob_ref->ob_type->tp_name, op->ob_ref);
|
||||
return PyString_FromString(buf);
|
||||
return PyString_FromFormat("<cell at %p: empty>", op);
|
||||
|
||||
return PyString_FromFormat("<cell at %p: %.80s object at %p>",
|
||||
op, op->ob_ref->ob_type->tp_name,
|
||||
op->ob_ref);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -313,19 +313,17 @@ static PyObject *
|
|||
class_repr(PyClassObject *op)
|
||||
{
|
||||
PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
|
||||
char buf[140];
|
||||
char *name;
|
||||
if (op->cl_name == NULL || !PyString_Check(op->cl_name))
|
||||
name = "?";
|
||||
else
|
||||
name = PyString_AsString(op->cl_name);
|
||||
if (mod == NULL || !PyString_Check(mod))
|
||||
sprintf(buf, "<class ?.%.100s at %p>", name, op);
|
||||
return PyString_FromFormat("<class ?.s at %p>", name, op);
|
||||
else
|
||||
sprintf(buf, "<class %.50s.%.50s at %p>",
|
||||
PyString_AsString(mod),
|
||||
name, op);
|
||||
return PyString_FromString(buf);
|
||||
return PyString_FromFormat("<class %s.%s at %p>",
|
||||
PyString_AsString(mod),
|
||||
name, op);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
@ -776,7 +774,6 @@ instance_repr(PyInstanceObject *inst)
|
|||
reprstr = PyString_InternFromString("__repr__");
|
||||
func = instance_getattr(inst, reprstr);
|
||||
if (func == NULL) {
|
||||
char buf[140];
|
||||
PyObject *classname = inst->in_class->cl_name;
|
||||
PyObject *mod = PyDict_GetItemString(
|
||||
inst->in_class->cl_dict, "__module__");
|
||||
|
@ -787,13 +784,12 @@ instance_repr(PyInstanceObject *inst)
|
|||
cname = "?";
|
||||
PyErr_Clear();
|
||||
if (mod == NULL || !PyString_Check(mod))
|
||||
sprintf(buf, "<?.%.100s instance at %p>",
|
||||
cname, inst);
|
||||
return PyString_FromFormat("<?.%s instance at %p>",
|
||||
cname, inst);
|
||||
else
|
||||
sprintf(buf, "<%.50s.%.50s instance at %p>",
|
||||
PyString_AsString(mod),
|
||||
cname, inst);
|
||||
return PyString_FromString(buf);
|
||||
return PyString_FromFormat("<%s.%s instance at %p>",
|
||||
PyString_AsString(mod),
|
||||
cname, inst);
|
||||
}
|
||||
res = PyEval_CallObject(func, (PyObject *)NULL);
|
||||
Py_DECREF(func);
|
||||
|
@ -2042,7 +2038,6 @@ instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
|
|||
static PyObject *
|
||||
instancemethod_repr(PyMethodObject *a)
|
||||
{
|
||||
char buffer[240];
|
||||
PyObject *self = a->im_self;
|
||||
PyObject *func = a->im_func;
|
||||
PyObject *klass = a->im_class;
|
||||
|
@ -2072,8 +2067,8 @@ instancemethod_repr(PyMethodObject *a)
|
|||
sklassname = PyString_AS_STRING(klassname);
|
||||
}
|
||||
if (self == NULL)
|
||||
sprintf(buffer, "<unbound method %.100s.%.100s>",
|
||||
sklassname, sfuncname);
|
||||
result = PyString_FromFormat("<unbound method %s.%s>",
|
||||
sklassname, sfuncname);
|
||||
else {
|
||||
/* XXX Shouldn't use repr() here! */
|
||||
PyObject *selfrepr = PyObject_Repr(self);
|
||||
|
@ -2083,11 +2078,11 @@ instancemethod_repr(PyMethodObject *a)
|
|||
Py_DECREF(selfrepr);
|
||||
goto fail;
|
||||
}
|
||||
sprintf(buffer, "<bound method %.60s.%.60s of %.60s>",
|
||||
sklassname, sfuncname, PyString_AS_STRING(selfrepr));
|
||||
result = PyString_FromFormat("<bound method %s.%s of %s>",
|
||||
sklassname, sfuncname,
|
||||
PyString_AS_STRING(selfrepr));
|
||||
Py_DECREF(selfrepr);
|
||||
}
|
||||
result = PyString_FromString(buffer);
|
||||
fail:
|
||||
Py_XDECREF(funcname);
|
||||
Py_XDECREF(klassname);
|
||||
|
|
|
@ -55,38 +55,36 @@ descr_name(PyDescrObject *descr)
|
|||
static PyObject *
|
||||
descr_repr(PyDescrObject *descr, char *format)
|
||||
{
|
||||
char buffer[500];
|
||||
|
||||
sprintf(buffer, format, descr_name(descr), descr->d_type->tp_name);
|
||||
return PyString_FromString(buffer);
|
||||
return PyString_FromFormat(format, descr_name(descr),
|
||||
descr->d_type->tp_name);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
method_repr(PyMethodDescrObject *descr)
|
||||
{
|
||||
return descr_repr((PyDescrObject *)descr,
|
||||
"<method '%.300s' of '%.100s' objects>");
|
||||
"<method '%s' of '%s' objects>");
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
member_repr(PyMemberDescrObject *descr)
|
||||
{
|
||||
return descr_repr((PyDescrObject *)descr,
|
||||
"<member '%.300s' of '%.100s' objects>");
|
||||
"<member '%s' of '%s' objects>");
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
getset_repr(PyGetSetDescrObject *descr)
|
||||
{
|
||||
return descr_repr((PyDescrObject *)descr,
|
||||
"<attribute '%.300s' of '%.100s' objects>");
|
||||
"<attribute '%s' of '%s' objects>");
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
wrapper_repr(PyWrapperDescrObject *descr)
|
||||
{
|
||||
return descr_repr((PyDescrObject *)descr,
|
||||
"<slot wrapper '%.300s' of '%.100s' objects>");
|
||||
"<slot wrapper '%s' of '%s' objects>");
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -100,8 +98,8 @@ descr_check(PyDescrObject *descr, PyObject *obj, PyTypeObject *type,
|
|||
}
|
||||
if (!PyObject_IsInstance(obj, (PyObject *)(descr->d_type))) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"descriptor '%.200s' for '%.100s' objects "
|
||||
"doesn't apply to '%.100s' object",
|
||||
"descriptor '%s' for '%s' objects "
|
||||
"doesn't apply to '%s' object",
|
||||
descr_name((PyDescrObject *)descr),
|
||||
descr->d_type->tp_name,
|
||||
obj->ob_type->tp_name);
|
||||
|
|
|
@ -179,13 +179,11 @@ file_dealloc(PyFileObject *f)
|
|||
static PyObject *
|
||||
file_repr(PyFileObject *f)
|
||||
{
|
||||
char buf[300];
|
||||
sprintf(buf, "<%s file '%.256s', mode '%.10s' at %p>",
|
||||
f->f_fp == NULL ? "closed" : "open",
|
||||
PyString_AsString(f->f_name),
|
||||
PyString_AsString(f->f_mode),
|
||||
f);
|
||||
return PyString_FromString(buf);
|
||||
return PyString_FromFormat("<%s file '%s', mode '%s' at %p>",
|
||||
f->f_fp == NULL ? "closed" : "open",
|
||||
PyString_AsString(f->f_name),
|
||||
PyString_AsString(f->f_mode),
|
||||
f);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
|
|
@ -239,14 +239,11 @@ func_dealloc(PyFunctionObject *op)
|
|||
static PyObject*
|
||||
func_repr(PyFunctionObject *op)
|
||||
{
|
||||
char buf[140];
|
||||
if (op->func_name == Py_None)
|
||||
sprintf(buf, "<anonymous function at %p>", op);
|
||||
else
|
||||
sprintf(buf, "<function %.100s at %p>",
|
||||
PyString_AsString(op->func_name),
|
||||
op);
|
||||
return PyString_FromString(buf);
|
||||
return PyString_FromFormat("<anonymous function at %p>", op);
|
||||
return PyString_FromFormat("<function %s at %p>",
|
||||
PyString_AsString(op->func_name),
|
||||
op);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -172,15 +172,13 @@ static struct getsetlist meth_getsets [] = {
|
|||
static PyObject *
|
||||
meth_repr(PyCFunctionObject *m)
|
||||
{
|
||||
char buf[200];
|
||||
if (m->m_self == NULL)
|
||||
sprintf(buf, "<built-in function %.80s>", m->m_ml->ml_name);
|
||||
else
|
||||
sprintf(buf,
|
||||
"<built-in method %.80s of %.80s object at %p>",
|
||||
m->m_ml->ml_name, m->m_self->ob_type->tp_name,
|
||||
m->m_self);
|
||||
return PyString_FromString(buf);
|
||||
return PyString_FromFormat("<built-in function %s>",
|
||||
m->m_ml->ml_name);
|
||||
return PyString_FromFormat("<built-in method %s of %s object at %p>",
|
||||
m->m_ml->ml_name,
|
||||
m->m_self->ob_type->tp_name,
|
||||
m->m_self);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -157,13 +157,8 @@ module_dealloc(PyModuleObject *m)
|
|||
static PyObject *
|
||||
module_repr(PyModuleObject *m)
|
||||
{
|
||||
static int template1len = sizeof("<module '' (built-in)>") + 1;
|
||||
static int template2len = sizeof("<module '' from ''>") + 1;
|
||||
|
||||
char *buf;
|
||||
char *name;
|
||||
char *filename;
|
||||
PyObject *rtn;
|
||||
|
||||
name = PyModule_GetName((PyObject *)m);
|
||||
if (name == NULL) {
|
||||
|
@ -173,19 +168,9 @@ module_repr(PyModuleObject *m)
|
|||
filename = PyModule_GetFilename((PyObject *)m);
|
||||
if (filename == NULL) {
|
||||
PyErr_Clear();
|
||||
buf = PyObject_MALLOC(
|
||||
sizeof(char) * (strlen(name) + template1len));
|
||||
sprintf(buf, "<module '%s' (built-in)>", name);
|
||||
return PyString_FromFormat("<module '%s' (built-in)>", name);
|
||||
}
|
||||
else {
|
||||
buf = PyObject_MALLOC(
|
||||
sizeof(char) * (strlen(name) + strlen(filename) +
|
||||
template2len));
|
||||
sprintf(buf, "<module '%s' from '%s'>", name, filename);
|
||||
}
|
||||
rtn = PyString_FromString(buf);
|
||||
PyObject_FREE(buf);
|
||||
return rtn;
|
||||
return PyString_FromFormat("<module '%s' from '%s'>", name, filename);
|
||||
}
|
||||
|
||||
/* We only need a traverse function, no clear function: If the module
|
||||
|
|
|
@ -222,6 +222,7 @@ void _PyGC_Dump(PyGC_Head* op)
|
|||
}
|
||||
#endif /* WITH_CYCLE_GC */
|
||||
|
||||
|
||||
PyObject *
|
||||
PyObject_Repr(PyObject *v)
|
||||
{
|
||||
|
@ -235,12 +236,9 @@ PyObject_Repr(PyObject *v)
|
|||
#endif
|
||||
if (v == NULL)
|
||||
return PyString_FromString("<NULL>");
|
||||
else if (v->ob_type->tp_repr == NULL) {
|
||||
char buf[120];
|
||||
sprintf(buf, "<%.80s object at %p>",
|
||||
v->ob_type->tp_name, v);
|
||||
return PyString_FromString(buf);
|
||||
}
|
||||
else if (v->ob_type->tp_repr == NULL)
|
||||
return PyString_FromFormat("<%s object at %p",
|
||||
v->ob_type->tp_name, v);
|
||||
else {
|
||||
PyObject *res;
|
||||
res = (*v->ob_type->tp_repr)(v);
|
||||
|
|
|
@ -126,30 +126,30 @@ range_length(rangeobject *r)
|
|||
static PyObject *
|
||||
range_repr(rangeobject *r)
|
||||
{
|
||||
/* buffers must be big enough to hold 3 longs + an int +
|
||||
* a bit of "(xrange(...) * ...)" text.
|
||||
*/
|
||||
char buf1[250];
|
||||
char buf2[250];
|
||||
|
||||
PyObject *rtn;
|
||||
|
||||
if (r->start == 0 && r->step == 1)
|
||||
sprintf(buf1, "xrange(%ld)", r->start + r->len * r->step);
|
||||
rtn = PyString_FromFormat("xrange(%ld)",
|
||||
r->start + r->len * r->step);
|
||||
|
||||
else if (r->step == 1)
|
||||
sprintf(buf1, "xrange(%ld, %ld)",
|
||||
r->start,
|
||||
r->start + r->len * r->step);
|
||||
rtn = PyString_FromFormat("xrange(%ld, %ld)",
|
||||
r->start,
|
||||
r->start + r->len * r->step);
|
||||
|
||||
else
|
||||
sprintf(buf1, "xrange(%ld, %ld, %ld)",
|
||||
r->start,
|
||||
r->start + r->len * r->step,
|
||||
r->step);
|
||||
|
||||
if (r->reps != 1)
|
||||
sprintf(buf2, "(%s * %d)", buf1, r->reps);
|
||||
|
||||
return PyString_FromString(r->reps == 1 ? buf1 : buf2);
|
||||
rtn = PyString_FromFormat("xrange(%ld, %ld, %ld)",
|
||||
r->start,
|
||||
r->start + r->len * r->step,
|
||||
r->step);
|
||||
if (r->reps != 1) {
|
||||
PyObject *extra = PyString_FromFormat(
|
||||
"(%s * %d)",
|
||||
PyString_AS_STRING(rtn), r->reps);
|
||||
Py_DECREF(rtn);
|
||||
rtn = extra;
|
||||
}
|
||||
return rtn;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
|
|
@ -113,8 +113,7 @@ type_compare(PyObject *v, PyObject *w)
|
|||
static PyObject *
|
||||
type_repr(PyTypeObject *type)
|
||||
{
|
||||
PyObject *mod, *name;
|
||||
char buf[200];
|
||||
PyObject *mod, *name, *rtn;
|
||||
|
||||
mod = type_module(type, NULL);
|
||||
if (mod == NULL)
|
||||
|
@ -126,15 +125,18 @@ type_repr(PyTypeObject *type)
|
|||
name = type_name(type, NULL);
|
||||
if (name == NULL)
|
||||
return NULL;
|
||||
if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__"))
|
||||
sprintf(buf, "<type '%.80s.%.80s'>",
|
||||
PyString_AS_STRING(mod),
|
||||
PyString_AS_STRING(name));
|
||||
|
||||
if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__")) {
|
||||
rtn = PyString_FromFormat("<type '%s.%s'>",
|
||||
PyString_AS_STRING(mod),
|
||||
PyString_AS_STRING(name));
|
||||
}
|
||||
else
|
||||
sprintf(buf, "<type '%.80s'>", type->tp_name);
|
||||
rtn = PyString_FromFormat("<type '%s'>", type->tp_name);
|
||||
|
||||
Py_XDECREF(mod);
|
||||
Py_DECREF(name);
|
||||
return PyString_FromString(buf);
|
||||
return rtn;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
@ -968,8 +970,7 @@ static PyObject *
|
|||
object_repr(PyObject *self)
|
||||
{
|
||||
PyTypeObject *type;
|
||||
PyObject *mod, *name;
|
||||
char buf[200];
|
||||
PyObject *mod, *name, *rtn;
|
||||
|
||||
type = self->ob_type;
|
||||
mod = type_module(type, NULL);
|
||||
|
@ -983,15 +984,16 @@ object_repr(PyObject *self)
|
|||
if (name == NULL)
|
||||
return NULL;
|
||||
if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__"))
|
||||
sprintf(buf, "<%.80s.%.80s instance at %p>",
|
||||
PyString_AS_STRING(mod),
|
||||
PyString_AS_STRING(name),
|
||||
self);
|
||||
rtn = PyString_FromFormat("<%s.%s instance at %p>",
|
||||
PyString_AS_STRING(mod),
|
||||
PyString_AS_STRING(name),
|
||||
self);
|
||||
else
|
||||
sprintf(buf, "<%.80s instance at %p>", type->tp_name, self);
|
||||
rtn = PyString_FromFormat("<%s instance at %p>",
|
||||
type->tp_name, self);
|
||||
Py_XDECREF(mod);
|
||||
Py_DECREF(name);
|
||||
return PyString_FromString(buf);
|
||||
return rtn;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
@ -2590,13 +2592,9 @@ slot_tp_repr(PyObject *self)
|
|||
Py_DECREF(func);
|
||||
return res;
|
||||
}
|
||||
else {
|
||||
char buf[120];
|
||||
PyErr_Clear();
|
||||
sprintf(buf, "<%.80s object at %p>",
|
||||
self->ob_type->tp_name, self);
|
||||
return PyString_FromString(buf);
|
||||
}
|
||||
PyErr_Clear();
|
||||
return PyString_FromFormat("<%s object at %p>",
|
||||
self->ob_type->tp_name, self);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
|
Loading…
Reference in New Issue