summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
Diffstat (limited to 'Objects')
-rw-r--r--Objects/object.c23
-rw-r--r--Objects/stringobject.c21
-rw-r--r--Objects/xxobject.c1
3 files changed, 34 insertions, 11 deletions
diff --git a/Objects/object.c b/Objects/object.c
index 9a8d4b3..e28158e 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -213,6 +213,29 @@ setattr(v, name, w)
}
}
+/* Test a value used as condition, e.g., in a for or if statement.
+ Return -1 if an error occurred */
+
+int
+testbool(v)
+ object *v;
+{
+ int res;
+ if (v == None)
+ res = 0;
+ else if (v->ob_type->tp_as_number != NULL)
+ res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
+ else if (v->ob_type->tp_as_mapping != NULL)
+ res = (*v->ob_type->tp_as_mapping->mp_length)(v);
+ else if (v->ob_type->tp_as_sequence != NULL)
+ res = (*v->ob_type->tp_as_sequence->sq_length)(v);
+ else
+ res = 1;
+ if (res > 0)
+ res = 1;
+ return res;
+}
+
/*
NoObject is usable as a non-NULL undefined value, used by the macro None.
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 5c7345d..33fe485 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -491,13 +491,13 @@ formatstring(format, args)
err_badcall();
return NULL;
}
- reslen = rescnt = 100;
+ fmt = getstringvalue(format);
+ fmtcnt = getstringsize(format);
+ reslen = rescnt = fmtcnt + 100;
result = newsizedstringobject((char *)NULL, reslen);
if (result == NULL)
return NULL;
res = getstringvalue(result);
- fmt = getstringvalue(format);
- fmtcnt = getstringsize(format);
if (is_tupleobject(args)) {
arglen = gettuplesize(args);
argidx = 0;
@@ -509,12 +509,11 @@ formatstring(format, args)
while (--fmtcnt >= 0) {
if (*fmt != '%') {
if (--rescnt < 0) {
- rescnt = reslen;
- reslen = reslen * 2; /* Maybe less when big? */
+ rescnt = fmtcnt + 100;
+ reslen += rescnt;
if (resizestring(&result, reslen) < 0)
return NULL;
- res = getstringvalue(result) + rescnt;
- rescnt = reslen - rescnt;
+ res = getstringvalue(result) + reslen - rescnt;
}
*res++ = *fmt++;
}
@@ -692,12 +691,12 @@ formatstring(format, args)
if (width < len)
width = len;
if (rescnt < width + (sign != '\0')) {
- rescnt = reslen;
- reslen = reslen + width + 100;
+ reslen -= rescnt;
+ rescnt = width + fmtcnt + 100;
+ reslen += rescnt;
if (resizestring(&result, reslen) < 0)
return NULL;
- res = getstringvalue(result) + rescnt;
- rescnt = reslen - rescnt;
+ res = getstringvalue(result) + reslen - rescnt;
}
if (sign) {
*res++ = sign;
diff --git a/Objects/xxobject.c b/Objects/xxobject.c
index 2d03cfd..64e0228 100644
--- a/Objects/xxobject.c
+++ b/Objects/xxobject.c
@@ -137,4 +137,5 @@ static typeobject Xxtype = {
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
+ 0, /*tp_hash*/
};