[Python-3000-checkins] r55539 - in python/branches/py3k-struni: Lib/test/test_datetime.py Modules/datetimemodule.c
guido.van.rossum
python-3000-checkins at python.org
Wed May 23 23:24:42 CEST 2007
Author: guido.van.rossum
Date: Wed May 23 23:24:35 2007
New Revision: 55539
Modified:
python/branches/py3k-struni/Lib/test/test_datetime.py
python/branches/py3k-struni/Modules/datetimemodule.c
Log:
Fix datetime and its test.
Modified: python/branches/py3k-struni/Lib/test/test_datetime.py
==============================================================================
--- python/branches/py3k-struni/Lib/test/test_datetime.py (original)
+++ python/branches/py3k-struni/Lib/test/test_datetime.py Wed May 23 23:24:35 2007
@@ -1098,7 +1098,8 @@
# This shouldn't blow up because of the month byte alone. If
# the implementation changes to do more-careful checking, it may
# blow up because other fields are insane.
- self.theclass(base[:2] + chr(ord_byte) + base[3:])
+ # XXX Maybe this will have to become bytes?
+ self.theclass(str8(base[:2] + chr(ord_byte) + base[3:]))
#############################################################################
# datetime tests
Modified: python/branches/py3k-struni/Modules/datetimemodule.c
==============================================================================
--- python/branches/py3k-struni/Modules/datetimemodule.c (original)
+++ python/branches/py3k-struni/Modules/datetimemodule.c Wed May 23 23:24:35 2007
@@ -927,7 +927,8 @@
/* Call tzinfo.tzname(tzinfoarg), and return the result. tzinfo must be
* an instance of the tzinfo class or None. If tzinfo isn't None, and
* tzname() doesn't return None or a string, TypeError is raised and this
- * returns NULL.
+ * returns NULL. If the result is a string, we ensure it is a Unicode
+ * string.
*/
static PyObject *
call_tzname(PyObject *tzinfo, PyObject *tzinfoarg)
@@ -945,12 +946,19 @@
else
result = PyObject_CallMethod(tzinfo, "tzname", "O", tzinfoarg);
- if (result != NULL && result != Py_None && ! PyString_Check(result)) {
- PyErr_Format(PyExc_TypeError, "tzinfo.tzname() must "
- "return None or a string, not '%s'",
- result->ob_type->tp_name);
- Py_DECREF(result);
- result = NULL;
+ if (result != NULL && result != Py_None) {
+ if (!PyString_Check(result) && !PyUnicode_Check(result)) {
+ PyErr_Format(PyExc_TypeError, "tzinfo.tzname() must "
+ "return None or a string, not '%s'",
+ result->ob_type->tp_name);
+ Py_DECREF(result);
+ result = NULL;
+ }
+ else if (!PyUnicode_Check(result)) {
+ PyObject *temp = PyUnicode_FromObject(result);
+ Py_DECREF(result);
+ result = temp;
+ }
}
return result;
}
@@ -1241,7 +1249,7 @@
temp = call_tzname(tzinfo, tzinfoarg);
if (temp == NULL) goto Done;
if (temp != Py_None) {
- assert(PyString_Check(temp));
+ assert(PyUnicode_Check(temp));
/* Since the tzname is getting
* stuffed into the format, we
* have to double any % signs
@@ -1255,6 +1263,11 @@
Py_DECREF(temp);
if (Zreplacement == NULL)
goto Done;
+ if (PyUnicode_Check(Zreplacement)) {
+ Zreplacement = _PyUnicode_AsDefaultEncodedString(Zreplacement, NULL);
+ if (Zreplacement == NULL)
+ goto Done;
+ }
if (!PyString_Check(Zreplacement)) {
PyErr_SetString(PyExc_TypeError, "tzname.replace() did not return a string");
goto Done;
More information about the Python-3000-checkins
mailing list