Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7ce3694

Browse files
committed
repr's converted to using PyString_FromFormat() instead of sprintf'ing
into a hardcoded char* buffer. Closes patch #454743.
1 parent dadace0 commit 7ce3694

11 files changed

Lines changed: 95 additions & 136 deletions

Objects/bufferobject.c

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -184,28 +184,22 @@ buffer_compare(PyBufferObject *self, PyBufferObject *other)
184184
static PyObject *
185185
buffer_repr(PyBufferObject *self)
186186
{
187-
char buf[300];
188187
char *status = self->b_readonly ? "read-only" : "read-write";
189188

190189
if ( self->b_base == NULL )
191-
{
192-
sprintf(buf, "<%s buffer ptr %p, size %d at %p>",
193-
status,
194-
self->b_ptr,
195-
self->b_size,
196-
self);
197-
}
190+
return PyString_FromFormat("<%s buffer ptr %p, size %d at %p>",
191+
status,
192+
self->b_ptr,
193+
self->b_size,
194+
self);
198195
else
199-
{
200-
sprintf(buf, "<%s buffer for %p, ptr %p, size %d at %p>",
196+
return PyString_FromFormat(
197+
"<%s buffer for %p, ptr %p, size %d at %p>",
201198
status,
202199
self->b_base,
203200
self->b_ptr,
204201
self->b_size,
205202
self);
206-
}
207-
208-
return PyString_FromString(buf);
209203
}
210204

211205
static long

Objects/cellobject.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,12 @@ cell_compare(PyCellObject *a, PyCellObject *b)
6262
static PyObject *
6363
cell_repr(PyCellObject *op)
6464
{
65-
char buf[256];
66-
6765
if (op->ob_ref == NULL)
68-
sprintf(buf, "<cell at %p: empty>", op);
69-
else
70-
sprintf(buf, "<cell at %p: %.80s object at %p>",
71-
op, op->ob_ref->ob_type->tp_name, op->ob_ref);
72-
return PyString_FromString(buf);
66+
return PyString_FromFormat("<cell at %p: empty>", op);
67+
68+
return PyString_FromFormat("<cell at %p: %.80s object at %p>",
69+
op, op->ob_ref->ob_type->tp_name,
70+
op->ob_ref);
7371
}
7472

7573
static int

Objects/classobject.c

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -313,19 +313,17 @@ static PyObject *
313313
class_repr(PyClassObject *op)
314314
{
315315
PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
316-
char buf[140];
317316
char *name;
318317
if (op->cl_name == NULL || !PyString_Check(op->cl_name))
319318
name = "?";
320319
else
321320
name = PyString_AsString(op->cl_name);
322321
if (mod == NULL || !PyString_Check(mod))
323-
sprintf(buf, "<class ?.%.100s at %p>", name, op);
322+
return PyString_FromFormat("<class ?.s at %p>", name, op);
324323
else
325-
sprintf(buf, "<class %.50s.%.50s at %p>",
326-
PyString_AsString(mod),
327-
name, op);
328-
return PyString_FromString(buf);
324+
return PyString_FromFormat("<class %s.%s at %p>",
325+
PyString_AsString(mod),
326+
name, op);
329327
}
330328

331329
static PyObject *
@@ -776,7 +774,6 @@ instance_repr(PyInstanceObject *inst)
776774
reprstr = PyString_InternFromString("__repr__");
777775
func = instance_getattr(inst, reprstr);
778776
if (func == NULL) {
779-
char buf[140];
780777
PyObject *classname = inst->in_class->cl_name;
781778
PyObject *mod = PyDict_GetItemString(
782779
inst->in_class->cl_dict, "__module__");
@@ -787,13 +784,12 @@ instance_repr(PyInstanceObject *inst)
787784
cname = "?";
788785
PyErr_Clear();
789786
if (mod == NULL || !PyString_Check(mod))
790-
sprintf(buf, "<?.%.100s instance at %p>",
791-
cname, inst);
787+
return PyString_FromFormat("<?.%s instance at %p>",
788+
cname, inst);
792789
else
793-
sprintf(buf, "<%.50s.%.50s instance at %p>",
794-
PyString_AsString(mod),
795-
cname, inst);
796-
return PyString_FromString(buf);
790+
return PyString_FromFormat("<%s.%s instance at %p>",
791+
PyString_AsString(mod),
792+
cname, inst);
797793
}
798794
res = PyEval_CallObject(func, (PyObject *)NULL);
799795
Py_DECREF(func);
@@ -2042,7 +2038,6 @@ instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
20422038
static PyObject *
20432039
instancemethod_repr(PyMethodObject *a)
20442040
{
2045-
char buffer[240];
20462041
PyObject *self = a->im_self;
20472042
PyObject *func = a->im_func;
20482043
PyObject *klass = a->im_class;
@@ -2072,8 +2067,8 @@ instancemethod_repr(PyMethodObject *a)
20722067
sklassname = PyString_AS_STRING(klassname);
20732068
}
20742069
if (self == NULL)
2075-
sprintf(buffer, "<unbound method %.100s.%.100s>",
2076-
sklassname, sfuncname);
2070+
result = PyString_FromFormat("<unbound method %s.%s>",
2071+
sklassname, sfuncname);
20772072
else {
20782073
/* XXX Shouldn't use repr() here! */
20792074
PyObject *selfrepr = PyObject_Repr(self);
@@ -2083,11 +2078,11 @@ instancemethod_repr(PyMethodObject *a)
20832078
Py_DECREF(selfrepr);
20842079
goto fail;
20852080
}
2086-
sprintf(buffer, "<bound method %.60s.%.60s of %.60s>",
2087-
sklassname, sfuncname, PyString_AS_STRING(selfrepr));
2081+
result = PyString_FromFormat("<bound method %s.%s of %s>",
2082+
sklassname, sfuncname,
2083+
PyString_AS_STRING(selfrepr));
20882084
Py_DECREF(selfrepr);
20892085
}
2090-
result = PyString_FromString(buffer);
20912086
fail:
20922087
Py_XDECREF(funcname);
20932088
Py_XDECREF(klassname);

Objects/descrobject.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,38 +55,36 @@ descr_name(PyDescrObject *descr)
5555
static PyObject *
5656
descr_repr(PyDescrObject *descr, char *format)
5757
{
58-
char buffer[500];
59-
60-
sprintf(buffer, format, descr_name(descr), descr->d_type->tp_name);
61-
return PyString_FromString(buffer);
58+
return PyString_FromFormat(format, descr_name(descr),
59+
descr->d_type->tp_name);
6260
}
6361

6462
static PyObject *
6563
method_repr(PyMethodDescrObject *descr)
6664
{
6765
return descr_repr((PyDescrObject *)descr,
68-
"<method '%.300s' of '%.100s' objects>");
66+
"<method '%s' of '%s' objects>");
6967
}
7068

7169
static PyObject *
7270
member_repr(PyMemberDescrObject *descr)
7371
{
7472
return descr_repr((PyDescrObject *)descr,
75-
"<member '%.300s' of '%.100s' objects>");
73+
"<member '%s' of '%s' objects>");
7674
}
7775

7876
static PyObject *
7977
getset_repr(PyGetSetDescrObject *descr)
8078
{
8179
return descr_repr((PyDescrObject *)descr,
82-
"<attribute '%.300s' of '%.100s' objects>");
80+
"<attribute '%s' of '%s' objects>");
8381
}
8482

8583
static PyObject *
8684
wrapper_repr(PyWrapperDescrObject *descr)
8785
{
8886
return descr_repr((PyDescrObject *)descr,
89-
"<slot wrapper '%.300s' of '%.100s' objects>");
87+
"<slot wrapper '%s' of '%s' objects>");
9088
}
9189

9290
static int
@@ -100,8 +98,8 @@ descr_check(PyDescrObject *descr, PyObject *obj, PyTypeObject *type,
10098
}
10199
if (!PyObject_IsInstance(obj, (PyObject *)(descr->d_type))) {
102100
PyErr_Format(PyExc_TypeError,
103-
"descriptor '%.200s' for '%.100s' objects "
104-
"doesn't apply to '%.100s' object",
101+
"descriptor '%s' for '%s' objects "
102+
"doesn't apply to '%s' object",
105103
descr_name((PyDescrObject *)descr),
106104
descr->d_type->tp_name,
107105
obj->ob_type->tp_name);

Objects/fileobject.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,11 @@ file_dealloc(PyFileObject *f)
179179
static PyObject *
180180
file_repr(PyFileObject *f)
181181
{
182-
char buf[300];
183-
sprintf(buf, "<%s file '%.256s', mode '%.10s' at %p>",
184-
f->f_fp == NULL ? "closed" : "open",
185-
PyString_AsString(f->f_name),
186-
PyString_AsString(f->f_mode),
187-
f);
188-
return PyString_FromString(buf);
182+
return PyString_FromFormat("<%s file '%s', mode '%s' at %p>",
183+
f->f_fp == NULL ? "closed" : "open",
184+
PyString_AsString(f->f_name),
185+
PyString_AsString(f->f_mode),
186+
f);
189187
}
190188

191189
static PyObject *

Objects/funcobject.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -239,14 +239,11 @@ func_dealloc(PyFunctionObject *op)
239239
static PyObject*
240240
func_repr(PyFunctionObject *op)
241241
{
242-
char buf[140];
243242
if (op->func_name == Py_None)
244-
sprintf(buf, "<anonymous function at %p>", op);
245-
else
246-
sprintf(buf, "<function %.100s at %p>",
247-
PyString_AsString(op->func_name),
248-
op);
249-
return PyString_FromString(buf);
243+
return PyString_FromFormat("<anonymous function at %p>", op);
244+
return PyString_FromFormat("<function %s at %p>",
245+
PyString_AsString(op->func_name),
246+
op);
250247
}
251248

252249
static int

Objects/methodobject.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -172,15 +172,13 @@ static struct getsetlist meth_getsets [] = {
172172
static PyObject *
173173
meth_repr(PyCFunctionObject *m)
174174
{
175-
char buf[200];
176175
if (m->m_self == NULL)
177-
sprintf(buf, "<built-in function %.80s>", m->m_ml->ml_name);
178-
else
179-
sprintf(buf,
180-
"<built-in method %.80s of %.80s object at %p>",
181-
m->m_ml->ml_name, m->m_self->ob_type->tp_name,
182-
m->m_self);
183-
return PyString_FromString(buf);
176+
return PyString_FromFormat("<built-in function %s>",
177+
m->m_ml->ml_name);
178+
return PyString_FromFormat("<built-in method %s of %s object at %p>",
179+
m->m_ml->ml_name,
180+
m->m_self->ob_type->tp_name,
181+
m->m_self);
184182
}
185183

186184
static int

Objects/moduleobject.c

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,8 @@ module_dealloc(PyModuleObject *m)
157157
static PyObject *
158158
module_repr(PyModuleObject *m)
159159
{
160-
static int template1len = sizeof("<module '' (built-in)>") + 1;
161-
static int template2len = sizeof("<module '' from ''>") + 1;
162-
163-
char *buf;
164160
char *name;
165161
char *filename;
166-
PyObject *rtn;
167162

168163
name = PyModule_GetName((PyObject *)m);
169164
if (name == NULL) {
@@ -173,19 +168,9 @@ module_repr(PyModuleObject *m)
173168
filename = PyModule_GetFilename((PyObject *)m);
174169
if (filename == NULL) {
175170
PyErr_Clear();
176-
buf = PyObject_MALLOC(
177-
sizeof(char) * (strlen(name) + template1len));
178-
sprintf(buf, "<module '%s' (built-in)>", name);
179-
}
180-
else {
181-
buf = PyObject_MALLOC(
182-
sizeof(char) * (strlen(name) + strlen(filename) +
183-
template2len));
184-
sprintf(buf, "<module '%s' from '%s'>", name, filename);
171+
return PyString_FromFormat("<module '%s' (built-in)>", name);
185172
}
186-
rtn = PyString_FromString(buf);
187-
PyObject_FREE(buf);
188-
return rtn;
173+
return PyString_FromFormat("<module '%s' from '%s'>", name, filename);
189174
}
190175

191176
/* We only need a traverse function, no clear function: If the module

Objects/object.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ void _PyGC_Dump(PyGC_Head* op)
222222
}
223223
#endif /* WITH_CYCLE_GC */
224224

225+
225226
PyObject *
226227
PyObject_Repr(PyObject *v)
227228
{
@@ -235,12 +236,9 @@ PyObject_Repr(PyObject *v)
235236
#endif
236237
if (v == NULL)
237238
return PyString_FromString("<NULL>");
238-
else if (v->ob_type->tp_repr == NULL) {
239-
char buf[120];
240-
sprintf(buf, "<%.80s object at %p>",
241-
v->ob_type->tp_name, v);
242-
return PyString_FromString(buf);
243-
}
239+
else if (v->ob_type->tp_repr == NULL)
240+
return PyString_FromFormat("<%s object at %p",
241+
v->ob_type->tp_name, v);
244242
else {
245243
PyObject *res;
246244
res = (*v->ob_type->tp_repr)(v);

Objects/rangeobject.c

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -126,30 +126,30 @@ range_length(rangeobject *r)
126126
static PyObject *
127127
range_repr(rangeobject *r)
128128
{
129-
/* buffers must be big enough to hold 3 longs + an int +
130-
* a bit of "(xrange(...) * ...)" text.
131-
*/
132-
char buf1[250];
133-
char buf2[250];
134-
129+
PyObject *rtn;
130+
135131
if (r->start == 0 && r->step == 1)
136-
sprintf(buf1, "xrange(%ld)", r->start + r->len * r->step);
132+
rtn = PyString_FromFormat("xrange(%ld)",
133+
r->start + r->len * r->step);
137134

138135
else if (r->step == 1)
139-
sprintf(buf1, "xrange(%ld, %ld)",
140-
r->start,
141-
r->start + r->len * r->step);
136+
rtn = PyString_FromFormat("xrange(%ld, %ld)",
137+
r->start,
138+
r->start + r->len * r->step);
142139

143140
else
144-
sprintf(buf1, "xrange(%ld, %ld, %ld)",
145-
r->start,
146-
r->start + r->len * r->step,
147-
r->step);
148-
149-
if (r->reps != 1)
150-
sprintf(buf2, "(%s * %d)", buf1, r->reps);
151-
152-
return PyString_FromString(r->reps == 1 ? buf1 : buf2);
141+
rtn = PyString_FromFormat("xrange(%ld, %ld, %ld)",
142+
r->start,
143+
r->start + r->len * r->step,
144+
r->step);
145+
if (r->reps != 1) {
146+
PyObject *extra = PyString_FromFormat(
147+
"(%s * %d)",
148+
PyString_AS_STRING(rtn), r->reps);
149+
Py_DECREF(rtn);
150+
rtn = extra;
151+
}
152+
return rtn;
153153
}
154154

155155
static PyObject *

0 commit comments

Comments
 (0)