[Python-checkins] r77122 - in python/trunk: Lib/test/test_datetime.py Misc/NEWS Modules/datetimemodule.c

amaury.forgeotdarc python-checkins at python.org
Tue Dec 29 23:03:38 CET 2009


Author: amaury.forgeotdarc
Date: Tue Dec 29 23:03:38 2009
New Revision: 77122

Log:
#7413: Passing '\0' as the separator to datetime.datetime.isoformat()
used to drop the time part of the result.


Modified:
   python/trunk/Lib/test/test_datetime.py
   python/trunk/Misc/NEWS
   python/trunk/Modules/datetimemodule.c

Modified: python/trunk/Lib/test/test_datetime.py
==============================================================================
--- python/trunk/Lib/test/test_datetime.py	(original)
+++ python/trunk/Lib/test/test_datetime.py	Tue Dec 29 23:03:38 2009
@@ -1180,6 +1180,7 @@
         self.assertEqual(t.isoformat(),    "0002-03-02T04:05:01.000123")
         self.assertEqual(t.isoformat('T'), "0002-03-02T04:05:01.000123")
         self.assertEqual(t.isoformat(' '), "0002-03-02 04:05:01.000123")
+        self.assertEqual(t.isoformat('\x00'), "0002-03-02\x0004:05:01.000123")
         # str is ISO format with the separator forced to a blank.
         self.assertEqual(str(t), "0002-03-02 04:05:01.000123")
 

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Tue Dec 29 23:03:38 2009
@@ -12,6 +12,9 @@
 Core and Builtins
 -----------------
 
+- Issue #7413: Passing '\0' as the separator to datetime.datetime.isoformat()
+  used to drop the time part of the result.
+
 - Issue #1811: improve accuracy and cross-platform consistency for
   true division of integers: the result of a/b is now correctly
   rounded for ints a and b (at least on IEEE 754 platforms), and in

Modified: python/trunk/Modules/datetimemodule.c
==============================================================================
--- python/trunk/Modules/datetimemodule.c	(original)
+++ python/trunk/Modules/datetimemodule.c	Tue Dec 29 23:03:38 2009
@@ -1362,21 +1362,26 @@
 	x = PyOS_snprintf(buffer, bufflen,
 			  "%04d-%02d-%02d",
 			  GET_YEAR(dt), GET_MONTH(dt), GET_DAY(dt));
+	assert(bufflen >= x);
 	return buffer + x;
 }
 
-static void
+static char *
 isoformat_time(PyDateTime_DateTime *dt, char buffer[], int bufflen)
 {
+	int x;
 	int us = DATE_GET_MICROSECOND(dt);
 
-	PyOS_snprintf(buffer, bufflen,
-		      "%02d:%02d:%02d",	/* 8 characters */
-		      DATE_GET_HOUR(dt),
-		      DATE_GET_MINUTE(dt),
-		      DATE_GET_SECOND(dt));
+	x = PyOS_snprintf(buffer, bufflen,
+			  "%02d:%02d:%02d",
+			  DATE_GET_HOUR(dt),
+			  DATE_GET_MINUTE(dt),
+			  DATE_GET_SECOND(dt));
+	assert(bufflen >= x);
 	if (us)
-		PyOS_snprintf(buffer + 8, bufflen - 8, ".%06d", us);
+		x += PyOS_snprintf(buffer + x, bufflen - x, ".%06d", us);
+	assert(bufflen >= x);
+	return buffer + x;
 }
 
 /* ---------------------------------------------------------------------------
@@ -4211,8 +4216,8 @@
 	cp = isoformat_date((PyDateTime_Date *)self, buffer, sizeof(buffer));
 	assert(cp != NULL);
 	*cp++ = sep;
-	isoformat_time(self, cp, sizeof(buffer) - (cp - buffer));
-	result = PyString_FromString(buffer);
+	cp = isoformat_time(self, cp, sizeof(buffer) - (cp - buffer));
+	result = PyString_FromStringAndSize(buffer, cp - buffer);
 	if (result == NULL || ! HASTZINFO(self))
 		return result;
 


More information about the Python-checkins mailing list