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 (via the 'executables' class attribute), but most will have:
# 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 @@ def _check_macro_definitions (self, definitions):
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 @@ def _setup_compile(self, outdir, macros, incdirs, sources, depends,
""" """
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 @@ def _fix_compile_args (self, output_dir, macros, include_dirs):
""" """
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 @@ def _fix_object_args (self, objects, output_dir):
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 @@ def _ensure_stringlike (self, option, what, default=None):
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 @@ def ensure_string_list (self, option):
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 @@ def make_file (self, infiles, outfile, func, args,
# 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 @@ 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 []
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 @@ def check_library_list (self, libraries):
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 @@ def finalize_options (self):
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 @@ def finalize_options (self):
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 @@ def finalize_options (self):
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 @@ def check_extensions_list (self, extensions):
("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 @@ def get_outputs (self, include_bytecode=1):
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 @@ def initialize_options (self):
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 @@ def search_cpp (self, pattern, body=None,
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 @@ def handle_extra_path (self):
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 @@
__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 @@ def finalize_options (self):
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 @@ def finalize_options (self):
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 @@ def _set_command_options (self, command_obj, option_dict=None):
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 @@ def __init__ (self, name, sources,
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 @@ def _grok_option_table (self):
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 @@
__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 @@ def link(self, target_desc, objects,
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 @@ def urandom(n):
_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 @@ def write(self, line):
(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 @@ def test_chr(self):
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 @@ def XXX_test_cmp(self):
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 @@ def test_compile(self):
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 @@ def test_eval(self):
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 @@ def test_float(self):
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 @@ def test_unichr(self):
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