summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2011-09-30 00:26:44 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2011-09-30 00:26:44 (GMT)
commit034f6cf10c53f11cdb0f1fd42d279122cdb8ebaf (patch)
treed38f9fe89e3057467f603a93cf3826c9515db009
parentb153615008570cffb2e5a782d96c2b79db51ea02 (diff)
downloadcpython-034f6cf10c53f11cdb0f1fd42d279122cdb8ebaf.zip
cpython-034f6cf10c53f11cdb0f1fd42d279122cdb8ebaf.tar.gz
cpython-034f6cf10c53f11cdb0f1fd42d279122cdb8ebaf.tar.bz2
Add PyUnicode_Copy() function, include it to the public API
-rw-r--r--Include/unicodeobject.h5
-rw-r--r--Modules/posixmodule.c3
-rw-r--r--Objects/unicodeobject.c40
3 files changed, 27 insertions, 21 deletions
diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h
index a2c07f5..9f3f66d 100644
--- a/Include/unicodeobject.h
+++ b/Include/unicodeobject.h
@@ -510,6 +510,11 @@ PyAPI_FUNC(int) _PyUnicode_Ready(
);
#endif
+/* Get a copy of a Unicode string. */
+PyAPI_FUNC(PyObject*) PyUnicode_Copy(
+ PyObject *unicode
+ );
+
/* Copy character from one unicode object into another, this function performs
character conversion when necessary and falls back to memcpy if possible.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 094ceb7..b19f1b3 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -729,8 +729,7 @@ convert_to_unicode(PyObject **param)
else if (PyUnicode_Check(*param))
/* For a Unicode subtype that's not a Unicode object,
return a true Unicode object with the same data. */
- *param = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(*param),
- PyUnicode_GET_SIZE(*param));
+ *param = PyUnicode_Copy(*param);
else
*param = PyUnicode_FromEncodedObject(*param,
Py_FileSystemDefaultEncoding,
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index a02c222..4b6f651 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -1209,6 +1209,20 @@ PyUnicode_FromKindAndData(int kind, const void *buffer, Py_ssize_t size)
return NULL;
}
+PyObject*
+PyUnicode_Copy(PyObject *unicode)
+{
+ if (!PyUnicode_Check(unicode)) {
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+ if (PyUnicode_READY(unicode))
+ return NULL;
+ return PyUnicode_FromKindAndData(PyUnicode_KIND(unicode),
+ PyUnicode_DATA(unicode),
+ PyUnicode_GET_LENGTH(unicode));
+}
+
/* Widen Unicode objects to larger buffers.
Return NULL if the string is too wide already. */
@@ -9061,9 +9075,7 @@ replace(PyObject *self, PyObject *str1,
Py_INCREF(self);
return (PyObject *) self;
}
- return PyUnicode_FromKindAndData(PyUnicode_KIND(self),
- PyUnicode_DATA(self),
- PyUnicode_GET_LENGTH(self));
+ return PyUnicode_Copy(self);
error:
if (srelease && sbuf)
PyMem_FREE(sbuf);
@@ -10477,7 +10489,8 @@ PyUnicode_Substring(PyObject *self, Py_ssize_t start, Py_ssize_t end)
return NULL;
kind = PyUnicode_KIND(self);
data = PyUnicode_1BYTE_DATA(self);
- return PyUnicode_FromKindAndData(kind, data + PyUnicode_KIND_SIZE(kind, start),
+ return PyUnicode_FromKindAndData(kind,
+ data + PyUnicode_KIND_SIZE(kind, start),
end-start);
}
@@ -11267,8 +11280,7 @@ PyObject *unicode_str(PyObject *self)
return self;
} else
/* Subtype -- return genuine unicode string with the same value. */
- return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(self),
- PyUnicode_GET_SIZE(self));
+ return PyUnicode_Copy(self);
}
PyDoc_STRVAR(swapcase__doc__,
@@ -11453,10 +11465,7 @@ unicode_zfill(PyUnicodeObject *self, PyObject *args)
return (PyObject*) self;
}
else
- return PyUnicode_FromUnicode(
- PyUnicode_AS_UNICODE(self),
- PyUnicode_GET_SIZE(self)
- );
+ return PyUnicode_Copy(self);
}
fill = width - _PyUnicode_LENGTH(self);
@@ -11652,16 +11661,9 @@ PyDoc_STRVAR(sizeof__doc__,
"S.__sizeof__() -> size of S in memory, in bytes");
static PyObject *
-unicode_getnewargs(PyUnicodeObject *v)
+unicode_getnewargs(PyObject *v)
{
- PyObject *copy;
- unsigned char *data;
- int kind;
- if (PyUnicode_READY(v) == -1)
- return NULL;
- kind = PyUnicode_KIND(v);
- data = PyUnicode_1BYTE_DATA(v);
- copy = PyUnicode_FromKindAndData(kind, data, PyUnicode_GET_LENGTH(v));
+ PyObject *copy = PyUnicode_Copy(v);
if (!copy)
return NULL;
return Py_BuildValue("(N)", copy);