[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