diff Objects/stringlib/string_format.h @ 47447:f9ebacace35d

Refactored known type optimization, in anticipation of backporting to 2.6. I'll probably move this code into PyObject_Format, so everyone benefits.
author Eric Smith <eric@trueblade.com>
date Mon, 02 Jun 2008 14:57:32 +0000
parents c04aa4aabe17
children da47e7e135ae
line wrap: on
line diff
--- a/Objects/stringlib/string_format.h	Mon Jun 02 12:33:47 2008 +0000
+++ b/Objects/stringlib/string_format.h	Mon Jun 02 14:57:32 2008 +0000
@@ -484,7 +484,7 @@
     int ok = 0;
     PyObject *result = NULL;
     PyObject *format_spec_object = NULL;
-
+    PyObject *(*formatter)(PyObject *, STRINGLIB_CHAR *, Py_ssize_t) = NULL;
     STRINGLIB_CHAR* format_spec_start = format_spec->ptr ?
 	    format_spec->ptr : NULL;
     Py_ssize_t format_spec_len = format_spec->ptr ?
@@ -493,14 +493,20 @@
     /* If we know the type exactly, skip the lookup of __format__ and just
        call the formatter directly. */
     if (PyUnicode_CheckExact(fieldobj))
-	result = _PyUnicode_FormatAdvanced(fieldobj, format_spec_start,
-					format_spec_len);
+	formatter = _PyUnicode_FormatAdvanced;
     else if (PyLong_CheckExact(fieldobj))
-	result = _PyLong_FormatAdvanced(fieldobj, format_spec_start,
-					format_spec_len);
+	formatter =_PyLong_FormatAdvanced;
     else if (PyFloat_CheckExact(fieldobj))
-	result = _PyFloat_FormatAdvanced(fieldobj, format_spec_start,
-					 format_spec_len);
+	formatter = _PyFloat_FormatAdvanced;
+
+    /* XXX: for 2.6, convert format_spec to the appropriate type
+       (unicode, str) */
+
+    if (formatter) {
+	/* we know exactly which formatter will be called when __format__ is
+	   looked up, so call it directly, instead. */
+	result = formatter(fieldobj, format_spec_start, format_spec_len);
+    }
     else {
 	/* We need to create an object out of the pointers we have, because
 	   __format__ takes a string/unicode object for format_spec. */