Checkpoint.  Manipulated things so that string literals are always
unicode, and a few other compensating changes, e.g. str <- unicode,
chr <- unichr, and repr() of a unicode string no longer starts
with 'u'.  Lots of unit tests are broken, but some basic things
work, in particular distutils works so the extensions can be built,
and test_builtin.py works.
diff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py
index 25d90c8..50905c1 100644
--- a/Lib/distutils/ccompiler.py
+++ b/Lib/distutils/ccompiler.py
@@ -168,7 +168,7 @@
     # set_executables ()
 
     def set_executable(self, key, value):
-        if type(value) is StringType:
+        if isinstance(value, basestring):
             setattr(self, key, split_quoted(value))
         else:
             setattr(self, key, value)
@@ -193,8 +193,8 @@
             if not (type (defn) is TupleType and
                     (len (defn) == 1 or
                      (len (defn) == 2 and
-                      (type (defn[1]) is StringType or defn[1] is None))) and
-                    type (defn[0]) is StringType):
+                      (isinstance (defn[1], basestring) or defn[1] is None))) and
+                    isinstance (defn[0], basestring)):
                 raise TypeError, \
                       ("invalid macro definition '%s': " % defn) + \
                       "must be tuple (string,), (string, string), or " + \
@@ -344,7 +344,7 @@
         """
         if outdir is None:
             outdir = self.output_dir
-        elif type(outdir) is not StringType:
+        elif not isinstance(outdir, basestring):
             raise TypeError, "'output_dir' must be a string or None"
 
         if macros is None:
@@ -442,7 +442,7 @@
         """
         if output_dir is None:
             output_dir = self.output_dir
-        elif type (output_dir) is not StringType:
+        elif not isinstance(output_dir, basestring):
             raise TypeError, "'output_dir' must be a string or None"
 
         if macros is None:
@@ -527,7 +527,7 @@
 
         if output_dir is None:
             output_dir = self.output_dir
-        elif type (output_dir) is not StringType:
+        elif not isinstance(output_dir, basestring):
             raise TypeError, "'output_dir' must be a string or None"
 
         return (objects, output_dir)
diff --git a/Lib/distutils/cmd.py b/Lib/distutils/cmd.py
index ebd9931..ea3799a 100644
--- a/Lib/distutils/cmd.py
+++ b/Lib/distutils/cmd.py
@@ -222,7 +222,7 @@
         if val is None:
             setattr(self, option, default)
             return default
-        elif type(val) is not StringType:
+        elif not isinstance(val, basestring):
             raise DistutilsOptionError, \
                   "'%s' must be a %s (got `%s`)" % (option, what, val)
         return val
@@ -242,12 +242,11 @@
         val = getattr(self, option)
         if val is None:
             return
-        elif type(val) is StringType:
+        elif isinstance(val, basestring):
             setattr(self, option, re.split(r',\s*|\s+', val))
         else:
             if type(val) is ListType:
-                types = map(type, val)
-                ok = (types == [StringType] * len(val))
+                ok = all(isinstance(v, basestring) for v in val)
             else:
                 ok = 0
 
@@ -421,7 +420,7 @@
 
 
         # Allow 'infiles' to be a single string
-        if type(infiles) is StringType:
+        if isinstance(infiles, basestring):
             infiles = (infiles,)
         elif type(infiles) not in (ListType, TupleType):
             raise TypeError, \
diff --git a/Lib/distutils/command/build_clib.py b/Lib/distutils/command/build_clib.py
index 07f5817..5434e86 100644
--- a/Lib/distutils/command/build_clib.py
+++ b/Lib/distutils/command/build_clib.py
@@ -92,7 +92,7 @@
 
         if self.include_dirs is None:
             self.include_dirs = self.distribution.include_dirs or []
-        if type(self.include_dirs) is StringType:
+        if isinstance(self.include_dirs, basestring):
             self.include_dirs = self.include_dirs.split(os.pathsep)
 
         # XXX same as for build_ext -- what about 'self.define' and
@@ -147,7 +147,7 @@
                 raise DistutilsSetupError, \
                       "each element of 'libraries' must a 2-tuple"
 
-            if type(lib[0]) is not StringType:
+            if isinstance(lib[0], basestring) StringType:
                 raise DistutilsSetupError, \
                       "first element of each tuple in 'libraries' " + \
                       "must be a string (the library name)"
diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py
index 2832d57..0236a26 100644
--- a/Lib/distutils/command/build_ext.py
+++ b/Lib/distutils/command/build_ext.py
@@ -137,7 +137,7 @@
         plat_py_include = sysconfig.get_python_inc(plat_specific=1)
         if self.include_dirs is None:
             self.include_dirs = self.distribution.include_dirs or []
-        if type(self.include_dirs) is StringType:
+        if isinstance(self.include_dirs, basestring):
             self.include_dirs = self.include_dirs.split(os.pathsep)
 
         # Put the Python "system" include dir at the end, so that
@@ -146,7 +146,7 @@
         if plat_py_include != py_include:
             self.include_dirs.append(plat_py_include)
 
-        if type(self.libraries) is StringType:
+        if isinstance(self.libraries, basestring):
             self.libraries = [self.libraries]
 
         # Life is easier if we're not forever checking for None, so
@@ -155,12 +155,12 @@
             self.libraries = []
         if self.library_dirs is None:
             self.library_dirs = []
-        elif type(self.library_dirs) is StringType:
+        elif isinstance(self.library_dirs, basestring):
             self.library_dirs = self.library_dirs.split(os.pathsep)
 
         if self.rpath is None:
             self.rpath = []
-        elif type(self.rpath) is StringType:
+        elif isinstance(self.rpath, basestring):
             self.rpath = self.rpath.split(os.pathsep)
 
         # for extensions under windows use different directories
@@ -321,7 +321,7 @@
                       ("each element of 'ext_modules' option must be an "
                        "Extension instance or 2-tuple")
 
-            if not (type(ext_name) is StringType and
+            if not (isinstance(ext_name, basestring) and
                     extension_name_re.match(ext_name)):
                 raise DistutilsSetupError, \
                       ("first element of each tuple in 'ext_modules' "
diff --git a/Lib/distutils/command/build_py.py b/Lib/distutils/command/build_py.py
index 990824b..52534bd 100644
--- a/Lib/distutils/command/build_py.py
+++ b/Lib/distutils/command/build_py.py
@@ -361,7 +361,7 @@
 
 
     def build_module (self, module, module_file, package):
-        if type(package) is StringType:
+        if isinstance(package, basestring):
             package = package.split('.')
         elif type(package) not in (ListType, TupleType):
             raise TypeError, \
diff --git a/Lib/distutils/command/config.py b/Lib/distutils/command/config.py
index 3374db9..04cfcde 100644
--- a/Lib/distutils/command/config.py
+++ b/Lib/distutils/command/config.py
@@ -73,17 +73,17 @@
     def finalize_options (self):
         if self.include_dirs is None:
             self.include_dirs = self.distribution.include_dirs or []
-        elif type(self.include_dirs) is StringType:
+        elif isinstance(self.include_dirs, basestring):
             self.include_dirs = self.include_dirs.split(os.pathsep)
 
         if self.libraries is None:
             self.libraries = []
-        elif type(self.libraries) is StringType:
+        elif isinstance(self.libraries, basestring):
             self.libraries = [self.libraries]
 
         if self.library_dirs is None:
             self.library_dirs = []
-        elif type(self.library_dirs) is StringType:
+        elif isinstance(self.library_dirs, basestring):
             self.library_dirs = self.library_dirs.split(os.pathsep)
 
 
@@ -212,7 +212,7 @@
         self._check_compiler()
         (src, out) = self._preprocess(body, headers, include_dirs, lang)
 
-        if type(pattern) is StringType:
+        if isinstance(pattern, basestring):
             pattern = re.compile(pattern)
 
         file = open(out)
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
index c03a90e..cc92e96 100644
--- a/Lib/distutils/command/install.py
+++ b/Lib/distutils/command/install.py
@@ -463,7 +463,7 @@
             self.extra_path = self.distribution.extra_path
 
         if self.extra_path is not None:
-            if type(self.extra_path) is StringType:
+            if isinstance(self.extra_path, basestring):
                 self.extra_path = self.extra_path.split(',')
 
             if len(self.extra_path) == 1:
diff --git a/Lib/distutils/command/install_data.py b/Lib/distutils/command/install_data.py
index 1069830..a951944 100644
--- a/Lib/distutils/command/install_data.py
+++ b/Lib/distutils/command/install_data.py
@@ -10,7 +10,6 @@
 __revision__ = "$Id$"
 
 import os
-from types import StringType
 from distutils.core import Command
 from distutils.util import change_root, convert_path
 
@@ -48,7 +47,7 @@
     def run (self):
         self.mkpath(self.install_dir)
         for f in self.data_files:
-            if type(f) is StringType:
+            if isinstance(f, basestring):
                 # it's a simple file, so copy it
                 f = convert_path(f)
                 if self.warn_dir:
diff --git a/Lib/distutils/dir_util.py b/Lib/distutils/dir_util.py
index 398f242..c6f014b 100644
--- a/Lib/distutils/dir_util.py
+++ b/Lib/distutils/dir_util.py
@@ -31,7 +31,7 @@
     global _path_created
 
     # Detect a common bug -- name is None
-    if not isinstance(name, StringTypes):
+    if not isinstance(name, basestring):
         raise DistutilsInternalError, \
               "mkpath: 'name' must be a string (got %r)" % (name,)
 
diff --git a/Lib/distutils/dist.py b/Lib/distutils/dist.py
index 7ed1b5c..89390fb 100644
--- a/Lib/distutils/dist.py
+++ b/Lib/distutils/dist.py
@@ -598,13 +598,13 @@
 
         keywords = self.metadata.keywords
         if keywords is not None:
-            if type(keywords) is StringType:
+            if isinstance(keywords, basestring):
                 keywordlist = keywords.split(',')
                 self.metadata.keywords = [x.strip() for x in keywordlist]
 
         platforms = self.metadata.platforms
         if platforms is not None:
-            if type(platforms) is StringType:
+            if isinstance(platforms, basestring):
                 platformlist = platforms.split(',')
                 self.metadata.platforms = [x.strip() for x in platformlist]
 
@@ -906,7 +906,7 @@
                 neg_opt = {}
 
             try:
-                is_string = type(value) is StringType
+                is_string = isinstance(value, basestring)
                 if option in neg_opt and is_string:
                     setattr(command_obj, neg_opt[option], not strtobool(value))
                 elif option in bool_opts and is_string:
diff --git a/Lib/distutils/extension.py b/Lib/distutils/extension.py
index 0fcbcc1..7fe846b 100644
--- a/Lib/distutils/extension.py
+++ b/Lib/distutils/extension.py
@@ -103,9 +103,9 @@
                   language=None,
                   **kw                      # To catch unknown keywords
                  ):
-        assert type(name) is StringType, "'name' must be a string"
+        assert isinstance(name, basestring), "'name' must be a string"
         assert (type(sources) is ListType and
-                map(type, sources) == [StringType]*len(sources)), \
+                all(isinstance(v, basestring) for v in sources)), \
                 "'sources' must be a list of strings"
 
         self.name = name
diff --git a/Lib/distutils/fancy_getopt.py b/Lib/distutils/fancy_getopt.py
index 317a3a4..82e1f4d 100644
--- a/Lib/distutils/fancy_getopt.py
+++ b/Lib/distutils/fancy_getopt.py
@@ -166,13 +166,13 @@
                 raise ValueError, "invalid option tuple: %r" % (option,)
 
             # Type- and value-check the option names
-            if type(long) is not StringType or len(long) < 2:
+            if not isinstance(long, basestring) or len(long) < 2:
                 raise DistutilsGetoptError, \
                       ("invalid long option '%s': "
                        "must be a string of length >= 2") % long
 
             if (not ((short is None) or
-                     (type(short) is StringType and len(short) == 1))):
+                     (isinstance(short, basestring) and len(short) == 1))):
                 raise DistutilsGetoptError, \
                       ("invalid short option '%s': "
                        "must a single character or None") % short
diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py
index bc668cf..a052353 100644
--- a/Lib/distutils/filelist.py
+++ b/Lib/distutils/filelist.py
@@ -333,7 +333,7 @@
     or just returned as-is (assumes it's a regex object).
     """
     if is_regex:
-        if type(pattern) is StringType:
+        if isinstance(pattern, basestring):
             return re.compile(pattern)
         else:
             return pattern
diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py
index 0795f12..a42ab5e 100644
--- a/Lib/distutils/unixccompiler.py
+++ b/Lib/distutils/unixccompiler.py
@@ -16,7 +16,7 @@
 __revision__ = "$Id$"
 
 import os, sys
-from types import StringType, NoneType
+from types import NoneType
 from copy import copy
 
 from distutils import sysconfig
@@ -212,7 +212,7 @@
 
         lib_opts = gen_lib_options(self, library_dirs, runtime_library_dirs,
                                    libraries)
-        if type(output_dir) not in (StringType, NoneType):
+        if not isinstance(output_dir, (basestring, NoneType)):
             raise TypeError, "'output_dir' must be a string or None"
         if output_dir is not None:
             output_filename = os.path.join(output_dir, output_filename)