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.
This commit is contained in:
Guido van Rossum 2007-04-27 23:53:51 +00:00
parent d4617f24ca
commit 572dbf8f13
28 changed files with 68 additions and 81 deletions

View File

@ -14,7 +14,6 @@ PyAPI_DATA(int) Py_NoSiteFlag;
PyAPI_DATA(int) Py_UseClassExceptionsFlag; PyAPI_DATA(int) Py_UseClassExceptionsFlag;
PyAPI_DATA(int) Py_FrozenFlag; PyAPI_DATA(int) Py_FrozenFlag;
PyAPI_DATA(int) Py_TabcheckFlag; PyAPI_DATA(int) Py_TabcheckFlag;
PyAPI_DATA(int) Py_UnicodeFlag;
PyAPI_DATA(int) Py_IgnoreEnvironmentFlag; PyAPI_DATA(int) Py_IgnoreEnvironmentFlag;
PyAPI_DATA(int) Py_DivisionWarningFlag; PyAPI_DATA(int) Py_DivisionWarningFlag;

View File

@ -168,7 +168,7 @@ class CCompiler:
# set_executables () # set_executables ()
def set_executable(self, key, value): def set_executable(self, key, value):
if type(value) is StringType: if isinstance(value, basestring):
setattr(self, key, split_quoted(value)) setattr(self, key, split_quoted(value))
else: else:
setattr(self, key, value) setattr(self, key, value)
@ -193,8 +193,8 @@ class CCompiler:
if not (type (defn) is TupleType and if not (type (defn) is TupleType and
(len (defn) == 1 or (len (defn) == 1 or
(len (defn) == 2 and (len (defn) == 2 and
(type (defn[1]) is StringType or defn[1] is None))) and (isinstance (defn[1], basestring) or defn[1] is None))) and
type (defn[0]) is StringType): isinstance (defn[0], basestring)):
raise TypeError, \ raise TypeError, \
("invalid macro definition '%s': " % defn) + \ ("invalid macro definition '%s': " % defn) + \
"must be tuple (string,), (string, string), or " + \ "must be tuple (string,), (string, string), or " + \
@ -344,7 +344,7 @@ class CCompiler:
""" """
if outdir is None: if outdir is None:
outdir = self.output_dir 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" raise TypeError, "'output_dir' must be a string or None"
if macros is None: if macros is None:
@ -442,7 +442,7 @@ class CCompiler:
""" """
if output_dir is None: if output_dir is None:
output_dir = self.output_dir 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" raise TypeError, "'output_dir' must be a string or None"
if macros is None: if macros is None:
@ -527,7 +527,7 @@ class CCompiler:
if output_dir is None: if output_dir is None:
output_dir = self.output_dir 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" raise TypeError, "'output_dir' must be a string or None"
return (objects, output_dir) return (objects, output_dir)

View File

@ -222,7 +222,7 @@ class Command:
if val is None: if val is None:
setattr(self, option, default) setattr(self, option, default)
return default return default
elif type(val) is not StringType: elif not isinstance(val, basestring):
raise DistutilsOptionError, \ raise DistutilsOptionError, \
"'%s' must be a %s (got `%s`)" % (option, what, val) "'%s' must be a %s (got `%s`)" % (option, what, val)
return val return val
@ -242,12 +242,11 @@ class Command:
val = getattr(self, option) val = getattr(self, option)
if val is None: if val is None:
return return
elif type(val) is StringType: elif isinstance(val, basestring):
setattr(self, option, re.split(r',\s*|\s+', val)) setattr(self, option, re.split(r',\s*|\s+', val))
else: else:
if type(val) is ListType: if type(val) is ListType:
types = map(type, val) ok = all(isinstance(v, basestring) for v in val)
ok = (types == [StringType] * len(val))
else: else:
ok = 0 ok = 0
@ -421,7 +420,7 @@ class Command:
# Allow 'infiles' to be a single string # Allow 'infiles' to be a single string
if type(infiles) is StringType: if isinstance(infiles, basestring):
infiles = (infiles,) infiles = (infiles,)
elif type(infiles) not in (ListType, TupleType): elif type(infiles) not in (ListType, TupleType):
raise TypeError, \ raise TypeError, \

View File

@ -92,7 +92,7 @@ class build_clib (Command):
if self.include_dirs is None: if self.include_dirs is None:
self.include_dirs = self.distribution.include_dirs or [] 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) self.include_dirs = self.include_dirs.split(os.pathsep)
# XXX same as for build_ext -- what about 'self.define' and # XXX same as for build_ext -- what about 'self.define' and
@ -147,7 +147,7 @@ class build_clib (Command):
raise DistutilsSetupError, \ raise DistutilsSetupError, \
"each element of 'libraries' must a 2-tuple" "each element of 'libraries' must a 2-tuple"
if type(lib[0]) is not StringType: if isinstance(lib[0], basestring) StringType:
raise DistutilsSetupError, \ raise DistutilsSetupError, \
"first element of each tuple in 'libraries' " + \ "first element of each tuple in 'libraries' " + \
"must be a string (the library name)" "must be a string (the library name)"

View File

@ -137,7 +137,7 @@ class build_ext (Command):
plat_py_include = sysconfig.get_python_inc(plat_specific=1) plat_py_include = sysconfig.get_python_inc(plat_specific=1)
if self.include_dirs is None: if self.include_dirs is None:
self.include_dirs = self.distribution.include_dirs or [] 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) self.include_dirs = self.include_dirs.split(os.pathsep)
# Put the Python "system" include dir at the end, so that # Put the Python "system" include dir at the end, so that
@ -146,7 +146,7 @@ class build_ext (Command):
if plat_py_include != py_include: if plat_py_include != py_include:
self.include_dirs.append(plat_py_include) self.include_dirs.append(plat_py_include)
if type(self.libraries) is StringType: if isinstance(self.libraries, basestring):
self.libraries = [self.libraries] self.libraries = [self.libraries]
# Life is easier if we're not forever checking for None, so # Life is easier if we're not forever checking for None, so
@ -155,12 +155,12 @@ class build_ext (Command):
self.libraries = [] self.libraries = []
if self.library_dirs is None: if self.library_dirs is None:
self.library_dirs = [] 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) self.library_dirs = self.library_dirs.split(os.pathsep)
if self.rpath is None: if self.rpath is None:
self.rpath = [] self.rpath = []
elif type(self.rpath) is StringType: elif isinstance(self.rpath, basestring):
self.rpath = self.rpath.split(os.pathsep) self.rpath = self.rpath.split(os.pathsep)
# for extensions under windows use different directories # for extensions under windows use different directories
@ -321,7 +321,7 @@ class build_ext (Command):
("each element of 'ext_modules' option must be an " ("each element of 'ext_modules' option must be an "
"Extension instance or 2-tuple") "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)): extension_name_re.match(ext_name)):
raise DistutilsSetupError, \ raise DistutilsSetupError, \
("first element of each tuple in 'ext_modules' " ("first element of each tuple in 'ext_modules' "

View File

@ -361,7 +361,7 @@ class build_py (Command):
def build_module (self, module, module_file, package): def build_module (self, module, module_file, package):
if type(package) is StringType: if isinstance(package, basestring):
package = package.split('.') package = package.split('.')
elif type(package) not in (ListType, TupleType): elif type(package) not in (ListType, TupleType):
raise TypeError, \ raise TypeError, \

View File

@ -73,17 +73,17 @@ class config (Command):
def finalize_options (self): def finalize_options (self):
if self.include_dirs is None: if self.include_dirs is None:
self.include_dirs = self.distribution.include_dirs or [] 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) self.include_dirs = self.include_dirs.split(os.pathsep)
if self.libraries is None: if self.libraries is None:
self.libraries = [] self.libraries = []
elif type(self.libraries) is StringType: elif isinstance(self.libraries, basestring):
self.libraries = [self.libraries] self.libraries = [self.libraries]
if self.library_dirs is None: if self.library_dirs is None:
self.library_dirs = [] 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) self.library_dirs = self.library_dirs.split(os.pathsep)
@ -212,7 +212,7 @@ class config (Command):
self._check_compiler() self._check_compiler()
(src, out) = self._preprocess(body, headers, include_dirs, lang) (src, out) = self._preprocess(body, headers, include_dirs, lang)
if type(pattern) is StringType: if isinstance(pattern, basestring):
pattern = re.compile(pattern) pattern = re.compile(pattern)
file = open(out) file = open(out)

View File

@ -463,7 +463,7 @@ class install (Command):
self.extra_path = self.distribution.extra_path self.extra_path = self.distribution.extra_path
if self.extra_path is not None: 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(',') self.extra_path = self.extra_path.split(',')
if len(self.extra_path) == 1: if len(self.extra_path) == 1:

View File

@ -10,7 +10,6 @@ platform-independent data files."""
__revision__ = "$Id$" __revision__ = "$Id$"
import os import os
from types import StringType
from distutils.core import Command from distutils.core import Command
from distutils.util import change_root, convert_path from distutils.util import change_root, convert_path
@ -48,7 +47,7 @@ class install_data (Command):
def run (self): def run (self):
self.mkpath(self.install_dir) self.mkpath(self.install_dir)
for f in self.data_files: for f in self.data_files:
if type(f) is StringType: if isinstance(f, basestring):
# it's a simple file, so copy it # it's a simple file, so copy it
f = convert_path(f) f = convert_path(f)
if self.warn_dir: if self.warn_dir:

View File

@ -31,7 +31,7 @@ def mkpath (name, mode=0777, verbose=0, dry_run=0):
global _path_created global _path_created
# Detect a common bug -- name is None # Detect a common bug -- name is None
if not isinstance(name, StringTypes): if not isinstance(name, basestring):
raise DistutilsInternalError, \ raise DistutilsInternalError, \
"mkpath: 'name' must be a string (got %r)" % (name,) "mkpath: 'name' must be a string (got %r)" % (name,)

View File

@ -598,13 +598,13 @@ Common commands: (see '--help-commands' for more)
keywords = self.metadata.keywords keywords = self.metadata.keywords
if keywords is not None: if keywords is not None:
if type(keywords) is StringType: if isinstance(keywords, basestring):
keywordlist = keywords.split(',') keywordlist = keywords.split(',')
self.metadata.keywords = [x.strip() for x in keywordlist] self.metadata.keywords = [x.strip() for x in keywordlist]
platforms = self.metadata.platforms platforms = self.metadata.platforms
if platforms is not None: if platforms is not None:
if type(platforms) is StringType: if isinstance(platforms, basestring):
platformlist = platforms.split(',') platformlist = platforms.split(',')
self.metadata.platforms = [x.strip() for x in platformlist] self.metadata.platforms = [x.strip() for x in platformlist]
@ -906,7 +906,7 @@ Common commands: (see '--help-commands' for more)
neg_opt = {} neg_opt = {}
try: try:
is_string = type(value) is StringType is_string = isinstance(value, basestring)
if option in neg_opt and is_string: if option in neg_opt and is_string:
setattr(command_obj, neg_opt[option], not strtobool(value)) setattr(command_obj, neg_opt[option], not strtobool(value))
elif option in bool_opts and is_string: elif option in bool_opts and is_string:

View File

@ -103,9 +103,9 @@ class Extension:
language=None, language=None,
**kw # To catch unknown keywords **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 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" "'sources' must be a list of strings"
self.name = name self.name = name

View File

@ -166,13 +166,13 @@ class FancyGetopt:
raise ValueError, "invalid option tuple: %r" % (option,) raise ValueError, "invalid option tuple: %r" % (option,)
# Type- and value-check the option names # 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, \ raise DistutilsGetoptError, \
("invalid long option '%s': " ("invalid long option '%s': "
"must be a string of length >= 2") % long "must be a string of length >= 2") % long
if (not ((short is None) or if (not ((short is None) or
(type(short) is StringType and len(short) == 1))): (isinstance(short, basestring) and len(short) == 1))):
raise DistutilsGetoptError, \ raise DistutilsGetoptError, \
("invalid short option '%s': " ("invalid short option '%s': "
"must a single character or None") % short "must a single character or None") % short

View File

@ -333,7 +333,7 @@ def translate_pattern (pattern, anchor=1, prefix=None, is_regex=0):
or just returned as-is (assumes it's a regex object). or just returned as-is (assumes it's a regex object).
""" """
if is_regex: if is_regex:
if type(pattern) is StringType: if isinstance(pattern, basestring):
return re.compile(pattern) return re.compile(pattern)
else: else:
return pattern return pattern

View File

@ -16,7 +16,7 @@ the "typical" Unix-style command-line C compiler:
__revision__ = "$Id$" __revision__ = "$Id$"
import os, sys import os, sys
from types import StringType, NoneType from types import NoneType
from copy import copy from copy import copy
from distutils import sysconfig from distutils import sysconfig
@ -212,7 +212,7 @@ class UnixCCompiler(CCompiler):
lib_opts = gen_lib_options(self, library_dirs, runtime_library_dirs, lib_opts = gen_lib_options(self, library_dirs, runtime_library_dirs,
libraries) 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" raise TypeError, "'output_dir' must be a string or None"
if output_dir is not None: if output_dir is not None:
output_filename = os.path.join(output_dir, output_filename) output_filename = os.path.join(output_dir, output_filename)

View File

@ -470,7 +470,7 @@ def setlocale(category, locale=None):
category may be given as one of the LC_* values. category may be given as one of the LC_* values.
""" """
if locale and type(locale) is not type(""): if locale and not isinstance(locale, basestring):
# convert to string # convert to string
locale = normalize(_build_localename(locale)) locale = normalize(_build_localename(locale))
return _setlocale(category, locale) return _setlocale(category, locale)

View File

@ -733,8 +733,8 @@ if not _exists("urandom"):
_urandomfd = open("/dev/urandom", O_RDONLY) _urandomfd = open("/dev/urandom", O_RDONLY)
except (OSError, IOError): except (OSError, IOError):
raise NotImplementedError("/dev/urandom (or equivalent) not found") raise NotImplementedError("/dev/urandom (or equivalent) not found")
bytes = "" bs = b""
while len(bytes) < n: while len(bs) < n:
bytes += read(_urandomfd, n - len(bytes)) bs += read(_urandomfd, n - len(bs))
close(_urandomfd) close(_urandomfd)
return bytes return bs

View File

@ -470,18 +470,8 @@ def _compile_info(code, pattern, flags):
_compile_charset(charset, flags, code) _compile_charset(charset, flags, code)
code[skip] = len(code) - skip code[skip] = len(code) - skip
try:
unicode
except NameError:
STRING_TYPES = (type(""),)
else:
STRING_TYPES = (type(""), type(unicode("")))
def isstring(obj): def isstring(obj):
for tp in STRING_TYPES: return isinstance(obj, basestring)
if isinstance(obj, tp):
return 1
return 0
def _code(p, flags): def _code(p, flags):

View File

@ -82,7 +82,7 @@ if have_unicode:
(unicode('100'), 100), (unicode('100'), 100),
(unicode('314'), 314), (unicode('314'), 314),
(unicode(' 314'), 314), (unicode(' 314'), 314),
(unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314), (unicode(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
(unicode(' \t\t 314 \t\t '), 314), (unicode(' \t\t 314 \t\t '), 314),
(unicode(' 1x'), ValueError), (unicode(' 1x'), ValueError),
(unicode(' 1 '), 1), (unicode(' 1 '), 1),
@ -185,7 +185,7 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(chr(65), 'A') self.assertEqual(chr(65), 'A')
self.assertEqual(chr(97), 'a') self.assertEqual(chr(97), 'a')
self.assertEqual(chr(0xff), '\xff') self.assertEqual(chr(0xff), '\xff')
self.assertRaises(ValueError, chr, 256) self.assertRaises(ValueError, chr, 1<<24)
self.assertRaises(TypeError, chr) self.assertRaises(TypeError, chr)
def XXX_test_cmp(self): def XXX_test_cmp(self):
@ -209,7 +209,7 @@ class BuiltinTest(unittest.TestCase):
def test_compile(self): def test_compile(self):
compile('print(1)\n', '', 'exec') compile('print(1)\n', '', 'exec')
bom = '\xef\xbb\xbf' bom = '\xef\xbb\xbf'
compile(bom + 'print(1)\n', '', 'exec') compile((bom + 'print(1)\n').encode("latin-1"), '', 'exec')
compile(source='pass', filename='?', mode='exec') compile(source='pass', filename='?', mode='exec')
compile(dont_inherit=0, filename='tmp', source='0', mode='eval') compile(dont_inherit=0, filename='tmp', source='0', mode='eval')
compile('pass', '?', dont_inherit=1, mode='exec') compile('pass', '?', dont_inherit=1, mode='exec')
@ -220,7 +220,7 @@ class BuiltinTest(unittest.TestCase):
self.assertRaises(TypeError, compile, 'pass', '?', 'exec', self.assertRaises(TypeError, compile, 'pass', '?', 'exec',
mode='eval', source='0', filename='tmp') mode='eval', source='0', filename='tmp')
if have_unicode: if have_unicode:
compile(unicode('print(u"\xc3\xa5")\n', 'utf8'), '', 'exec') compile(unicode(b'print(u"\xc3\xa5")\n', 'utf8'), '', 'exec')
self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec') self.assertRaises(TypeError, compile, unichr(0), 'f', 'exec')
self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad') self.assertRaises(ValueError, compile, unicode('a = 1'), 'f', 'bad')
@ -339,9 +339,9 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(eval(unicode('b'), globals, locals), 200) self.assertEqual(eval(unicode('b'), globals, locals), 200)
self.assertEqual(eval(unicode('c'), globals, locals), 300) self.assertEqual(eval(unicode('c'), globals, locals), 300)
bom = '\xef\xbb\xbf' bom = '\xef\xbb\xbf'
self.assertEqual(eval(bom + 'a', globals, locals), 1) self.assertEqual(eval((bom + 'a').encode("latin-1"), globals, locals), 1)
self.assertEqual(eval(unicode('u"\xc3\xa5"', 'utf8'), globals), self.assertEqual(eval(unicode(b'u"\xc3\xa5"', 'utf8'), globals),
unicode('\xc3\xa5', 'utf8')) unicode(b'\xc3\xa5', 'utf8'))
self.assertRaises(TypeError, eval) self.assertRaises(TypeError, eval)
self.assertRaises(TypeError, eval, ()) self.assertRaises(TypeError, eval, ())
@ -608,7 +608,7 @@ class BuiltinTest(unittest.TestCase):
self.assertRaises(ValueError, float, " -0x3.p-1 ") self.assertRaises(ValueError, float, " -0x3.p-1 ")
if have_unicode: if have_unicode:
self.assertEqual(float(unicode(" 3.14 ")), 3.14) self.assertEqual(float(unicode(" 3.14 ")), 3.14)
self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14) self.assertEqual(float(unicode(b" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14)
# Implementation limitation in PyFloat_FromString() # Implementation limitation in PyFloat_FromString()
self.assertRaises(ValueError, float, unicode("1"*10000)) self.assertRaises(ValueError, float, unicode("1"*10000))
@ -1673,7 +1673,7 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(unichr(97), unicode('a')) self.assertEqual(unichr(97), unicode('a'))
self.assertEqual( self.assertEqual(
unichr(sys.maxunicode), unichr(sys.maxunicode),
unicode('\\U%08x' % (sys.maxunicode), 'unicode-escape') unicode(('\\U%08x' % (sys.maxunicode)).encode("ascii"), 'unicode-escape')
) )
self.assertRaises(ValueError, unichr, sys.maxunicode+1) self.assertRaises(ValueError, unichr, sys.maxunicode+1)
self.assertRaises(TypeError, unichr) self.assertRaises(TypeError, unichr)

View File

@ -6163,7 +6163,8 @@ Read a file descriptor.");
static PyObject * static PyObject *
posix_read(PyObject *self, PyObject *args) posix_read(PyObject *self, PyObject *args)
{ {
int fd, size, n; int fd, size;
Py_ssize_t n;
PyObject *buffer; PyObject *buffer;
if (!PyArg_ParseTuple(args, "ii:read", &fd, &size)) if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
return NULL; return NULL;
@ -6171,18 +6172,18 @@ posix_read(PyObject *self, PyObject *args)
errno = EINVAL; errno = EINVAL;
return posix_error(); return posix_error();
} }
buffer = PyString_FromStringAndSize((char *)NULL, size); buffer = PyBytes_FromStringAndSize((char *)NULL, size);
if (buffer == NULL) if (buffer == NULL)
return NULL; return NULL;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
n = read(fd, PyString_AsString(buffer), size); n = read(fd, PyBytes_AsString(buffer), size);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (n < 0) { if (n < 0) {
Py_DECREF(buffer); Py_DECREF(buffer);
return posix_error(); return posix_error();
} }
if (n != size) if (n != size)
_PyString_Resize(&buffer, n); PyBytes_Resize(buffer, n);
return buffer; return buffer;
} }
@ -8841,5 +8842,3 @@ INITFUNC(void)
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -59,6 +59,7 @@ PyModule_GetName(PyObject *m)
{ {
PyObject *d; PyObject *d;
PyObject *nameobj; PyObject *nameobj;
char *s;
if (!PyModule_Check(m)) { if (!PyModule_Check(m)) {
PyErr_BadArgument(); PyErr_BadArgument();
return NULL; return NULL;
@ -66,11 +67,13 @@ PyModule_GetName(PyObject *m)
d = ((PyModuleObject *)m)->md_dict; d = ((PyModuleObject *)m)->md_dict;
if (d == NULL || if (d == NULL ||
(nameobj = PyDict_GetItemString(d, "__name__")) == NULL || (nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
!PyString_Check(nameobj)) !(PyString_Check(nameobj) || PyUnicode_Check(nameobj)))
{ {
PyErr_SetString(PyExc_SystemError, "nameless module"); PyErr_SetString(PyExc_SystemError, "nameless module");
return NULL; return NULL;
} }
if (PyUnicode_Check(nameobj))
nameobj = _PyUnicode_AsDefaultEncodedString(nameobj, "replace");
return PyString_AsString(nameobj); return PyString_AsString(nameobj);
} }

View File

@ -2072,7 +2072,6 @@ PyObject *unicodeescape_string(const Py_UNICODE *s,
p = PyString_AS_STRING(repr); p = PyString_AS_STRING(repr);
if (quotes) { if (quotes) {
*p++ = 'u';
*p++ = (findchar(s, size, '\'') && *p++ = (findchar(s, size, '\'') &&
!findchar(s, size, '"')) ? '"' : '\''; !findchar(s, size, '"')) ? '"' : '\'';
} }
@ -2081,7 +2080,7 @@ PyObject *unicodeescape_string(const Py_UNICODE *s,
/* Escape quotes and backslashes */ /* Escape quotes and backslashes */
if ((quotes && if ((quotes &&
ch == (Py_UNICODE) PyString_AS_STRING(repr)[1]) || ch == '\\') { ch == (Py_UNICODE) PyString_AS_STRING(repr)[0]) || ch == '\\') {
*p++ = '\\'; *p++ = '\\';
*p++ = (char) ch; *p++ = (char) ch;
continue; continue;
@ -2167,7 +2166,7 @@ PyObject *unicodeescape_string(const Py_UNICODE *s,
*p++ = (char) ch; *p++ = (char) ch;
} }
if (quotes) if (quotes)
*p++ = PyString_AS_STRING(repr)[1]; *p++ = PyString_AS_STRING(repr)[0];
*p = '\0'; *p = '\0';
_PyString_Resize(&repr, p - PyString_AS_STRING(repr)); _PyString_Resize(&repr, p - PyString_AS_STRING(repr));

View File

@ -3187,7 +3187,7 @@ parsestr(const node *n, const char *encoding, int *bytesmode)
} }
} }
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE
if (unicode || Py_UnicodeFlag) { if (!*bytesmode) {
return decode_unicode(s, len, rawmode, encoding); return decode_unicode(s, len, rawmode, encoding);
} }
#endif #endif

View File

@ -2270,7 +2270,7 @@ static PyMethodDef builtin_methods[] = {
{"all", builtin_all, METH_O, all_doc}, {"all", builtin_all, METH_O, all_doc},
{"any", builtin_any, METH_O, any_doc}, {"any", builtin_any, METH_O, any_doc},
{"callable", builtin_callable, METH_O, callable_doc}, {"callable", builtin_callable, METH_O, callable_doc},
{"chr", builtin_chr, METH_VARARGS, chr_doc}, {"chr", builtin_unichr, METH_VARARGS, chr_doc},
{"cmp", builtin_cmp, METH_VARARGS, cmp_doc}, {"cmp", builtin_cmp, METH_VARARGS, cmp_doc},
{"compile", (PyCFunction)builtin_compile, METH_VARARGS | METH_KEYWORDS, compile_doc}, {"compile", (PyCFunction)builtin_compile, METH_VARARGS | METH_KEYWORDS, compile_doc},
{"delattr", builtin_delattr, METH_VARARGS, delattr_doc}, {"delattr", builtin_delattr, METH_VARARGS, delattr_doc},
@ -2375,7 +2375,7 @@ _PyBuiltin_Init(void)
SETBUILTIN("set", &PySet_Type); SETBUILTIN("set", &PySet_Type);
SETBUILTIN("slice", &PySlice_Type); SETBUILTIN("slice", &PySlice_Type);
SETBUILTIN("staticmethod", &PyStaticMethod_Type); SETBUILTIN("staticmethod", &PyStaticMethod_Type);
SETBUILTIN("str", &PyString_Type); SETBUILTIN("str", &PyUnicode_Type);
SETBUILTIN("super", &PySuper_Type); SETBUILTIN("super", &PySuper_Type);
SETBUILTIN("tuple", &PyTuple_Type); SETBUILTIN("tuple", &PyTuple_Type);
SETBUILTIN("type", &PyType_Type); SETBUILTIN("type", &PyType_Type);

View File

@ -2633,7 +2633,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
PyObject *keyword = kws[2*i]; PyObject *keyword = kws[2*i];
PyObject *value = kws[2*i + 1]; PyObject *value = kws[2*i + 1];
int j; int j;
if (keyword == NULL || !PyString_Check(keyword)) { if (keyword == NULL || !(PyString_Check(keyword) || PyUnicode_Check(keyword))) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"%.200s() keywords must be strings", "%.200s() keywords must be strings",
PyString_AsString(co->co_name)); PyString_AsString(co->co_name));

View File

@ -1081,7 +1081,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
case 'S': { /* string object */ case 'S': { /* string object */
PyObject **p = va_arg(*p_va, PyObject **); PyObject **p = va_arg(*p_va, PyObject **);
if (PyString_Check(arg)) if (PyString_Check(arg) || PyUnicode_Check(arg))
*p = arg; *p = arg;
else else
return converterr("string", arg, msgbuf, bufsize); return converterr("string", arg, msgbuf, bufsize);
@ -1531,7 +1531,7 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
while (PyDict_Next(keywords, &pos, &key, &value)) { while (PyDict_Next(keywords, &pos, &key, &value)) {
int match = 0; int match = 0;
char *ks; char *ks;
if (!PyString_Check(key)) { if (!PyString_Check(key) && !PyUnicode_Check(key)) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"keywords must be strings"); "keywords must be strings");
return cleanreturn(0, freelist); return cleanreturn(0, freelist);

View File

@ -154,7 +154,7 @@ _PyImport_Init(void)
} }
} }
if (Py_UnicodeFlag) { {
/* Fix the pyc_magic so that byte compiled code created /* Fix the pyc_magic so that byte compiled code created
using the all-Unicode method doesn't interfere with using the all-Unicode method doesn't interfere with
code created in normal operation mode. */ code created in normal operation mode. */

View File

@ -76,7 +76,6 @@ int Py_InspectFlag; /* Needed to determine whether to exit at SystemError */
int Py_NoSiteFlag; /* Suppress 'import site' */ int Py_NoSiteFlag; /* Suppress 'import site' */
int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */ int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
int Py_FrozenFlag; /* Needed by getpath.c */ int Py_FrozenFlag; /* Needed by getpath.c */
int Py_UnicodeFlag = 0; /* Needed by compile.c */
int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */ int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
/* Reference to 'warnings' module, to avoid importing it /* Reference to 'warnings' module, to avoid importing it