From buildbot at python.org Sun Jun 1 00:03:18 2008 From: buildbot at python.org (buildbot at python.org) Date: Sat, 31 May 2008 22:03:18 +0000 Subject: [Python-checkins] buildbot failure in x86 osx.5 trunk Message-ID: <20080531220318.C637F1E4008@bag.python.org> The Buildbot has detected a new failure of x86 osx.5 trunk. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20osx.5%20trunk/builds/369 Buildbot URL: http://www.python.org/dev/buildbot/all/ Buildslave for this Build: heller-x86-osx5 Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: georg.brandl,gerhard.haering,mark.summerfield BUILD FAILED: failed test Excerpt from the test logfile: 1 test failed: test_socket make: *** [buildbottest] Error 1 sincerely, -The Buildbot From python-checkins at python.org Sun Jun 1 00:52:43 2008 From: python-checkins at python.org (georg.brandl) Date: Sun, 1 Jun 2008 00:52:43 +0200 (CEST) Subject: [Python-checkins] r63840 - in doctools/trunk: CHANGES sphinx/__init__.py sphinx/builder.py sphinx/environment.py sphinx/htmlhelp.py Message-ID: <20080531225243.83F071E4009@bag.python.org> Author: georg.brandl Date: Sun Jun 1 00:52:42 2008 New Revision: 63840 Log: More logical "next"/"previous" links. Modified: doctools/trunk/CHANGES doctools/trunk/sphinx/__init__.py doctools/trunk/sphinx/builder.py doctools/trunk/sphinx/environment.py doctools/trunk/sphinx/htmlhelp.py Modified: doctools/trunk/CHANGES ============================================================================== --- doctools/trunk/CHANGES (original) +++ doctools/trunk/CHANGES Sun Jun 1 00:52:42 2008 @@ -33,6 +33,9 @@ * Add document metadata to the values in the default template context. +* Let the "previous" and "next" to more logical documents, so that always + selecting "next" lets you visit every document in the tree. + Bugs fixed ---------- Modified: doctools/trunk/sphinx/__init__.py ============================================================================== --- doctools/trunk/sphinx/__init__.py (original) +++ doctools/trunk/sphinx/__init__.py Sun Jun 1 00:52:42 2008 @@ -135,6 +135,11 @@ app.builder.build_update() except KeyboardInterrupt: # catches BaseExceptions in 2.5 -- SystemExit, KeyboardInterrupt + if use_pdb: + import pdb + print >>sys.stderr, darkred('Interrupted while building, starting debugger:') + traceback.print_exc() + pdb.post_mortem(sys.exc_info()[2]) return 1 except SystemExit: return 0 Modified: doctools/trunk/sphinx/builder.py ============================================================================== --- doctools/trunk/sphinx/builder.py (original) +++ doctools/trunk/sphinx/builder.py Sun Jun 1 00:52:42 2008 @@ -302,9 +302,6 @@ def prepare_writing(self, docnames): from sphinx.search import IndexBuilder - self.info(bold('creating index...')) - self.env.create_index(self) - self.indexer = IndexBuilder() self.load_indexer(docnames) self.docwriter = HTMLWriter(self) @@ -326,6 +323,8 @@ if not isinstance(self.config.html_use_opensearch, basestring): self.warn('html_use_opensearch config value must now be a string') + self.relations = self.env.collect_relations() + self.globalcontext = dict( project = self.config.project, release = self.config.release, @@ -350,28 +349,29 @@ # find out relations prev = next = None parents = [] - related = self.env.toctree_relations.get(docname) + related = self.relations.get(docname) titles = self.env.titles - if related: + if related and related[1]: try: prev = {'link': self.get_relative_uri(docname, related[1]), 'title': self.render_partial(titles[related[1]])['title']} except KeyError: # the relation is (somehow) not in the TOC tree, handle that gracefully prev = None + if related and related[2]: try: next = {'link': self.get_relative_uri(docname, related[2]), 'title': self.render_partial(titles[related[2]])['title']} except KeyError: next = None - while related: + while related and related[0]: try: parents.append( {'link': self.get_relative_uri(docname, related[0]), 'title': self.render_partial(titles[related[0]])['title']}) except KeyError: pass - related = self.env.toctree_relations.get(related[0]) + related = self.relations.get(related[0]) if parents: parents.pop() # remove link to the master file; we have a generic # "back to index" link already @@ -420,13 +420,14 @@ if self.config.html_use_index: # the total count of lines for each index letter, used to distribute # the entries into two columns + genindex = self.env.create_index(self) indexcounts = [] - for _, entries in self.env.index: + for _, entries in genindex: indexcounts.append(sum(1 + len(subitems) for _, (_, subitems) in entries)) genindexcontext = dict( - genindexentries = self.env.index, + genindexentries = genindex, genindexcounts = indexcounts, ) self.info(' genindex', nonl=1) Modified: doctools/trunk/sphinx/environment.py ============================================================================== --- doctools/trunk/sphinx/environment.py (original) +++ doctools/trunk/sphinx/environment.py Sun Jun 1 00:52:42 2008 @@ -15,10 +15,10 @@ import heapq import types import difflib -import itertools import cPickle as pickle from os import path from string import uppercase +from itertools import izip, groupby try: import hashlib md5 = hashlib.md5 @@ -58,7 +58,7 @@ # This is increased every time an environment attribute is added # or changed to properly invalidate pickle files. -ENV_VERSION = 21 +ENV_VERSION = 22 default_substitutions = set([ @@ -225,8 +225,7 @@ self.toc_num_entries = {} # docname -> number of real entries # used to determine when to show the TOC in a sidebar # (don't show if it's only one item) - self.toctree_relations = {} # docname -> ["parent", "previous", "next"] docname - # for navigating in the toctree + self.toctree_includes = {} # docname -> list of toctree includefiles self.files_to_rebuild = {} # docname -> set of files (containing its TOCs) # to rebuild too @@ -280,11 +279,14 @@ self.titles.pop(docname, None) self.tocs.pop(docname, None) self.toc_num_entries.pop(docname, None) + self.toctree_includes.pop(docname, None) self.filemodules.pop(docname, None) self.indexentries.pop(docname, None) - for subfn, fnset in self.files_to_rebuild.iteritems(): + for subfn, fnset in self.files_to_rebuild.items(): fnset.discard(docname) + if not fnset: + del self.files_to_rebuild[subfn] for fullname, (fn, _) in self.descrefs.items(): if fn == docname: del self.descrefs[fullname] @@ -590,17 +592,11 @@ """Note a TOC tree directive in a document and gather information about file relations from it.""" includefiles = toctreenode['includefiles'] - includefiles_len = len(includefiles) - for i, includefile in enumerate(includefiles): - # the "previous" file for the first toctree item is the parent - previous = i > 0 and includefiles[i-1] or docname - # the "next" file for the last toctree item is the parent again - next = i < includefiles_len-1 and includefiles[i+1] or docname - self.toctree_relations[includefile] = [docname, previous, next] + for includefile in includefiles: # note that if the included file is rebuilt, this one must be # too (since the TOC of the included file could have changed) self.files_to_rebuild.setdefault(includefile, set()).add(docname) - + self.toctree_includes.setdefault(docname, []).extend(includefiles) def build_toc_from(self, docname, document): """Build a TOC from the doctree and store it in the inventory.""" @@ -998,14 +994,49 @@ else: # get all other symbols under one heading return 'Symbols' - self.index = [(key, list(group)) for (key, group) in - itertools.groupby(newlist, keyfunc)] + return [(key, list(group)) for (key, group) in groupby(newlist, keyfunc)] + + def collect_relations(self): + relations = {} + getinc = self.toctree_includes.get + def collect(parents, docname, previous, next): + includes = getinc(docname) + # previous + if not previous: + previous = parents[0][0] + else: + while 1: + previncs = getinc(previous) + if previncs: + previous = previncs[-1] + else: + break + # next + if includes: + next = includes[0] + elif next: + pass + else: + for parname, parindex in parents: + parincs = getinc(parname) + if parincs and parindex + 1 < len(parincs): + next = parincs[parindex+1] + break + # else it will stay None + # same for children + if includes: + for subindex, args in enumerate(izip(includes, [None] + includes, + includes[1:] + [None])): + collect([(docname, subindex)] + parents, *args) + relations[docname] = [parents[0][0], previous, next] + collect([(None, 0)], self.config.master_doc, None, None) + return relations def check_consistency(self): """Do consistency checks.""" for docname in self.all_docs: - if docname not in self.toctree_relations: + if docname not in self.files_to_rebuild: if docname == self.config.master_doc: # the master file is not included anywhere ;) continue Modified: doctools/trunk/sphinx/htmlhelp.py ============================================================================== --- doctools/trunk/sphinx/htmlhelp.py (original) +++ doctools/trunk/sphinx/htmlhelp.py Sun Jun 1 00:52:42 2008 @@ -184,6 +184,7 @@ f.close() builder.info('writing index file...') + index = builder.env.create_index(builder) f = open(path.join(outdir, outname+'.hhk'), 'w') try: f.write('') - for (key, group) in builder.env.index: + for (key, group) in index: for title, (refs, subitems) in group: write_index(title, refs, subitems) f.write('\n') From python-checkins at python.org Sun Jun 1 00:54:10 2008 From: python-checkins at python.org (georg.brandl) Date: Sun, 1 Jun 2008 00:54:10 +0200 (CEST) Subject: [Python-checkins] r63841 - doctools/trunk/sphinx/environment.py Message-ID: <20080531225410.92BF71E4009@bag.python.org> Author: georg.brandl Date: Sun Jun 1 00:54:10 2008 New Revision: 63841 Log: Refer to a RFC base URL that actually works. Modified: doctools/trunk/sphinx/environment.py Modified: doctools/trunk/sphinx/environment.py ============================================================================== --- doctools/trunk/sphinx/environment.py (original) +++ doctools/trunk/sphinx/environment.py Sun Jun 1 00:54:10 2008 @@ -51,6 +51,7 @@ 'embed_stylesheet': False, 'cloak_email_addresses': True, 'pep_base_url': 'http://www.python.org/dev/peps/', + 'rfc_base_url': 'http://rfc.net/', 'input_encoding': 'utf-8', 'doctitle_xform': False, 'sectsubtitle_xform': False, From python-checkins at python.org Sun Jun 1 00:55:14 2008 From: python-checkins at python.org (georg.brandl) Date: Sun, 1 Jun 2008 00:55:14 +0200 (CEST) Subject: [Python-checkins] r63842 - doctools/trunk/CHANGES Message-ID: <20080531225514.821CB1E4009@bag.python.org> Author: georg.brandl Date: Sun Jun 1 00:55:14 2008 New Revision: 63842 Log: Reword a little. Modified: doctools/trunk/CHANGES Modified: doctools/trunk/CHANGES ============================================================================== --- doctools/trunk/CHANGES (original) +++ doctools/trunk/CHANGES Sun Jun 1 00:55:14 2008 @@ -33,8 +33,8 @@ * Add document metadata to the values in the default template context. -* Let the "previous" and "next" to more logical documents, so that always - selecting "next" lets you visit every document in the tree. +* Let the "previous" and "next" to more logical documents, so that by + following "next" links you can traverse the entire TOC tree. Bugs fixed ---------- From buildbot at python.org Sun Jun 1 02:19:57 2008 From: buildbot at python.org (buildbot at python.org) Date: Sun, 01 Jun 2008 00:19:57 +0000 Subject: [Python-checkins] buildbot failure in ARM Linux EABI 2.5 Message-ID: <20080601001957.44E981E4009@bag.python.org> The Buildbot has detected a new failure of ARM Linux EABI 2.5. Full details are available at: http://www.python.org/dev/buildbot/all/ARM%20Linux%20EABI%202.5/builds/1 Buildbot URL: http://www.python.org/dev/buildbot/all/ Buildslave for this Build: klose-linux-armeabi Build Reason: Build Source Stamp: [branch branches/release25-maint] HEAD Blamelist: georg.brandl BUILD FAILED: failed test Excerpt from the test logfile: Traceback (most recent call last): File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/threading.py", line 486, in __bootstrap_inner self.run() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/test/test_socketserver.py", line 91, in run svr.serve_a_few() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/test/test_socketserver.py", line 35, in serve_a_few self.handle_request() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/SocketServer.py", line 217, in handle_request request, client_address = self.get_request() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/SocketServer.py", line 374, in get_request return self.socket.accept() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/socket.py", line 167, in accept sock, addr = self._sock.accept() SystemError: Negative size passed to PyString_FromStringAndSize 2 tests failed: test_socket test_socketserver ====================================================================== ERROR: testLinuxAbstractNamespace (test.test_socket.TestLinuxAbstractNamespace) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/test/test_socket.py", line 926, in testLinuxAbstractNamespace s1.accept() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/socket.py", line 167, in accept sock, addr = self._sock.accept() SystemError: Negative size passed to PyString_FromStringAndSize ====================================================================== FAIL: testMaxName (test.test_socket.TestLinuxAbstractNamespace) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/test/test_socket.py", line 934, in testMaxName self.assertEqual(s.getsockname(), address) AssertionError: '\x00hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh' != '\x00hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh' Traceback (most recent call last): File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/threading.py", line 486, in __bootstrap_inner self.run() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/test/test_socketserver.py", line 91, in run svr.serve_a_few() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/test/test_socketserver.py", line 35, in serve_a_few self.handle_request() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/SocketServer.py", line 217, in handle_request request, client_address = self.get_request() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/SocketServer.py", line 374, in get_request return self.socket.accept() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/socket.py", line 167, in accept sock, addr = self._sock.accept() SystemError: Negative size passed to PyString_FromStringAndSize Traceback (most recent call last): File "./Lib/test/regrtest.py", line 557, in runtest_inner indirect_test() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/test/test_socketserver.py", line 212, in test_main testall() File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/test/test_socketserver.py", line 200, in testall testloop(socket.AF_UNIX, streamservers, MyStreamHandler, teststream) File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/test/test_socketserver.py", line 144, in testloop testfunc(proto, addr) File "/home/pybot/buildarea-armeabi/2.5.klose-linux-armeabi/build/Lib/test/test_socketserver.py", line 63, in teststream s.sendall(teststring) File "", line 1, in sendall error: (32, 'Broken pipe') make: *** [buildbottest] Error 1 sincerely, -The Buildbot From buildbot at python.org Sun Jun 1 06:21:05 2008 From: buildbot at python.org (buildbot at python.org) Date: Sun, 01 Jun 2008 04:21:05 +0000 Subject: [Python-checkins] buildbot failure in x86 osx.5 3.0 Message-ID: <20080601042105.709C31E4009@bag.python.org> The Buildbot has detected a new failure of x86 osx.5 3.0. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20osx.5%203.0/builds/276 Buildbot URL: http://www.python.org/dev/buildbot/all/ Buildslave for this Build: heller-x86-osx5 Build Reason: Build Source Stamp: [branch branches/py3k] HEAD Blamelist: alexandre.vassalotti,mark.summerfield BUILD FAILED: failed test Excerpt from the test logfile: 3 tests failed: test_calendar test_email test_mailbox make: *** [buildbottest] Error 1 sincerely, -The Buildbot From buildbot at python.org Sun Jun 1 07:05:57 2008 From: buildbot at python.org (buildbot at python.org) Date: Sun, 01 Jun 2008 05:05:57 +0000 Subject: [Python-checkins] buildbot failure in x86 XP-4 3.0 Message-ID: <20080601050558.21BC71E4015@bag.python.org> The Buildbot has detected a new failure of x86 XP-4 3.0. Full details are available at: http://www.python.org/dev/buildbot/all/x86%20XP-4%203.0/builds/764 Buildbot URL: http://www.python.org/dev/buildbot/all/ Buildslave for this Build: bolen-windows Build Reason: Build Source Stamp: [branch branches/py3k] HEAD Blamelist: benjamin.peterson,brett.cannon,eric.smith,georg.brandl BUILD FAILED: failed test Excerpt from the test logfile: Traceback (most recent call last): File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 614, in __init__ self.handle() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 358, in handle_one_request method() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 617, in do_GET f = self.send_head() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 849, in send_head return self.run_cgi() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 3, in File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str Traceback (most recent call last): File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 614, in __init__ self.handle() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 358, in handle_one_request method() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 617, in do_GET f = self.send_head() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 849, in send_head return self.run_cgi() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 3, in File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str Traceback (most recent call last): File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 614, in __init__ self.handle() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 358, in handle_one_request method() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 842, in do_POST self.run_cgi() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 4, in File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str 3 tests failed: test_httpservers test_platform test_pydoc ====================================================================== ERROR: test_post (test.test_httpservers.CGIHTTPServerTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\test\test_httpservers.py", line 325, in test_post res = self.request('/cgi-bin/file2.py', 'POST', params, headers) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\test\test_httpservers.py", line 63, in request return self.connection.getresponse() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\client.py", line 975, in getresponse response.begin() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\client.py", line 424, in begin self.msg = HTTPMessage(self.fp, 0) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\mimetools.py", line 16, in __init__ rfc822.Message.__init__(self, fp, seekable) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\rfc822.py", line 104, in __init__ self.readheaders() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\client.py", line 266, in readheaders line = str(self.fp.readline(), "iso-8859-1") File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\io.py", line 510, in readline b = self.read(nreadahead()) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\io.py", line 577, in read n = self.readinto(b) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socket.py", line 217, in readinto return self._sock.recv_into(b) socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host ====================================================================== FAIL: test_authorization (test.test_httpservers.CGIHTTPServerTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\test\test_httpservers.py", line 339, in test_authorization (res.read(), res.getheader('Content-type'), res.status)) AssertionError: (b'Hello World\n', 'text/html', 200) != (b'', None, 200) ====================================================================== FAIL: test_headers_and_content (test.test_httpservers.CGIHTTPServerTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\test\test_httpservers.py", line 320, in test_headers_and_content (res.read(), res.getheader('Content-type'), res.status)) AssertionError: (b'Hello World\n', 'text/html', 200) != (b'', None, 200) ====================================================================== ERROR: test_mac_ver (test.test_platform.PlatformTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\test\test_platform.py", line 68, in test_mac_ver if os.uname()[0] == 'Darwin': AttributeError: 'module' object has no attribute 'uname' ====================================================================== FAIL: test_html_doc (test.test_pydoc.PyDocDocTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\test\test_pydoc.py", line 237, in test_html_doc self.fail("outputs are not equal, see diff above") AssertionError: outputs are not equal, see diff above Traceback (most recent call last): File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 614, in __init__ self.handle() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 358, in handle_one_request method() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 617, in do_GET f = self.send_head() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 849, in send_head return self.run_cgi() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 3, in File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str Traceback (most recent call last): File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 614, in __init__ self.handle() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 358, in handle_one_request method() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 617, in do_GET f = self.send_head() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 849, in send_head return self.run_cgi() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 3, in File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str Traceback (most recent call last): File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socketserver.py", line 614, in __init__ self.handle() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 358, in handle_one_request method() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 842, in do_POST self.run_cgi() File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 4, in File "E:\cygwin\home\db3l\buildarea\3.0.bolen-windows\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str sincerely, -The Buildbot From python-checkins at python.org Sun Jun 1 09:20:47 2008 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 1 Jun 2008 09:20:47 +0200 (CEST) Subject: [Python-checkins] r63846 - in python/trunk: Doc/c-api/file.rst Doc/library/stdtypes.rst Doc/using/cmdline.rst Include/fileobject.h Lib/test/test_sys.py Misc/NEWS Modules/main.c Objects/fileobject.c Python/pythonrun.c Python/sysmodule.c Message-ID: <20080601072047.944A91E400B@bag.python.org> Author: martin.v.loewis Date: Sun Jun 1 09:20:46 2008 New Revision: 63846 Log: New environment variable PYTHONIOENCODING. Modified: python/trunk/Doc/c-api/file.rst python/trunk/Doc/library/stdtypes.rst python/trunk/Doc/using/cmdline.rst python/trunk/Include/fileobject.h python/trunk/Lib/test/test_sys.py python/trunk/Misc/NEWS python/trunk/Modules/main.c python/trunk/Objects/fileobject.c python/trunk/Python/pythonrun.c python/trunk/Python/sysmodule.c Modified: python/trunk/Doc/c-api/file.rst ============================================================================== --- python/trunk/Doc/c-api/file.rst (original) +++ python/trunk/Doc/c-api/file.rst Sun Jun 1 09:20:46 2008 @@ -130,6 +130,14 @@ .. versionadded:: 2.3 +.. cfunction:: int PyFile_SetEncodingAndErrors(PyFileObject *p, const char *enc, *errors) + + Set the file's encoding for Unicode output to *enc*, and its error + mode to *err*. Return 1 on success and 0 on failure. + + .. versionadded:: 2.6 + + .. cfunction:: int PyFile_SoftSpace(PyObject *p, int newflag) .. index:: single: softspace (file attribute) Modified: python/trunk/Doc/library/stdtypes.rst ============================================================================== --- python/trunk/Doc/library/stdtypes.rst (original) +++ python/trunk/Doc/library/stdtypes.rst Sun Jun 1 09:20:46 2008 @@ -2165,6 +2165,13 @@ .. versionadded:: 2.3 +.. attribute:: file.errors + + The Unicode error handler used to along with the encoding. + + .. versionadded:: 2.6 + + .. attribute:: file.mode The I/O mode for the file. If the file was created using the :func:`open` Modified: python/trunk/Doc/using/cmdline.rst ============================================================================== --- python/trunk/Doc/using/cmdline.rst (original) +++ python/trunk/Doc/using/cmdline.rst Sun Jun 1 09:20:46 2008 @@ -481,6 +481,13 @@ .. versionadded:: 2.6 +.. envvar:: PYTHONIOENCODING + + Overrides the encoding used for stdin/stdout/stderr, in the syntax + encodingname:errorhandler, with the :errors part being optional. + + .. versionadded:: 2.6 + .. envvar:: PYTHONNOUSERSITE Modified: python/trunk/Include/fileobject.h ============================================================================== --- python/trunk/Include/fileobject.h (original) +++ python/trunk/Include/fileobject.h Sun Jun 1 09:20:46 2008 @@ -24,6 +24,7 @@ int f_newlinetypes; /* Types of newlines seen */ int f_skipnextlf; /* Skip next \n */ PyObject *f_encoding; + PyObject *f_errors; PyObject *weakreflist; /* List of weak references */ int unlocked_count; /* Num. currently running sections of code using f_fp with the GIL released. */ @@ -37,6 +38,7 @@ PyAPI_FUNC(PyObject *) PyFile_FromString(char *, char *); PyAPI_FUNC(void) PyFile_SetBufSize(PyObject *, int); PyAPI_FUNC(int) PyFile_SetEncoding(PyObject *, const char *); +PyAPI_FUNC(int) PyFile_SetEncodingAndErrors(PyObject *, const char *, char *errors); PyAPI_FUNC(PyObject *) PyFile_FromFile(FILE *, char *, char *, int (*)(FILE *)); PyAPI_FUNC(FILE *) PyFile_AsFile(PyObject *); Modified: python/trunk/Lib/test/test_sys.py ============================================================================== --- python/trunk/Lib/test/test_sys.py (original) +++ python/trunk/Lib/test/test_sys.py Sun Jun 1 09:20:46 2008 @@ -385,6 +385,26 @@ ## self.assert_(r[0][2] > 100, r[0][2]) ## self.assert_(r[1][2] > 100, r[1][2]) + def test_ioencoding(self): + import subprocess,os + env = dict(os.environ) + + # Test character: cent sign, encoded as 0x4A (ASCII J) in CP424, + # not representable in ASCII. + + env["PYTHONIOENCODING"] = "cp424" + p = subprocess.Popen([sys.executable, "-c", 'print unichr(0xa2)'], + stdout = subprocess.PIPE, env=env) + out = p.stdout.read().strip() + self.assertEqual(out, unichr(0xa2).encode("cp424")) + + env["PYTHONIOENCODING"] = "ascii:replace" + p = subprocess.Popen([sys.executable, "-c", 'print unichr(0xa2)'], + stdout = subprocess.PIPE, env=env) + out = p.stdout.read().strip() + self.assertEqual(out, '?') + + def test_main(): test.test_support.run_unittest(SysModuleTest) Modified: python/trunk/Misc/NEWS ============================================================================== --- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sun Jun 1 09:20:46 2008 @@ -12,6 +12,8 @@ Core and Builtins ----------------- +- New environment variable PYTHONIOENCODING. + - Patch #2488: Add sys.maxsize. - Issue #2353: file.xreadlines() now emits a Py3k warning. Modified: python/trunk/Modules/main.c ============================================================================== --- python/trunk/Modules/main.c (original) +++ python/trunk/Modules/main.c Sun Jun 1 09:20:46 2008 @@ -99,6 +99,7 @@ PYTHONHOME : alternate directory (or %c).\n\ The default module search path uses %s.\n\ PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\ +PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ "; Modified: python/trunk/Objects/fileobject.c ============================================================================== --- python/trunk/Objects/fileobject.c (original) +++ python/trunk/Objects/fileobject.c Sun Jun 1 09:20:46 2008 @@ -155,6 +155,7 @@ Py_DECREF(f->f_name); Py_DECREF(f->f_mode); Py_DECREF(f->f_encoding); + Py_DECREF(f->f_errors); Py_INCREF(name); f->f_name = name; @@ -170,6 +171,8 @@ f->f_skipnextlf = 0; Py_INCREF(Py_None); f->f_encoding = Py_None; + Py_INCREF(Py_None); + f->f_errors = Py_None; if (f->f_mode == NULL) return NULL; @@ -435,19 +438,38 @@ } /* Set the encoding used to output Unicode strings. - Returh 1 on success, 0 on failure. */ + Return 1 on success, 0 on failure. */ int PyFile_SetEncoding(PyObject *f, const char *enc) { + return PyFile_SetEncodingAndErrors(f, enc, NULL); +} + +int +PyFile_SetEncodingAndErrors(PyObject *f, const char *enc, char* errors) +{ PyFileObject *file = (PyFileObject*)f; - PyObject *str = PyBytes_FromString(enc); + PyObject *str, *oerrors; assert(PyFile_Check(f)); + str = PyBytes_FromString(enc); if (!str) return 0; + if (errors) { + oerrors = PyString_FromString(errors); + if (!oerrors) { + Py_DECREF(str); + return 0; + } + } else { + oerrors = Py_None; + Py_INCREF(Py_None); + } Py_DECREF(file->f_encoding); file->f_encoding = str; + Py_DECREF(file->f_errors); + file->f_errors = oerrors; return 1; } @@ -491,6 +513,7 @@ Py_XDECREF(f->f_name); Py_XDECREF(f->f_mode); Py_XDECREF(f->f_encoding); + Py_XDECREF(f->f_errors); drop_readahead(f); Py_TYPE(f)->tp_free((PyObject *)f); } @@ -1879,6 +1902,8 @@ "file name"}, {"encoding", T_OBJECT, OFF(f_encoding), RO, "file encoding"}, + {"errors", T_OBJECT, OFF(f_errors), RO, + "Unicode error handler"}, /* getattr(f, "closed") is implemented without this table */ {NULL} /* Sentinel */ }; @@ -2093,6 +2118,8 @@ ((PyFileObject *)self)->f_mode = not_yet_string; Py_INCREF(Py_None); ((PyFileObject *)self)->f_encoding = Py_None; + Py_INCREF(Py_None); + ((PyFileObject *)self)->f_errors = Py_None; ((PyFileObject *)self)->weakreflist = NULL; ((PyFileObject *)self)->unlocked_count = 0; } @@ -2295,7 +2322,9 @@ if ((flags & Py_PRINT_RAW) && PyUnicode_Check(v) && enc != Py_None) { char *cenc = PyBytes_AS_STRING(enc); - value = PyUnicode_AsEncodedString(v, cenc, "strict"); + char *errors = fobj->f_errors == Py_None ? + "strict" : PyBytes_AS_STRING(fobj->f_errors); + value = PyUnicode_AsEncodedString(v, cenc, errors); if (value == NULL) return -1; } else { Modified: python/trunk/Python/pythonrun.c ============================================================================== --- python/trunk/Python/pythonrun.c (original) +++ python/trunk/Python/pythonrun.c Sun Jun 1 09:20:46 2008 @@ -132,11 +132,20 @@ PyThreadState *tstate; PyObject *bimod, *sysmod; char *p; + char *icodeset; /* On Windows, input codeset may theoretically + differ from output codeset. */ + char *codeset = NULL; + char *errors = NULL; + int free_codeset = 0; + int overridden = 0; #if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) - char *codeset; - char *saved_locale; + char *saved_locale, *loc_codeset; PyObject *sys_stream, *sys_isatty; #endif +#ifdef MS_WINDOWS + char ibuf[128]; + char buf[128]; +#endif extern void _Py_ReadyTypes(void); if (initialized) @@ -238,38 +247,75 @@ _PyGILState_Init(interp, tstate); #endif /* WITH_THREAD */ + if ((p = Py_GETENV("PYTHONIOENCODING")) && *p != '\0') { + p = icodeset = codeset = strdup(p); + free_codeset = 1; + errors = strchr(p, ':'); + if (errors) { + *errors = '\0'; + errors++; + } + overridden = 1; + } + #if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) /* On Unix, set the file system encoding according to the user's preference, if the CODESET names a well-known Python codec, and Py_FileSystemDefaultEncoding isn't initialized by other means. Also set the encoding of - stdin and stdout if these are terminals. */ + stdin and stdout if these are terminals, unless overridden. */ - saved_locale = strdup(setlocale(LC_CTYPE, NULL)); - setlocale(LC_CTYPE, ""); - codeset = nl_langinfo(CODESET); - if (codeset && *codeset) { - PyObject *enc = PyCodec_Encoder(codeset); - if (enc) { - codeset = strdup(codeset); - Py_DECREF(enc); - } else { - codeset = NULL; - PyErr_Clear(); + if (!overridden || !Py_FileSystemDefaultEncoding) { + saved_locale = strdup(setlocale(LC_CTYPE, NULL)); + setlocale(LC_CTYPE, ""); + loc_codeset = nl_langinfo(CODESET); + if (loc_codeset && *loc_codeset) { + PyObject *enc = PyCodec_Encoder(loc_codeset); + if (enc) { + loc_codeset = strdup(loc_codeset); + Py_DECREF(enc); + } else { + loc_codeset = NULL; + PyErr_Clear(); + } + } else + loc_codeset = NULL; + setlocale(LC_CTYPE, saved_locale); + free(saved_locale); + + if (!overridden) { + codeset = icodeset = loc_codeset; + free_codeset = 1; + } + + /* Initialize Py_FileSystemDefaultEncoding from + locale even if PYTHONIOENCODING is set. */ + if (!Py_FileSystemDefaultEncoding) { + Py_FileSystemDefaultEncoding = loc_codeset; + if (!overridden) + free_codeset = 0; } - } else - codeset = NULL; - setlocale(LC_CTYPE, saved_locale); - free(saved_locale); + } +#endif + +#ifdef MS_WINDOWS + if (!overridden) { + icodeset = ibuf; + encoding = buf; + sprintf(ibuf, "cp%d", GetConsoleCP()); + sprintf(buf, "cp%d", GetConsoleOutputCP()); + } +#endif if (codeset) { sys_stream = PySys_GetObject("stdin"); sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); if (!sys_isatty) PyErr_Clear(); - if(sys_isatty && PyObject_IsTrue(sys_isatty) && + if ((overridden || + (sys_isatty && PyObject_IsTrue(sys_isatty))) && PyFile_Check(sys_stream)) { - if (!PyFile_SetEncoding(sys_stream, codeset)) + if (!PyFile_SetEncodingAndErrors(sys_stream, icodeset, errors)) Py_FatalError("Cannot set codeset of stdin"); } Py_XDECREF(sys_isatty); @@ -278,9 +324,10 @@ sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); if (!sys_isatty) PyErr_Clear(); - if(sys_isatty && PyObject_IsTrue(sys_isatty) && + if ((overridden || + (sys_isatty && PyObject_IsTrue(sys_isatty))) && PyFile_Check(sys_stream)) { - if (!PyFile_SetEncoding(sys_stream, codeset)) + if (!PyFile_SetEncodingAndErrors(sys_stream, codeset, errors)) Py_FatalError("Cannot set codeset of stdout"); } Py_XDECREF(sys_isatty); @@ -289,19 +336,17 @@ sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); if (!sys_isatty) PyErr_Clear(); - if(sys_isatty && PyObject_IsTrue(sys_isatty) && + if((overridden || + (sys_isatty && PyObject_IsTrue(sys_isatty))) && PyFile_Check(sys_stream)) { - if (!PyFile_SetEncoding(sys_stream, codeset)) + if (!PyFile_SetEncodingAndErrors(sys_stream, codeset, errors)) Py_FatalError("Cannot set codeset of stderr"); } Py_XDECREF(sys_isatty); - if (!Py_FileSystemDefaultEncoding) - Py_FileSystemDefaultEncoding = codeset; - else + if (free_codeset) free(codeset); } -#endif } void Modified: python/trunk/Python/sysmodule.c ============================================================================== --- python/trunk/Python/sysmodule.c (original) +++ python/trunk/Python/sysmodule.c Sun Jun 1 09:20:46 2008 @@ -1232,9 +1232,6 @@ PyObject *m, *v, *sysdict; PyObject *sysin, *sysout, *syserr; char *s; -#ifdef MS_WINDOWS - char buf[128]; -#endif m = Py_InitModule3("sys", sys_methods, sys_doc); if (m == NULL) @@ -1272,23 +1269,6 @@ syserr = PyFile_FromFile(stderr, "", "w", _check_and_flush); if (PyErr_Occurred()) return NULL; -#ifdef MS_WINDOWS - if(isatty(_fileno(stdin)) && PyFile_Check(sysin)) { - sprintf(buf, "cp%d", GetConsoleCP()); - if (!PyFile_SetEncoding(sysin, buf)) - return NULL; - } - if(isatty(_fileno(stdout)) && PyFile_Check(sysout)) { - sprintf(buf, "cp%d", GetConsoleOutputCP()); - if (!PyFile_SetEncoding(sysout, buf)) - return NULL; - } - if(isatty(_fileno(stderr)) && PyFile_Check(syserr)) { - sprintf(buf, "cp%d", GetConsoleOutputCP()); - if (!PyFile_SetEncoding(syserr, buf)) - return NULL; - } -#endif PyDict_SetItemString(sysdict, "stdin", sysin); PyDict_SetItemString(sysdict, "stdout", sysout); From buildbot at python.org Sun Jun 1 09:36:25 2008 From: buildbot at python.org (buildbot at python.org) Date: Sun, 01 Jun 2008 07:36:25 +0000 Subject: [Python-checkins] buildbot failure in amd64 XP trunk Message-ID: <20080601073625.B268E1E4013@bag.python.org> The Buildbot has detected a new failure of amd64 XP trunk. Full details are available at: http://www.python.org/dev/buildbot/all/amd64%20XP%20trunk/builds/1415 Buildbot URL: http://www.python.org/dev/buildbot/all/ Buildslave for this Build: heller-windows-amd64 Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: martin.v.loewis BUILD FAILED: failed compile sincerely, -The Buildbot From python-checkins at python.org Sun Jun 1 10:06:18 2008 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 1 Jun 2008 10:06:18 +0200 (CEST) Subject: [Python-checkins] r63848 - python/trunk/Python/pythonrun.c Message-ID: <20080601080618.22CCA1E4009@bag.python.org> Author: martin.v.loewis Date: Sun Jun 1 10:06:17 2008 New Revision: 63848 Log: Move sys_stream and sys_isatty out of the have-langinfo block. Modified: python/trunk/Python/pythonrun.c Modified: python/trunk/Python/pythonrun.c ============================================================================== --- python/trunk/Python/pythonrun.c (original) +++ python/trunk/Python/pythonrun.c Sun Jun 1 10:06:17 2008 @@ -138,9 +138,9 @@ char *errors = NULL; int free_codeset = 0; int overridden = 0; + PyObject *sys_stream, *sys_isatty; #if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) char *saved_locale, *loc_codeset; - PyObject *sys_stream, *sys_isatty; #endif #ifdef MS_WINDOWS char ibuf[128]; From python-checkins at python.org Sun Jun 1 10:19:02 2008 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 1 Jun 2008 10:19:02 +0200 (CEST) Subject: [Python-checkins] r63849 - python/trunk/Python/pythonrun.c Message-ID: <20080601081902.5F15E1E4009@bag.python.org> Author: martin.v.loewis Date: Sun Jun 1 10:19:02 2008 New Revision: 63849 Log: Typo: encoding -> codeset. Modified: python/trunk/Python/pythonrun.c Modified: python/trunk/Python/pythonrun.c ============================================================================== --- python/trunk/Python/pythonrun.c (original) +++ python/trunk/Python/pythonrun.c Sun Jun 1 10:19:02 2008 @@ -301,7 +301,7 @@ #ifdef MS_WINDOWS if (!overridden) { icodeset = ibuf; - encoding = buf; + codeset = buf; sprintf(ibuf, "cp%d", GetConsoleCP()); sprintf(buf, "cp%d", GetConsoleOutputCP()); } From buildbot at python.org Sun Jun 1 12:10:54 2008 From: buildbot at python.org (buildbot at python.org) Date: Sun, 01 Jun 2008 10:10:54 +0000 Subject: [Python-checkins] buildbot failure in g4 osx.4 trunk Message-ID: <20080601101054.9CD061E4009@bag.python.org> The Buildbot has detected a new failure of g4 osx.4 trunk. Full details are available at: http://www.python.org/dev/buildbot/all/g4%20osx.4%20trunk/builds/3472 Buildbot URL: http://www.python.org/dev/buildbot/all/ Buildslave for this Build: psf-g4 Build Reason: Build Source Stamp: [branch trunk] HEAD Blamelist: martin.v.loewis BUILD FAILED: failed test Excerpt from the test logfile: 1 test failed: test_pickletools make: *** [buildbottest] Error 1 sincerely, -The Buildbot From buildbot at python.org Sun Jun 1 13:29:32 2008 From: buildbot at python.org (buildbot at python.org) Date: Sun, 01 Jun 2008 11:29:32 +0000 Subject: [Python-checkins] buildbot failure in amd64 XP 3.0 Message-ID: <20080601112932.83D1E1E4009@bag.python.org> The Buildbot has detected a new failure of amd64 XP 3.0. Full details are available at: http://www.python.org/dev/buildbot/all/amd64%20XP%203.0/builds/976 Buildbot URL: http://www.python.org/dev/buildbot/all/ Buildslave for this Build: heller-windows-amd64 Build Reason: Build Source Stamp: [branch branches/py3k] HEAD Blamelist: martin.v.loewis BUILD FAILED: failed test Excerpt from the test logfile: Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 614, in __init__ self.handle() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 358, in handle_one_request method() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 617, in do_GET f = self.send_head() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 849, in send_head return self.run_cgi() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 3, in File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 614, in __init__ self.handle() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 358, in handle_one_request method() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 617, in do_GET f = self.send_head() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 849, in send_head return self.run_cgi() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 3, in File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 614, in __init__ self.handle() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 358, in handle_one_request method() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 842, in do_POST self.run_cgi() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 4, in File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str 5 tests failed: test_httpservers test_platform test_pydoc test_site test_winsound ====================================================================== ERROR: test_post (test.test_httpservers.CGIHTTPServerTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_httpservers.py", line 325, in test_post res = self.request('/cgi-bin/file2.py', 'POST', params, headers) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_httpservers.py", line 63, in request return self.connection.getresponse() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\client.py", line 975, in getresponse response.begin() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\client.py", line 424, in begin self.msg = HTTPMessage(self.fp, 0) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\mimetools.py", line 16, in __init__ rfc822.Message.__init__(self, fp, seekable) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\rfc822.py", line 104, in __init__ self.readheaders() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\client.py", line 266, in readheaders line = str(self.fp.readline(), "iso-8859-1") File "C:\buildbot\3.0.heller-windows-amd64\build\lib\io.py", line 510, in readline b = self.read(nreadahead()) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\io.py", line 577, in read n = self.readinto(b) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socket.py", line 217, in readinto return self._sock.recv_into(b) socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host ====================================================================== FAIL: test_authorization (test.test_httpservers.CGIHTTPServerTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_httpservers.py", line 339, in test_authorization (res.read(), res.getheader('Content-type'), res.status)) AssertionError: (b'Hello World\n', 'text/html', 200) != (b'', None, 200) ====================================================================== FAIL: test_headers_and_content (test.test_httpservers.CGIHTTPServerTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_httpservers.py", line 320, in test_headers_and_content (res.read(), res.getheader('Content-type'), res.status)) AssertionError: (b'Hello World\n', 'text/html', 200) != (b'', None, 200) ====================================================================== ERROR: test_mac_ver (test.test_platform.PlatformTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_platform.py", line 68, in test_mac_ver if os.uname()[0] == 'Darwin': AttributeError: 'module' object has no attribute 'uname' ====================================================================== FAIL: test_html_doc (test.test_pydoc.PyDocDocTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_pydoc.py", line 237, in test_html_doc self.fail("outputs are not equal, see diff above") AssertionError: outputs are not equal, see diff above ====================================================================== FAIL: test_s_option (test.test_site.HelperFunctionsTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_site.py", line 105, in test_s_option self.assertEqual(rc, 1) AssertionError: 0 != 1 ====================================================================== ERROR: test_alias_asterisk (test.test_winsound.PlaySoundTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_winsound.py", line 87, in test_alias_asterisk winsound.PlaySound('SystemAsterisk', winsound.SND_ALIAS) RuntimeError: Failed to play sound ====================================================================== ERROR: test_alias_exclamation (test.test_winsound.PlaySoundTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_winsound.py", line 97, in test_alias_exclamation winsound.PlaySound('SystemExclamation', winsound.SND_ALIAS) RuntimeError: Failed to play sound ====================================================================== ERROR: test_alias_exit (test.test_winsound.PlaySoundTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_winsound.py", line 107, in test_alias_exit winsound.PlaySound('SystemExit', winsound.SND_ALIAS) RuntimeError: Failed to play sound ====================================================================== ERROR: test_alias_hand (test.test_winsound.PlaySoundTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_winsound.py", line 117, in test_alias_hand winsound.PlaySound('SystemHand', winsound.SND_ALIAS) RuntimeError: Failed to play sound ====================================================================== ERROR: test_alias_question (test.test_winsound.PlaySoundTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\test\test_winsound.py", line 127, in test_alias_question winsound.PlaySound('SystemQuestion', winsound.SND_ALIAS) RuntimeError: Failed to play sound Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 614, in __init__ self.handle() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 358, in handle_one_request method() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 617, in do_GET f = self.send_head() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 849, in send_head return self.run_cgi() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 3, in File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 614, in __init__ self.handle() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 358, in handle_one_request method() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 617, in do_GET f = self.send_head() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 849, in send_head return self.run_cgi() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 3, in File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str Traceback (most recent call last): File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 281, in _handle_request_noblock self.process_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 307, in process_request self.finish_request(request, client_address) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 320, in finish_request self.RequestHandlerClass(request, client_address, self) File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socketserver.py", line 614, in __init__ self.handle() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 364, in handle self.handle_one_request() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 358, in handle_one_request method() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 842, in do_POST self.run_cgi() File "C:\buildbot\3.0.heller-windows-amd64\build\lib\http\server.py", line 1102, in run_cgi exec(open(scriptfile).read(), {"__name__": "__main__"}) File "", line 4, in File "C:\buildbot\3.0.heller-windows-amd64\build\lib\socket.py", line 222, in write return self._sock.send(b) TypeError: send() argument 1 must be bytes or read-only buffer, not str sincerely, -The Buildbot From python-checkins at python.org Sun Jun 1 16:30:25 2008 From: python-checkins at python.org (david.goodger) Date: Sun, 1 Jun 2008 16:30:25 +0200 (CEST) Subject: [Python-checkins] r63852 - peps/trunk/pep-3140.txt Message-ID: <20080601143025.113D21E400C@bag.python.org> Author: david.goodger Date: Sun Jun 1 16:30:24 2008 New Revision: 63852 Log: typo, spelling, caps Modified: peps/trunk/pep-3140.txt Modified: peps/trunk/pep-3140.txt ============================================================================== --- peps/trunk/pep-3140.txt (original) +++ peps/trunk/pep-3140.txt Sun Jun 1 16:30:24 2008 @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date: 2008-05-28 20:38:33 -0600 (Thu, 28 May 2008)$ Author: Oleg Broytmann , - Jim Jewett + Jim Jewett Discussions-To: python-3000 at python.org Status: Rejected Type: Standards Track @@ -40,7 +40,7 @@ -- there is no standard way to print a container's content calling items' __str__, that's inconvenient in cases where __str__ and __repr__ return different results; - -- repr(item) sometimes do wrong things (hex-escapes non-ascii + -- repr(item) sometimes do wrong things (hex-escapes non-ASCII strings, e.g.) This PEP proposes to change how str(container) works. It is @@ -69,14 +69,14 @@ The disadvantage is that __repr__ often returns technical data (like '') or unreadable string (hex-encoded - string if the input is non-ascii string): + string if the input is non-ASCII string): >>> print(['????']) ['\xd4\xc5\xd3\xd4'] One of the motivations for PEP 3138 is that neither repr nor str - will allow the sensible printing of dicts whose keys are non-ascii - text strings. Now that unicode identifiers are allowed, it + will allow the sensible printing of dicts whose keys are non-ASCII + text strings. Now that Unicode identifiers are allowed, it includes Python's own attribute dicts. This also includes JSON serialization (and caused some hoops for the json lib). @@ -85,7 +85,7 @@ persistence) outputs some objects, with system-dependent failures. Changing how str(container) works would allow easy debugging in - the normal case, and retrain the safety of ASCII-only for the + the normal case, and retain the safety of ASCII-only for the machine-readable case. The only downside is that str(x) and repr(x) would more often be different -- but only in those cases where the current almost-the-same version is insufficient. @@ -169,9 +169,9 @@ drawback of the proposal is that every __repr__ implementation must be changed. Introspection could help a bit (inspect __repr__ before calling if it accepts 2 or 3 parameters), but introspection - doesn't work on classes written in C, like all builtin containers. + doesn't work on classes written in C, like all built-in containers. - Less radical proposal is to implement __str__ methods for builtin + Less radical proposal is to implement __str__ methods for built-in container types. The obvious drawback is a duplication of effort - all those __str__ and __repr__ implementations are only differ in one small detail - if they call str or repr on items. From python-checkins at python.org Sun Jun 1 16:55:06 2008 From: python-checkins at python.org (thomas.lee) Date: Sun, 1 Jun 2008 16:55:06 +0200 (CEST) Subject: [Python-checkins] r63853 - in python/branches/tlee-ast-optimize: Include/compile.h Include/optimize.h Python/bltinmodule.c Python/compile.c Python/optimize.c Python/pythonrun.c Message-ID: <20080601145506.6E2961E4009@bag.python.org> Author: thomas.lee Date: Sun Jun 1 16:55:05 2008 New Revision: 63853 Log: Making a move towards the separation of symbol table generation and compilation. This will allow us to use symtable information in the optimizer and fixes a few problems that might otherwise be caused by the optimizer. Modified: python/branches/tlee-ast-optimize/Include/compile.h python/branches/tlee-ast-optimize/Include/optimize.h python/branches/tlee-ast-optimize/Python/bltinmodule.c python/branches/tlee-ast-optimize/Python/compile.c python/branches/tlee-ast-optimize/Python/optimize.c python/branches/tlee-ast-optimize/Python/pythonrun.c Modified: python/branches/tlee-ast-optimize/Include/compile.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/compile.h (original) +++ python/branches/tlee-ast-optimize/Include/compile.h Sun Jun 1 16:55:05 2008 @@ -32,6 +32,8 @@ PyAPI_FUNC(PyCodeObject *) PyAST_Compile(struct _mod *, const char *, PyCompilerFlags *, PyArena *); PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *); +PyAPI_FUNC(int) PyAST_BuildSymbolInfo(struct _mod *, PyFutureFeatures**, + struct symtable**, const char*, PyCompilerFlags*); #define ERR_LATE_FUTURE \ "from __future__ imports must occur at the beginning of the file" Modified: python/branches/tlee-ast-optimize/Include/optimize.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/optimize.h (original) +++ python/branches/tlee-ast-optimize/Include/optimize.h Sun Jun 1 16:55:05 2008 @@ -5,7 +5,8 @@ extern "C" { #endif -PyAPI_FUNC(int) PyAST_Optimize(mod_ty* mod_ptr, PyArena* arena); +PyAPI_FUNC(int) PyAST_Optimize(mod_ty* mod_ptr, struct symtable* st, + PyArena* arena); #ifdef __cplusplus }; Modified: python/branches/tlee-ast-optimize/Python/bltinmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/bltinmodule.c (original) +++ python/branches/tlee-ast-optimize/Python/bltinmodule.c Sun Jun 1 16:55:05 2008 @@ -6,6 +6,7 @@ #include "node.h" #include "code.h" #include "eval.h" +#include "symtable.h" #include "optimize.h" #include @@ -515,6 +516,8 @@ else { PyArena *arena; mod_ty mod; + struct symtable* st; + PyFutureFeatures* future; arena = PyArena_New(); mod = PyAST_obj2mod(cmd, arena, mode); @@ -522,9 +525,15 @@ PyArena_Free(arena); return NULL; } + if (!PyAST_BuildSymbolInfo(mod, &future, &st, filename, &cf)) { + PyArena_Free(arena); + return NULL; + } if (!(supplied_flags & PyCF_NO_OPTIMIZE)) { - if (!PyAST_Optimize(&mod, arena)) { + if (!PyAST_Optimize(&mod, st, arena)) { PyArena_Free(arena); + PySymtable_Free(st); + PyObject_Free(future); return NULL; } } Modified: python/branches/tlee-ast-optimize/Python/compile.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/compile.c (original) +++ python/branches/tlee-ast-optimize/Python/compile.c Sun Jun 1 16:55:05 2008 @@ -180,6 +180,31 @@ static PyCodeObject *assemble(struct compiler *, int addNone); static PyObject *__doc__; +int +PyAST_BuildSymbolInfo(mod_ty mod, PyFutureFeatures** f, struct symtable** st, + const char* filename, PyCompilerFlags* cf) +{ + int merged; + + *f = PyFuture_FromAST(mod, filename); + if (*f == NULL) + return 0; + + merged = (*f)->ff_features | (cf ? cf->cf_flags : 0); + (*f)->ff_features = merged; + + *st = PySymtable_Build(mod, filename, *f); + if (*st == NULL) { + PyObject_Free(*st); + return 0; + } + + if (cf != NULL) + cf->cf_flags = merged; + + return 1; +} + PyObject * _Py_Mangle(PyObject *privateobj, PyObject *ident) { @@ -247,7 +272,6 @@ struct compiler c; PyCodeObject *co = NULL; PyCompilerFlags local_flags; - int merged; if (!__doc__) { __doc__ = PyString_InternFromString("__doc__"); @@ -259,25 +283,13 @@ return NULL; c.c_filename = filename; c.c_arena = arena; - c.c_future = PyFuture_FromAST(mod, filename); - if (c.c_future == NULL) - goto finally; if (!flags) { local_flags.cf_flags = 0; flags = &local_flags; } - merged = c.c_future->ff_features | flags->cf_flags; - c.c_future->ff_features = merged; - flags->cf_flags = merged; - c.c_flags = flags; - c.c_nestlevel = 0; - - c.c_st = PySymtable_Build(mod, filename, c.c_future); - if (c.c_st == NULL) { - if (!PyErr_Occurred()) - PyErr_SetString(PyExc_SystemError, "no symtable"); - goto finally; - } + if (!PyAST_BuildSymbolInfo(mod, &c.c_future, &c.c_st, filename, flags)) + goto finally; + c.c_flags = flags; /* XXX initialize to NULL for now, need to handle */ c.c_encoding = NULL; @@ -300,8 +312,15 @@ return NULL; mod = PyAST_FromNode(n, NULL, filename, arena); if (mod != NULL) { - if (PyAST_Optimize(&mod, arena)) { - co = PyAST_Compile(mod, filename, NULL, arena); + PyFutureFeatures* future; + struct symtable* st; + + if (PyAST_BuildSymbolInfo(mod, &future, &st, filename, NULL)) { + if (PyAST_Optimize(&mod, st, arena)) { + co = PyAST_Compile(mod, filename, NULL, arena); + } + PyObject_Free(future); + PySymtable_Free(st); } } PyArena_Free(arena); @@ -311,10 +330,10 @@ static void compiler_free(struct compiler *c) { - if (c->c_st) - PySymtable_Free(c->c_st); - if (c->c_future) - PyObject_Free(c->c_future); + if (c->c_st != NULL) + PySymtable_Free(c->c_st); + if (c->c_future) + PyObject_Free(c->c_future); Py_DECREF(c->c_stack); } Modified: python/branches/tlee-ast-optimize/Python/optimize.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/optimize.c (original) +++ python/branches/tlee-ast-optimize/Python/optimize.c Sun Jun 1 16:55:05 2008 @@ -4,14 +4,22 @@ #include "pyerrors.h" #include "node.h" #include "ast.h" +#include "symtable.h" -static int optimize_expr(expr_ty* expr_ptr, PyArena* arena); -static int optimize_stmt(stmt_ty* stmt_ptr, PyArena* arena); -static int optimize_comprehension(comprehension_ty* comp_ptr, PyArena* arena); -static int optimize_excepthandler(excepthandler_ty* exc_ptr, PyArena* arena); -static int optimize_keyword(keyword_ty* kwd_ptr, PyArena* arena); -static int optimize_arguments(arguments_ty* args_ptr, PyArena* arena); -static int optimize_slice(slice_ty* slice_ptr, PyArena* arena); +static int optimize_expr(expr_ty* expr_ptr, PySTEntryObject* ste, + PyArena* arena); +static int optimize_stmt(stmt_ty* stmt_ptr, PySTEntryObject* ste, + PyArena* arena); +static int optimize_comprehension(comprehension_ty* comp_ptr, + PySTEntryObject* ste, PyArena* arena); +static int optimize_excepthandler(excepthandler_ty* exc_ptr, + PySTEntryObject* ste, PyArena* arena); +static int optimize_keyword(keyword_ty* kwd_ptr, PySTEntryObject* ste, + PyArena* arena); +static int optimize_arguments(arguments_ty* args_ptr, PySTEntryObject* ste, + PyArena* arena); +static int optimize_slice(slice_ty* slice_ptr, PySTEntryObject* ste, + PyArena* arena); /** * Determine the constant value of a given expression. It's assumed that @@ -133,12 +141,12 @@ * Optimize a sequence of expressions. */ static int -optimize_expr_seq(asdl_seq** seq_ptr, PyArena* arena) +optimize_expr_seq(asdl_seq** seq_ptr, PySTEntryObject* ste, PyArena* arena) { int n; asdl_seq* seq = *seq_ptr; for (n = 0; n < asdl_seq_LEN(seq); n++) - if (!optimize_expr((expr_ty*)&asdl_seq_GET(seq, n), arena)) + if (!optimize_expr((expr_ty*)&asdl_seq_GET(seq, n), ste, arena)) return 0; return 1; } @@ -186,7 +194,8 @@ * Replaces the AST node at `n' with a Pass() node. */ static asdl_seq* -_asdl_seq_replace_with_pass(asdl_seq* seq, int n, int lineno, int col_offset, PyArena* arena) +_asdl_seq_replace_with_pass(asdl_seq* seq, int n, int lineno, int col_offset, + PyArena* arena) { stmt_ty pass = Pass(lineno, col_offset, arena); if (pass == NULL) @@ -199,13 +208,13 @@ * Optimize a sequence of statements. */ static int -optimize_stmt_seq(asdl_seq** seq_ptr, PyArena* arena) +optimize_stmt_seq(asdl_seq** seq_ptr, PySTEntryObject* ste, PyArena* arena) { int n; asdl_seq* seq = *seq_ptr; for (n = 0; n < asdl_seq_LEN(seq); n++) { stmt_ty stmt = asdl_seq_GET(seq, n); - if (!optimize_stmt((stmt_ty*)&asdl_seq_GET(seq, n), arena)) + if (!optimize_stmt((stmt_ty*)&asdl_seq_GET(seq, n), ste, arena)) return 0; if (stmt->kind == If_kind) { @@ -243,57 +252,59 @@ } static int -optimize_comprehension_seq(asdl_seq** seq_ptr, PyArena* arena) +optimize_comprehension_seq(asdl_seq** seq_ptr, PySTEntryObject* ste, + PyArena* arena) { int n; asdl_seq* seq = *seq_ptr; for (n = 0; n < asdl_seq_LEN(seq); n++) { comprehension_ty* comp; comp = (comprehension_ty*)&asdl_seq_GET(seq, n); - if (!optimize_comprehension(comp, arena)) + if (!optimize_comprehension(comp, ste, arena)) return 0; } return 1; } static int -optimize_excepthandler_seq(asdl_seq** seq_ptr, PyArena* arena) +optimize_excepthandler_seq(asdl_seq** seq_ptr, PySTEntryObject* ste, + PyArena* arena) { int n; asdl_seq* seq = *seq_ptr; for (n = 0; n < asdl_seq_LEN(seq); n++) { excepthandler_ty* excepthandler; excepthandler = (excepthandler_ty*)&asdl_seq_GET(seq, n); - if (!optimize_excepthandler(excepthandler, arena)) + if (!optimize_excepthandler(excepthandler, ste, arena)) return 0; } return 1; } static int -optimize_keyword_seq(asdl_seq** seq_ptr, PyArena* arena) +optimize_keyword_seq(asdl_seq** seq_ptr, PySTEntryObject* ste, PyArena* arena) { int n; asdl_seq* seq = *seq_ptr; for (n = 0; n < asdl_seq_LEN(seq); n++) - if (!optimize_keyword((keyword_ty*)&asdl_seq_GET(seq, n), arena)) + if (!optimize_keyword((keyword_ty*)&asdl_seq_GET(seq, n), ste, arena)) return 0; return 1; } static int -optimize_slice_seq(asdl_seq** seq_ptr, PyArena* arena) +optimize_slice_seq(asdl_seq** seq_ptr, PySTEntryObject* ste, PyArena* arena) { int n; asdl_seq* seq = *seq_ptr; for (n = 0; n < asdl_seq_LEN(seq); n++) - if (!optimize_slice((slice_ty*)&asdl_seq_GET(seq, n), arena)) + if (!optimize_slice((slice_ty*)&asdl_seq_GET(seq, n), ste, arena)) return 0; return 1; } static int -optimize_mod(mod_ty* mod_ptr, PyArena* arena) +optimize_mod(mod_ty* mod_ptr, PySTEntryObject* ste, PyArena* arena) { asdl_seq** body; mod_ty mod = *mod_ptr; @@ -316,7 +327,7 @@ } case Expression_kind: { - return optimize_expr(&mod->v.Expression.body, arena); + return optimize_expr(&mod->v.Expression.body, ste, arena); } default: PyErr_Format(PyExc_ValueError, "unknown mod_ty kind: %d", @@ -324,28 +335,28 @@ return 0; }; - return optimize_stmt_seq(body, arena); + return optimize_stmt_seq(body, ste, arena); } static int -optimize_bool_op(expr_ty* expr_ptr, PyArena* arena) +optimize_bool_op(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; - if (!optimize_expr_seq(&expr->v.BoolOp.values, arena)) + if (!optimize_expr_seq(&expr->v.BoolOp.values, ste, arena)) return 0; return 1; } static int -optimize_bin_op(expr_ty* expr_ptr, PyArena* arena) +optimize_bin_op(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { PyObject* left; PyObject* right; expr_ty expr = *expr_ptr; - if (!optimize_expr(&expr->v.BinOp.left, arena)) + if (!optimize_expr(&expr->v.BinOp.left, ste, arena)) return 0; - if (!optimize_expr(&expr->v.BinOp.right, arena)) + if (!optimize_expr(&expr->v.BinOp.right, ste, arena)) return 0; /* @@ -472,11 +483,11 @@ } static int -optimize_unary_op(expr_ty* expr_ptr, PyArena* arena) +optimize_unary_op(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { PyObject* operand; expr_ty expr = *expr_ptr; - if (!optimize_expr(&expr->v.UnaryOp.operand, arena)) + if (!optimize_expr(&expr->v.UnaryOp.operand, ste, arena)) return 0; operand = _expr_constant_value(expr->v.UnaryOp.operand); if (operand != NULL) { @@ -537,76 +548,82 @@ } static int -optimize_lambda(expr_ty* expr_ptr, PyArena* arena) +optimize_lambda(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; - if (!optimize_expr(&expr->v.Lambda.body, arena)) + /* XXX: do we need to look up ste again? */ + if (!optimize_expr(&expr->v.Lambda.body, ste, arena)) return 0; return 1; } -static int optimize_if_exp(expr_ty* expr_ptr, PyArena* arena) { +static int optimize_if_exp(expr_ty* expr_ptr, PySTEntryObject* ste, + PyArena* arena) { expr_ty expr = *expr_ptr; - if (!optimize_expr(&expr->v.IfExp.test, arena)) + if (!optimize_expr(&expr->v.IfExp.test, ste, arena)) return 0; - if (!optimize_expr(&expr->v.IfExp.body, arena)) + if (!optimize_expr(&expr->v.IfExp.body, ste, arena)) return 0; - if (!optimize_expr(&expr->v.IfExp.orelse, arena)) + if (!optimize_expr(&expr->v.IfExp.orelse, ste, arena)) return 0; return 1; } -static int optimize_dict(expr_ty* expr_ptr, PyArena* arena) { +static int optimize_dict(expr_ty* expr_ptr, PySTEntryObject* ste, + PyArena* arena) +{ expr_ty expr = *expr_ptr; - if (!optimize_expr_seq(&expr->v.Dict.keys, arena)) + if (!optimize_expr_seq(&expr->v.Dict.keys, ste, arena)) return 0; - if (!optimize_expr_seq(&expr->v.Dict.values, arena)) + if (!optimize_expr_seq(&expr->v.Dict.values, ste, arena)) return 0; return 1; } static int -optimize_comprehension(comprehension_ty* comp_ptr, PyArena* arena) +optimize_comprehension(comprehension_ty* comp_ptr, PySTEntryObject* ste, + PyArena* arena) { comprehension_ty comp = *comp_ptr; - if (!optimize_expr(&comp->target, arena)) + if (!optimize_expr(&comp->target, ste, arena)) return 0; - if (!optimize_expr(&comp->iter, arena)) + if (!optimize_expr(&comp->iter, ste, arena)) return 0; - if (!optimize_expr_seq(&comp->ifs, arena)) + if (!optimize_expr_seq(&comp->ifs, ste, arena)) return 0; return 1; } static int -optimize_list_comp(expr_ty* expr_ptr, PyArena* arena) +optimize_list_comp(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; - if (!optimize_expr(&expr->v.ListComp.elt, arena)) + if (!optimize_expr(&expr->v.ListComp.elt, ste, arena)) return 0; - if (!optimize_comprehension_seq(&expr->v.ListComp.generators, arena)) + if (!optimize_comprehension_seq(&expr->v.ListComp.generators, ste, arena)) return 0; return 1; } static int -optimize_generator_exp(expr_ty* expr_ptr, PyArena* arena) +optimize_generator_exp(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; - if (!optimize_expr(&expr->v.GeneratorExp.elt, arena)) + if (!optimize_expr(&expr->v.GeneratorExp.elt, ste, arena)) return 0; - if (!optimize_comprehension_seq(&expr->v.GeneratorExp.generators, arena)) + if (!optimize_comprehension_seq(&expr->v.GeneratorExp.generators, ste, + arena)) return 0; return 1; } static int -optimize_yield(expr_ty* expr_ptr, PyArena* arena) +optimize_yield(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; if (expr->v.Yield.value != NULL) { expr_ty value; - if (!optimize_expr(&expr->v.Yield.value, arena)) + if (!optimize_expr(&expr->v.Yield.value, ste, arena)) return 0; value = expr->v.Yield.value; if (value->kind == Const_kind && value->v.Const.value == Py_None) @@ -616,100 +633,101 @@ } static int -optimize_compare(expr_ty* expr_ptr, PyArena* arena) +optimize_compare(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; - if (!optimize_expr(&expr->v.Compare.left, arena)) + if (!optimize_expr(&expr->v.Compare.left, ste, arena)) return 0; - if (!optimize_expr_seq(&expr->v.Compare.comparators, arena)) + if (!optimize_expr_seq(&expr->v.Compare.comparators, ste, arena)) return 0; return 1; } static int -optimize_keyword(keyword_ty* keyword_ptr, PyArena* arena) +optimize_keyword(keyword_ty* keyword_ptr, PySTEntryObject* ste, PyArena* arena) { keyword_ty keyword = *keyword_ptr; - if (!optimize_expr(&keyword->value, arena)) + if (!optimize_expr(&keyword->value, ste, arena)) return 0; return 1; } static int -optimize_arguments(arguments_ty* args_ptr, PyArena* arena) +optimize_arguments(arguments_ty* args_ptr, PySTEntryObject* ste, + PyArena* arena) { arguments_ty args = *args_ptr; - if (!optimize_expr_seq(&args->args, arena)) + if (!optimize_expr_seq(&args->args, ste, arena)) return 0; - if (!optimize_expr_seq(&args->defaults, arena)) + if (!optimize_expr_seq(&args->defaults, ste, arena)) return 0; return 1; } static int -optimize_call(expr_ty* expr_ptr, PyArena* arena) +optimize_call(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; - if (!optimize_expr(&expr->v.Call.func, arena)) + if (!optimize_expr(&expr->v.Call.func, ste, arena)) return 0; - if (!optimize_expr_seq(&expr->v.Call.args, arena)) + if (!optimize_expr_seq(&expr->v.Call.args, ste, arena)) return 0; - if (!optimize_keyword_seq(&expr->v.Call.keywords, arena)) + if (!optimize_keyword_seq(&expr->v.Call.keywords, ste, arena)) return 0; if (expr->v.Call.starargs != NULL) - if (!optimize_expr(&expr->v.Call.starargs, arena)) + if (!optimize_expr(&expr->v.Call.starargs, ste, arena)) return 0; if (expr->v.Call.kwargs != NULL) - if (!optimize_expr(&expr->v.Call.kwargs, arena)) + if (!optimize_expr(&expr->v.Call.kwargs, ste, arena)) return 0; return 1; } static int -optimize_repr(expr_ty* expr_ptr, PyArena* arena) +optimize_repr(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; - if (!optimize_expr(&expr->v.Repr.value, arena)) + if (!optimize_expr(&expr->v.Repr.value, ste, arena)) return 0; return 1; } static int -optimize_attribute(expr_ty* expr_ptr, PyArena* arena) +optimize_attribute(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; - if (!optimize_expr(&expr->v.Attribute.value, arena)) + if (!optimize_expr(&expr->v.Attribute.value, ste, arena)) return 0; return 1; } static int -optimize_slice(slice_ty* slice_ptr, PyArena* arena) +optimize_slice(slice_ty* slice_ptr, PySTEntryObject* ste, PyArena* arena) { slice_ty slice = *slice_ptr; switch (slice->kind) { case Slice_kind: { if (slice->v.Slice.lower != NULL) - if (!optimize_expr(&slice->v.Slice.lower, arena)) + if (!optimize_expr(&slice->v.Slice.lower, ste, arena)) return 0; if (slice->v.Slice.upper != NULL) - if (!optimize_expr(&slice->v.Slice.upper, arena)) + if (!optimize_expr(&slice->v.Slice.upper, ste, arena)) return 0; if (slice->v.Slice.step != NULL) - if (!optimize_expr(&slice->v.Slice.step, arena)) + if (!optimize_expr(&slice->v.Slice.step, ste, arena)) return 0; break; } case ExtSlice_kind: { - if (!optimize_slice_seq(&slice->v.ExtSlice.dims, arena)) + if (!optimize_slice_seq(&slice->v.ExtSlice.dims, ste, arena)) return 0; break; } case Index_kind: { - if (!optimize_expr(&slice->v.Index.value, arena)) + if (!optimize_expr(&slice->v.Index.value, ste, arena)) return 0; break; } @@ -726,21 +744,21 @@ } static int -optimize_subscript(expr_ty* expr_ptr, PyArena* arena) +optimize_subscript(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; - if (!optimize_expr(&expr->v.Subscript.value, arena)) + if (!optimize_expr(&expr->v.Subscript.value, ste, arena)) return 0; - if (!optimize_slice(&expr->v.Subscript.slice, arena)) + if (!optimize_slice(&expr->v.Subscript.slice, ste, arena)) return 0; return 1; } static int -optimize_tuple(expr_ty* expr_ptr, PyArena* arena) +optimize_tuple(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; - if (!optimize_expr_seq(&expr->v.Tuple.elts, arena)) + if (!optimize_expr_seq(&expr->v.Tuple.elts, ste, arena)) return 0; if (_is_sequence_of_constants(expr->v.Tuple.elts)) { @@ -756,7 +774,7 @@ } static int -optimize_name(expr_ty* expr_ptr, PyArena* arena) +optimize_name(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; const char* id = PyString_AS_STRING(expr->v.Name.id); @@ -783,77 +801,77 @@ } static int -optimize_expr(expr_ty* expr_ptr, PyArena* arena) +optimize_expr(expr_ty* expr_ptr, PySTEntryObject* ste, PyArena* arena) { expr_ty expr = *expr_ptr; switch (expr->kind) { case BoolOp_kind: { - return optimize_bool_op(expr_ptr, arena); + return optimize_bool_op(expr_ptr, ste, arena); } case BinOp_kind: { - return optimize_bin_op(expr_ptr, arena); + return optimize_bin_op(expr_ptr, ste, arena); } case UnaryOp_kind: { - return optimize_unary_op(expr_ptr, arena); + return optimize_unary_op(expr_ptr, ste, arena); } case Lambda_kind: { - return optimize_lambda(expr_ptr, arena); + return optimize_lambda(expr_ptr, ste, arena); } case IfExp_kind: { - return optimize_if_exp(expr_ptr, arena); + return optimize_if_exp(expr_ptr, ste, arena); } case Dict_kind: { - return optimize_dict(expr_ptr, arena); + return optimize_dict(expr_ptr, ste, arena); } case ListComp_kind: { - return optimize_list_comp(expr_ptr, arena); + return optimize_list_comp(expr_ptr, ste, arena); } case GeneratorExp_kind: { - return optimize_generator_exp(expr_ptr, arena); + return optimize_generator_exp(expr_ptr, ste, arena); } case Yield_kind: { - return optimize_yield(expr_ptr, arena); + return optimize_yield(expr_ptr, ste, arena); } case Compare_kind: { - return optimize_compare(expr_ptr, arena); + return optimize_compare(expr_ptr, ste, arena); } case Call_kind: { - return optimize_call(expr_ptr, arena); + return optimize_call(expr_ptr, ste, arena); } case Repr_kind: { - return optimize_repr(expr_ptr, arena); + return optimize_repr(expr_ptr, ste, arena); } case Attribute_kind: { - return optimize_attribute(expr_ptr, arena); + return optimize_attribute(expr_ptr, ste, arena); } case Subscript_kind: { - return optimize_subscript(expr_ptr, arena); + return optimize_subscript(expr_ptr, ste, arena); } case List_kind: { - return optimize_expr_seq(&expr->v.List.elts, arena); + return optimize_expr_seq(&expr->v.List.elts, ste, arena); } case Tuple_kind: { - return optimize_tuple(expr_ptr, arena); + return optimize_tuple(expr_ptr, ste, arena); } case Name_kind: { - return optimize_name(expr_ptr, arena); + return optimize_name(expr_ptr, ste, arena); } case Num_kind: case Str_kind: @@ -869,38 +887,38 @@ } static int -optimize_function_def(stmt_ty* stmt_ptr, PyArena* arena) +optimize_function_def(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_arguments(&stmt->v.FunctionDef.args, arena)) + if (!optimize_arguments(&stmt->v.FunctionDef.args, ste, arena)) return 0; - if (!optimize_expr_seq(&stmt->v.FunctionDef.decorator_list, arena)) + if (!optimize_expr_seq(&stmt->v.FunctionDef.decorator_list, ste, arena)) return 0; - if (!optimize_stmt_seq(&stmt->v.FunctionDef.body, arena)) + if (!optimize_stmt_seq(&stmt->v.FunctionDef.body, ste, arena)) return 0; return 1; } static int -optimize_class_def(stmt_ty* stmt_ptr, PyArena* arena) +optimize_class_def(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_expr_seq(&stmt->v.ClassDef.bases, arena)) + if (!optimize_expr_seq(&stmt->v.ClassDef.bases, ste, arena)) return 0; - if (!optimize_expr_seq(&stmt->v.ClassDef.decorator_list, arena)) + if (!optimize_expr_seq(&stmt->v.ClassDef.decorator_list, ste, arena)) return 0; - if (!optimize_stmt_seq(&stmt->v.ClassDef.body, arena)) + if (!optimize_stmt_seq(&stmt->v.ClassDef.body, ste, arena)) return 0; return 1; } static int -optimize_return(stmt_ty* stmt_ptr, PyArena* arena) +optimize_return(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; if (stmt->v.Return.value != NULL) { expr_ty value; - if (!optimize_expr(&stmt->v.Return.value, arena)) + if (!optimize_expr(&stmt->v.Return.value, ste, arena)) return 0; value = stmt->v.Return.value; if (value->kind == Const_kind && value->v.Const.value == Py_None) @@ -910,87 +928,87 @@ } static int -optimize_delete(stmt_ty* stmt_ptr, PyArena* arena) +optimize_delete(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_expr_seq(&stmt->v.Delete.targets, arena)) + if (!optimize_expr_seq(&stmt->v.Delete.targets, ste, arena)) return 0; return 1; } static int -optimize_assign(stmt_ty* stmt_ptr, PyArena* arena) +optimize_assign(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_expr_seq(&stmt->v.Assign.targets, arena)) + if (!optimize_expr_seq(&stmt->v.Assign.targets, ste, arena)) return 0; - if (!optimize_expr(&stmt->v.Assign.value, arena)) + if (!optimize_expr(&stmt->v.Assign.value, ste, arena)) return 0; return 1; } static int -optimize_aug_assign(stmt_ty* stmt_ptr, PyArena* arena) +optimize_aug_assign(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_expr(&stmt->v.AugAssign.target, arena)) + if (!optimize_expr(&stmt->v.AugAssign.target, ste, arena)) return 0; - if (!optimize_expr(&stmt->v.AugAssign.value, arena)) + if (!optimize_expr(&stmt->v.AugAssign.value, ste, arena)) return 0; return 1; } static int -optimize_print(stmt_ty* stmt_ptr, PyArena* arena) +optimize_print(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; if (stmt->v.Print.dest != NULL) - if (!optimize_expr(&stmt->v.Print.dest, arena)) + if (!optimize_expr(&stmt->v.Print.dest, ste, arena)) return 0; - if (!optimize_expr_seq(&stmt->v.Print.values, arena)) + if (!optimize_expr_seq(&stmt->v.Print.values, ste, arena)) return 0; return 1; } static int -optimize_for(stmt_ty* stmt_ptr, PyArena* arena) +optimize_for(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_expr(&stmt->v.For.target, arena)) + if (!optimize_expr(&stmt->v.For.target, ste, arena)) return 0; - if (!optimize_expr(&stmt->v.For.iter, arena)) + if (!optimize_expr(&stmt->v.For.iter, ste, arena)) return 0; - if (!optimize_stmt_seq(&stmt->v.For.body, arena)) + if (!optimize_stmt_seq(&stmt->v.For.body, ste, arena)) return 0; - if (!optimize_stmt_seq(&stmt->v.For.orelse, arena)) + if (!optimize_stmt_seq(&stmt->v.For.orelse, ste, arena)) return 0; return 1; } static int -optimize_while(stmt_ty* stmt_ptr, PyArena* arena) +optimize_while(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_expr(&stmt->v.While.test, arena)) + if (!optimize_expr(&stmt->v.While.test, ste, arena)) return 0; - if (!optimize_stmt_seq(&stmt->v.While.body, arena)) + if (!optimize_stmt_seq(&stmt->v.While.body, ste, arena)) return 0; - if (!optimize_stmt_seq(&stmt->v.While.orelse, arena)) + if (!optimize_stmt_seq(&stmt->v.While.orelse, ste, arena)) return 0; return 1; } static int -optimize_if(stmt_ty* stmt_ptr, PyArena* arena) +optimize_if(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_expr(&stmt->v.If.test, arena)) + if (!optimize_expr(&stmt->v.If.test, ste, arena)) return 0; - if (!optimize_stmt_seq(&stmt->v.If.body, arena)) + if (!optimize_stmt_seq(&stmt->v.If.body, ste, arena)) return 0; - if (!optimize_stmt_seq(&stmt->v.If.orelse, arena)) + if (!optimize_stmt_seq(&stmt->v.If.orelse, ste, arena)) return 0; if (stmt->v.If.test->kind == UnaryOp_kind && @@ -1020,174 +1038,187 @@ } static int -optimize_with(stmt_ty* stmt_ptr, PyArena* arena) +optimize_with(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_expr(&stmt->v.With.context_expr, arena)) + if (!optimize_expr(&stmt->v.With.context_expr, ste, arena)) return 0; if (stmt->v.With.optional_vars != NULL) - if (!optimize_expr(&stmt->v.With.optional_vars, arena)) + if (!optimize_expr(&stmt->v.With.optional_vars, ste, arena)) return 0; - if (!optimize_stmt_seq(&stmt->v.With.body, arena)) + if (!optimize_stmt_seq(&stmt->v.With.body, ste, arena)) return 0; return 1; } static int -optimize_raise(stmt_ty* stmt_ptr, PyArena* arena) +optimize_raise(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; if (stmt->v.Raise.type != NULL) - if (!optimize_expr(&stmt->v.Raise.type, arena)) + if (!optimize_expr(&stmt->v.Raise.type, ste, arena)) return 0; if (stmt->v.Raise.inst != NULL) - if (!optimize_expr(&stmt->v.Raise.inst, arena)) + if (!optimize_expr(&stmt->v.Raise.inst, ste, arena)) return 0; if (stmt->v.Raise.tback != NULL) - if (!optimize_expr(&stmt->v.Raise.tback, arena)) + if (!optimize_expr(&stmt->v.Raise.tback, ste, arena)) return 0; return 1; } static int -optimize_excepthandler(excepthandler_ty* exc_ptr, PyArena* arena) +optimize_excepthandler(excepthandler_ty* exc_ptr, PySTEntryObject* ste, + PyArena* arena) { excepthandler_ty exc = *exc_ptr; if (exc->v.ExceptHandler.type != NULL) - if (!optimize_expr(&exc->v.ExceptHandler.type, arena)) + if (!optimize_expr(&exc->v.ExceptHandler.type, ste, arena)) return 0; if (exc->v.ExceptHandler.name != NULL) - if (!optimize_expr(&exc->v.ExceptHandler.name, arena)) + if (!optimize_expr(&exc->v.ExceptHandler.name, ste, arena)) return 0; - if (!optimize_stmt_seq(&exc->v.ExceptHandler.body, arena)) + if (!optimize_stmt_seq(&exc->v.ExceptHandler.body, ste, arena)) return 0; return 1; } static int -optimize_try_except(stmt_ty* stmt_ptr, PyArena* arena) +optimize_try_except(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_stmt_seq(&stmt->v.TryExcept.body, arena)) + if (!optimize_stmt_seq(&stmt->v.TryExcept.body, ste, arena)) return 0; - if (!optimize_excepthandler_seq(&stmt->v.TryExcept.handlers, arena)) + if (!optimize_excepthandler_seq(&stmt->v.TryExcept.handlers, ste, arena)) return 0; - if (!optimize_stmt_seq(&stmt->v.TryExcept.orelse, arena)) + if (!optimize_stmt_seq(&stmt->v.TryExcept.orelse, ste, arena)) return 0; return 1; } static int -optimize_try_finally(stmt_ty* stmt_ptr, PyArena* arena) +optimize_try_finally(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_stmt_seq(&stmt->v.TryFinally.body, arena)) + if (!optimize_stmt_seq(&stmt->v.TryFinally.body, ste, arena)) return 0; - if (!optimize_stmt_seq(&stmt->v.TryFinally.finalbody, arena)) + if (!optimize_stmt_seq(&stmt->v.TryFinally.finalbody, ste, arena)) return 0; return 1; } static int -optimize_assert(stmt_ty* stmt_ptr, PyArena* arena) +optimize_assert(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_expr(&stmt->v.Assert.test, arena)) + if (!optimize_expr(&stmt->v.Assert.test, ste, arena)) return 0; if (stmt->v.Assert.msg != NULL) - if (!optimize_expr(&stmt->v.Assert.msg, arena)) + if (!optimize_expr(&stmt->v.Assert.msg, ste, arena)) return 0; return 1; } static int -optimize_exec(stmt_ty* stmt_ptr, PyArena* arena) +optimize_exec(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; - if (!optimize_expr(&stmt->v.Exec.body, arena)) + if (!optimize_expr(&stmt->v.Exec.body, ste, arena)) return 0; if (stmt->v.Exec.globals != NULL) - if (!optimize_expr(&stmt->v.Exec.globals, arena)) + if (!optimize_expr(&stmt->v.Exec.globals, ste, arena)) return 0; if (stmt->v.Exec.locals != NULL) - if (!optimize_expr(&stmt->v.Exec.locals, arena)) + if (!optimize_expr(&stmt->v.Exec.locals, ste, arena)) return 0; return 1; } static int -optimize_stmt(stmt_ty* stmt_ptr, PyArena* arena) +optimize_stmt(stmt_ty* stmt_ptr, PySTEntryObject* ste, PyArena* arena) { stmt_ty stmt = *stmt_ptr; switch (stmt->kind) { case FunctionDef_kind: { - return optimize_function_def(stmt_ptr, arena); + int rc; + ste = PySymtable_Lookup(ste->ste_table, *stmt_ptr); + if (ste == NULL) + return 0; + rc = optimize_function_def(stmt_ptr, ste, arena); + Py_DECREF(ste); + return rc; } case ClassDef_kind: { - return optimize_class_def(stmt_ptr, arena); + int rc; + ste = PySymtable_Lookup(ste->ste_table, *stmt_ptr); + if (ste == NULL) + return 0; + rc = optimize_class_def(stmt_ptr, ste, arena); + Py_DECREF(ste); + return rc; } case Return_kind: { - return optimize_return(stmt_ptr, arena); + return optimize_return(stmt_ptr, ste, arena); } case Delete_kind: { - return optimize_delete(stmt_ptr, arena); + return optimize_delete(stmt_ptr, ste, arena); } case Assign_kind: { - return optimize_assign(stmt_ptr, arena); + return optimize_assign(stmt_ptr, ste, arena); } case AugAssign_kind: { - return optimize_aug_assign(stmt_ptr, arena); + return optimize_aug_assign(stmt_ptr, ste, arena); } case Print_kind: { - return optimize_print(stmt_ptr, arena); + return optimize_print(stmt_ptr, ste, arena); } case For_kind: { - return optimize_for(stmt_ptr, arena); + return optimize_for(stmt_ptr, ste, arena); } case While_kind: { - return optimize_while(stmt_ptr, arena); + return optimize_while(stmt_ptr, ste, arena); } case If_kind: { - return optimize_if(stmt_ptr, arena); + return optimize_if(stmt_ptr, ste, arena); } case With_kind: { - return optimize_with(stmt_ptr, arena); + return optimize_with(stmt_ptr, ste, arena); } case Raise_kind: { - return optimize_raise(stmt_ptr, arena); + return optimize_raise(stmt_ptr, ste, arena); } case TryExcept_kind: { - return optimize_try_except(stmt_ptr, arena); + return optimize_try_except(stmt_ptr, ste, arena); } case TryFinally_kind: { - return optimize_try_finally(stmt_ptr, arena); + return optimize_try_finally(stmt_ptr, ste, arena); } case Assert_kind: { - return optimize_assert(stmt_ptr, arena); + return optimize_assert(stmt_ptr, ste, arena); } case Exec_kind: { - return optimize_exec(stmt_ptr, arena); + return optimize_exec(stmt_ptr, ste, arena); } case Expr_kind: { - return optimize_expr(&stmt->v.Expr.value, arena); + return optimize_expr(&stmt->v.Expr.value, ste, arena); } case Import_kind: case ImportFrom_kind: @@ -1211,8 +1242,14 @@ * Optimize an AST. */ int -PyAST_Optimize(mod_ty* mod_ptr, PyArena* arena) +PyAST_Optimize(mod_ty* mod_ptr, struct symtable* st, PyArena* arena) { - return optimize_mod(mod_ptr, arena); + int rc; + PySTEntryObject* ste = PySymtable_Lookup(st, *mod_ptr); + if (ste == NULL) + return 0; + rc = optimize_mod(mod_ptr, ste, arena); + Py_DECREF(ste); + return rc; } Modified: python/branches/tlee-ast-optimize/Python/pythonrun.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/pythonrun.c (original) +++ python/branches/tlee-ast-optimize/Python/pythonrun.c Sun Jun 1 16:55:05 2008 @@ -1386,9 +1386,20 @@ } mod = PyAST_FromNode(n, flags, filename, arena); PyNode_Free(n); - if (mod != NULL && flags && !(flags->cf_flags & PyCF_NO_OPTIMIZE)) - if (!PyAST_Optimize(&mod, arena)) - return NULL; + if (mod != NULL && flags && !(flags->cf_flags & PyCF_NO_OPTIMIZE)) { + PyFutureFeatures* future; + struct symtable* st; + + if (!PyAST_BuildSymbolInfo(mod, &future, &st, filename, flags)) { + if (!PyAST_Optimize(&mod, st, arena)) { + PyObject_Free(future); + PySymtable_Free(st); + return NULL; + } + PyObject_Free(future); + PySymtable_Free(st); + } + } return mod; } else { @@ -1414,9 +1425,20 @@ } mod = PyAST_FromNode(n, flags, filename, arena); PyNode_Free(n); - if (mod != NULL && flags && !(flags->cf_flags & PyCF_NO_OPTIMIZE)) - if (!PyAST_Optimize(&mod, arena)) - return NULL; + if (mod != NULL && flags && !(flags->cf_flags & PyCF_NO_OPTIMIZE)) { + PyFutureFeatures* future; + struct symtable* st; + + if (!PyAST_BuildSymbolInfo(mod, &future, &st, filename, flags)) { + if (!PyAST_Optimize(&mod, st, arena)) { + PySymtable_Free(st); + PyObject_Free(future); + return NULL; + } + PySymtable_Free(st); + PyObject_Free(future); + } + } return mod; } else { From buildbot at python.org Sun Jun 1 16:58:19 2008 From: buildbot at python.org (buildbot at python.org) Date: Sun, 01 Jun 2008 14:58:19 +0000 Subject: [Python-checkins] buildbot failure in sparc Debian 3.0 Message-ID: <20080601145819.C03B21E4009@bag.python.org> The Buildbot has detected a new failure of sparc Debian 3.0. Full details are available at: http://www.python.org/dev/buildbot/all/sparc%20Debian%203.0/builds/288 Buildbot URL: http://www.python.org/dev/buildbot/all/ Buildslave for this Build: klose-debian-sparc Build Reason: Build Source Stamp: [branch branches/py3k] HEAD Blamelist: martin.v.loewis BUILD FAILED: failed test Excerpt from the test logfile: 1 test failed: test_funcattrs make: *** [buildbottest] Error 1 sincerely, -The Buildbot From python-checkins at python.org Sun Jun 1 17:18:22 2008 From: python-checkins at python.org (thomas.lee) Date: Sun, 1 Jun 2008 17:18:22 +0200 (CEST) Subject: [Python-checkins] r63854 - in python/branches/tlee-ast-optimize: Doc/c-api/bytearray.rst Doc/c-api/concrete.rst Doc/c-api/file.rst Doc/c-api/string.rst Doc/c-api/type.rst Doc/includes/noddy2.c Doc/includes/noddy3.c Doc/includes/noddy4.c Doc/includes/run-func.c Doc/library/basehttpserver.rst Doc/library/cgihttpserver.rst Doc/library/cmd.rst Doc/library/codecs.rst Doc/library/commands.rst Doc/library/cookie.rst Doc/library/cookielib.rst Doc/library/easydialogs.rst Doc/library/ftplib.rst Doc/library/httplib.rst Doc/library/os.rst Doc/library/poplib.rst Doc/library/re.rst Doc/library/simplehttpserver.rst Doc/library/smtplib.rst Doc/library/socket.rst Doc/library/stdtypes.rst Doc/library/telnetlib.rst Doc/library/urllib2.rst Doc/library/userdict.rst Doc/tutorial/controlflow.rst Doc/tutorial/interpreter.rst Doc/using/cmdline.rst Doc/whatsnew/2.6.rst Include/Python.h Include/bytearrayobject.h Include/bytesobject.h Include/fileobject.h Include/floatobject.h Include/formatter_string.h Include/formatter_unicode.h Include/intobject.h Include/longobject.h Include/object.h Include/py_curses.h Include/pyerrors.h Include/pyport.h Include/pythonrun.h Include/stringobject.h Include/unicodeobject.h Include/warnings.h Lib/UserString.py Lib/bsddb/test/test_all.py Lib/collections.py Lib/commands.py Lib/ctypes/test/test_pointers.py Lib/distutils/command/bdist_wininst.py Lib/distutils/command/wininst-6.0.exe Lib/distutils/command/wininst-7.1.exe Lib/distutils/command/wininst-9.0-amd64.exe Lib/distutils/command/wininst-9.0.exe Lib/distutils/tests/test_build_ext.py Lib/ftplib.py Lib/heapq.py Lib/httplib.py Lib/lib-tk/Tkinter.py Lib/locale.py Lib/poplib.py Lib/smtplib.py Lib/socket.py Lib/sqlite3/test/dbapi.py Lib/sre_parse.py Lib/subprocess.py Lib/tarfile.py Lib/telnetlib.py Lib/test/pydoc_mod.py Lib/test/test___all__.py Lib/test/test_bsddb3.py Lib/test/test_ftplib.py Lib/test/test_httplib.py Lib/test/test_math.py Lib/test/test_poplib.py Lib/test/test_py3kwarn.py Lib/test/test_smtplib.py Lib/test/test_socket.py Lib/test/test_subprocess.py Lib/test/test_support.py Lib/test/test_sys.py Lib/test/test_tarfile.py Lib/test/test_telnetlib.py Lib/test/test_urllib.py Lib/test/test_urllib2.py Lib/test/test_urllib2net.py Lib/test/test_userstring.py Lib/urllib.py Lib/urllib2.py Lib/xmlrpclib.py Mac/Modules/MacOS.c Mac/Modules/Nav.c Mac/Modules/ae/_AEmodule.c Mac/Modules/cf/_CFmodule.c Mac/Modules/cf/pycfbridge.c Mac/Modules/file/_Filemodule.c Mac/Modules/qd/_Qdmodule.c Mac/Modules/qdoffs/_Qdoffsmodule.c Mac/Modules/res/_Resmodule.c Mac/Modules/scrap/_Scrapmodule.c Mac/Modules/snd/_Sndihooks.c Mac/Modules/win/_Winmodule.c Makefile.pre.in Misc/NEWS Modules/_bsddb.c Modules/_bytesio.c Modules/_codecsmodule.c Modules/_collectionsmodule.c Modules/_csv.c Modules/_ctypes/_ctypes.c Modules/_ctypes/callbacks.c Modules/_ctypes/callproc.c Modules/_ctypes/cfield.c Modules/_curses_panel.c Modules/_cursesmodule.c Modules/_elementtree.c Modules/_fileio.c Modules/_hashopenssl.c Modules/_heapqmodule.c Modules/_hotshot.c Modules/_json.c Modules/_localemodule.c Modules/_lsprof.c Modules/_sqlite/cache.c Modules/_sqlite/connection.c Modules/_sqlite/connection.h Modules/_sqlite/cursor.c Modules/_sqlite/cursor.h Modules/_sqlite/module.c Modules/_sqlite/row.c Modules/_sqlite/statement.c Modules/_sre.c Modules/_ssl.c Modules/_struct.c Modules/_testcapimodule.c Modules/_tkinter.c Modules/almodule.c Modules/arraymodule.c Modules/audioop.c Modules/binascii.c Modules/bsddbmodule.c Modules/bz2module.c Modules/cPickle.c Modules/cStringIO.c Modules/cdmodule.c Modules/cgensupport.c Modules/cjkcodecs/cjkcodecs.h Modules/cjkcodecs/multibytecodec.c Modules/clmodule.c Modules/datetimemodule.c Modules/dbmmodule.c Modules/dlmodule.c Modules/errnomodule.c Modules/fcntlmodule.c Modules/flmodule.c Modules/fmmodule.c Modules/gcmodule.c Modules/gdbmmodule.c Modules/glmodule.c Modules/grpmodule.c Modules/imageop.c Modules/imgfile.c Modules/itertoolsmodule.c Modules/linuxaudiodev.c Modules/main.c Modules/mathmodule.c Modules/md5module.c Modules/mmapmodule.c Modules/nismodule.c Modules/operator.c Modules/ossaudiodev.c Modules/parsermodule.c Modules/posixmodule.c Modules/pwdmodule.c Modules/pyexpat.c Modules/readline.c Modules/selectmodule.c Modules/sha256module.c Modules/sha512module.c Modules/shamodule.c Modules/socketmodule.c Modules/spwdmodule.c Modules/stropmodule.c Modules/sunaudiodev.c Modules/svmodule.c Modules/syslogmodule.c Modules/termios.c Modules/threadmodule.c Modules/timemodule.c Modules/unicodedata.c Modules/zipimport.c Modules/zlibmodule.c Objects/abstract.c Objects/boolobject.c Objects/bufferobject.c Objects/bytearrayobject.c Objects/bytes_methods.c Objects/bytesobject.c Objects/cellobject.c Objects/classobject.c Objects/codeobject.c Objects/complexobject.c Objects/descrobject.c Objects/dictobject.c Objects/exceptions.c Objects/fileobject.c Objects/floatobject.c Objects/frameobject.c Objects/funcobject.c Objects/genobject.c Objects/intobject.c Objects/listobject.c Objects/longobject.c Objects/methodobject.c Objects/moduleobject.c Objects/object.c Objects/rangeobject.c Objects/setobject.c Objects/sliceobject.c Objects/stringlib/formatter.h Objects/stringlib/string_format.h Objects/stringlib/stringdefs.h Objects/stringobject.c Objects/structseq.c Objects/tupleobject.c Objects/typeobject.c Objects/unicodeobject.c Objects/weakrefobject.c PC/VC6/pythoncore.dsp PC/VS7.1/pythoncore.vcproj PC/VS8.0/_bsddb.vcproj PC/VS8.0/_bsddb44.vcproj PC/VS8.0/_elementtree.vcproj PC/VS8.0/_hashlib.vcproj PC/VS8.0/_sqlite3.vcproj PC/VS8.0/_ssl.vcproj PC/VS8.0/_tkinter.vcproj PC/VS8.0/bdist_wininst.vcproj PC/VS8.0/debug.vsprops PC/VS8.0/kill_python.vcproj PC/VS8.0/make_versioninfo.vcproj PC/VS8.0/pcbuild.sln PC/VS8.0/pyd.vsprops PC/VS8.0/pyd_d.vsprops PC/VS8.0/pyproject.vsprops PC/VS8.0/python.vcproj PC/VS8.0/pythoncore.vcproj PC/VS8.0/release.vsprops PC/VS8.0/sqlite3.vcproj PC/VS8.0/x64.vsprops PC/_msi.c PC/_subprocess.c PC/_winreg.c PC/bdist_wininst/install.c PC/msvcrtmodule.c PC/winsound.c PCbuild/pythoncore.vcproj Parser/asdl_c.py Parser/tokenizer.c Python/Python-ast.c Python/_warnings.c Python/ast.c Python/bltinmodule.c Python/ceval.c Python/codecs.c Python/compile.c Python/errors.c Python/formatter_string.c Python/formatter_unicode.c Python/future.c Python/getargs.c Python/import.c Python/mactoolboxglue.c Python/marshal.c Python/modsupport.c Python/mysnprintf.c Python/peephole.c Python/pystrtod.c Python/pythonrun.c Python/structmember.c Python/symtable.c Python/sysmodule.c Python/traceback.c RISCOS/Modules/drawfmodule.c RISCOS/Modules/riscosmodule.c RISCOS/Modules/swimodule.c configure.in setup.py Message-ID: <20080601151822.A676A1E4009@bag.python.org> Author: thomas.lee Date: Sun Jun 1 17:18:10 2008 New Revision: 63854 Log: Merged revisions 63669-63853 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r63670 | thomas.heller | 2008-05-26 21:42:40 +1000 (Mon, 26 May 2008) | 4 lines On Windows, we must build a debug version iff running a debug build of Python ........ r63672 | christian.heimes | 2008-05-26 22:29:14 +1000 (Mon, 26 May 2008) | 4 lines First step of the C API rename: renamed Include/bytesobject.h to Include/bytearrayobject.h renamed Include/stringobject.h to Include/bytesobject.h added Include/stringobject.h with aliases ........ r63673 | benjamin.peterson | 2008-05-26 22:29:46 +1000 (Mon, 26 May 2008) | 2 lines some updates to string formatting section in whatsnew ........ r63675 | christian.heimes | 2008-05-26 22:51:38 +1000 (Mon, 26 May 2008) | 1 line Renamed PyString to PyBytes ........ r63677 | christian.heimes | 2008-05-26 23:01:01 +1000 (Mon, 26 May 2008) | 3 lines Renamed bytesobject.c to bytearrayobject.c Renamed stringobject.c to bytesobject.c Fixed Windows builds ........ r63678 | benjamin.peterson | 2008-05-26 23:01:25 +1000 (Mon, 26 May 2008) | 2 lines put a big note on configure.in asking people to run autoconf ........ r63679 | christian.heimes | 2008-05-26 23:15:11 +1000 (Mon, 26 May 2008) | 1 line Updated NEWS ........ r63685 | christian.heimes | 2008-05-26 23:51:41 +1000 (Mon, 26 May 2008) | 2 lines Used vs9to8.py to port all VS9.0 changes to 8.0 Updated VS7.1 and VC6 project files ........ r63686 | benjamin.peterson | 2008-05-27 00:02:09 +1000 (Tue, 27 May 2008) | 2 lines note that PyString and has been aliased to PyBytes ........ r63688 | benjamin.peterson | 2008-05-27 00:29:09 +1000 (Tue, 27 May 2008) | 2 lines fix a minor typo ........ r63690 | benjamin.peterson | 2008-05-27 00:51:54 +1000 (Tue, 27 May 2008) | 2 lines fix typo (thank Georg) ........ r63691 | georg.brandl | 2008-05-27 01:01:48 +1000 (Tue, 27 May 2008) | 2 lines Add renaming notices to 3.0 http package members. ........ r63696 | benjamin.peterson | 2008-05-27 01:54:26 +1000 (Tue, 27 May 2008) | 2 lines add PyByteArray docs ........ r63698 | benjamin.peterson | 2008-05-27 02:22:27 +1000 (Tue, 27 May 2008) | 2 lines add __all__ to test_support ........ r63704 | benjamin.peterson | 2008-05-27 03:43:53 +1000 (Tue, 27 May 2008) | 2 lines turn PyErr_WarnPy3k into a macro ........ r63714 | gregory.p.smith | 2008-05-27 05:03:35 +1000 (Tue, 27 May 2008) | 2 lines Define macros so that this still compiles on Python prior to r63675. ........ r63718 | gregory.p.smith | 2008-05-27 05:29:14 +1000 (Tue, 27 May 2008) | 3 lines Allow BerlekeyDB up through 4.7. I doubt any of our unixy buildbots even have that installed yet but the module code supports it. ........ r63719 | benjamin.peterson | 2008-05-27 05:37:11 +1000 (Tue, 27 May 2008) | 2 lines wrap line ........ r63721 | benjamin.peterson | 2008-05-27 05:41:53 +1000 (Tue, 27 May 2008) | 2 lines warn about some members of the commands module ........ r63724 | gregory.p.smith | 2008-05-27 06:22:14 +1000 (Tue, 27 May 2008) | 6 lines Fixes issue2791: subprocess.Popen.communicate leaked a file descripton until the last reference to the Popen instance was dropped. Adding explicit close() calls fixes it. Candidate for backport to release25-maint. ........ r63725 | benjamin.peterson | 2008-05-27 06:41:45 +1000 (Tue, 27 May 2008) | 2 lines take Brett's advice on a few warnings ........ r63726 | benjamin.peterson | 2008-05-27 06:43:24 +1000 (Tue, 27 May 2008) | 2 lines fix minor grammar typo ........ r63728 | gregory.p.smith | 2008-05-27 07:16:34 +1000 (Tue, 27 May 2008) | 4 lines Fix issue2589: there was a potential integer overflow leading to memory corruption on esoteric platforms and incorrect behavior on normal platforms. ........ r63732 | benjamin.peterson | 2008-05-27 07:44:26 +1000 (Tue, 27 May 2008) | 2 lines remove duplication in test module ........ r63734 | gregory.p.smith | 2008-05-27 08:07:28 +1000 (Tue, 27 May 2008) | 3 lines Fix issue2588: Do not execute str[size-1] = '\0' when a 0 size is passed in. (The assert won't prevent this in non-debug builds). ........ r63736 | benjamin.peterson | 2008-05-27 11:18:39 +1000 (Tue, 27 May 2008) | 2 lines remove some __getslice__ ........ r63738 | benjamin.peterson | 2008-05-27 11:42:29 +1000 (Tue, 27 May 2008) | 4 lines Improvements for test_py3kwarn - Always show warnings so they are always catchable - Make test_os_path_walk faster by walking a less populous directory ........ r63742 | gregory.p.smith | 2008-05-27 18:40:09 +1000 (Tue, 27 May 2008) | 3 lines Disable the use of BerkeleyDB 4.6 on platforms that appear to have issues with it. ........ r63744 | lars.gustaebel | 2008-05-27 22:39:23 +1000 (Tue, 27 May 2008) | 3 lines Do not close external file objects passed to tarfile.open(mode='w:bz2') when the TarFile is closed. ........ r63745 | jesus.cea | 2008-05-27 23:26:02 +1000 (Tue, 27 May 2008) | 1 line Better integration between Python testing and bsddb3 ........ r63754 | benjamin.peterson | 2008-05-28 11:12:35 +1000 (Wed, 28 May 2008) | 2 lines update tutorial function with more appropiate one from Eric Smith ........ r63755 | mark.hammond | 2008-05-28 11:54:55 +1000 (Wed, 28 May 2008) | 2 lines bdist_wininst now works correctly when both --skip-build and --plat-name are specified. ........ r63757 | georg.brandl | 2008-05-28 21:21:39 +1000 (Wed, 28 May 2008) | 2 lines #2989: add PyType_Modified(). ........ r63758 | benjamin.peterson | 2008-05-28 21:51:41 +1000 (Wed, 28 May 2008) | 2 lines fix spelling ........ r63760 | georg.brandl | 2008-05-29 01:41:36 +1000 (Thu, 29 May 2008) | 2 lines #2990: prevent inconsistent state while updating method cache. ........ r63767 | brett.cannon | 2008-05-29 15:08:50 +1000 (Thu, 29 May 2008) | 4 lines UserString.MutableString has been removed in Python 3.0. Works on issue #2877. Thanks Quentin Gallet-Gilles for the patch. ........ r63775 | georg.brandl | 2008-05-29 17:18:17 +1000 (Thu, 29 May 2008) | 2 lines Two fixes in bytearray docs. ........ r63776 | georg.brandl | 2008-05-29 17:18:49 +1000 (Thu, 29 May 2008) | 2 lines #2906: accept lists for options, and some cosmetic fixes in Tkinter. ........ r63781 | georg.brandl | 2008-05-29 17:38:37 +1000 (Thu, 29 May 2008) | 2 lines #2988: add note about catching CookieError when parsing untrusted cookie data. ........ r63782 | georg.brandl | 2008-05-29 17:45:26 +1000 (Thu, 29 May 2008) | 2 lines #2985: allow i8 in XMLRPC responses. ........ r63784 | raymond.hettinger | 2008-05-29 18:38:23 +1000 (Thu, 29 May 2008) | 1 line Fix two typos. ........ r63787 | georg.brandl | 2008-05-30 00:35:39 +1000 (Fri, 30 May 2008) | 2 lines Revert #2990 patch; it's not necessary as Armin showed. ........ r63788 | facundo.batista | 2008-05-30 02:39:26 +1000 (Fri, 30 May 2008) | 6 lines Fixed the semantic of timeout for socket.create_connection and all the upper level libraries that use it, including urllib2. Added and fixed some tests, and changed docs correspondingly. Thanks to John J Lee for the patch and the pusing, :) ........ r63791 | thomas.heller | 2008-05-30 05:18:12 +1000 (Fri, 30 May 2008) | 1 line Fix compiler warning. ........ r63792 | thomas.heller | 2008-05-30 05:42:34 +1000 (Fri, 30 May 2008) | 1 line ctypes NULL function pointers have a boolean False value now. ........ r63799 | brett.cannon | 2008-05-30 07:23:33 +1000 (Fri, 30 May 2008) | 1 line Turn off debugging output for building bsddb. ........ r63800 | brett.cannon | 2008-05-30 07:28:55 +1000 (Fri, 30 May 2008) | 1 line Note that UserList and UserString were moved to 'collections' in 3.0. ........ r63802 | mark.dickinson | 2008-05-30 12:46:53 +1000 (Fri, 30 May 2008) | 2 lines Fix typo in testSum ........ r63805 | raymond.hettinger | 2008-05-30 16:37:27 +1000 (Fri, 30 May 2008) | 1 line Issue 2784: fix leaks in exception exit. ........ r63806 | raymond.hettinger | 2008-05-30 16:49:47 +1000 (Fri, 30 May 2008) | 1 line Issue 2855: Fix obscure crasher by slowing down the entire module. Mimics what was done to dictionaries in r59223. ........ r63807 | raymond.hettinger | 2008-05-30 17:16:53 +1000 (Fri, 30 May 2008) | 1 line Issue 2903: Add __name__ in globals for namedtuple namespace. ........ r63808 | georg.brandl | 2008-05-30 17:54:16 +1000 (Fri, 30 May 2008) | 2 lines #2999: fix name of third parameter in unicode.replace()'s docstring. ........ r63814 | eric.smith | 2008-05-31 04:10:04 +1000 (Sat, 31 May 2008) | 1 line Refactor and clean up str.format() code (and helpers) in advance of optimizations. ........ r63817 | raymond.hettinger | 2008-05-31 04:20:50 +1000 (Sat, 31 May 2008) | 8 lines * Mark intermedidate computes values (hi, lo, yr) as volatile. * Expand comments. * Swap variable names in the sum_exact code so that x and y are consistently chosen as the larger and smaller magnitude values respectively. ........ r63818 | georg.brandl | 2008-05-31 05:12:13 +1000 (Sat, 31 May 2008) | 2 lines getloadavg() is not available on Windows. ........ r63819 | georg.brandl | 2008-05-31 05:17:29 +1000 (Sat, 31 May 2008) | 2 lines Better quote with single quotes. ........ r63823 | benjamin.peterson | 2008-05-31 06:44:39 +1000 (Sat, 31 May 2008) | 2 lines fix grammar ........ r63824 | marc-andre.lemburg | 2008-05-31 06:52:18 +1000 (Sat, 31 May 2008) | 5 lines Update the locale module alias table. Closes #3011. ........ r63827 | raymond.hettinger | 2008-05-31 13:24:31 +1000 (Sat, 31 May 2008) | 1 line Implement heapq in terms of less-than (to match list.sort()). ........ r63828 | mark.hammond | 2008-05-31 15:11:07 +1000 (Sat, 31 May 2008) | 2 lines Fix bdist_wininst --user-access-control for win2k ........ r63829 | mark.summerfield | 2008-05-31 23:05:34 +1000 (Sat, 31 May 2008) | 4 lines Added a note to [] that special forms & special chars lose their meaning and backrefs can't be used inside [] ........ r63830 | georg.brandl | 2008-06-01 00:40:09 +1000 (Sun, 01 Jun 2008) | 2 lines #3010: clarification about stdin/use_rawinput. ........ r63831 | georg.brandl | 2008-06-01 00:45:55 +1000 (Sun, 01 Jun 2008) | 2 lines #3005: add explaining sentence to easydialogs docs. ........ r63839 | gerhard.haering | 2008-06-01 07:33:27 +1000 (Sun, 01 Jun 2008) | 2 lines Fixed rowcount for SELECT statements. They're -1 now (again), for better DB-API 2.0 compliance. ........ r63846 | martin.v.loewis | 2008-06-01 17:20:46 +1000 (Sun, 01 Jun 2008) | 2 lines New environment variable PYTHONIOENCODING. ........ r63848 | martin.v.loewis | 2008-06-01 18:06:17 +1000 (Sun, 01 Jun 2008) | 2 lines Move sys_stream and sys_isatty out of the have-langinfo block. ........ r63849 | martin.v.loewis | 2008-06-01 18:19:02 +1000 (Sun, 01 Jun 2008) | 2 lines Typo: encoding -> codeset. ........ Added: python/branches/tlee-ast-optimize/Doc/c-api/bytearray.rst - copied unchanged from r63849, /python/trunk/Doc/c-api/bytearray.rst python/branches/tlee-ast-optimize/Include/bytearrayobject.h - copied unchanged from r63849, /python/trunk/Include/bytearrayobject.h python/branches/tlee-ast-optimize/Include/bytesobject.h - copied unchanged from r63849, /python/trunk/Include/bytesobject.h python/branches/tlee-ast-optimize/Include/stringobject.h - copied unchanged from r63849, /python/trunk/Include/stringobject.h python/branches/tlee-ast-optimize/Objects/bytearrayobject.c - copied unchanged from r63849, /python/trunk/Objects/bytearrayobject.c python/branches/tlee-ast-optimize/Objects/bytesobject.c - copied unchanged from r63849, /python/trunk/Objects/bytesobject.c python/branches/tlee-ast-optimize/PC/VS8.0/_bsddb44.vcproj - copied unchanged from r63849, /python/trunk/PC/VS8.0/_bsddb44.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/_hashlib.vcproj - copied unchanged from r63849, /python/trunk/PC/VS8.0/_hashlib.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/kill_python.vcproj - copied unchanged from r63849, /python/trunk/PC/VS8.0/kill_python.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/sqlite3.vcproj - copied unchanged from r63849, /python/trunk/PC/VS8.0/sqlite3.vcproj Removed: python/branches/tlee-ast-optimize/Include/formatter_string.h python/branches/tlee-ast-optimize/Include/formatter_unicode.h python/branches/tlee-ast-optimize/Objects/stringobject.c Modified: python/branches/tlee-ast-optimize/ (props changed) python/branches/tlee-ast-optimize/Doc/c-api/concrete.rst python/branches/tlee-ast-optimize/Doc/c-api/file.rst python/branches/tlee-ast-optimize/Doc/c-api/string.rst python/branches/tlee-ast-optimize/Doc/c-api/type.rst python/branches/tlee-ast-optimize/Doc/includes/noddy2.c python/branches/tlee-ast-optimize/Doc/includes/noddy3.c python/branches/tlee-ast-optimize/Doc/includes/noddy4.c python/branches/tlee-ast-optimize/Doc/includes/run-func.c python/branches/tlee-ast-optimize/Doc/library/basehttpserver.rst python/branches/tlee-ast-optimize/Doc/library/cgihttpserver.rst python/branches/tlee-ast-optimize/Doc/library/cmd.rst python/branches/tlee-ast-optimize/Doc/library/codecs.rst python/branches/tlee-ast-optimize/Doc/library/commands.rst python/branches/tlee-ast-optimize/Doc/library/cookie.rst python/branches/tlee-ast-optimize/Doc/library/cookielib.rst python/branches/tlee-ast-optimize/Doc/library/easydialogs.rst python/branches/tlee-ast-optimize/Doc/library/ftplib.rst python/branches/tlee-ast-optimize/Doc/library/httplib.rst python/branches/tlee-ast-optimize/Doc/library/os.rst python/branches/tlee-ast-optimize/Doc/library/poplib.rst python/branches/tlee-ast-optimize/Doc/library/re.rst python/branches/tlee-ast-optimize/Doc/library/simplehttpserver.rst python/branches/tlee-ast-optimize/Doc/library/smtplib.rst python/branches/tlee-ast-optimize/Doc/library/socket.rst python/branches/tlee-ast-optimize/Doc/library/stdtypes.rst python/branches/tlee-ast-optimize/Doc/library/telnetlib.rst python/branches/tlee-ast-optimize/Doc/library/urllib2.rst python/branches/tlee-ast-optimize/Doc/library/userdict.rst python/branches/tlee-ast-optimize/Doc/tutorial/controlflow.rst python/branches/tlee-ast-optimize/Doc/tutorial/interpreter.rst python/branches/tlee-ast-optimize/Doc/using/cmdline.rst python/branches/tlee-ast-optimize/Doc/whatsnew/2.6.rst python/branches/tlee-ast-optimize/Include/Python.h python/branches/tlee-ast-optimize/Include/fileobject.h python/branches/tlee-ast-optimize/Include/floatobject.h python/branches/tlee-ast-optimize/Include/intobject.h python/branches/tlee-ast-optimize/Include/longobject.h python/branches/tlee-ast-optimize/Include/object.h python/branches/tlee-ast-optimize/Include/py_curses.h python/branches/tlee-ast-optimize/Include/pyerrors.h python/branches/tlee-ast-optimize/Include/pyport.h python/branches/tlee-ast-optimize/Include/pythonrun.h python/branches/tlee-ast-optimize/Include/unicodeobject.h python/branches/tlee-ast-optimize/Include/warnings.h python/branches/tlee-ast-optimize/Lib/UserString.py python/branches/tlee-ast-optimize/Lib/bsddb/test/test_all.py python/branches/tlee-ast-optimize/Lib/collections.py python/branches/tlee-ast-optimize/Lib/commands.py python/branches/tlee-ast-optimize/Lib/ctypes/test/test_pointers.py python/branches/tlee-ast-optimize/Lib/distutils/command/bdist_wininst.py python/branches/tlee-ast-optimize/Lib/distutils/command/wininst-6.0.exe python/branches/tlee-ast-optimize/Lib/distutils/command/wininst-7.1.exe python/branches/tlee-ast-optimize/Lib/distutils/command/wininst-9.0-amd64.exe python/branches/tlee-ast-optimize/Lib/distutils/command/wininst-9.0.exe python/branches/tlee-ast-optimize/Lib/distutils/tests/test_build_ext.py python/branches/tlee-ast-optimize/Lib/ftplib.py python/branches/tlee-ast-optimize/Lib/heapq.py python/branches/tlee-ast-optimize/Lib/httplib.py python/branches/tlee-ast-optimize/Lib/lib-tk/Tkinter.py python/branches/tlee-ast-optimize/Lib/locale.py python/branches/tlee-ast-optimize/Lib/poplib.py python/branches/tlee-ast-optimize/Lib/smtplib.py python/branches/tlee-ast-optimize/Lib/socket.py python/branches/tlee-ast-optimize/Lib/sqlite3/test/dbapi.py python/branches/tlee-ast-optimize/Lib/sre_parse.py python/branches/tlee-ast-optimize/Lib/subprocess.py python/branches/tlee-ast-optimize/Lib/tarfile.py python/branches/tlee-ast-optimize/Lib/telnetlib.py python/branches/tlee-ast-optimize/Lib/test/pydoc_mod.py python/branches/tlee-ast-optimize/Lib/test/test___all__.py python/branches/tlee-ast-optimize/Lib/test/test_bsddb3.py python/branches/tlee-ast-optimize/Lib/test/test_ftplib.py python/branches/tlee-ast-optimize/Lib/test/test_httplib.py python/branches/tlee-ast-optimize/Lib/test/test_math.py python/branches/tlee-ast-optimize/Lib/test/test_poplib.py python/branches/tlee-ast-optimize/Lib/test/test_py3kwarn.py python/branches/tlee-ast-optimize/Lib/test/test_smtplib.py python/branches/tlee-ast-optimize/Lib/test/test_socket.py python/branches/tlee-ast-optimize/Lib/test/test_subprocess.py python/branches/tlee-ast-optimize/Lib/test/test_support.py python/branches/tlee-ast-optimize/Lib/test/test_sys.py python/branches/tlee-ast-optimize/Lib/test/test_tarfile.py python/branches/tlee-ast-optimize/Lib/test/test_telnetlib.py python/branches/tlee-ast-optimize/Lib/test/test_urllib.py python/branches/tlee-ast-optimize/Lib/test/test_urllib2.py python/branches/tlee-ast-optimize/Lib/test/test_urllib2net.py python/branches/tlee-ast-optimize/Lib/test/test_userstring.py python/branches/tlee-ast-optimize/Lib/urllib.py python/branches/tlee-ast-optimize/Lib/urllib2.py python/branches/tlee-ast-optimize/Lib/xmlrpclib.py python/branches/tlee-ast-optimize/Mac/Modules/MacOS.c python/branches/tlee-ast-optimize/Mac/Modules/Nav.c python/branches/tlee-ast-optimize/Mac/Modules/ae/_AEmodule.c python/branches/tlee-ast-optimize/Mac/Modules/cf/_CFmodule.c python/branches/tlee-ast-optimize/Mac/Modules/cf/pycfbridge.c python/branches/tlee-ast-optimize/Mac/Modules/file/_Filemodule.c python/branches/tlee-ast-optimize/Mac/Modules/qd/_Qdmodule.c python/branches/tlee-ast-optimize/Mac/Modules/qdoffs/_Qdoffsmodule.c python/branches/tlee-ast-optimize/Mac/Modules/res/_Resmodule.c python/branches/tlee-ast-optimize/Mac/Modules/scrap/_Scrapmodule.c python/branches/tlee-ast-optimize/Mac/Modules/snd/_Sndihooks.c python/branches/tlee-ast-optimize/Mac/Modules/win/_Winmodule.c python/branches/tlee-ast-optimize/Makefile.pre.in python/branches/tlee-ast-optimize/Misc/NEWS python/branches/tlee-ast-optimize/Modules/_bsddb.c python/branches/tlee-ast-optimize/Modules/_bytesio.c python/branches/tlee-ast-optimize/Modules/_codecsmodule.c python/branches/tlee-ast-optimize/Modules/_collectionsmodule.c python/branches/tlee-ast-optimize/Modules/_csv.c python/branches/tlee-ast-optimize/Modules/_ctypes/_ctypes.c python/branches/tlee-ast-optimize/Modules/_ctypes/callbacks.c python/branches/tlee-ast-optimize/Modules/_ctypes/callproc.c python/branches/tlee-ast-optimize/Modules/_ctypes/cfield.c python/branches/tlee-ast-optimize/Modules/_curses_panel.c python/branches/tlee-ast-optimize/Modules/_cursesmodule.c python/branches/tlee-ast-optimize/Modules/_elementtree.c python/branches/tlee-ast-optimize/Modules/_fileio.c python/branches/tlee-ast-optimize/Modules/_hashopenssl.c python/branches/tlee-ast-optimize/Modules/_heapqmodule.c python/branches/tlee-ast-optimize/Modules/_hotshot.c python/branches/tlee-ast-optimize/Modules/_json.c python/branches/tlee-ast-optimize/Modules/_localemodule.c python/branches/tlee-ast-optimize/Modules/_lsprof.c python/branches/tlee-ast-optimize/Modules/_sqlite/cache.c python/branches/tlee-ast-optimize/Modules/_sqlite/connection.c python/branches/tlee-ast-optimize/Modules/_sqlite/connection.h python/branches/tlee-ast-optimize/Modules/_sqlite/cursor.c python/branches/tlee-ast-optimize/Modules/_sqlite/cursor.h python/branches/tlee-ast-optimize/Modules/_sqlite/module.c python/branches/tlee-ast-optimize/Modules/_sqlite/row.c python/branches/tlee-ast-optimize/Modules/_sqlite/statement.c python/branches/tlee-ast-optimize/Modules/_sre.c python/branches/tlee-ast-optimize/Modules/_ssl.c python/branches/tlee-ast-optimize/Modules/_struct.c python/branches/tlee-ast-optimize/Modules/_testcapimodule.c python/branches/tlee-ast-optimize/Modules/_tkinter.c python/branches/tlee-ast-optimize/Modules/almodule.c python/branches/tlee-ast-optimize/Modules/arraymodule.c python/branches/tlee-ast-optimize/Modules/audioop.c python/branches/tlee-ast-optimize/Modules/binascii.c python/branches/tlee-ast-optimize/Modules/bsddbmodule.c python/branches/tlee-ast-optimize/Modules/bz2module.c python/branches/tlee-ast-optimize/Modules/cPickle.c python/branches/tlee-ast-optimize/Modules/cStringIO.c python/branches/tlee-ast-optimize/Modules/cdmodule.c python/branches/tlee-ast-optimize/Modules/cgensupport.c python/branches/tlee-ast-optimize/Modules/cjkcodecs/cjkcodecs.h python/branches/tlee-ast-optimize/Modules/cjkcodecs/multibytecodec.c python/branches/tlee-ast-optimize/Modules/clmodule.c python/branches/tlee-ast-optimize/Modules/datetimemodule.c python/branches/tlee-ast-optimize/Modules/dbmmodule.c python/branches/tlee-ast-optimize/Modules/dlmodule.c python/branches/tlee-ast-optimize/Modules/errnomodule.c python/branches/tlee-ast-optimize/Modules/fcntlmodule.c python/branches/tlee-ast-optimize/Modules/flmodule.c python/branches/tlee-ast-optimize/Modules/fmmodule.c python/branches/tlee-ast-optimize/Modules/gcmodule.c python/branches/tlee-ast-optimize/Modules/gdbmmodule.c python/branches/tlee-ast-optimize/Modules/glmodule.c python/branches/tlee-ast-optimize/Modules/grpmodule.c python/branches/tlee-ast-optimize/Modules/imageop.c python/branches/tlee-ast-optimize/Modules/imgfile.c python/branches/tlee-ast-optimize/Modules/itertoolsmodule.c python/branches/tlee-ast-optimize/Modules/linuxaudiodev.c python/branches/tlee-ast-optimize/Modules/main.c python/branches/tlee-ast-optimize/Modules/mathmodule.c python/branches/tlee-ast-optimize/Modules/md5module.c python/branches/tlee-ast-optimize/Modules/mmapmodule.c python/branches/tlee-ast-optimize/Modules/nismodule.c python/branches/tlee-ast-optimize/Modules/operator.c python/branches/tlee-ast-optimize/Modules/ossaudiodev.c python/branches/tlee-ast-optimize/Modules/parsermodule.c python/branches/tlee-ast-optimize/Modules/posixmodule.c python/branches/tlee-ast-optimize/Modules/pwdmodule.c python/branches/tlee-ast-optimize/Modules/pyexpat.c python/branches/tlee-ast-optimize/Modules/readline.c python/branches/tlee-ast-optimize/Modules/selectmodule.c python/branches/tlee-ast-optimize/Modules/sha256module.c python/branches/tlee-ast-optimize/Modules/sha512module.c python/branches/tlee-ast-optimize/Modules/shamodule.c python/branches/tlee-ast-optimize/Modules/socketmodule.c python/branches/tlee-ast-optimize/Modules/spwdmodule.c python/branches/tlee-ast-optimize/Modules/stropmodule.c python/branches/tlee-ast-optimize/Modules/sunaudiodev.c python/branches/tlee-ast-optimize/Modules/svmodule.c python/branches/tlee-ast-optimize/Modules/syslogmodule.c python/branches/tlee-ast-optimize/Modules/termios.c python/branches/tlee-ast-optimize/Modules/threadmodule.c python/branches/tlee-ast-optimize/Modules/timemodule.c python/branches/tlee-ast-optimize/Modules/unicodedata.c python/branches/tlee-ast-optimize/Modules/zipimport.c python/branches/tlee-ast-optimize/Modules/zlibmodule.c python/branches/tlee-ast-optimize/Objects/abstract.c python/branches/tlee-ast-optimize/Objects/boolobject.c python/branches/tlee-ast-optimize/Objects/bufferobject.c python/branches/tlee-ast-optimize/Objects/bytes_methods.c python/branches/tlee-ast-optimize/Objects/cellobject.c python/branches/tlee-ast-optimize/Objects/classobject.c python/branches/tlee-ast-optimize/Objects/codeobject.c python/branches/tlee-ast-optimize/Objects/complexobject.c python/branches/tlee-ast-optimize/Objects/descrobject.c python/branches/tlee-ast-optimize/Objects/dictobject.c python/branches/tlee-ast-optimize/Objects/exceptions.c python/branches/tlee-ast-optimize/Objects/fileobject.c python/branches/tlee-ast-optimize/Objects/floatobject.c python/branches/tlee-ast-optimize/Objects/frameobject.c python/branches/tlee-ast-optimize/Objects/funcobject.c python/branches/tlee-ast-optimize/Objects/genobject.c python/branches/tlee-ast-optimize/Objects/intobject.c python/branches/tlee-ast-optimize/Objects/listobject.c python/branches/tlee-ast-optimize/Objects/longobject.c python/branches/tlee-ast-optimize/Objects/methodobject.c python/branches/tlee-ast-optimize/Objects/moduleobject.c python/branches/tlee-ast-optimize/Objects/object.c python/branches/tlee-ast-optimize/Objects/rangeobject.c python/branches/tlee-ast-optimize/Objects/setobject.c python/branches/tlee-ast-optimize/Objects/sliceobject.c python/branches/tlee-ast-optimize/Objects/stringlib/formatter.h python/branches/tlee-ast-optimize/Objects/stringlib/string_format.h python/branches/tlee-ast-optimize/Objects/stringlib/stringdefs.h python/branches/tlee-ast-optimize/Objects/structseq.c python/branches/tlee-ast-optimize/Objects/tupleobject.c python/branches/tlee-ast-optimize/Objects/typeobject.c python/branches/tlee-ast-optimize/Objects/unicodeobject.c python/branches/tlee-ast-optimize/Objects/weakrefobject.c python/branches/tlee-ast-optimize/PC/VC6/pythoncore.dsp python/branches/tlee-ast-optimize/PC/VS7.1/pythoncore.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/_bsddb.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/_elementtree.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/_sqlite3.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/_ssl.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/_tkinter.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/bdist_wininst.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/debug.vsprops python/branches/tlee-ast-optimize/PC/VS8.0/make_versioninfo.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/pcbuild.sln python/branches/tlee-ast-optimize/PC/VS8.0/pyd.vsprops python/branches/tlee-ast-optimize/PC/VS8.0/pyd_d.vsprops python/branches/tlee-ast-optimize/PC/VS8.0/pyproject.vsprops python/branches/tlee-ast-optimize/PC/VS8.0/python.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/pythoncore.vcproj python/branches/tlee-ast-optimize/PC/VS8.0/release.vsprops python/branches/tlee-ast-optimize/PC/VS8.0/x64.vsprops python/branches/tlee-ast-optimize/PC/_msi.c python/branches/tlee-ast-optimize/PC/_subprocess.c python/branches/tlee-ast-optimize/PC/_winreg.c python/branches/tlee-ast-optimize/PC/bdist_wininst/install.c python/branches/tlee-ast-optimize/PC/msvcrtmodule.c python/branches/tlee-ast-optimize/PC/winsound.c python/branches/tlee-ast-optimize/PCbuild/pythoncore.vcproj python/branches/tlee-ast-optimize/Parser/asdl_c.py python/branches/tlee-ast-optimize/Parser/tokenizer.c python/branches/tlee-ast-optimize/Python/Python-ast.c python/branches/tlee-ast-optimize/Python/_warnings.c python/branches/tlee-ast-optimize/Python/ast.c python/branches/tlee-ast-optimize/Python/bltinmodule.c python/branches/tlee-ast-optimize/Python/ceval.c python/branches/tlee-ast-optimize/Python/codecs.c python/branches/tlee-ast-optimize/Python/compile.c python/branches/tlee-ast-optimize/Python/errors.c python/branches/tlee-ast-optimize/Python/formatter_string.c python/branches/tlee-ast-optimize/Python/formatter_unicode.c python/branches/tlee-ast-optimize/Python/future.c python/branches/tlee-ast-optimize/Python/getargs.c python/branches/tlee-ast-optimize/Python/import.c python/branches/tlee-ast-optimize/Python/mactoolboxglue.c python/branches/tlee-ast-optimize/Python/marshal.c python/branches/tlee-ast-optimize/Python/modsupport.c python/branches/tlee-ast-optimize/Python/mysnprintf.c python/branches/tlee-ast-optimize/Python/peephole.c python/branches/tlee-ast-optimize/Python/pystrtod.c python/branches/tlee-ast-optimize/Python/pythonrun.c python/branches/tlee-ast-optimize/Python/structmember.c python/branches/tlee-ast-optimize/Python/symtable.c python/branches/tlee-ast-optimize/Python/sysmodule.c python/branches/tlee-ast-optimize/Python/traceback.c python/branches/tlee-ast-optimize/RISCOS/Modules/drawfmodule.c python/branches/tlee-ast-optimize/RISCOS/Modules/riscosmodule.c python/branches/tlee-ast-optimize/RISCOS/Modules/swimodule.c python/branches/tlee-ast-optimize/configure.in python/branches/tlee-ast-optimize/setup.py Modified: python/branches/tlee-ast-optimize/Doc/c-api/concrete.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/c-api/concrete.rst (original) +++ python/branches/tlee-ast-optimize/Doc/c-api/concrete.rst Sun Jun 1 17:18:10 2008 @@ -64,6 +64,7 @@ .. toctree:: + bytearray.rst string.rst unicode.rst buffer.rst Modified: python/branches/tlee-ast-optimize/Doc/c-api/file.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/c-api/file.rst (original) +++ python/branches/tlee-ast-optimize/Doc/c-api/file.rst Sun Jun 1 17:18:10 2008 @@ -130,6 +130,14 @@ .. versionadded:: 2.3 +.. cfunction:: int PyFile_SetEncodingAndErrors(PyFileObject *p, const char *enc, *errors) + + Set the file's encoding for Unicode output to *enc*, and its error + mode to *err*. Return 1 on success and 0 on failure. + + .. versionadded:: 2.6 + + .. cfunction:: int PyFile_SoftSpace(PyObject *p, int newflag) .. index:: single: softspace (file attribute) Modified: python/branches/tlee-ast-optimize/Doc/c-api/string.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/c-api/string.rst (original) +++ python/branches/tlee-ast-optimize/Doc/c-api/string.rst Sun Jun 1 17:18:10 2008 @@ -2,12 +2,16 @@ .. _stringobjects: -String Objects --------------- +String/Bytes Objects +-------------------- These functions raise :exc:`TypeError` when expecting a string parameter and are called with a non-string parameter. +.. note:: + These functions have been renamed to PyBytes_* in Python 3.x. The PyBytes + names are also available in 2.6. + .. index:: object: string @@ -120,7 +124,7 @@ .. cfunction:: PyObject* PyString_FromFormatV(const char *format, va_list vargs) - Identical to :func:`PyString_FromFormat` except that it takes exactly two + Identical to :cfunc:`PyString_FromFormat` except that it takes exactly two arguments. Modified: python/branches/tlee-ast-optimize/Doc/c-api/type.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/c-api/type.rst (original) +++ python/branches/tlee-ast-optimize/Doc/c-api/type.rst Sun Jun 1 17:18:10 2008 @@ -37,7 +37,16 @@ .. cfunction:: unsigned int PyType_ClearCache(void) - Clears the internal lookup cache. Return the current version tag. + Clear the internal lookup cache. Return the current version tag. + + .. versionadded:: 2.6 + + +.. cfunction:: void PyType_Modified(PyTypeObject *type) + + Invalidate the internal lookup cache for the type and all of its + subtypes. This function must be called after any manual + modification of the attributes or base classes of the type. .. versionadded:: 2.6 Modified: python/branches/tlee-ast-optimize/Doc/includes/noddy2.c ============================================================================== --- python/branches/tlee-ast-optimize/Doc/includes/noddy2.c (original) +++ python/branches/tlee-ast-optimize/Doc/includes/noddy2.c Sun Jun 1 17:18:10 2008 @@ -23,14 +23,14 @@ self = (Noddy *)type->tp_alloc(type, 0); if (self != NULL) { - self->first = PyString_FromString(""); + self->first = PyBytes_FromString(""); if (self->first == NULL) { Py_DECREF(self); return NULL; } - self->last = PyString_FromString(""); + self->last = PyBytes_FromString(""); if (self->last == NULL) { Py_DECREF(self); @@ -90,7 +90,7 @@ PyObject *args, *result; if (format == NULL) { - format = PyString_FromString("%s %s"); + format = PyBytes_FromString("%s %s"); if (format == NULL) return NULL; } @@ -109,7 +109,7 @@ if (args == NULL) return NULL; - result = PyString_Format(format, args); + result = PyBytes_Format(format, args); Py_DECREF(args); return result; Modified: python/branches/tlee-ast-optimize/Doc/includes/noddy3.c ============================================================================== --- python/branches/tlee-ast-optimize/Doc/includes/noddy3.c (original) +++ python/branches/tlee-ast-optimize/Doc/includes/noddy3.c Sun Jun 1 17:18:10 2008 @@ -23,14 +23,14 @@ self = (Noddy *)type->tp_alloc(type, 0); if (self != NULL) { - self->first = PyString_FromString(""); + self->first = PyBytes_FromString(""); if (self->first == NULL) { Py_DECREF(self); return NULL; } - self->last = PyString_FromString(""); + self->last = PyBytes_FromString(""); if (self->last == NULL) { Py_DECREF(self); @@ -93,7 +93,7 @@ return -1; } - if (! PyString_Check(value)) { + if (! PyBytes_Check(value)) { PyErr_SetString(PyExc_TypeError, "The first attribute value must be a string"); return -1; @@ -121,7 +121,7 @@ return -1; } - if (! PyString_Check(value)) { + if (! PyBytes_Check(value)) { PyErr_SetString(PyExc_TypeError, "The last attribute value must be a string"); return -1; @@ -153,7 +153,7 @@ PyObject *args, *result; if (format == NULL) { - format = PyString_FromString("%s %s"); + format = PyBytes_FromString("%s %s"); if (format == NULL) return NULL; } @@ -162,7 +162,7 @@ if (args == NULL) return NULL; - result = PyString_Format(format, args); + result = PyBytes_Format(format, args); Py_DECREF(args); return result; Modified: python/branches/tlee-ast-optimize/Doc/includes/noddy4.c ============================================================================== --- python/branches/tlee-ast-optimize/Doc/includes/noddy4.c (original) +++ python/branches/tlee-ast-optimize/Doc/includes/noddy4.c Sun Jun 1 17:18:10 2008 @@ -57,14 +57,14 @@ self = (Noddy *)type->tp_alloc(type, 0); if (self != NULL) { - self->first = PyString_FromString(""); + self->first = PyBytes_FromString(""); if (self->first == NULL) { Py_DECREF(self); return NULL; } - self->last = PyString_FromString(""); + self->last = PyBytes_FromString(""); if (self->last == NULL) { Py_DECREF(self); @@ -124,7 +124,7 @@ PyObject *args, *result; if (format == NULL) { - format = PyString_FromString("%s %s"); + format = PyBytes_FromString("%s %s"); if (format == NULL) return NULL; } @@ -143,7 +143,7 @@ if (args == NULL) return NULL; - result = PyString_Format(format, args); + result = PyBytes_Format(format, args); Py_DECREF(args); return result; Modified: python/branches/tlee-ast-optimize/Doc/includes/run-func.c ============================================================================== --- python/branches/tlee-ast-optimize/Doc/includes/run-func.c (original) +++ python/branches/tlee-ast-optimize/Doc/includes/run-func.c Sun Jun 1 17:18:10 2008 @@ -13,7 +13,7 @@ } Py_Initialize(); - pName = PyString_FromString(argv[1]); + pName = PyBytes_FromString(argv[1]); /* Error checking of pName left out */ pModule = PyImport_Import(pName); Modified: python/branches/tlee-ast-optimize/Doc/library/basehttpserver.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/basehttpserver.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/basehttpserver.rst Sun Jun 1 17:18:10 2008 @@ -1,10 +1,14 @@ - :mod:`BaseHTTPServer` --- Basic HTTP server =========================================== .. module:: BaseHTTPServer :synopsis: Basic HTTP server (base class for SimpleHTTPServer and CGIHTTPServer). +.. note:: + The :mod:`BaseHTTPServer` module has been merged into :mod:`http.server` in + Python 3.0. The :term:`2to3` tool will automatically adapt imports when + converting your sources to 3.0. + .. index:: pair: WWW; server Modified: python/branches/tlee-ast-optimize/Doc/library/cgihttpserver.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/cgihttpserver.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/cgihttpserver.rst Sun Jun 1 17:18:10 2008 @@ -1,4 +1,3 @@ - :mod:`CGIHTTPServer` --- CGI-capable HTTP request handler ========================================================= @@ -7,6 +6,11 @@ scripts. .. sectionauthor:: Moshe Zadka +.. note:: + The :mod:`CGIHTTPServer` module has been merged into :mod:`http.server` in + Python 3.0. The :term:`2to3` tool will automatically adapt imports when + converting your sources to 3.0. + The :mod:`CGIHTTPServer` module defines a request-handler class, interface compatible with :class:`BaseHTTPServer.BaseHTTPRequestHandler` and inherits Modified: python/branches/tlee-ast-optimize/Doc/library/cmd.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/cmd.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/cmd.rst Sun Jun 1 17:18:10 2008 @@ -26,7 +26,12 @@ The optional arguments *stdin* and *stdout* specify the input and output file objects that the Cmd instance or subclass instance will use for input and - output. If not specified, they will default to *sys.stdin* and *sys.stdout*. + output. If not specified, they will default to :data:`sys.stdin` and + :data:`sys.stdout`. + + If you want a given *stdin* to be used, make sure to set the instance's + :attr:`use_rawinput` attribute to ``False``, otherwise *stdin* will be + ignored. .. versionchanged:: 2.3 The *stdin* and *stdout* parameters were added. Modified: python/branches/tlee-ast-optimize/Doc/library/codecs.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/codecs.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/codecs.rst Sun Jun 1 17:18:10 2008 @@ -295,7 +295,8 @@ ------------------ The :mod:`codecs` module defines a set of base classes which define the -interface and can also be used to easily write you own codecs for use in Python. +interface and can also be used to easily write your own codecs for use in +Python. Each codec has to define four interfaces to make it usable as codec in Python: stateless encoder, stateless decoder, stream reader and stream writer. The Modified: python/branches/tlee-ast-optimize/Doc/library/commands.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/commands.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/commands.rst Sun Jun 1 17:18:10 2008 @@ -16,6 +16,12 @@ processes and retrieving their results. Using the :mod:`subprocess` module is preferable to using the :mod:`commands` module. +.. warning:: + + In 3.x, :func:`getstatus` and two undocumented functions (:func:`mk2arg` and + :func:`mkarg`) have been removed. Also, :func:`getstatusoutput` and + :func:`getoutput` have been moved to the :mod:`subprocess` module. + The :mod:`commands` module defines the following functions: @@ -44,6 +50,7 @@ This function is nonobvious and useless, also the name is misleading in the presence of :func:`getstatusoutput`. + Example:: >>> import commands Modified: python/branches/tlee-ast-optimize/Doc/library/cookie.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/cookie.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/cookie.rst Sun Jun 1 17:18:10 2008 @@ -1,4 +1,3 @@ - :mod:`Cookie` --- HTTP state management ======================================= @@ -7,6 +6,11 @@ .. moduleauthor:: Timothy O'Malley .. sectionauthor:: Moshe Zadka +.. note:: + The :mod:`Cookie` module has been renamed to :mod:`http.cookies` in Python + 3.0. The :term:`2to3` tool will automatically adapt imports when converting + your sources to 3.0. + The :mod:`Cookie` module defines classes for abstracting the concept of cookies, an HTTP state management mechanism. It supports both simple string-only @@ -18,6 +22,12 @@ MSIE 3.0x doesn't follow the character rules outlined in those specs. As a result, the parsing rules used are a bit less strict. +.. note:: + + On encountering an invalid cookie, :exc:`CookieError` is raised, so if your + cookie data comes from a browser you should always prepare for invalid data + and catch :exc:`CookieError` on parsing. + .. exception:: CookieError Modified: python/branches/tlee-ast-optimize/Doc/library/cookielib.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/cookielib.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/cookielib.rst Sun Jun 1 17:18:10 2008 @@ -1,4 +1,3 @@ - :mod:`cookielib` --- Cookie handling for HTTP clients ===================================================== @@ -7,6 +6,11 @@ .. moduleauthor:: John J. Lee .. sectionauthor:: John J. Lee +.. note:: + The :mod:`cookielib` module has been renamed to :mod:`http.cookiejar` in + Python 3.0. The :term:`2to3` tool will automatically adapt imports when + converting your sources to 3.0. + .. versionadded:: 2.4 Modified: python/branches/tlee-ast-optimize/Doc/library/easydialogs.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/easydialogs.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/easydialogs.rst Sun Jun 1 17:18:10 2008 @@ -9,10 +9,12 @@ The :mod:`EasyDialogs` module contains some simple dialogs for the Macintosh. -All routines take an optional resource ID parameter *id* with which one can -override the :const:`DLOG` resource used for the dialog, provided that the -dialog items correspond (both type and item number) to those in the default -:const:`DLOG` resource. See source code for details. +The dialogs get launched in a separate application which appears in the dock and +must be clicked on for the dialogs be displayed. All routines take an optional +resource ID parameter *id* with which one can override the :const:`DLOG` +resource used for the dialog, provided that the dialog items correspond (both +type and item number) to those in the default :const:`DLOG` resource. See source +code for details. .. warning:: Modified: python/branches/tlee-ast-optimize/Doc/library/ftplib.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/ftplib.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/ftplib.rst Sun Jun 1 17:18:10 2008 @@ -44,8 +44,8 @@ the method call ``login(user, passwd, acct)`` is made (where *passwd* and *acct* default to the empty string when not given). The optional *timeout* parameter specifies a timeout in seconds for blocking operations like the - connection attempt (if is not specified, or passed as None, the global - default timeout setting will be used). + connection attempt (if is not specified, the global default timeout setting + will be used). .. versionchanged:: 2.6 *timeout* was added. @@ -126,10 +126,8 @@ made. The optional *timeout* parameter specifies a timeout in seconds for the - connection attempt. If is not specified, or passed as None, the object - timeout is used (the timeout that you passed when instantiating the class); - if the object timeout is also None, the global default timeout setting will - be used. + connection attempt. If no *timeout* is passed, the global default timeout + setting will be used. .. versionchanged:: 2.6 *timeout* was added. Modified: python/branches/tlee-ast-optimize/Doc/library/httplib.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/httplib.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/httplib.rst Sun Jun 1 17:18:10 2008 @@ -1,10 +1,14 @@ - :mod:`httplib` --- HTTP protocol client ======================================= .. module:: httplib :synopsis: HTTP and HTTPS protocol client (requires sockets). +.. note:: + The :mod:`httplib` module has been renamed to :mod:`http.client` in Python + 3.0. The :term:`2to3` tool will automatically adapt imports when converting + your sources to 3.0. + .. index:: pair: HTTP; protocol @@ -40,7 +44,7 @@ be raised if the status line can't be parsed as a valid HTTP/1.0 or 1.1 status line. If the optional *timeout* parameter is given, blocking operations (like connection attempts) will timeout after that many seconds - (if it is not given or ``None``, the global default timeout setting is used). + (if it is not given, the global default timeout setting is used). For example, the following calls all create instances that connect to the server at the same host and port:: Modified: python/branches/tlee-ast-optimize/Doc/library/os.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/os.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/os.rst Sun Jun 1 17:18:10 2008 @@ -2031,7 +2031,7 @@ Return the number of processes in the system run queue averaged over the last 1, 5, and 15 minutes or raises :exc:`OSError` if the load average was - unobtainable. + unobtainable. Availability: Unix. .. versionadded:: 2.3 Modified: python/branches/tlee-ast-optimize/Doc/library/poplib.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/poplib.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/poplib.rst Sun Jun 1 17:18:10 2008 @@ -29,8 +29,8 @@ This class implements the actual POP3 protocol. The connection is created when the instance is initialized. If *port* is omitted, the standard POP3 port (110) is used. The optional *timeout* parameter specifies a timeout in seconds for the - connection attempt (if not specified, or passed as None, the global default - timeout setting will be used). + connection attempt (if not specified, the global default timeout setting will + be used). .. versionchanged:: 2.6 *timeout* was added. Modified: python/branches/tlee-ast-optimize/Doc/library/re.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/re.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/re.rst Sun Jun 1 17:18:10 2008 @@ -181,6 +181,12 @@ ``[^5]`` will match any character except ``'5'``, and ``[^^]`` will match any character except ``'^'``. + Note that inside ``[]`` the special forms and special characters lose + their meanings and only the syntaxes described here are valid. For + example, ``+``, ``*``, ``(``, ``)``, and so on are treated as + literals inside ``[]``, and backreferences cannot be used inside + ``[]``. + ``'|'`` ``A|B``, where A and B can be arbitrary REs, creates a regular expression that will match either A or B. An arbitrary number of REs can be separated by the Modified: python/branches/tlee-ast-optimize/Doc/library/simplehttpserver.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/simplehttpserver.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/simplehttpserver.rst Sun Jun 1 17:18:10 2008 @@ -6,6 +6,11 @@ :synopsis: This module provides a basic request handler for HTTP servers. .. sectionauthor:: Moshe Zadka +.. note:: + The :mod:`SimpleHTTPServer` module has been merged into :mod:`http.server` in + Python 3.0. The :term:`2to3` tool will automatically adapt imports when + converting your sources to 3.0. + The :mod:`SimpleHTTPServer` module defines a single class, :class:`SimpleHTTPRequestHandler`, which is interface-compatible with Modified: python/branches/tlee-ast-optimize/Doc/library/smtplib.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/smtplib.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/smtplib.rst Sun Jun 1 17:18:10 2008 @@ -25,8 +25,8 @@ with those parameters during initialization. An :exc:`SMTPConnectError` is raised if the specified host doesn't respond correctly. The optional *timeout* parameter specifies a timeout in seconds for blocking operations - like the connection attempt (if not specified, or passed as None, the global - default timeout setting will be used). + like the connection attempt (if not specified, the global default timeout + setting will be used). For normal use, you should only require the initialization/connect, :meth:`sendmail`, and :meth:`quit` methods. An example is included below. @@ -45,8 +45,8 @@ and *certfile* are also optional, and can contain a PEM formatted private key and certificate chain file for the SSL connection. The optional *timeout* parameter specifies a timeout in seconds for blocking operations like the - connection attempt (if not specified, or passed as None, the global default - timeout setting will be used). + connection attempt (if not specified, the global default timeout setting + will be used). .. versionchanged:: 2.6 *timeout* was added. Modified: python/branches/tlee-ast-optimize/Doc/library/socket.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/socket.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/socket.rst Sun Jun 1 17:18:10 2008 @@ -207,12 +207,11 @@ .. function:: create_connection(address[, timeout]) - Connects to the *address* received (as usual, a ``(host, port)`` pair), with an - optional timeout for the connection. Especially useful for higher-level - protocols, it is not normally used directly from application-level code. - Passing the optional *timeout* parameter will set the timeout on the socket - instance (if it is not given or ``None``, the global default timeout setting is - used). + Convenience function. Connect to *address* (a 2-tuple ``(host, port)``), + and return the socket object. Passing the optional *timeout* parameter will + set the timeout on the socket instance before attempting to connect. If no + *timeout* is supplied, the global default timeout setting returned by + :func:`getdefaulttimeout` is used. .. versionadded:: 2.6 Modified: python/branches/tlee-ast-optimize/Doc/library/stdtypes.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/stdtypes.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/stdtypes.rst Sun Jun 1 17:18:10 2008 @@ -2165,6 +2165,13 @@ .. versionadded:: 2.3 +.. attribute:: file.errors + + The Unicode error handler used to along with the encoding. + + .. versionadded:: 2.6 + + .. attribute:: file.mode The I/O mode for the file. If the file was created using the :func:`open` Modified: python/branches/tlee-ast-optimize/Doc/library/telnetlib.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/telnetlib.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/telnetlib.rst Sun Jun 1 17:18:10 2008 @@ -28,6 +28,11 @@ :class:`Telnet` represents a connection to a Telnet server. The instance is initially not connected by default; the :meth:`open` method must be used to establish a connection. Alternatively, the host name and optional port + and timeout can be passed to the constructor, in which case the connection to + the server will be established before the constructor returns. The optional + *timeout* parameter specifies a timeout in seconds for the connection attempt (if + not specified, the global default timeout setting will be used). + number can be passed to the constructor, to, in which case the connection to the server will be established before the constructor returns. The optional *timeout* parameter specifies a timeout in seconds for blocking operations @@ -128,8 +133,7 @@ Connect to a host. The optional second argument is the port number, which defaults to the standard Telnet port (23). The optional *timeout* parameter specifies a timeout in seconds for blocking operations like the connection - attempt (if not specified, or passed as None, the global default timeout - setting will be used). + attempt (if not specified, the global default timeout setting will be used). Do not try to reopen an already connected instance. Modified: python/branches/tlee-ast-optimize/Doc/library/urllib2.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/urllib2.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/urllib2.rst Sun Jun 1 17:18:10 2008 @@ -27,9 +27,9 @@ returns a string in this format. The optional *timeout* parameter specifies a timeout in seconds for blocking - operations like the connection attempt (if not specified, or passed as - ``None``, the global default timeout setting will be used). This actually - only works for HTTP, HTTPS, FTP and FTPS connections. + operations like the connection attempt (if not specified, the global default + timeout setting will be used). This actually only works for HTTP, HTTPS, + FTP and FTPS connections. This function returns a file-like object with two additional methods: @@ -411,9 +411,9 @@ the same as those of :func:`urlopen` (which simply calls the :meth:`open` method on the currently installed global :class:`OpenerDirector`). The optional *timeout* parameter specifies a timeout in seconds for blocking - operations like the connection attempt (if not specified, or passed as - ``None``, the global default timeout setting will be used; this actually only - works for HTTP, HTTPS, FTP and FTPS connections). + operations like the connection attempt (if not specified, the global default + timeout setting will be usedi). The timeout feature actually works only for + HTTP, HTTPS, FTP and FTPS connections). .. versionchanged:: 2.6 *timeout* was added. Modified: python/branches/tlee-ast-optimize/Doc/library/userdict.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/library/userdict.rst (original) +++ python/branches/tlee-ast-optimize/Doc/library/userdict.rst Sun Jun 1 17:18:10 2008 @@ -100,6 +100,12 @@ defaulting to the empty list ``[]``. *list* can be any iterable, e.g. a real Python list or a :class:`UserList` object. + .. note:: + The :class:`UserList` class has been moved to the :mod:`collections` + module in Python 3.0. The :term:`2to3` tool will automatically adapt + imports when converting your sources to 3.0. + + In addition to supporting the methods and operations of mutable sequences (see section :ref:`typesseq`), :class:`UserList` instances provide the following attribute: @@ -167,6 +173,12 @@ :class:`UserString` (or a subclass) or an arbitrary sequence which can be converted into a string using the built-in :func:`str` function. + .. note:: + The :class:`UserString` class has been moved to the :mod:`collections` + module in Python 3.0. The :term:`2to3` tool will automatically adapt + imports when converting your sources to 3.0. + + .. class:: MutableString([sequence]) @@ -178,6 +190,9 @@ mutable object as dictionary key, which would be otherwise very error prone and hard to track down. + .. deprecated:: 2.6 + The :class:`MutableString` class has been removed in Python 3.0. + In addition to supporting the methods and operations of string and Unicode objects (see section :ref:`string-methods`), :class:`UserString` instances provide the following attribute: Modified: python/branches/tlee-ast-optimize/Doc/tutorial/controlflow.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/tutorial/controlflow.rst (original) +++ python/branches/tlee-ast-optimize/Doc/tutorial/controlflow.rst Sun Jun 1 17:18:10 2008 @@ -445,8 +445,8 @@ up in a tuple. Before the variable number of arguments, zero or more normal arguments may occur. :: - def fprintf(file, template, *args): - file.write(template.format(args)) + def write_multiple_items(file, separator, *args): + file.write(separator.join(args)) .. _tut-unpacking-arguments: Modified: python/branches/tlee-ast-optimize/Doc/tutorial/interpreter.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/tutorial/interpreter.rst (original) +++ python/branches/tlee-ast-optimize/Doc/tutorial/interpreter.rst Sun Jun 1 17:18:10 2008 @@ -51,8 +51,8 @@ A second way of starting the interpreter is ``python -c command [arg] ...``, which executes the statement(s) in *command*, analogous to the shell's :option:`-c` option. Since Python statements often contain spaces or other -characters that are special to the shell, it is best to quote *command* in its -entirety with double quotes. +characters that are special to the shell, it is usually advised to quote +*command* in its entirety with single quotes. Some Python modules are also useful as scripts. These can be invoked using ``python -m module [arg] ...``, which executes the source file for *module* as Modified: python/branches/tlee-ast-optimize/Doc/using/cmdline.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/using/cmdline.rst (original) +++ python/branches/tlee-ast-optimize/Doc/using/cmdline.rst Sun Jun 1 17:18:10 2008 @@ -481,6 +481,13 @@ .. versionadded:: 2.6 +.. envvar:: PYTHONIOENCODING + + Overrides the encoding used for stdin/stdout/stderr, in the syntax + encodingname:errorhandler, with the :errors part being optional. + + .. versionadded:: 2.6 + .. envvar:: PYTHONNOUSERSITE Modified: python/branches/tlee-ast-optimize/Doc/whatsnew/2.6.rst ============================================================================== --- python/branches/tlee-ast-optimize/Doc/whatsnew/2.6.rst (original) +++ python/branches/tlee-ast-optimize/Doc/whatsnew/2.6.rst Sun Jun 1 17:18:10 2008 @@ -526,9 +526,9 @@ PEP 3101: Advanced String Formatting ===================================================== -In Python 3.0, the `%` operator is supplemented by a more powerful -string formatting method, :meth:`format`. Support for the -:meth:`format` method has been backported to Python 2.6. +In Python 3.0, the `%` operator is supplemented by a more powerful string +formatting method, :meth:`format`. Support for the :meth:`str.format` method +has been backported to Python 2.6. In 2.6, both 8-bit and Unicode strings have a `.format()` method that treats the string as a template and takes the arguments to be formatted. @@ -649,8 +649,11 @@ .. seealso:: + :ref:`formatstrings` + The reference format fields. + :pep:`3101` - Advanced String Formatting - PEP written by Talin. + PEP written by Talin. Implemented by Eric Smith. .. ====================================================================== Modified: python/branches/tlee-ast-optimize/Include/Python.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/Python.h (original) +++ python/branches/tlee-ast-optimize/Include/Python.h Sun Jun 1 17:18:10 2008 @@ -94,6 +94,7 @@ /* #include "memoryobject.h" */ #include "bufferobject.h" #include "bytesobject.h" +#include "bytearrayobject.h" #include "tupleobject.h" #include "listobject.h" #include "dictobject.h" Modified: python/branches/tlee-ast-optimize/Include/fileobject.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/fileobject.h (original) +++ python/branches/tlee-ast-optimize/Include/fileobject.h Sun Jun 1 17:18:10 2008 @@ -24,6 +24,7 @@ int f_newlinetypes; /* Types of newlines seen */ int f_skipnextlf; /* Skip next \n */ PyObject *f_encoding; + PyObject *f_errors; PyObject *weakreflist; /* List of weak references */ int unlocked_count; /* Num. currently running sections of code using f_fp with the GIL released. */ @@ -37,6 +38,7 @@ PyAPI_FUNC(PyObject *) PyFile_FromString(char *, char *); PyAPI_FUNC(void) PyFile_SetBufSize(PyObject *, int); PyAPI_FUNC(int) PyFile_SetEncoding(PyObject *, const char *); +PyAPI_FUNC(int) PyFile_SetEncodingAndErrors(PyObject *, const char *, char *errors); PyAPI_FUNC(PyObject *) PyFile_FromFile(FILE *, char *, char *, int (*)(FILE *)); PyAPI_FUNC(FILE *) PyFile_AsFile(PyObject *); Modified: python/branches/tlee-ast-optimize/Include/floatobject.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/floatobject.h (original) +++ python/branches/tlee-ast-optimize/Include/floatobject.h Sun Jun 1 17:18:10 2008 @@ -115,6 +115,12 @@ /* free list api */ PyAPI_FUNC(void) PyFloat_CompactFreeList(size_t *, size_t *, size_t *); +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyFloat_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + #ifdef __cplusplus } #endif Deleted: python/branches/tlee-ast-optimize/Include/formatter_string.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/formatter_string.h Sun Jun 1 17:18:10 2008 +++ (empty file) @@ -1,12 +0,0 @@ -PyObject * -string__format__(PyObject *self, PyObject *args); - -PyObject * -string_long__format__(PyObject *self, PyObject *args); - -PyObject * -string_int__format__(PyObject *self, PyObject *args); - -PyObject * -string_float__format__(PyObject *self, PyObject *args); - Deleted: python/branches/tlee-ast-optimize/Include/formatter_unicode.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/formatter_unicode.h Sun Jun 1 17:18:10 2008 +++ (empty file) @@ -1,12 +0,0 @@ -PyObject * -unicode__format__(PyObject *self, PyObject *args); - -PyObject * -unicode_long__format__(PyObject *self, PyObject *args); - -PyObject * -unicode_int__format__(PyObject *self, PyObject *args); - -PyObject * -unicode_float__format__(PyObject *self, PyObject *args); - Modified: python/branches/tlee-ast-optimize/Include/intobject.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/intobject.h (original) +++ python/branches/tlee-ast-optimize/Include/intobject.h Sun Jun 1 17:18:10 2008 @@ -68,6 +68,12 @@ a leading "0" */ PyAPI_FUNC(PyObject*) _PyInt_Format(PyIntObject* v, int base, int newstyle); +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyInt_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + #ifdef __cplusplus } #endif Modified: python/branches/tlee-ast-optimize/Include/longobject.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/longobject.h (original) +++ python/branches/tlee-ast-optimize/Include/longobject.h Sun Jun 1 17:18:10 2008 @@ -119,6 +119,12 @@ a leading "0", instead of the prefix "0o" */ PyAPI_FUNC(PyObject *) _PyLong_Format(PyObject *aa, int base, int addL, int newstyle); +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyLong_FormatAdvanced(PyObject *obj, + char *format_spec, + Py_ssize_t format_spec_len); + #ifdef __cplusplus } #endif Modified: python/branches/tlee-ast-optimize/Include/object.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/object.h (original) +++ python/branches/tlee-ast-optimize/Include/object.h Sun Jun 1 17:18:10 2008 @@ -460,6 +460,7 @@ PyObject *, PyObject *); PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); PyAPI_FUNC(unsigned int) PyType_ClearCache(void); +PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); /* Generic operations on objects */ PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); @@ -514,7 +515,7 @@ PyAPI_FUNC(long) _Py_HashPointer(void*); /* Helper for passing objects to printf and the like */ -#define PyObject_REPR(obj) PyString_AS_STRING(PyObject_Repr(obj)) +#define PyObject_REPR(obj) PyBytes_AS_STRING(PyObject_Repr(obj)) /* Flag bits for printing: */ #define Py_PRINT_RAW 1 /* No string quotes etc. */ @@ -608,7 +609,7 @@ #define Py_TPFLAGS_LONG_SUBCLASS (1L<<24) #define Py_TPFLAGS_LIST_SUBCLASS (1L<<25) #define Py_TPFLAGS_TUPLE_SUBCLASS (1L<<26) -#define Py_TPFLAGS_STRING_SUBCLASS (1L<<27) +#define Py_TPFLAGS_BYTES_SUBCLASS (1L<<27) #define Py_TPFLAGS_UNICODE_SUBCLASS (1L<<28) #define Py_TPFLAGS_DICT_SUBCLASS (1L<<29) #define Py_TPFLAGS_BASE_EXC_SUBCLASS (1L<<30) Modified: python/branches/tlee-ast-optimize/Include/py_curses.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/py_curses.h (original) +++ python/branches/tlee-ast-optimize/Include/py_curses.h Sun Jun 1 17:18:10 2008 @@ -146,7 +146,7 @@ static PyObject *PyCurses_ ## X (PyObject *self) \ { \ PyCursesInitialised \ - return PyString_FromString(X()); } + return PyBytes_FromString(X()); } #define NoArgTrueFalseFunction(X) \ static PyObject *PyCurses_ ## X (PyObject *self) \ Modified: python/branches/tlee-ast-optimize/Include/pyerrors.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/pyerrors.h (original) +++ python/branches/tlee-ast-optimize/Include/pyerrors.h Sun Jun 1 17:18:10 2008 @@ -104,7 +104,7 @@ #define PyExceptionClass_Name(x) \ (PyClass_Check((x)) \ - ? PyString_AS_STRING(((PyClassObject*)(x))->cl_name) \ + ? PyBytes_AS_STRING(((PyClassObject*)(x))->cl_name) \ : (char *)(((PyTypeObject*)(x))->tp_name)) #define PyExceptionInstance_Class(x) \ Modified: python/branches/tlee-ast-optimize/Include/pyport.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/pyport.h (original) +++ python/branches/tlee-ast-optimize/Include/pyport.h Sun Jun 1 17:18:10 2008 @@ -135,9 +135,9 @@ * all platforms (Python interprets the format string itself, and does whatever * the platform C requires to convert a size_t/Py_ssize_t argument): * - * PyString_FromFormat + * PyBytes_FromFormat * PyErr_Format - * PyString_FromFormatV + * PyBytes_FromFormatV * * Lower-level uses require that you interpolate the correct format modifier * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for Modified: python/branches/tlee-ast-optimize/Include/pythonrun.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/pythonrun.h (original) +++ python/branches/tlee-ast-optimize/Include/pythonrun.h Sun Jun 1 17:18:10 2008 @@ -125,7 +125,7 @@ PyAPI_FUNC(int) _PyFrame_Init(void); PyAPI_FUNC(int) _PyInt_Init(void); PyAPI_FUNC(void) _PyFloat_Init(void); -PyAPI_FUNC(int) PyBytes_Init(void); +PyAPI_FUNC(int) PyByteArray_Init(void); /* Various internal finalizers */ PyAPI_FUNC(void) _PyExc_Fini(void); @@ -137,11 +137,11 @@ PyAPI_FUNC(void) PyTuple_Fini(void); PyAPI_FUNC(void) PyList_Fini(void); PyAPI_FUNC(void) PySet_Fini(void); -PyAPI_FUNC(void) PyString_Fini(void); +PyAPI_FUNC(void) PyBytes_Fini(void); PyAPI_FUNC(void) PyInt_Fini(void); PyAPI_FUNC(void) PyFloat_Fini(void); PyAPI_FUNC(void) PyOS_FiniInterrupts(void); -PyAPI_FUNC(void) PyBytes_Fini(void); +PyAPI_FUNC(void) PyByteArray_Fini(void); /* Stuff with no proper home (yet) */ PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, char *); Modified: python/branches/tlee-ast-optimize/Include/unicodeobject.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/unicodeobject.h (original) +++ python/branches/tlee-ast-optimize/Include/unicodeobject.h Sun Jun 1 17:18:10 2008 @@ -553,6 +553,12 @@ PyAPI_FUNC(PyObject *) PyUnicode_FromFormatV(const char*, va_list); PyAPI_FUNC(PyObject *) PyUnicode_FromFormat(const char*, ...); +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +PyAPI_FUNC(PyObject *) _PyUnicode_FormatAdvanced(PyObject *obj, + Py_UNICODE *format_spec, + Py_ssize_t format_spec_len); + /* --- wchar_t support for platforms which support it --------------------- */ #ifdef HAVE_WCHAR_H Modified: python/branches/tlee-ast-optimize/Include/warnings.h ============================================================================== --- python/branches/tlee-ast-optimize/Include/warnings.h (original) +++ python/branches/tlee-ast-optimize/Include/warnings.h Sun Jun 1 17:18:10 2008 @@ -9,7 +9,9 @@ PyAPI_FUNC(int) PyErr_WarnEx(PyObject *, const char *, Py_ssize_t); PyAPI_FUNC(int) PyErr_WarnExplicit(PyObject *, const char *, const char *, int, const char *, PyObject *); -PyAPI_FUNC(int) PyErr_WarnPy3k(const char *, Py_ssize_t); + +#define PyErr_WarnPy3k(msg, stacklevel) \ + (Py_Py3kWarningFlag ? PyErr_WarnEx(PyExc_DeprecationWarning, msg, stacklevel) : 0) /* DEPRECATED: Use PyErr_WarnEx() instead. */ #define PyErr_Warn(category, msg) PyErr_WarnEx(category, msg, 1) Modified: python/branches/tlee-ast-optimize/Lib/UserString.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/UserString.py (original) +++ python/branches/tlee-ast-optimize/Lib/UserString.py Sun Jun 1 17:18:10 2008 @@ -146,6 +146,9 @@ A faster and better solution is to rewrite your program using lists.""" def __init__(self, string=""): + from warnings import warnpy3k + warnpy3k('the class UserString.MutableString has been removed in ' + 'Python 3.0', stacklevel=2) self.data = string def __hash__(self): raise TypeError, "unhashable type (it is mutable)" Modified: python/branches/tlee-ast-optimize/Lib/bsddb/test/test_all.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/bsddb/test/test_all.py (original) +++ python/branches/tlee-ast-optimize/Lib/bsddb/test/test_all.py Sun Jun 1 17:18:10 2008 @@ -67,11 +67,20 @@ return path -# NOTE: This path is overridden by a unique one and cleaned up -# afterwards when run under regrtest via Lib/test/test_bsddb3.py. -get_new_path.prefix="/tmp/z-Berkeley_DB" +# This path can be overriden via "set_test_path_prefix()". +import os, os.path +get_new_path.prefix=os.path.join(os.sep,"tmp","z-Berkeley_DB") get_new_path.num=0 +def get_test_path_prefix() : + return get_new_path.prefix + +def set_test_path_prefix(path) : + get_new_path.prefix=path + +def remove_test_path_directory() : + test_support.rmtree(get_new_path.prefix) + try : import threading get_new_path.mutex=threading.Lock() @@ -100,12 +109,6 @@ def suite(module_prefix='', timing_check=None): - try: - # this is special, it used to segfault the interpreter - import test_1413192 - except: - pass - test_modules = [ 'test_associate', 'test_basics', Modified: python/branches/tlee-ast-optimize/Lib/collections.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/collections.py (original) +++ python/branches/tlee-ast-optimize/Lib/collections.py Sun Jun 1 17:18:10 2008 @@ -88,8 +88,9 @@ if verbose: print template - # Execute the template string in a temporary namespace - namespace = dict(itemgetter=_itemgetter) + # Execute the template string in a temporary namespace and + # support tracing utilities by setting a value for frame.f_globals['__name__'] + namespace = dict(itemgetter=_itemgetter, __name__='namedtuple_%s' % typename) try: exec template in namespace except SyntaxError, e: Modified: python/branches/tlee-ast-optimize/Lib/commands.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/commands.py (original) +++ python/branches/tlee-ast-optimize/Lib/commands.py Sun Jun 1 17:18:10 2008 @@ -63,6 +63,8 @@ # Make command argument from directory and pathname (prefix space, add quotes). # def mk2arg(head, x): + from warnings import warnpy3k + warnpy3k("In 3.x, mk2arg has been removed.") import os return mkarg(os.path.join(head, x)) @@ -75,6 +77,8 @@ # with backslash. # def mkarg(x): + from warnings import warnpy3k + warnpy3k("in 3.x, mkarg has been removed.") if '\'' not in x: return ' \'' + x + '\'' s = ' "' Modified: python/branches/tlee-ast-optimize/Lib/ctypes/test/test_pointers.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/ctypes/test/test_pointers.py (original) +++ python/branches/tlee-ast-optimize/Lib/ctypes/test/test_pointers.py Sun Jun 1 17:18:10 2008 @@ -175,5 +175,13 @@ self.assertRaises(TypeError, c_void_p, 3.14) # make sure floats are NOT accepted self.assertRaises(TypeError, c_void_p, object()) # nor other objects + def test_pointers_bool(self): + # NULL pointers have a boolean False value, non-NULL pointers True. + self.failUnlessEqual(bool(POINTER(c_int)()), False) + self.failUnlessEqual(bool(pointer(c_int())), True) + + self.failUnlessEqual(bool(CFUNCTYPE(None)(0)), False) + self.failUnlessEqual(bool(CFUNCTYPE(None)(42)), True) + if __name__ == '__main__': unittest.main() Modified: python/branches/tlee-ast-optimize/Lib/distutils/command/bdist_wininst.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/distutils/command/bdist_wininst.py (original) +++ python/branches/tlee-ast-optimize/Lib/distutils/command/bdist_wininst.py Sun Jun 1 17:18:10 2008 @@ -79,6 +79,12 @@ def finalize_options (self): if self.bdist_dir is None: + if self.skip_build and self.plat_name: + # If build is skipped and plat_name is overridden, bdist will + # not see the correct 'plat_name' - so set that up manually. + bdist = self.distribution.get_command_obj('bdist') + bdist.plat_name = self.plat_name + # next the command will be initialized using that name bdist_base = self.get_finalized_command('bdist').bdist_base self.bdist_dir = os.path.join(bdist_base, 'wininst') if not self.target_version: Modified: python/branches/tlee-ast-optimize/Lib/distutils/command/wininst-6.0.exe ============================================================================== Binary files. No diff available. Modified: python/branches/tlee-ast-optimize/Lib/distutils/command/wininst-7.1.exe ============================================================================== Binary files. No diff available. Modified: python/branches/tlee-ast-optimize/Lib/distutils/command/wininst-9.0-amd64.exe ============================================================================== Binary files. No diff available. Modified: python/branches/tlee-ast-optimize/Lib/distutils/command/wininst-9.0.exe ============================================================================== Binary files. No diff available. Modified: python/branches/tlee-ast-optimize/Lib/distutils/tests/test_build_ext.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/distutils/tests/test_build_ext.py (original) +++ python/branches/tlee-ast-optimize/Lib/distutils/tests/test_build_ext.py Sun Jun 1 17:18:10 2008 @@ -28,6 +28,10 @@ dist = Distribution({'name': 'xx', 'ext_modules': [xx_ext]}) dist.package_dir = self.tmp_dir cmd = build_ext(dist) + if os.name == "nt": + # On Windows, we must build a debug version iff running + # a debug build of Python + cmd.debug = sys.executable.endswith("_d.exe") cmd.build_lib = self.tmp_dir cmd.build_temp = self.tmp_dir Modified: python/branches/tlee-ast-optimize/Lib/ftplib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/ftplib.py (original) +++ python/branches/tlee-ast-optimize/Lib/ftplib.py Sun Jun 1 17:18:10 2008 @@ -44,6 +44,7 @@ from socket import getfqdn; socket.getfqdn = getfqdn; del getfqdn except ImportError: import socket +from socket import _GLOBAL_DEFAULT_TIMEOUT __all__ = ["FTP","Netrc"] @@ -71,7 +72,6 @@ # Line terminators (we always output CRLF, but accept any of CRLF, CR, LF) CRLF = '\r\n' - # The class itself class FTP: @@ -109,14 +109,15 @@ # Initialize host to localhost, port to standard ftp port # Optional arguments are host (for connect()), # and user, passwd, acct (for login()) - def __init__(self, host='', user='', passwd='', acct='', timeout=None): + def __init__(self, host='', user='', passwd='', acct='', + timeout=_GLOBAL_DEFAULT_TIMEOUT): self.timeout = timeout if host: self.connect(host) if user: self.login(user, passwd, acct) - def connect(self, host='', port=0, timeout=None): + def connect(self, host='', port=0, timeout=-999): '''Connect to host. Arguments are: - host: hostname to connect to (string, default previous host) - port: port to connect to (integer, default previous port) @@ -125,7 +126,7 @@ self.host = host if port > 0: self.port = port - if timeout is not None: + if timeout != -999: self.timeout = timeout self.sock = socket.create_connection((self.host, self.port), self.timeout) self.af = self.sock.family Modified: python/branches/tlee-ast-optimize/Lib/heapq.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/heapq.py (original) +++ python/branches/tlee-ast-optimize/Lib/heapq.py Sun Jun 1 17:18:10 2008 @@ -167,7 +167,7 @@ def heappushpop(heap, item): """Fast version of a heappush followed by a heappop.""" - if heap and item > heap[0]: + if heap and heap[0] < item: item, heap[0] = heap[0], item _siftup(heap, 0) return item @@ -240,10 +240,11 @@ while pos > startpos: parentpos = (pos - 1) >> 1 parent = heap[parentpos] - if parent <= newitem: - break - heap[pos] = parent - pos = parentpos + if newitem < parent: + heap[pos] = parent + pos = parentpos + continue + break heap[pos] = newitem # The child indices of heap index pos are already heaps, and we want to make @@ -294,7 +295,7 @@ while childpos < endpos: # Set childpos to index of smaller child. rightpos = childpos + 1 - if rightpos < endpos and heap[rightpos] <= heap[childpos]: + if rightpos < endpos and not heap[childpos] < heap[rightpos]: childpos = rightpos # Move the smaller child up. heap[pos] = heap[childpos] Modified: python/branches/tlee-ast-optimize/Lib/httplib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/httplib.py (original) +++ python/branches/tlee-ast-optimize/Lib/httplib.py Sun Jun 1 17:18:10 2008 @@ -639,7 +639,8 @@ debuglevel = 0 strict = 0 - def __init__(self, host, port=None, strict=None, timeout=None): + def __init__(self, host, port=None, strict=None, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT): self.timeout = timeout self.sock = None self._buffer = [] @@ -1055,7 +1056,7 @@ default_port = HTTPS_PORT def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=None): + strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): HTTPConnection.__init__(self, host, port, strict, timeout) self.key_file = key_file self.cert_file = cert_file Modified: python/branches/tlee-ast-optimize/Lib/lib-tk/Tkinter.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/lib-tk/Tkinter.py (original) +++ python/branches/tlee-ast-optimize/Lib/lib-tk/Tkinter.py Sun Jun 1 17:18:10 2008 @@ -30,7 +30,7 @@ tk.mainloop() """ -__version__ = "$Revision$" +__version__ = "$Revision: 63501 $" import sys if sys.platform == "win32": @@ -1053,6 +1053,12 @@ if k[-1] == '_': k = k[:-1] if callable(v): v = self._register(v) + elif isinstance(v, (tuple, list)): + for item in v: + if not isinstance(item, (basestring, int)): + break + else: + v = ' '.join(map(str, v)) res = res + ('-'+k, v) return res def nametowidget(self, name): @@ -1092,7 +1098,6 @@ if self._tclCommands is None: self._tclCommands = [] self._tclCommands.append(name) - #print '+ Tkinter created command', name return name register = _register def _root(self): @@ -1747,10 +1752,11 @@ after=widget - pack it after you have packed widget anchor=NSEW (or subset) - position widget according to given direction - before=widget - pack it before you will pack widget + before=widget - pack it before you will pack widget expand=bool - expand widget if parent size grows fill=NONE or X or Y or BOTH - fill widget if widget grows in=master - use master to contain this widget + in_=master - see 'in' option description ipadx=amount - add internal padding in x direction ipady=amount - add internal padding in y direction padx=amount - add padding in x direction @@ -1788,29 +1794,26 @@ Base class to use the methods place_* in every widget.""" def place_configure(self, cnf={}, **kw): """Place a widget in the parent widget. Use as options: - in=master - master relative to which the widget is placed. + in=master - master relative to which the widget is placed + in_=master - see 'in' option description x=amount - locate anchor of this widget at position x of master y=amount - locate anchor of this widget at position y of master relx=amount - locate anchor of this widget between 0.0 and 1.0 relative to width of master (1.0 is right edge) - rely=amount - locate anchor of this widget between 0.0 and 1.0 + rely=amount - locate anchor of this widget between 0.0 and 1.0 relative to height of master (1.0 is bottom edge) - anchor=NSEW (or subset) - position anchor according to given direction + anchor=NSEW (or subset) - position anchor according to given direction width=amount - width of this widget in pixel height=amount - height of this widget in pixel relwidth=amount - width of this widget between 0.0 and 1.0 relative to width of master (1.0 is the same width - as the master) - relheight=amount - height of this widget between 0.0 and 1.0 + as the master) + relheight=amount - height of this widget between 0.0 and 1.0 relative to height of master (1.0 is the same - height as the master) - bordermode="inside" or "outside" - whether to take border width of master widget - into account - """ - for k in ['in_']: - if kw.has_key(k): - kw[k[:-1]] = kw[k] - del kw[k] + height as the master) + bordermode="inside" or "outside" - whether to take border width of + master widget into account + """ self.tk.call( ('place', 'configure', self._w) + self._options(cnf, kw)) @@ -1845,6 +1848,7 @@ column=number - use cell identified with given column (starting with 0) columnspan=number - this widget will span several columns in=master - use master to contain this widget + in_=master - see 'in' option description ipadx=amount - add internal padding in x direction ipady=amount - add internal padding in y direction padx=amount - add padding in x direction Modified: python/branches/tlee-ast-optimize/Lib/locale.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/locale.py (original) +++ python/branches/tlee-ast-optimize/Lib/locale.py Sun Jun 1 17:18:10 2008 @@ -615,6 +615,33 @@ # updated 'zh_cn.big5' -> 'zh_TW.eucTW' to 'zh_TW.big5' # updated 'zh_tw' -> 'zh_TW.eucTW' to 'zh_TW.big5' # +# MAL 2008-05-30: +# Updated alias mapping to most recent locale.alias file +# from X.org distribution using makelocalealias.py. +# +# These are the differences compared to the old mapping (Python 2.5 +# and older): +# +# updated 'cs_cs.iso88592' -> 'cs_CZ.ISO8859-2' to 'cs_CS.ISO8859-2' +# updated 'serbocroatian' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sh' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sh_hr.iso88592' -> 'sh_HR.ISO8859-2' to 'hr_HR.ISO8859-2' +# updated 'sh_sp' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sh_yu' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sp' -> 'sp_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sp_yu' -> 'sp_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr at cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_sp' -> 'sr_SP.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sr_yu' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_yu.cp1251 at cyrillic' -> 'sr_YU.CP1251' to 'sr_CS.CP1251' +# updated 'sr_yu.iso88592' -> 'sr_YU.ISO8859-2' to 'sr_CS.ISO8859-2' +# updated 'sr_yu.iso88595' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_yu.iso88595 at cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' +# updated 'sr_yu.microsoftcp1251 at cyrillic' -> 'sr_YU.CP1251' to 'sr_CS.CP1251' +# updated 'sr_yu.utf8 at cyrillic' -> 'sr_YU.UTF-8' to 'sr_CS.UTF-8' +# updated 'sr_yu at cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' + locale_alias = { 'a3': 'a3_AZ.KOI8-C', 'a3_az': 'a3_AZ.KOI8-C', @@ -623,30 +650,46 @@ 'af_za': 'af_ZA.ISO8859-1', 'af_za.iso88591': 'af_ZA.ISO8859-1', 'am': 'am_ET.UTF-8', + 'am_et': 'am_ET.UTF-8', 'american': 'en_US.ISO8859-1', 'american.iso88591': 'en_US.ISO8859-1', 'ar': 'ar_AA.ISO8859-6', 'ar_aa': 'ar_AA.ISO8859-6', 'ar_aa.iso88596': 'ar_AA.ISO8859-6', 'ar_ae': 'ar_AE.ISO8859-6', + 'ar_ae.iso88596': 'ar_AE.ISO8859-6', 'ar_bh': 'ar_BH.ISO8859-6', + 'ar_bh.iso88596': 'ar_BH.ISO8859-6', 'ar_dz': 'ar_DZ.ISO8859-6', + 'ar_dz.iso88596': 'ar_DZ.ISO8859-6', 'ar_eg': 'ar_EG.ISO8859-6', 'ar_eg.iso88596': 'ar_EG.ISO8859-6', 'ar_iq': 'ar_IQ.ISO8859-6', + 'ar_iq.iso88596': 'ar_IQ.ISO8859-6', 'ar_jo': 'ar_JO.ISO8859-6', + 'ar_jo.iso88596': 'ar_JO.ISO8859-6', 'ar_kw': 'ar_KW.ISO8859-6', + 'ar_kw.iso88596': 'ar_KW.ISO8859-6', 'ar_lb': 'ar_LB.ISO8859-6', + 'ar_lb.iso88596': 'ar_LB.ISO8859-6', 'ar_ly': 'ar_LY.ISO8859-6', + 'ar_ly.iso88596': 'ar_LY.ISO8859-6', 'ar_ma': 'ar_MA.ISO8859-6', + 'ar_ma.iso88596': 'ar_MA.ISO8859-6', 'ar_om': 'ar_OM.ISO8859-6', + 'ar_om.iso88596': 'ar_OM.ISO8859-6', 'ar_qa': 'ar_QA.ISO8859-6', + 'ar_qa.iso88596': 'ar_QA.ISO8859-6', 'ar_sa': 'ar_SA.ISO8859-6', 'ar_sa.iso88596': 'ar_SA.ISO8859-6', 'ar_sd': 'ar_SD.ISO8859-6', + 'ar_sd.iso88596': 'ar_SD.ISO8859-6', 'ar_sy': 'ar_SY.ISO8859-6', + 'ar_sy.iso88596': 'ar_SY.ISO8859-6', 'ar_tn': 'ar_TN.ISO8859-6', + 'ar_tn.iso88596': 'ar_TN.ISO8859-6', 'ar_ye': 'ar_YE.ISO8859-6', + 'ar_ye.iso88596': 'ar_YE.ISO8859-6', 'arabic': 'ar_AA.ISO8859-6', 'arabic.iso88596': 'ar_AA.ISO8859-6', 'az': 'az_AZ.ISO8859-9E', @@ -662,6 +705,7 @@ 'bg_bg.iso88595': 'bg_BG.ISO8859-5', 'bg_bg.koi8r': 'bg_BG.KOI8-R', 'bg_bg.microsoftcp1251': 'bg_BG.CP1251', + 'bn_in': 'bn_IN.UTF-8', 'bokmal': 'nb_NO.ISO8859-1', 'bokm\xe5l': 'nb_NO.ISO8859-1', 'br': 'br_FR.ISO8859-1', @@ -669,7 +713,12 @@ 'br_fr.iso88591': 'br_FR.ISO8859-1', 'br_fr.iso885914': 'br_FR.ISO8859-14', 'br_fr.iso885915': 'br_FR.ISO8859-15', + 'br_fr.iso885915 at euro': 'br_FR.ISO8859-15', + 'br_fr.utf8 at euro': 'br_FR.UTF-8', 'br_fr at euro': 'br_FR.ISO8859-15', + 'bs': 'bs_BA.ISO8859-2', + 'bs_ba': 'bs_BA.ISO8859-2', + 'bs_ba.iso88592': 'bs_BA.ISO8859-2', 'bulgarian': 'bg_BG.CP1251', 'c': 'C', 'c-french': 'fr_CA.ISO8859-1', @@ -682,6 +731,8 @@ 'ca_es': 'ca_ES.ISO8859-1', 'ca_es.iso88591': 'ca_ES.ISO8859-1', 'ca_es.iso885915': 'ca_ES.ISO8859-15', + 'ca_es.iso885915 at euro': 'ca_ES.ISO8859-15', + 'ca_es.utf8 at euro': 'ca_ES.UTF-8', 'ca_es at euro': 'ca_ES.ISO8859-15', 'catalan': 'ca_ES.ISO8859-1', 'cextend': 'en_US.ISO8859-1', @@ -691,7 +742,7 @@ 'croatian': 'hr_HR.ISO8859-2', 'cs': 'cs_CZ.ISO8859-2', 'cs_cs': 'cs_CZ.ISO8859-2', - 'cs_cs.iso88592': 'cs_CZ.ISO8859-2', + 'cs_cs.iso88592': 'cs_CS.ISO8859-2', 'cs_cz': 'cs_CZ.ISO8859-2', 'cs_cz.iso88592': 'cs_CZ.ISO8859-2', 'cy': 'cy_GB.ISO8859-1', @@ -717,10 +768,14 @@ 'de_at': 'de_AT.ISO8859-1', 'de_at.iso88591': 'de_AT.ISO8859-1', 'de_at.iso885915': 'de_AT.ISO8859-15', + 'de_at.iso885915 at euro': 'de_AT.ISO8859-15', + 'de_at.utf8 at euro': 'de_AT.UTF-8', 'de_at at euro': 'de_AT.ISO8859-15', 'de_be': 'de_BE.ISO8859-1', 'de_be.iso88591': 'de_BE.ISO8859-1', 'de_be.iso885915': 'de_BE.ISO8859-15', + 'de_be.iso885915 at euro': 'de_BE.ISO8859-15', + 'de_be.utf8 at euro': 'de_BE.UTF-8', 'de_be at euro': 'de_BE.ISO8859-15', 'de_ch': 'de_CH.ISO8859-1', 'de_ch.iso88591': 'de_CH.ISO8859-1', @@ -732,10 +787,14 @@ 'de_de.885915 at euro': 'de_DE.ISO8859-15', 'de_de.iso88591': 'de_DE.ISO8859-1', 'de_de.iso885915': 'de_DE.ISO8859-15', + 'de_de.iso885915 at euro': 'de_DE.ISO8859-15', + 'de_de.utf8 at euro': 'de_DE.UTF-8', 'de_de at euro': 'de_DE.ISO8859-15', 'de_lu': 'de_LU.ISO8859-1', 'de_lu.iso88591': 'de_LU.ISO8859-1', 'de_lu.iso885915': 'de_LU.ISO8859-15', + 'de_lu.iso885915 at euro': 'de_LU.ISO8859-15', + 'de_lu.utf8 at euro': 'de_LU.UTF-8', 'de_lu at euro': 'de_LU.ISO8859-15', 'deutsch': 'de_DE.ISO8859-1', 'dutch': 'nl_NL.ISO8859-1', @@ -755,6 +814,7 @@ 'en_be': 'en_BE.ISO8859-1', 'en_be at euro': 'en_BE.ISO8859-15', 'en_bw': 'en_BW.ISO8859-1', + 'en_bw.iso88591': 'en_BW.ISO8859-1', 'en_ca': 'en_CA.ISO8859-1', 'en_ca.iso88591': 'en_CA.ISO8859-1', 'en_gb': 'en_GB.ISO8859-1', @@ -763,15 +823,20 @@ 'en_gb.iso885915': 'en_GB.ISO8859-15', 'en_gb at euro': 'en_GB.ISO8859-15', 'en_hk': 'en_HK.ISO8859-1', + 'en_hk.iso88591': 'en_HK.ISO8859-1', 'en_ie': 'en_IE.ISO8859-1', 'en_ie.iso88591': 'en_IE.ISO8859-1', 'en_ie.iso885915': 'en_IE.ISO8859-15', + 'en_ie.iso885915 at euro': 'en_IE.ISO8859-15', + 'en_ie.utf8 at euro': 'en_IE.UTF-8', 'en_ie at euro': 'en_IE.ISO8859-15', 'en_in': 'en_IN.ISO8859-1', 'en_nz': 'en_NZ.ISO8859-1', 'en_nz.iso88591': 'en_NZ.ISO8859-1', 'en_ph': 'en_PH.ISO8859-1', + 'en_ph.iso88591': 'en_PH.ISO8859-1', 'en_sg': 'en_SG.ISO8859-1', + 'en_sg.iso88591': 'en_SG.ISO8859-1', 'en_uk': 'en_GB.ISO8859-1', 'en_us': 'en_US.ISO8859-1', 'en_us.88591': 'en_US.ISO8859-1', @@ -787,6 +852,7 @@ 'en_za.iso885915': 'en_ZA.ISO8859-15', 'en_za at euro': 'en_ZA.ISO8859-15', 'en_zw': 'en_ZW.ISO8859-1', + 'en_zw.iso88591': 'en_ZW.ISO8859-1', 'eng_gb': 'en_GB.ISO8859-1', 'eng_gb.8859': 'en_GB.ISO8859-1', 'english': 'en_EN.ISO8859-1', @@ -822,6 +888,8 @@ 'es_es.88591': 'es_ES.ISO8859-1', 'es_es.iso88591': 'es_ES.ISO8859-1', 'es_es.iso885915': 'es_ES.ISO8859-15', + 'es_es.iso885915 at euro': 'es_ES.ISO8859-15', + 'es_es.utf8 at euro': 'es_ES.UTF-8', 'es_es at euro': 'es_ES.ISO8859-15', 'es_gt': 'es_GT.ISO8859-1', 'es_gt.iso88591': 'es_GT.ISO8859-1', @@ -850,6 +918,7 @@ 'es_sv.iso885915': 'es_SV.ISO8859-15', 'es_sv at euro': 'es_SV.ISO8859-15', 'es_us': 'es_US.ISO8859-1', + 'es_us.iso88591': 'es_US.ISO8859-1', 'es_uy': 'es_UY.ISO8859-1', 'es_uy.iso88591': 'es_UY.ISO8859-1', 'es_uy.iso885915': 'es_UY.ISO8859-15', @@ -870,6 +939,8 @@ 'eu_es': 'eu_ES.ISO8859-1', 'eu_es.iso88591': 'eu_ES.ISO8859-1', 'eu_es.iso885915': 'eu_ES.ISO8859-15', + 'eu_es.iso885915 at euro': 'eu_ES.ISO8859-15', + 'eu_es.utf8 at euro': 'eu_ES.UTF-8', 'eu_es at euro': 'eu_ES.ISO8859-15', 'fa': 'fa_IR.UTF-8', 'fa_ir': 'fa_IR.UTF-8', @@ -879,6 +950,7 @@ 'fi_fi.88591': 'fi_FI.ISO8859-1', 'fi_fi.iso88591': 'fi_FI.ISO8859-1', 'fi_fi.iso885915': 'fi_FI.ISO8859-15', + 'fi_fi.iso885915 at euro': 'fi_FI.ISO8859-15', 'fi_fi.utf8 at euro': 'fi_FI.UTF-8', 'fi_fi at euro': 'fi_FI.ISO8859-15', 'finnish': 'fi_FI.ISO8859-1', @@ -893,6 +965,8 @@ 'fr_be.88591': 'fr_BE.ISO8859-1', 'fr_be.iso88591': 'fr_BE.ISO8859-1', 'fr_be.iso885915': 'fr_BE.ISO8859-15', + 'fr_be.iso885915 at euro': 'fr_BE.ISO8859-15', + 'fr_be.utf8 at euro': 'fr_BE.UTF-8', 'fr_be at euro': 'fr_BE.ISO8859-15', 'fr_ca': 'fr_CA.ISO8859-1', 'fr_ca.88591': 'fr_CA.ISO8859-1', @@ -908,11 +982,15 @@ 'fr_fr.88591': 'fr_FR.ISO8859-1', 'fr_fr.iso88591': 'fr_FR.ISO8859-1', 'fr_fr.iso885915': 'fr_FR.ISO8859-15', + 'fr_fr.iso885915 at euro': 'fr_FR.ISO8859-15', + 'fr_fr.utf8 at euro': 'fr_FR.UTF-8', 'fr_fr at euro': 'fr_FR.ISO8859-15', 'fr_lu': 'fr_LU.ISO8859-1', 'fr_lu.88591': 'fr_LU.ISO8859-1', 'fr_lu.iso88591': 'fr_LU.ISO8859-1', 'fr_lu.iso885915': 'fr_LU.ISO8859-15', + 'fr_lu.iso885915 at euro': 'fr_LU.ISO8859-15', + 'fr_lu.utf8 at euro': 'fr_LU.UTF-8', 'fr_lu at euro': 'fr_LU.ISO8859-15', 'fran\xe7ais': 'fr_FR.ISO8859-1', 'fre_fr': 'fr_FR.ISO8859-1', @@ -926,6 +1004,8 @@ 'ga_ie.iso88591': 'ga_IE.ISO8859-1', 'ga_ie.iso885914': 'ga_IE.ISO8859-14', 'ga_ie.iso885915': 'ga_IE.ISO8859-15', + 'ga_ie.iso885915 at euro': 'ga_IE.ISO8859-15', + 'ga_ie.utf8 at euro': 'ga_IE.UTF-8', 'ga_ie at euro': 'ga_IE.ISO8859-15', 'galego': 'gl_ES.ISO8859-1', 'galician': 'gl_ES.ISO8859-1', @@ -945,9 +1025,12 @@ 'gl_es': 'gl_ES.ISO8859-1', 'gl_es.iso88591': 'gl_ES.ISO8859-1', 'gl_es.iso885915': 'gl_ES.ISO8859-15', + 'gl_es.iso885915 at euro': 'gl_ES.ISO8859-15', + 'gl_es.utf8 at euro': 'gl_ES.UTF-8', 'gl_es at euro': 'gl_ES.ISO8859-15', 'greek': 'el_GR.ISO8859-7', 'greek.iso88597': 'el_GR.ISO8859-7', + 'gu_in': 'gu_IN.UTF-8', 'gv': 'gv_GB.ISO8859-1', 'gv_gb': 'gv_GB.ISO8859-1', 'gv_gb.iso88591': 'gv_GB.ISO8859-1', @@ -998,6 +1081,8 @@ 'it_it.88591': 'it_IT.ISO8859-1', 'it_it.iso88591': 'it_IT.ISO8859-1', 'it_it.iso885915': 'it_IT.ISO8859-15', + 'it_it.iso885915 at euro': 'it_IT.ISO8859-15', + 'it_it.utf8 at euro': 'it_IT.UTF-8', 'it_it at euro': 'it_IT.ISO8859-15', 'italian': 'it_IT.ISO8859-1', 'italian.iso88591': 'it_IT.ISO8859-1', @@ -1037,6 +1122,8 @@ 'kl_gl.iso88591': 'kl_GL.ISO8859-1', 'kl_gl.iso885915': 'kl_GL.ISO8859-15', 'kl_gl at euro': 'kl_GL.ISO8859-15', + 'km_kh': 'km_KH.UTF-8', + 'kn_in': 'kn_IN.UTF-8', 'ko': 'ko_KR.eucKR', 'ko_kr': 'ko_KR.eucKR', 'ko_kr.euc': 'ko_KR.eucKR', @@ -1049,6 +1136,8 @@ 'kw_gb.iso885914': 'kw_GB.ISO8859-14', 'kw_gb.iso885915': 'kw_GB.ISO8859-15', 'kw_gb at euro': 'kw_GB.ISO8859-15', + 'ky': 'ky_KG.UTF-8', + 'ky_kg': 'ky_KG.UTF-8', 'lithuanian': 'lt_LT.ISO8859-13', 'lo': 'lo_LA.MULELAO-1', 'lo_la': 'lo_LA.MULELAO-1', @@ -1071,6 +1160,7 @@ 'mk_mk.cp1251': 'mk_MK.CP1251', 'mk_mk.iso88595': 'mk_MK.ISO8859-5', 'mk_mk.microsoftcp1251': 'mk_MK.CP1251', + 'mr_in': 'mr_IN.UTF-8', 'ms': 'ms_MY.ISO8859-1', 'ms_my': 'ms_MY.ISO8859-1', 'ms_my.iso88591': 'ms_MY.ISO8859-1', @@ -1088,11 +1178,15 @@ 'nl_be.88591': 'nl_BE.ISO8859-1', 'nl_be.iso88591': 'nl_BE.ISO8859-1', 'nl_be.iso885915': 'nl_BE.ISO8859-15', + 'nl_be.iso885915 at euro': 'nl_BE.ISO8859-15', + 'nl_be.utf8 at euro': 'nl_BE.UTF-8', 'nl_be at euro': 'nl_BE.ISO8859-15', 'nl_nl': 'nl_NL.ISO8859-1', 'nl_nl.88591': 'nl_NL.ISO8859-1', 'nl_nl.iso88591': 'nl_NL.ISO8859-1', 'nl_nl.iso885915': 'nl_NL.ISO8859-15', + 'nl_nl.iso885915 at euro': 'nl_NL.ISO8859-15', + 'nl_nl.utf8 at euro': 'nl_NL.UTF-8', 'nl_nl at euro': 'nl_NL.ISO8859-15', 'nn': 'nn_NO.ISO8859-1', 'nn_no': 'nn_NO.ISO8859-1', @@ -1109,6 +1203,12 @@ 'no_no at euro': 'no_NO.ISO8859-15', 'norwegian': 'no_NO.ISO8859-1', 'norwegian.iso88591': 'no_NO.ISO8859-1', + 'nr': 'nr_ZA.ISO8859-1', + 'nr_za': 'nr_ZA.ISO8859-1', + 'nr_za.iso88591': 'nr_ZA.ISO8859-1', + 'nso': 'nso_ZA.ISO8859-15', + 'nso_za': 'nso_ZA.ISO8859-15', + 'nso_za.iso885915': 'nso_ZA.ISO8859-15', 'ny': 'ny_NO.ISO8859-1', 'ny_no': 'ny_NO.ISO8859-1', 'ny_no.88591': 'ny_NO.ISO8859-1', @@ -1121,6 +1221,7 @@ 'oc_fr.iso88591': 'oc_FR.ISO8859-1', 'oc_fr.iso885915': 'oc_FR.ISO8859-15', 'oc_fr at euro': 'oc_FR.ISO8859-15', + 'pa_in': 'pa_IN.UTF-8', 'pd': 'pd_US.ISO8859-1', 'pd_de': 'pd_DE.ISO8859-1', 'pd_de.iso88591': 'pd_DE.ISO8859-1', @@ -1156,6 +1257,7 @@ 'pt_pt.88591': 'pt_PT.ISO8859-1', 'pt_pt.iso88591': 'pt_PT.ISO8859-1', 'pt_pt.iso885915': 'pt_PT.ISO8859-15', + 'pt_pt.iso885915 at euro': 'pt_PT.ISO8859-15', 'pt_pt.utf8 at euro': 'pt_PT.UTF-8', 'pt_pt at euro': 'pt_PT.ISO8859-15', 'ro': 'ro_RO.ISO8859-2', @@ -1174,13 +1276,19 @@ 'ru_ua.microsoftcp1251': 'ru_UA.CP1251', 'rumanian': 'ro_RO.ISO8859-2', 'russian': 'ru_RU.ISO8859-5', + 'rw': 'rw_RW.ISO8859-1', + 'rw_rw': 'rw_RW.ISO8859-1', + 'rw_rw.iso88591': 'rw_RW.ISO8859-1', 'se_no': 'se_NO.UTF-8', - 'serbocroatian': 'sh_YU.ISO8859-2', - 'sh': 'sh_YU.ISO8859-2', + 'serbocroatian': 'sr_CS.ISO8859-2', + 'sh': 'sr_CS.ISO8859-2', 'sh_hr': 'sh_HR.ISO8859-2', - 'sh_hr.iso88592': 'sh_HR.ISO8859-2', - 'sh_sp': 'sh_YU.ISO8859-2', - 'sh_yu': 'sh_YU.ISO8859-2', + 'sh_hr.iso88592': 'hr_HR.ISO8859-2', + 'sh_sp': 'sr_CS.ISO8859-2', + 'sh_yu': 'sr_CS.ISO8859-2', + 'si': 'si_LK.UTF-8', + 'si_lk': 'si_LK.UTF-8', + 'sinhala': 'si_LK.UTF-8', 'sk': 'sk_SK.ISO8859-2', 'sk_sk': 'sk_SK.ISO8859-2', 'sk_sk.iso88592': 'sk_SK.ISO8859-2', @@ -1191,8 +1299,8 @@ 'slovak': 'sk_SK.ISO8859-2', 'slovene': 'sl_SI.ISO8859-2', 'slovenian': 'sl_SI.ISO8859-2', - 'sp': 'sp_YU.ISO8859-5', - 'sp_yu': 'sp_YU.ISO8859-5', + 'sp': 'sr_CS.ISO8859-5', + 'sp_yu': 'sr_CS.ISO8859-5', 'spanish': 'es_ES.ISO8859-1', 'spanish.iso88591': 'es_ES.ISO8859-1', 'spanish_spain': 'es_ES.ISO8859-1', @@ -1200,21 +1308,35 @@ 'sq': 'sq_AL.ISO8859-2', 'sq_al': 'sq_AL.ISO8859-2', 'sq_al.iso88592': 'sq_AL.ISO8859-2', - 'sr': 'sr_YU.ISO8859-5', - 'sr at cyrillic': 'sr_YU.ISO8859-5', - 'sr_sp': 'sr_SP.ISO8859-2', - 'sr_yu': 'sr_YU.ISO8859-5', - 'sr_yu.cp1251 at cyrillic': 'sr_YU.CP1251', - 'sr_yu.iso88592': 'sr_YU.ISO8859-2', - 'sr_yu.iso88595': 'sr_YU.ISO8859-5', - 'sr_yu.iso88595 at cyrillic': 'sr_YU.ISO8859-5', - 'sr_yu.microsoftcp1251 at cyrillic': 'sr_YU.CP1251', - 'sr_yu.utf8 at cyrillic': 'sr_YU.UTF-8', - 'sr_yu at cyrillic': 'sr_YU.ISO8859-5', + 'sr': 'sr_CS.ISO8859-5', + 'sr at cyrillic': 'sr_CS.ISO8859-5', + 'sr at latn': 'sr_CS.ISO8859-2', + 'sr_cs.iso88592': 'sr_CS.ISO8859-2', + 'sr_cs.iso88592 at latn': 'sr_CS.ISO8859-2', + 'sr_cs.iso88595': 'sr_CS.ISO8859-5', + 'sr_cs.utf8 at latn': 'sr_CS.UTF-8', + 'sr_cs at latn': 'sr_CS.ISO8859-2', + 'sr_sp': 'sr_CS.ISO8859-2', + 'sr_yu': 'sr_CS.ISO8859-5', + 'sr_yu.cp1251 at cyrillic': 'sr_CS.CP1251', + 'sr_yu.iso88592': 'sr_CS.ISO8859-2', + 'sr_yu.iso88595': 'sr_CS.ISO8859-5', + 'sr_yu.iso88595 at cyrillic': 'sr_CS.ISO8859-5', + 'sr_yu.microsoftcp1251 at cyrillic': 'sr_CS.CP1251', + 'sr_yu.utf8 at cyrillic': 'sr_CS.UTF-8', + 'sr_yu at cyrillic': 'sr_CS.ISO8859-5', + 'ss': 'ss_ZA.ISO8859-1', + 'ss_za': 'ss_ZA.ISO8859-1', + 'ss_za.iso88591': 'ss_ZA.ISO8859-1', + 'st': 'st_ZA.ISO8859-1', + 'st_za': 'st_ZA.ISO8859-1', + 'st_za.iso88591': 'st_ZA.ISO8859-1', 'sv': 'sv_SE.ISO8859-1', 'sv_fi': 'sv_FI.ISO8859-1', 'sv_fi.iso88591': 'sv_FI.ISO8859-1', 'sv_fi.iso885915': 'sv_FI.ISO8859-15', + 'sv_fi.iso885915 at euro': 'sv_FI.ISO8859-15', + 'sv_fi.utf8 at euro': 'sv_FI.UTF-8', 'sv_fi at euro': 'sv_FI.ISO8859-15', 'sv_se': 'sv_SE.ISO8859-1', 'sv_se.88591': 'sv_SE.ISO8859-1', @@ -1239,9 +1361,15 @@ 'tl': 'tl_PH.ISO8859-1', 'tl_ph': 'tl_PH.ISO8859-1', 'tl_ph.iso88591': 'tl_PH.ISO8859-1', + 'tn': 'tn_ZA.ISO8859-15', + 'tn_za': 'tn_ZA.ISO8859-15', + 'tn_za.iso885915': 'tn_ZA.ISO8859-15', 'tr': 'tr_TR.ISO8859-9', 'tr_tr': 'tr_TR.ISO8859-9', 'tr_tr.iso88599': 'tr_TR.ISO8859-9', + 'ts': 'ts_ZA.ISO8859-1', + 'ts_za': 'ts_ZA.ISO8859-1', + 'ts_za.iso88591': 'ts_ZA.ISO8859-1', 'tt': 'tt_RU.TATAR-CYR', 'tt_ru': 'tt_RU.TATAR-CYR', 'tt_ru.koi8c': 'tt_RU.KOI8-C', @@ -1263,6 +1391,11 @@ 'ur_pk.microsoftcp1256': 'ur_PK.CP1256', 'uz': 'uz_UZ.UTF-8', 'uz_uz': 'uz_UZ.UTF-8', + 'uz_uz.iso88591': 'uz_UZ.ISO8859-1', + 'uz_uz.utf8 at cyrillic': 'uz_UZ.UTF-8', + 'uz_uz at cyrillic': 'uz_UZ.UTF-8', + 've': 've_ZA.UTF-8', + 've_za': 've_ZA.UTF-8', 'vi': 'vi_VN.TCVN', 'vi_vn': 'vi_VN.TCVN', 'vi_vn.tcvn': 'vi_VN.TCVN', @@ -1273,7 +1406,11 @@ 'wa_be': 'wa_BE.ISO8859-1', 'wa_be.iso88591': 'wa_BE.ISO8859-1', 'wa_be.iso885915': 'wa_BE.ISO8859-15', + 'wa_be.iso885915 at euro': 'wa_BE.ISO8859-15', 'wa_be at euro': 'wa_BE.ISO8859-15', + 'xh': 'xh_ZA.ISO8859-1', + 'xh_za': 'xh_ZA.ISO8859-1', + 'xh_za.iso88591': 'xh_ZA.ISO8859-1', 'yi': 'yi_US.CP1255', 'yi_us': 'yi_US.CP1255', 'yi_us.cp1255': 'yi_US.CP1255', @@ -1291,6 +1428,10 @@ 'zh_tw': 'zh_TW.big5', 'zh_tw.big5': 'zh_TW.big5', 'zh_tw.euc': 'zh_TW.eucTW', + 'zh_tw.euctw': 'zh_TW.eucTW', + 'zu': 'zu_ZA.ISO8859-1', + 'zu_za': 'zu_ZA.ISO8859-1', + 'zu_za.iso88591': 'zu_ZA.ISO8859-1', } # Modified: python/branches/tlee-ast-optimize/Lib/poplib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/poplib.py (original) +++ python/branches/tlee-ast-optimize/Lib/poplib.py Sun Jun 1 17:18:10 2008 @@ -76,7 +76,8 @@ """ - def __init__(self, host, port=POP3_PORT, timeout=None): + def __init__(self, host, port=POP3_PORT, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT): self.host = host self.port = port self.sock = socket.create_connection((host, port), timeout) Modified: python/branches/tlee-ast-optimize/Lib/smtplib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/smtplib.py (original) +++ python/branches/tlee-ast-optimize/Lib/smtplib.py Sun Jun 1 17:18:10 2008 @@ -220,7 +220,8 @@ ehlo_resp = None does_esmtp = 0 - def __init__(self, host='', port=0, local_hostname=None, timeout=None): + def __init__(self, host='', port=0, local_hostname=None, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT): """Initialize a new instance. If specified, `host' is the name of the remote host to which to @@ -741,7 +742,8 @@ certificate chain file for the SSL connection. """ def __init__(self, host='', port=0, local_hostname=None, - keyfile=None, certfile=None, timeout=None): + keyfile=None, certfile=None, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT): self.keyfile = keyfile self.certfile = certfile SMTP.__init__(self, host, port, local_hostname, timeout) Modified: python/branches/tlee-ast-optimize/Lib/socket.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/socket.py (original) +++ python/branches/tlee-ast-optimize/Lib/socket.py Sun Jun 1 17:18:10 2008 @@ -480,14 +480,17 @@ raise StopIteration return line +_GLOBAL_DEFAULT_TIMEOUT = object() -def create_connection(address, timeout=None): - """Connect to address (host, port) with an optional timeout. +def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT): + """Connect to *address* and return the socket object. - Provides access to socketobject timeout for higher-level - protocols. Passing a timeout will set the timeout on the - socket instance (if not present, or passed as None, the - default global timeout setting will be used). + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. """ msg = "getaddrinfo returns an empty list" @@ -497,7 +500,7 @@ sock = None try: sock = socket(af, socktype, proto) - if timeout is not None: + if timeout is not _GLOBAL_DEFAULT_TIMEOUT: sock.settimeout(timeout) sock.connect(sa) return sock Modified: python/branches/tlee-ast-optimize/Lib/sqlite3/test/dbapi.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/sqlite3/test/dbapi.py (original) +++ python/branches/tlee-ast-optimize/Lib/sqlite3/test/dbapi.py Sun Jun 1 17:18:10 2008 @@ -297,6 +297,15 @@ self.cu.execute("update test set name='bar'") self.failUnlessEqual(self.cu.rowcount, 2) + def CheckRowcountSelect(self): + """ + pysqlite does not know the rowcount of SELECT statements, because we + don't fetch all rows after executing the select statement. The rowcount + has thus to be -1. + """ + self.cu.execute("select 5 union select 6") + self.failUnlessEqual(self.cu.rowcount, -1) + def CheckRowcountExecutemany(self): self.cu.execute("delete from test") self.cu.executemany("insert into test(name) values (?)", [(1,), (2,), (3,)]) Modified: python/branches/tlee-ast-optimize/Lib/sre_parse.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/sre_parse.py (original) +++ python/branches/tlee-ast-optimize/Lib/sre_parse.py Sun Jun 1 17:18:10 2008 @@ -139,8 +139,6 @@ return self.data[index] def __setitem__(self, index, code): self.data[index] = code - def __getslice__(self, start, stop): - return SubPattern(self.pattern, self.data[start:stop]) def insert(self, index, code): self.data.insert(index, code) def append(self, code): Modified: python/branches/tlee-ast-optimize/Lib/subprocess.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/subprocess.py (original) +++ python/branches/tlee-ast-optimize/Lib/subprocess.py Sun Jun 1 17:18:10 2008 @@ -661,8 +661,10 @@ self.stdin.close() elif self.stdout: stdout = self.stdout.read() + self.stdout.close() elif self.stderr: stderr = self.stderr.read() + self.stderr.close() self.wait() return (stdout, stderr) Modified: python/branches/tlee-ast-optimize/Lib/tarfile.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/tarfile.py (original) +++ python/branches/tlee-ast-optimize/Lib/tarfile.py Sun Jun 1 17:18:10 2008 @@ -692,7 +692,6 @@ if self.mode == "w": raw = self.bz2obj.flush() self.fileobj.write(raw) - self.fileobj.close() # class _BZ2Proxy #------------------------ Modified: python/branches/tlee-ast-optimize/Lib/telnetlib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/telnetlib.py (original) +++ python/branches/tlee-ast-optimize/Lib/telnetlib.py Sun Jun 1 17:18:10 2008 @@ -184,13 +184,13 @@ """ - def __init__(self, host=None, port=0, timeout=None): + def __init__(self, host=None, port=0, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT): """Constructor. When called without arguments, create an unconnected instance. - With a hostname argument, it connects the instance; a port - number is optional. - + With a hostname argument, it connects the instance; port number + and timeout are optional. """ self.debuglevel = DEBUGLEVEL self.host = host @@ -208,23 +208,21 @@ if host is not None: self.open(host, port, timeout) - def open(self, host, port=0, timeout=None): + def open(self, host, port=0, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): """Connect to a host. The optional second argument is the port number, which defaults to the standard telnet port (23). Don't try to reopen an already connected instance. - """ self.eof = 0 if not port: port = TELNET_PORT self.host = host self.port = port - if timeout is not None: - self.timeout = timeout - self.sock = socket.create_connection((host, port), self.timeout) + self.timeout = timeout + self.sock = socket.create_connection((host, port), timeout) def __del__(self): """Destructor -- close the connection.""" Modified: python/branches/tlee-ast-optimize/Lib/test/pydoc_mod.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/pydoc_mod.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/pydoc_mod.py Sun Jun 1 17:18:10 2008 @@ -25,30 +25,3 @@ def nodoc_func(): pass -"""This is a test module for test_pydoc""" - -__author__ = "Benjamin Peterson" -__credits__ = "Nobody" -__version__ = "1.2.3.4" - - -class A: - """Hello and goodbye""" - def __init__(): - """Wow, I have no function!""" - pass - -class B(object): - NO_MEANING = "eggs" - pass - -def doc_func(): - """ - This function solves all of the world's problems: - hunger - lack of Python - war - """ - -def nodoc_func(): - pass Modified: python/branches/tlee-ast-optimize/Lib/test/test___all__.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test___all__.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test___all__.py Sun Jun 1 17:18:10 2008 @@ -144,6 +144,7 @@ self.check_all("tarfile") self.check_all("telnetlib") self.check_all("tempfile") + self.check_all("test.test_support") self.check_all("textwrap") self.check_all("threading") self.check_all("timeit") Modified: python/branches/tlee-ast-optimize/Lib/test/test_bsddb3.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_bsddb3.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_bsddb3.py Sun Jun 1 17:18:10 2008 @@ -52,13 +52,13 @@ def test_main(): from bsddb import db from bsddb.test import test_all - test_all.get_new_path.prefix = os.path.join(tempfile.gettempdir(), - 'z-test_bsddb3-%s' % - os.getpid()) + test_all.set_test_path_prefix(os.path.join(tempfile.gettempdir(), + 'z-test_bsddb3-%s' % + os.getpid())) # Please leave this print in, having this show up in the buildbots # makes diagnosing problems a lot easier. print >>sys.stderr, db.DB_VERSION_STRING - print >>sys.stderr, 'Test path prefix: ', test_all.get_new_path.prefix + print >>sys.stderr, 'Test path prefix: ', test_all.get_test_path_prefix() try: run_unittest(test_all.suite(module_prefix='bsddb.test.', timing_check=TimingCheck)) @@ -67,7 +67,7 @@ # one lying around. This might be by a different user, so just # ignore errors. We should always make a unique name now. try: - rmtree(test_all.get_new_path.prefix) + test_all.remove_test_path_directory() except: pass Modified: python/branches/tlee-ast-optimize/Lib/test/test_ftplib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_ftplib.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_ftplib.py Sun Jun 1 17:18:10 2008 @@ -53,35 +53,52 @@ # connects ftp = ftplib.FTP(HOST) self.evt.wait() - ftp.sock.close() + ftp.close() def testTimeoutDefault(self): - # default - ftp = ftplib.FTP(HOST) + # default -- use global socket timeout + self.assert_(socket.getdefaulttimeout() is None) + socket.setdefaulttimeout(30) + try: + ftp = ftplib.FTP("localhost") + finally: + socket.setdefaulttimeout(None) + self.assertEqual(ftp.sock.gettimeout(), 30) + self.evt.wait() + ftp.close() + + def testTimeoutNone(self): + # no timeout -- do not use global socket timeout + self.assert_(socket.getdefaulttimeout() is None) + socket.setdefaulttimeout(30) + try: + ftp = ftplib.FTP("localhost", timeout=None) + finally: + socket.setdefaulttimeout(None) self.assertTrue(ftp.sock.gettimeout() is None) self.evt.wait() - ftp.sock.close() + ftp.close() def testTimeoutValue(self): # a value ftp = ftplib.FTP(HOST, timeout=30) self.assertEqual(ftp.sock.gettimeout(), 30) self.evt.wait() - ftp.sock.close() + ftp.close() def testTimeoutConnect(self): ftp = ftplib.FTP() ftp.connect(HOST, timeout=30) self.assertEqual(ftp.sock.gettimeout(), 30) self.evt.wait() - ftp.sock.close() + ftp.close() def testTimeoutDifferentOrder(self): ftp = ftplib.FTP(timeout=30) ftp.connect(HOST) self.assertEqual(ftp.sock.gettimeout(), 30) self.evt.wait() - ftp.sock.close() + ftp.close() def testTimeoutDirectAccess(self): ftp = ftplib.FTP() @@ -89,18 +106,6 @@ ftp.connect(HOST) self.assertEqual(ftp.sock.gettimeout(), 30) self.evt.wait() - ftp.sock.close() - - def testTimeoutNone(self): - # None, having other default - previous = socket.getdefaulttimeout() - socket.setdefaulttimeout(30) - try: - ftp = ftplib.FTP(HOST, timeout=None) - finally: - socket.setdefaulttimeout(previous) - self.assertEqual(ftp.sock.gettimeout(), 30) - self.evt.wait() ftp.close() Modified: python/branches/tlee-ast-optimize/Lib/test/test_httplib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_httplib.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_httplib.py Sun Jun 1 17:18:10 2008 @@ -214,27 +214,32 @@ '''This will prove that the timeout gets through HTTPConnection and into the socket. ''' - # default - httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT) - httpConn.connect() - self.assertTrue(httpConn.sock.gettimeout() is None) - httpConn.close() - - # a value - httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT, timeout=30) - httpConn.connect() + # default -- use global socket timeout + self.assert_(socket.getdefaulttimeout() is None) + socket.setdefaulttimeout(30) + try: + httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT) + httpConn.connect() + finally: + socket.setdefaulttimeout(None) self.assertEqual(httpConn.sock.gettimeout(), 30) httpConn.close() - # None, having other default - previous = socket.getdefaulttimeout() + # no timeout -- do not use global socket default + self.assert_(socket.getdefaulttimeout() is None) socket.setdefaulttimeout(30) try: httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT, timeout=None) httpConn.connect() finally: - socket.setdefaulttimeout(previous) + socket.setdefaulttimeout(None) + self.assertEqual(httpConn.sock.gettimeout(), None) + httpConn.close() + + # a value + httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT, timeout=30) + httpConn.connect() self.assertEqual(httpConn.sock.gettimeout(), 30) httpConn.close() Modified: python/branches/tlee-ast-optimize/Lib/test/test_math.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_math.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_math.py Sun Jun 1 17:18:10 2008 @@ -740,7 +740,7 @@ OverflowError), ([2.**1023, 2.**1023, -1e307], OverflowError), ([1e16, 1., 1e-16], 10000000000000002.0), - ([1e16-2., 1.-2.**53, -(1e16-2.), -(1.-2.**53)], 0.0), + ([1e16-2., 1.-2.**-53, -(1e16-2.), -(1.-2.**-53)], 0.0), ] for i, (vals, s) in enumerate(test_values): Modified: python/branches/tlee-ast-optimize/Lib/test/test_poplib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_poplib.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_poplib.py Sun Jun 1 17:18:10 2008 @@ -40,28 +40,29 @@ pop.sock.close() def testTimeoutDefault(self): - # default - pop = poplib.POP3(HOST, self.port) - self.assertTrue(pop.sock.gettimeout() is None) - pop.sock.close() - - def testTimeoutValue(self): - # a value - pop = poplib.POP3(HOST, self.port, timeout=30) + self.assertTrue(socket.getdefaulttimeout() is None) + socket.setdefaulttimeout(30) + try: + pop = poplib.POP3("localhost", self.port) + finally: + socket.setdefaulttimeout(None) self.assertEqual(pop.sock.gettimeout(), 30) pop.sock.close() def testTimeoutNone(self): - # None, having other default - previous = socket.getdefaulttimeout() + self.assertTrue(socket.getdefaulttimeout() is None) socket.setdefaulttimeout(30) try: pop = poplib.POP3(HOST, self.port, timeout=None) finally: - socket.setdefaulttimeout(previous) - self.assertEqual(pop.sock.gettimeout(), 30) + socket.setdefaulttimeout(None) + self.assertTrue(pop.sock.gettimeout() is None) pop.sock.close() + def testTimeoutValue(self): + pop = poplib.POP3("localhost", self.port, timeout=30) + self.assertEqual(pop.sock.gettimeout(), 30) + pop.sock.close() def test_main(verbose=None): Modified: python/branches/tlee-ast-optimize/Lib/test/test_py3kwarn.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_py3kwarn.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_py3kwarn.py Sun Jun 1 17:18:10 2008 @@ -207,15 +207,32 @@ for path_mod in ("ntpath", "macpath", "os2emxpath", "posixpath"): mod = __import__(path_mod) with catch_warning() as w: - # Since os3exmpath just imports it from ntpath - warnings.simplefilter("always") - mod.walk(".", dumbo, None) + mod.walk("crashers", dumbo, None) self.assertEquals(str(w.message), msg) + def test_commands_members(self): + import commands + members = {"mk2arg" : 2, "mkarg" : 1, "getstatus" : 1} + for name, arg_count in members.items(): + with catch_warning(record=False): + warnings.filterwarnings("error") + func = getattr(commands, name) + self.assertRaises(DeprecationWarning, func, *([None]*arg_count)) + + def test_mutablestring_removal(self): + # UserString.MutableString has been removed in 3.0. + import UserString + with catch_warning(record=False): + warnings.filterwarnings("error", ".*MutableString", + DeprecationWarning) + self.assertRaises(DeprecationWarning, UserString.MutableString) + def test_main(): - run_unittest(TestPy3KWarnings, - TestStdlibRemovals) + with catch_warning(record=True): + warnings.simplefilter("always") + run_unittest(TestPy3KWarnings, + TestStdlibRemovals) if __name__ == '__main__': test_main() Modified: python/branches/tlee-ast-optimize/Lib/test/test_smtplib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_smtplib.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_smtplib.py Sun Jun 1 17:18:10 2008 @@ -54,41 +54,43 @@ def testBasic1(self): # connects smtp = smtplib.SMTP(HOST, self.port) - smtp.sock.close() + smtp.close() def testBasic2(self): # connects, include port in host name smtp = smtplib.SMTP("%s:%s" % (HOST, self.port)) - smtp.sock.close() + smtp.close() def testLocalHostName(self): # check that supplied local_hostname is used smtp = smtplib.SMTP(HOST, self.port, local_hostname="testhost") self.assertEqual(smtp.local_hostname, "testhost") - smtp.sock.close() + smtp.close() def testTimeoutDefault(self): - # default - smtp = smtplib.SMTP(HOST, self.port) - self.assertTrue(smtp.sock.gettimeout() is None) - smtp.sock.close() - - def testTimeoutValue(self): - # a value - smtp = smtplib.SMTP(HOST, self.port, timeout=30) + self.assertTrue(socket.getdefaulttimeout() is None) + socket.setdefaulttimeout(30) + try: + smtp = smtplib.SMTP(HOST, self.port) + finally: + socket.setdefaulttimeout(None) self.assertEqual(smtp.sock.gettimeout(), 30) - smtp.sock.close() + smtp.close() def testTimeoutNone(self): - # None, having other default - previous = socket.getdefaulttimeout() + self.assertTrue(socket.getdefaulttimeout() is None) socket.setdefaulttimeout(30) try: smtp = smtplib.SMTP(HOST, self.port, timeout=None) finally: - socket.setdefaulttimeout(previous) + socket.setdefaulttimeout(None) + self.assertTrue(smtp.sock.gettimeout() is None) + smtp.close() + + def testTimeoutValue(self): + smtp = smtplib.SMTP(HOST, self.port, timeout=30) self.assertEqual(smtp.sock.gettimeout(), 30) - smtp.sock.close() + smtp.close() # Test server thread using the specified SMTP server class Modified: python/branches/tlee-ast-optimize/Lib/test/test_socket.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_socket.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_socket.py Sun Jun 1 17:18:10 2008 @@ -901,8 +901,25 @@ testTimeoutDefault = _justAccept def _testTimeoutDefault(self): - self.cli = socket.create_connection((HOST, self.port)) - self.assertTrue(self.cli.gettimeout() is None) + # passing no explicit timeout uses socket's global default + self.assert_(socket.getdefaulttimeout() is None) + socket.setdefaulttimeout(42) + try: + self.cli = socket.create_connection((HOST, self.port)) + finally: + socket.setdefaulttimeout(None) + self.assertEquals(self.cli.gettimeout(), 42) + + testTimeoutNone = _justAccept + def _testTimeoutNone(self): + # None timeout means the same as sock.settimeout(None) + self.assert_(socket.getdefaulttimeout() is None) + socket.setdefaulttimeout(30) + try: + self.cli = socket.create_connection((HOST, self.port), timeout=None) + finally: + socket.setdefaulttimeout(None) + self.assertEqual(self.cli.gettimeout(), None) testTimeoutValueNamed = _justAccept def _testTimeoutValueNamed(self): @@ -914,17 +931,6 @@ self.cli = socket.create_connection((HOST, self.port), 30) self.assertEqual(self.cli.gettimeout(), 30) - testTimeoutNone = _justAccept - def _testTimeoutNone(self): - previous = socket.getdefaulttimeout() - socket.setdefaulttimeout(30) - try: - self.cli = socket.create_connection((HOST, self.port), timeout=None) - finally: - socket.setdefaulttimeout(previous) - self.assertEqual(self.cli.gettimeout(), 30) - - class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest): def __init__(self, methodName='runTest'): Modified: python/branches/tlee-ast-optimize/Lib/test/test_subprocess.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_subprocess.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_subprocess.py Sun Jun 1 17:18:10 2008 @@ -287,14 +287,12 @@ stderr=subprocess.PIPE) (stdout, stderr) = p.communicate() self.assertEqual(stdout, None) - # When running with a pydebug build, the # of references is outputted - # to stderr, so just check if stderr at least started with "pinapple" - self.assert_(stderr.startswith("pineapple")) + self.assertEqual(remove_stderr_debug_decorations(stderr), "pineapple") def test_communicate(self): p = subprocess.Popen([sys.executable, "-c", - 'import sys,os;' \ - 'sys.stderr.write("pineapple");' \ + 'import sys,os;' + 'sys.stderr.write("pineapple");' 'sys.stdout.write(sys.stdin.read())'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, @@ -304,6 +302,22 @@ self.assertEqual(remove_stderr_debug_decorations(stderr), "pineapple") + # This test is Linux specific for simplicity to at least have + # some coverage. It is not a platform specific bug. + if os.path.isdir('/proc/%d/fd' % os.getpid()): + # Test for the fd leak reported in http://bugs.python.org/issue2791. + def test_communicate_pipe_fd_leak(self): + fd_directory = '/proc/%d/fd' % os.getpid() + num_fds_before_popen = len(os.listdir(fd_directory)) + p = subprocess.Popen([sys.executable, '-c', 'print()'], + stdout=subprocess.PIPE) + p.communicate() + num_fds_after_communicate = len(os.listdir(fd_directory)) + del p + num_fds_after_destruction = len(os.listdir(fd_directory)) + self.assertEqual(num_fds_before_popen, num_fds_after_destruction) + self.assertEqual(num_fds_before_popen, num_fds_after_communicate) + def test_communicate_returns(self): # communicate() should return None if no redirection is active p = subprocess.Popen([sys.executable, "-c", Modified: python/branches/tlee-ast-optimize/Lib/test/test_support.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_support.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_support.py Sun Jun 1 17:18:10 2008 @@ -13,6 +13,19 @@ import warnings import unittest +__all__ = ["Error", "TestFailed", "TestSkipped", "ResourceDenied", "import_module", + "verbose", "use_resources", "max_memuse", "record_original_stdout", + "get_original_stdout", "unload", "unlink", "rmtree", "forget", + "is_resource_enabled", "requires", "find_unused_port", "bind_port", + "fcmp", "have_unicode", "is_jython", "TESTFN", "HOST", "FUZZ", + "findfile", "verify", "vereq", "sortdict", "check_syntax_error", + "open_urlresource", "WarningMessage", "catch_warning", "CleanImport", + "EnvironmentVarGuard", "TransientResource", "captured_output", + "captured_stdout", "TransientResource", "transient_internet", + "run_with_locale", "set_memlimit", "bigmemtest", "bigaddrspacetest", + "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup", + "threading_cleanup", "reap_children"] + class Error(Exception): """Base class for regression test exceptions.""" @@ -584,11 +597,7 @@ _1G = 1024 * _1M _2G = 2 * _1G -# Hack to get at the maximum value an internal index can take. -class _Dummy: - def __getslice__(self, i, j): - return j -MAX_Py_ssize_t = _Dummy()[:] +MAX_Py_ssize_t = sys.maxsize def set_memlimit(limit): import re Modified: python/branches/tlee-ast-optimize/Lib/test/test_sys.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_sys.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_sys.py Sun Jun 1 17:18:10 2008 @@ -385,6 +385,26 @@ ## self.assert_(r[0][2] > 100, r[0][2]) ## self.assert_(r[1][2] > 100, r[1][2]) + def test_ioencoding(self): + import subprocess,os + env = dict(os.environ) + + # Test character: cent sign, encoded as 0x4A (ASCII J) in CP424, + # not representable in ASCII. + + env["PYTHONIOENCODING"] = "cp424" + p = subprocess.Popen([sys.executable, "-c", 'print unichr(0xa2)'], + stdout = subprocess.PIPE, env=env) + out = p.stdout.read().strip() + self.assertEqual(out, unichr(0xa2).encode("cp424")) + + env["PYTHONIOENCODING"] = "ascii:replace" + p = subprocess.Popen([sys.executable, "-c", 'print unichr(0xa2)'], + stdout = subprocess.PIPE, env=env) + out = p.stdout.read().strip() + self.assertEqual(out, '?') + + def test_main(): test.test_support.run_unittest(SysModuleTest) Modified: python/branches/tlee-ast-optimize/Lib/test/test_tarfile.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_tarfile.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_tarfile.py Sun Jun 1 17:18:10 2008 @@ -529,7 +529,19 @@ self.assertEqual(float(tarinfo.pax_headers["ctime"]), 1041808783.0) -class WriteTest(unittest.TestCase): +class WriteTestBase(unittest.TestCase): + # Put all write tests in here that are supposed to be tested + # in all possible mode combinations. + + def test_fileobj_no_close(self): + fobj = StringIO.StringIO() + tar = tarfile.open(fileobj=fobj, mode=self.mode) + tar.addfile(tarfile.TarInfo("foo")) + tar.close() + self.assert_(fobj.closed is False, "external fileobjs must never closed") + + +class WriteTest(WriteTestBase): mode = "w:" @@ -652,7 +664,7 @@ shutil.rmtree(tempdir) -class StreamWriteTest(unittest.TestCase): +class StreamWriteTest(WriteTestBase): mode = "w|" Modified: python/branches/tlee-ast-optimize/Lib/test/test_telnetlib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_telnetlib.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_telnetlib.py Sun Jun 1 17:18:10 2008 @@ -40,34 +40,36 @@ telnet.sock.close() def testTimeoutDefault(self): - # default - telnet = telnetlib.Telnet(HOST, self.port) - self.assertTrue(telnet.sock.gettimeout() is None) - telnet.sock.close() - - def testTimeoutValue(self): - # a value - telnet = telnetlib.Telnet(HOST, self.port, timeout=30) - self.assertEqual(telnet.sock.gettimeout(), 30) - telnet.sock.close() - - def testTimeoutDifferentOrder(self): - telnet = telnetlib.Telnet(timeout=30) - telnet.open(HOST, self.port) + self.assertTrue(socket.getdefaulttimeout() is None) + socket.setdefaulttimeout(30) + try: + telnet = telnetlib.Telnet("localhost", self.port) + finally: + socket.setdefaulttimeout(None) self.assertEqual(telnet.sock.gettimeout(), 30) telnet.sock.close() def testTimeoutNone(self): # None, having other default - previous = socket.getdefaulttimeout() + self.assertTrue(socket.getdefaulttimeout() is None) socket.setdefaulttimeout(30) try: telnet = telnetlib.Telnet(HOST, self.port, timeout=None) finally: - socket.setdefaulttimeout(previous) + socket.setdefaulttimeout(None) + self.assertTrue(telnet.sock.gettimeout() is None) + telnet.sock.close() + + def testTimeoutValue(self): + telnet = telnetlib.Telnet("localhost", self.port, timeout=30) self.assertEqual(telnet.sock.gettimeout(), 30) telnet.sock.close() + def testTimeoutOpen(self): + telnet = telnetlib.Telnet() + telnet.open("localhost", self.port, timeout=30) + self.assertEqual(telnet.sock.gettimeout(), 30) + telnet.sock.close() def test_main(verbose=None): Modified: python/branches/tlee-ast-optimize/Lib/test/test_urllib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_urllib.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_urllib.py Sun Jun 1 17:18:10 2008 @@ -568,6 +568,7 @@ # . Facundo # # def server(evt): +# import socket, time # serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # serv.settimeout(3) # serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) @@ -592,6 +593,7 @@ # class FTPWrapperTests(unittest.TestCase): # # def setUp(self): +# import ftplib, time, threading # ftplib.FTP.port = 9093 # self.evt = threading.Event() # threading.Thread(target=server, args=(self.evt,)).start() @@ -603,31 +605,37 @@ # def testBasic(self): # # connects # ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) -# ftp.ftp.sock.close() +# ftp.close() # -# def testTimeoutDefault(self): -# # default -# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) -# self.assertTrue(ftp.ftp.sock.gettimeout() is None) -# ftp.ftp.sock.close() -# -# def testTimeoutValue(self): -# # a value -# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [], timeout=30) +# def testTimeoutNone(self): +# # global default timeout is ignored +# import socket +# self.assert_(socket.getdefaulttimeout() is None) +# socket.setdefaulttimeout(30) +# try: +# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) +# finally: +# socket.setdefaulttimeout(None) # self.assertEqual(ftp.ftp.sock.gettimeout(), 30) -# ftp.ftp.sock.close() +# ftp.close() # -# def testTimeoutNone(self): -# # None, having other default -# previous = socket.getdefaulttimeout() +# def testTimeoutDefault(self): +# # global default timeout is used +# import socket +# self.assert_(socket.getdefaulttimeout() is None) # socket.setdefaulttimeout(30) # try: # ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) # finally: -# socket.setdefaulttimeout(previous) +# socket.setdefaulttimeout(None) # self.assertEqual(ftp.ftp.sock.gettimeout(), 30) -# ftp.ftp.close() +# ftp.close() # +# def testTimeoutValue(self): +# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [], +# timeout=30) +# self.assertEqual(ftp.ftp.sock.gettimeout(), 30) +# ftp.close() Modified: python/branches/tlee-ast-optimize/Lib/test/test_urllib2.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_urllib2.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_urllib2.py Sun Jun 1 17:18:10 2008 @@ -2,6 +2,7 @@ from test import test_support import os +import socket import StringIO import urllib2 @@ -551,14 +552,15 @@ class NullFTPHandler(urllib2.FTPHandler): def __init__(self, data): self.data = data - def connect_ftp(self, user, passwd, host, port, dirs, timeout=None): + def connect_ftp(self, user, passwd, host, port, dirs, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT): self.user, self.passwd = user, passwd self.host, self.port = host, port self.dirs = dirs self.ftpwrapper = MockFTPWrapper(self.data) return self.ftpwrapper - import ftplib, socket + import ftplib data = "rheum rhaponicum" h = NullFTPHandler(data) o = h.parent = MockOpener() @@ -691,7 +693,7 @@ self.req_headers = [] self.data = None self.raise_on_endheaders = False - def __call__(self, host, timeout=None): + def __call__(self, host, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): self.host = host self.timeout = timeout return self Modified: python/branches/tlee-ast-optimize/Lib/test/test_urllib2net.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_urllib2net.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_urllib2net.py Sun Jun 1 17:18:10 2008 @@ -189,46 +189,58 @@ class TimeoutTest(unittest.TestCase): def test_http_basic(self): + self.assertTrue(socket.getdefaulttimeout() is None) u = _urlopen_with_retry("http://www.python.org") self.assertTrue(u.fp._sock.fp._sock.gettimeout() is None) - def test_http_NoneWithdefault(self): - prev = socket.getdefaulttimeout() + def test_http_default_timeout(self): + self.assertTrue(socket.getdefaulttimeout() is None) + socket.setdefaulttimeout(60) + try: + u = _urlopen_with_retry("http://www.python.org") + finally: + socket.setdefaulttimeout(None) + self.assertEqual(u.fp._sock.fp._sock.gettimeout(), 60) + + def test_http_no_timeout(self): + self.assertTrue(socket.getdefaulttimeout() is None) socket.setdefaulttimeout(60) try: u = _urlopen_with_retry("http://www.python.org", timeout=None) - self.assertEqual(u.fp._sock.fp._sock.gettimeout(), 60) finally: - socket.setdefaulttimeout(prev) + socket.setdefaulttimeout(None) + self.assertTrue(u.fp._sock.fp._sock.gettimeout() is None) - def test_http_Value(self): + def test_http_timeout(self): u = _urlopen_with_retry("http://www.python.org", timeout=120) self.assertEqual(u.fp._sock.fp._sock.gettimeout(), 120) - def test_http_NoneNodefault(self): - u = _urlopen_with_retry("http://www.python.org", timeout=None) - self.assertTrue(u.fp._sock.fp._sock.gettimeout() is None) - FTP_HOST = "ftp://ftp.mirror.nl/pub/mirror/gnu/" def test_ftp_basic(self): + self.assertTrue(socket.getdefaulttimeout() is None) u = _urlopen_with_retry(self.FTP_HOST) self.assertTrue(u.fp.fp._sock.gettimeout() is None) - def test_ftp_NoneWithdefault(self): - prev = socket.getdefaulttimeout() + def test_ftp_default_timeout(self): + self.assertTrue(socket.getdefaulttimeout() is None) socket.setdefaulttimeout(60) try: - u = _urlopen_with_retry(self.FTP_HOST, timeout=None) - self.assertEqual(u.fp.fp._sock.gettimeout(), 60) + u = _urlopen_with_retry(self.FTP_HOST) finally: - socket.setdefaulttimeout(prev) + socket.setdefaulttimeout(None) + self.assertEqual(u.fp.fp._sock.gettimeout(), 60) - def test_ftp_NoneNodefault(self): - u = _urlopen_with_retry(self.FTP_HOST, timeout=None) + def test_ftp_no_timeout(self): + self.assertTrue(socket.getdefaulttimeout() is None) + socket.setdefaulttimeout(60) + try: + u = _urlopen_with_retry(self.FTP_HOST, timeout=None) + finally: + socket.setdefaulttimeout(None) self.assertTrue(u.fp.fp._sock.gettimeout() is None) - def test_ftp_Value(self): + def test_ftp_timeout(self): u = _urlopen_with_retry(self.FTP_HOST, timeout=60) self.assertEqual(u.fp.fp._sock.gettimeout(), 60) Modified: python/branches/tlee-ast-optimize/Lib/test/test_userstring.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/test/test_userstring.py (original) +++ python/branches/tlee-ast-optimize/Lib/test/test_userstring.py Sun Jun 1 17:18:10 2008 @@ -4,8 +4,8 @@ import string from test import test_support, string_tests - from UserString import UserString, MutableString +import warnings class UserStringTest( string_tests.CommonTest, @@ -135,7 +135,10 @@ self.assertEqual(s, "") def test_main(): - test_support.run_unittest(UserStringTest, MutableStringTest) + with test_support.catch_warning(record=False): + warnings.filterwarnings("ignore", ".*MutableString", + DeprecationWarning) + test_support.run_unittest(UserStringTest, MutableStringTest) if __name__ == "__main__": test_main() Modified: python/branches/tlee-ast-optimize/Lib/urllib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/urllib.py (original) +++ python/branches/tlee-ast-optimize/Lib/urllib.py Sun Jun 1 17:18:10 2008 @@ -832,7 +832,8 @@ class ftpwrapper: """Class used by open_ftp() for cache of open FTP connections.""" - def __init__(self, user, passwd, host, port, dirs, timeout=None): + def __init__(self, user, passwd, host, port, dirs, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT): self.user = user self.passwd = passwd self.host = host Modified: python/branches/tlee-ast-optimize/Lib/urllib2.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/urllib2.py (original) +++ python/branches/tlee-ast-optimize/Lib/urllib2.py Sun Jun 1 17:18:10 2008 @@ -117,7 +117,7 @@ __version__ = sys.version[:3] _opener = None -def urlopen(url, data=None, timeout=None): +def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): global _opener if _opener is None: _opener = build_opener() @@ -359,7 +359,7 @@ if result is not None: return result - def open(self, fullurl, data=None, timeout=None): + def open(self, fullurl, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): # accept a URL or a Request object if isinstance(fullurl, basestring): req = Request(fullurl, data) Modified: python/branches/tlee-ast-optimize/Lib/xmlrpclib.py ============================================================================== --- python/branches/tlee-ast-optimize/Lib/xmlrpclib.py (original) +++ python/branches/tlee-ast-optimize/Lib/xmlrpclib.py Sun Jun 1 17:18:10 2008 @@ -897,6 +897,7 @@ self.append(int(data)) self._value = 0 dispatch["i4"] = end_int + dispatch["i8"] = end_int dispatch["int"] = end_int def end_double(self, data): Modified: python/branches/tlee-ast-optimize/Mac/Modules/MacOS.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/MacOS.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/MacOS.c Sun Jun 1 17:18:10 2008 @@ -77,17 +77,17 @@ if (!PyArg_ParseTuple(args, "l", &n)) return NULL; - v = PyString_FromStringAndSize((char *)NULL, n); + v = PyBytes_FromStringAndSize((char *)NULL, n); if (v == NULL) return NULL; - err = FSRead(self->fRefNum, &n, PyString_AsString(v)); + err = FSRead(self->fRefNum, &n, PyBytes_AsString(v)); if (err && err != eofErr) { PyMac_Error(err); Py_DECREF(v); return NULL; } - _PyString_Resize(&v, n); + _PyBytes_Resize(&v, n); return v; } @@ -301,8 +301,8 @@ return NULL; if ((err = FSpGetFInfo(&fss, &info)) != noErr) return PyErr_Mac(MacOS_Error, err); - creator = PyString_FromStringAndSize((char *)&info.fdCreator, 4); - type = PyString_FromStringAndSize((char *)&info.fdType, 4); + creator = PyBytes_FromStringAndSize((char *)&info.fdCreator, 4); + type = PyBytes_FromStringAndSize((char *)&info.fdType, 4); res = Py_BuildValue("OO", creator, type); Py_DECREF(creator); Py_DECREF(type); @@ -623,7 +623,7 @@ ** some of the image and sound processing interfaces on the mac:-( */ { - PyStringObject *p = 0; + PyBytesObject *p = 0; long off = (long)&(p->ob_sval[0]); if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0) Modified: python/branches/tlee-ast-optimize/Mac/Modules/Nav.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/Nav.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/Nav.c Sun Jun 1 17:18:10 2008 @@ -139,11 +139,11 @@ NavGetDefaultDialogOptions(opt); while ( PyDict_Next(d, &pos, &key, &value) ) { - if ( !key || !value || !PyString_Check(key) ) { + if ( !key || !value || !PyBytes_Check(key) ) { PyErr_SetString(ErrorObject, "DialogOption has non-string key"); return 0; } - keystr = PyString_AsString(key); + keystr = PyBytes_AsString(key); if( strcmp(keystr, "defaultLocation") == 0 ) { if ( (defaultLocation_storage = PyMem_NEW(AEDesc, 1)) == NULL ) { PyErr_NoMemory(); @@ -932,7 +932,7 @@ /* Add some symbolic constants to the module */ d = PyModule_GetDict(m); - ErrorObject = PyString_FromString("Nav.error"); + ErrorObject = PyBytes_FromString("Nav.error"); PyDict_SetItemString(d, "error", ErrorObject); /* XXXX Add constants here */ Modified: python/branches/tlee-ast-optimize/Mac/Modules/ae/_AEmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/ae/_AEmodule.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/ae/_AEmodule.c Sun Jun 1 17:18:10 2008 @@ -835,9 +835,9 @@ OSErr err; size = AEGetDescDataSize(&self->ob_itself); - if ( (res = PyString_FromStringAndSize(NULL, size)) == NULL ) + if ( (res = PyBytes_FromStringAndSize(NULL, size)) == NULL ) return NULL; - if ( (ptr = PyString_AsString(res)) == NULL ) + if ( (ptr = PyBytes_AsString(res)) == NULL ) return NULL; if ( (err=AEGetDescData(&self->ob_itself, ptr, size)) < 0 ) return PyMac_Error(err); Modified: python/branches/tlee-ast-optimize/Mac/Modules/cf/_CFmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/cf/_CFmodule.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/cf/_CFmodule.c Sun Jun 1 17:18:10 2008 @@ -392,7 +392,7 @@ { char buf[100]; sprintf(buf, "", (int)CFGetTypeID(self->ob_itself), (unsigned)self, (unsigned)self->ob_itself); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int CFTypeRefObj_hash(CFTypeRefObject *self) @@ -596,7 +596,7 @@ { char buf[100]; sprintf(buf, "", (unsigned)self, (unsigned)self->ob_itself); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int CFArrayRefObj_hash(CFArrayRefObject *self) @@ -836,7 +836,7 @@ { char buf[100]; sprintf(buf, "", (unsigned)self, (unsigned)self->ob_itself); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int CFMutableArrayRefObj_hash(CFMutableArrayRefObject *self) @@ -1029,7 +1029,7 @@ { char buf[100]; sprintf(buf, "", (unsigned)self, (unsigned)self->ob_itself); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int CFDictionaryRefObj_hash(CFDictionaryRefObject *self) @@ -1206,7 +1206,7 @@ { char buf[100]; sprintf(buf, "", (unsigned)self, (unsigned)self->ob_itself); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int CFMutableDictionaryRefObj_hash(CFMutableDictionaryRefObject *self) @@ -1327,10 +1327,10 @@ { if (v == Py_None) { *p_itself = NULL; return 1; } - if (PyString_Check(v)) { + if (PyBytes_Check(v)) { char *cStr; Py_ssize_t cLen; - if( PyString_AsStringAndSize(v, &cStr, &cLen) < 0 ) return 0; + if( PyBytes_AsStringAndSize(v, &cStr, &cLen) < 0 ) return 0; *p_itself = CFDataCreate((CFAllocatorRef)NULL, (unsigned char *)cStr, cLen); return 1; } @@ -1405,7 +1405,7 @@ int size = CFDataGetLength(_self->ob_itself); char *data = (char *)CFDataGetBytePtr(_self->ob_itself); - _res = (PyObject *)PyString_FromStringAndSize(data, size); + _res = (PyObject *)PyBytes_FromStringAndSize(data, size); return _res; } @@ -1437,7 +1437,7 @@ { char buf[100]; sprintf(buf, "", (unsigned)self, (unsigned)self->ob_itself); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int CFDataRefObj_hash(CFDataRefObject *self) @@ -1702,7 +1702,7 @@ { char buf[100]; sprintf(buf, "", (unsigned)self, (unsigned)self->ob_itself); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int CFMutableDataRefObj_hash(CFMutableDataRefObject *self) @@ -1823,7 +1823,7 @@ { if (v == Py_None) { *p_itself = NULL; return 1; } - if (PyString_Check(v)) { + if (PyBytes_Check(v)) { char *cStr; if (!PyArg_Parse(v, "es", "ascii", &cStr)) return 0; @@ -2344,7 +2344,7 @@ if( data == NULL ) return PyErr_NoMemory(); if ( CFStringGetCString(_self->ob_itself, data, size, 0) ) { - _res = (PyObject *)PyString_FromString(data); + _res = (PyObject *)PyBytes_FromString(data); } else { PyErr_SetString(PyExc_RuntimeError, "CFStringGetCString could not fit the string"); _res = NULL; @@ -2445,7 +2445,7 @@ { char buf[100]; sprintf(buf, "", (unsigned)self, (unsigned)self->ob_itself); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int CFStringRefObj_hash(CFStringRefObject *self) @@ -2833,7 +2833,7 @@ { char buf[100]; sprintf(buf, "", (unsigned)self, (unsigned)self->ob_itself); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int CFMutableStringRefObj_hash(CFMutableStringRefObject *self) @@ -3485,7 +3485,7 @@ { char buf[100]; sprintf(buf, "", (unsigned)self, (unsigned)self->ob_itself); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int CFURLRefObj_hash(CFURLRefObject *self) Modified: python/branches/tlee-ast-optimize/Mac/Modules/cf/pycfbridge.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/cf/pycfbridge.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/cf/pycfbridge.c Sun Jun 1 17:18:10 2008 @@ -146,7 +146,7 @@ int PyCF_Python2CF(PyObject *src, CFTypeRef *dst) { - if (PyString_Check(src) || PyUnicode_Check(src)) + if (PyBytes_Check(src) || PyUnicode_Check(src)) return PyCF_Python2CF_simple(src, dst); if (PySequence_Check(src)) return PyCF_Python2CF_sequence(src, (CFArrayRef *)dst); @@ -249,7 +249,7 @@ return (*dst != NULL); } #endif - if (PyString_Check(src) || PyUnicode_Check(src)) + if (PyBytes_Check(src) || PyUnicode_Check(src)) return PyCF_Python2CF_string(src, (CFStringRef *)dst); if (PyBool_Check(src)) { if (src == Py_True) @@ -281,7 +281,7 @@ CFIndex size; UniChar *unichars; - if (PyString_Check(src)) { + if (PyBytes_Check(src)) { if (!PyArg_Parse(src, "es", "ascii", &chars)) return 0; /* This error is more descriptive than the general one below */ *dst = CFStringCreateWithCString((CFAllocatorRef)NULL, chars, kCFStringEncodingASCII); Modified: python/branches/tlee-ast-optimize/Mac/Modules/file/_Filemodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/file/_Filemodule.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/file/_Filemodule.c Sun Jun 1 17:18:10 2008 @@ -915,7 +915,7 @@ size = GetHandleSize((Handle)self->ob_itself); HLock((Handle)self->ob_itself); - rv = PyString_FromStringAndSize(*(Handle)self->ob_itself, size); + rv = PyBytes_FromStringAndSize(*(Handle)self->ob_itself, size); HUnlock((Handle)self->ob_itself); return rv; @@ -1315,7 +1315,7 @@ PyMac_Error(err); return NULL; } - _res = PyString_FromString(strbuf); + _res = PyBytes_FromString(strbuf); return _res; } @@ -1372,7 +1372,7 @@ static PyObject *FSSpec_get_data(FSSpecObject *self, void *closure) { - return PyString_FromStringAndSize((char *)&self->ob_itself, sizeof(self->ob_itself)); + return PyBytes_FromStringAndSize((char *)&self->ob_itself, sizeof(self->ob_itself)); } #define FSSpec_set_data NULL @@ -1393,7 +1393,7 @@ self->ob_itself.vRefNum, self->ob_itself.parID, self->ob_itself.name[0], self->ob_itself.name+1); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } #define FSSpec_hash NULL @@ -1925,7 +1925,7 @@ static PyObject *FSRef_get_data(FSRefObject *self, void *closure) { - return PyString_FromStringAndSize((char *)&self->ob_itself, sizeof(self->ob_itself)); + return PyBytes_FromStringAndSize((char *)&self->ob_itself, sizeof(self->ob_itself)); } #define FSRef_set_data NULL @@ -3038,7 +3038,7 @@ if (!PyArg_ParseTuple(_args, "O", &obj)) return NULL; - if (PyString_Check(obj)) { + if (PyBytes_Check(obj)) { Py_INCREF(obj); return obj; } @@ -3201,7 +3201,7 @@ } /* On OSX we now try a pathname */ - if ( PyString_Check(v) || PyUnicode_Check(v)) { + if ( PyBytes_Check(v) || PyUnicode_Check(v)) { char *path = NULL; if (!PyArg_Parse(v, "et", Py_FileSystemDefaultEncoding, &path)) return 0; Modified: python/branches/tlee-ast-optimize/Mac/Modules/qd/_Qdmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/qd/_Qdmodule.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/qd/_Qdmodule.c Sun Jun 1 17:18:10 2008 @@ -1457,7 +1457,7 @@ if ( !PyArg_ParseTuple(_args, "ii", &from, &length) ) return NULL; cp = _self->ob_itself->baseAddr+from; - _res = PyString_FromStringAndSize(cp, length); + _res = PyBytes_FromStringAndSize(cp, length); return _res; } @@ -1510,14 +1510,14 @@ static PyObject *BMObj_get_bitmap_data(BitMapObject *self, void *closure) { - return PyString_FromStringAndSize((char *)self->ob_itself, sizeof(BitMap)); + return PyBytes_FromStringAndSize((char *)self->ob_itself, sizeof(BitMap)); } #define BMObj_set_bitmap_data NULL static PyObject *BMObj_get_pixmap_data(BitMapObject *self, void *closure) { - return PyString_FromStringAndSize((char *)self->ob_itself, sizeof(PixMap)); + return PyBytes_FromStringAndSize((char *)self->ob_itself, sizeof(PixMap)); } #define BMObj_set_pixmap_data NULL @@ -6500,10 +6500,10 @@ int rowbytes; char *data; - if ( !PyArg_ParseTuple(_args, "O!iO&", &PyString_Type, &source, &rowbytes, PyMac_GetRect, + if ( !PyArg_ParseTuple(_args, "O!iO&", &PyBytes_Type, &source, &rowbytes, PyMac_GetRect, &bounds) ) return NULL; - data = PyString_AsString(source); + data = PyBytes_AsString(source); if ((ptr=(BitMap *)malloc(sizeof(BitMap))) == NULL ) return PyErr_NoMemory(); ptr->baseAddr = (Ptr)data; @@ -6527,15 +6527,15 @@ BitMap *ptr; PyObject *source; - if ( !PyArg_ParseTuple(_args, "O!", &PyString_Type, &source) ) + if ( !PyArg_ParseTuple(_args, "O!", &PyBytes_Type, &source) ) return NULL; - if ( PyString_Size(source) != sizeof(BitMap) && PyString_Size(source) != sizeof(PixMap) ) { + if ( PyBytes_Size(source) != sizeof(BitMap) && PyBytes_Size(source) != sizeof(PixMap) ) { PyErr_Format(PyExc_TypeError, "Argument size was %ld, should be %lu (sizeof BitMap) or %lu (sizeof PixMap)", - PyString_Size(source), sizeof(BitMap), sizeof(PixMap)); + PyBytes_Size(source), sizeof(BitMap), sizeof(PixMap)); return NULL; } - ptr = (BitMapPtr)PyString_AsString(source); + ptr = (BitMapPtr)PyBytes_AsString(source); if ( (_res = BMObj_New(ptr)) == NULL ) { return NULL; } Modified: python/branches/tlee-ast-optimize/Mac/Modules/qdoffs/_Qdoffsmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/qdoffs/_Qdoffsmodule.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/qdoffs/_Qdoffsmodule.c Sun Jun 1 17:18:10 2008 @@ -608,7 +608,7 @@ if ( !PyArg_ParseTuple(_args, "O&ii", ResObj_Convert, &pm, &from, &length) ) return NULL; cp = GetPixBaseAddr(pm)+from; - _res = PyString_FromStringAndSize(cp, length); + _res = PyBytes_FromStringAndSize(cp, length); return _res; } Modified: python/branches/tlee-ast-optimize/Mac/Modules/res/_Resmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/res/_Resmodule.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/res/_Resmodule.c Sun Jun 1 17:18:10 2008 @@ -520,7 +520,7 @@ state = HGetState(self->ob_itself); HLock(self->ob_itself); - res = PyString_FromStringAndSize( + res = PyBytes_FromStringAndSize( *self->ob_itself, GetHandleSize(self->ob_itself)); HUnlock(self->ob_itself); @@ -537,10 +537,10 @@ if ( v == NULL ) return -1; - if ( !PyString_Check(v) ) + if ( !PyBytes_Check(v) ) return -1; - size = PyString_Size(v); - data = PyString_AsString(v); + size = PyBytes_Size(v); + data = PyBytes_AsString(v); /* XXXX Do I need the GetState/SetState calls? */ SetHandleSize(self->ob_itself, size); if ( MemError()) Modified: python/branches/tlee-ast-optimize/Mac/Modules/scrap/_Scrapmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/scrap/_Scrapmodule.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/scrap/_Scrapmodule.c Sun Jun 1 17:18:10 2008 @@ -105,12 +105,12 @@ flavorType, &byteCount); if (_err != noErr) return PyMac_Error(_err); - _res = PyString_FromStringAndSize(NULL, (int)byteCount); + _res = PyBytes_FromStringAndSize(NULL, (int)byteCount); if ( _res == NULL ) return NULL; _err = GetScrapFlavorData(_self->ob_itself, flavorType, &byteCount, - PyString_AS_STRING(_res)); + PyBytes_AS_STRING(_res)); if (_err != noErr) { Py_XDECREF(_res); return PyMac_Error(_err); Modified: python/branches/tlee-ast-optimize/Mac/Modules/snd/_Sndihooks.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/snd/_Sndihooks.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/snd/_Sndihooks.c Sun Jun 1 17:18:10 2008 @@ -500,7 +500,7 @@ /* Add some symbolic constants to the module */ d = PyModule_GetDict(m); - ErrorObject = PyString_FromString("Sndihooks.error"); + ErrorObject = PyBytes_FromString("Sndihooks.error"); PyDict_SetItemString(d, "error", ErrorObject); /* XXXX Add constants here */ Modified: python/branches/tlee-ast-optimize/Mac/Modules/win/_Winmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Mac/Modules/win/_Winmodule.c (original) +++ python/branches/tlee-ast-optimize/Mac/Modules/win/_Winmodule.c Sun Jun 1 17:18:10 2008 @@ -2580,7 +2580,7 @@ { char buf[100]; sprintf(buf, "", (unsigned)self, (unsigned)self->ob_itself); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int WinObj_hash(WindowObject *self) Modified: python/branches/tlee-ast-optimize/Makefile.pre.in ============================================================================== --- python/branches/tlee-ast-optimize/Makefile.pre.in (original) +++ python/branches/tlee-ast-optimize/Makefile.pre.in Sun Jun 1 17:18:10 2008 @@ -303,6 +303,7 @@ Objects/boolobject.o \ Objects/bufferobject.o \ Objects/bytes_methods.o \ + Objects/bytearrayobject.o \ Objects/bytesobject.o \ Objects/cellobject.o \ Objects/classobject.o \ @@ -329,7 +330,6 @@ Objects/rangeobject.o \ Objects/setobject.o \ Objects/sliceobject.o \ - Objects/stringobject.o \ Objects/structseq.o \ Objects/tupleobject.o \ Objects/typeobject.o \ @@ -585,6 +585,7 @@ Include/bitset.h \ Include/boolobject.h \ Include/bytes_methods.h \ + Include/bytearrayobject.h \ Include/bytesobject.h \ Include/bufferobject.h \ Include/cellobject.h \ Modified: python/branches/tlee-ast-optimize/Misc/NEWS ============================================================================== --- python/branches/tlee-ast-optimize/Misc/NEWS (original) +++ python/branches/tlee-ast-optimize/Misc/NEWS Sun Jun 1 17:18:10 2008 @@ -12,6 +12,8 @@ Core and Builtins ----------------- +- New environment variable PYTHONIOENCODING. + - Patch #2488: Add sys.maxsize. - Issue #2353: file.xreadlines() now emits a Py3k warning. @@ -36,6 +38,9 @@ Extension Modules ----------------- +- The heapq module does comparisons using LT instead of LE. This + makes its implementation match that used by list.sort(). + - Issue #2819: add full-precision summation function to math module, based on Hettinger's ASPN Python Cookbook recipe. @@ -63,6 +68,21 @@ Library ------- +- Issue #3011: locale module alias table was updated to the latest version + from the X.org locale.alias file + +- Issue #1797 (partial fix): ctypes NULL function pointers have a + False boolean value now. + +- Issue #2985: Allow 64-bit integer responses (````) in XMLRPC + transfers. + +- Issue #2877: The UserString.MutableString class has been removed in + Python 3.0. + +- Do not close external file objects passed to tarfile.open(mode='w:bz2') + when the TarFile is closed. + - Issue #2959: For consistency with other file-like objects, gzip's GzipFile.close() can now be called multiple times without raising an exception. @@ -233,6 +253,17 @@ - ``Lib/lib-old`` is now added to sys.path. +C API +----- + +- Add ``PyType_Modified()`` as a public API to clear the type cache. + +- The PyBytes functions have been renamed to PyByteArray. + +- The PyString functions have been renamed to PyBytes. A batch of + defines were added so that the linker still sees the original + PyString names. + What's New in Python 2.6 alpha 3? ================================= @@ -400,8 +431,7 @@ which provide the functions through their libm. The files also contains several helpers and constants for math. -- Added a new convenience function, PyErr_WarnPy3k, for issuing Py3k - warnings. +- Added a new convenience macro, PyErr_WarnPy3k, for issuing Py3k warnings. What's New in Python 2.6 alpha 2? Modified: python/branches/tlee-ast-optimize/Modules/_bsddb.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_bsddb.c (original) +++ python/branches/tlee-ast-optimize/Modules/_bsddb.c Sun Jun 1 17:18:10 2008 @@ -104,6 +104,17 @@ typedef int Py_ssize_t; #endif +#if (PY_VERSION_HEX < 0x02060000) /* really: before python trunk r63675 */ +/* This code now uses PyBytes* API function names instead of PyString*. + * These #defines map to their equivalent on earlier python versions. */ +#define PyBytes_FromStringAndSize PyString_FromStringAndSize +#define PyBytes_FromString PyString_FromString +#define PyBytes_AsStringAndSize PyString_AsStringAndSize +#define PyBytes_Check PyString_Check +#define PyBytes_GET_SIZE PyString_GET_SIZE +#define PyBytes_AS_STRING PyString_AS_STRING +#endif + #ifdef WITH_THREAD /* These are for when calling Python --> C */ @@ -398,7 +409,7 @@ /* no need to do anything, the structure has already been zeroed */ } - else if (PyString_Check(keyobj)) { + else if (PyBytes_Check(keyobj)) { /* verify access method type */ type = _DB_get_type(self); if (type == -1) @@ -417,15 +428,15 @@ * the code check for DB_THREAD and forceably set DBT_MALLOC * when we otherwise would leave flags 0 to indicate that. */ - key->data = malloc(PyString_GET_SIZE(keyobj)); + key->data = malloc(PyBytes_GET_SIZE(keyobj)); if (key->data == NULL) { PyErr_SetString(PyExc_MemoryError, "Key memory allocation failed"); return 0; } - memcpy(key->data, PyString_AS_STRING(keyobj), - PyString_GET_SIZE(keyobj)); + memcpy(key->data, PyBytes_AS_STRING(keyobj), + PyBytes_GET_SIZE(keyobj)); key->flags = DB_DBT_REALLOC; - key->size = PyString_GET_SIZE(keyobj); + key->size = PyBytes_GET_SIZE(keyobj); } else if (PyInt_Check(keyobj)) { @@ -535,7 +546,7 @@ p=DummyString; assert(s==0); } - return PyString_FromStringAndSize(p,s); + return PyBytes_FromStringAndSize(p,s); } static PyObject *BuildValue_S(const void *p,int s) @@ -1291,12 +1302,12 @@ else if (PyInt_Check(result)) { retval = PyInt_AsLong(result); } - else if (PyString_Check(result)) { + else if (PyBytes_Check(result)) { char* data; Py_ssize_t size; CLEAR_DBT(*secKey); - PyString_AsStringAndSize(result, &data, &size); + PyBytes_AsStringAndSize(result, &data, &size); secKey->flags = DB_DBT_APPMALLOC; /* DB will free */ secKey->data = malloc(size); /* TODO, check this */ if (secKey->data) { @@ -4412,7 +4423,7 @@ if (!retp) break; flags=DB_NEXT; /* Prepare for next loop pass */ for (i=0; ibuf, self->string_size); + return PyBytes_FromStringAndSize(self->buf, self->string_size); } PyDoc_STRVAR(isatty_doc, @@ -244,7 +244,7 @@ output = self->buf + self->pos; self->pos += size; - return PyString_FromStringAndSize(output, size); + return PyBytes_FromStringAndSize(output, size); } @@ -307,7 +307,7 @@ self->pos -= size; } - return PyString_FromStringAndSize(output, n); + return PyBytes_FromStringAndSize(output, n); } PyDoc_STRVAR(readlines_doc, @@ -349,7 +349,7 @@ return NULL; while ((n = get_line(self, &output)) != 0) { - line = PyString_FromStringAndSize(output, n); + line = PyBytes_FromStringAndSize(output, n); if (!line) goto on_error; if (PyList_Append(result, line) == -1) { @@ -455,7 +455,7 @@ if (!next || n == 0) return NULL; - return PyString_FromStringAndSize(next, n); + return PyBytes_FromStringAndSize(next, n); } PyDoc_STRVAR(seek_doc, Modified: python/branches/tlee-ast-optimize/Modules/_codecsmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_codecsmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/_codecsmodule.c Sun Jun 1 17:18:10 2008 @@ -168,7 +168,7 @@ if (!PyArg_ParseTuple(args, "s#|z:escape_decode", &data, &size, &errors)) return NULL; - return codec_tuple(PyString_DecodeEscape(data, size, errors, 0, NULL), + return codec_tuple(PyBytes_DecodeEscape(data, size, errors, 0, NULL), size); } @@ -182,21 +182,21 @@ Py_ssize_t len; if (!PyArg_ParseTuple(args, "O!|z:escape_encode", - &PyString_Type, &str, &errors)) + &PyBytes_Type, &str, &errors)) return NULL; - str = PyString_Repr(str, 0); + str = PyBytes_Repr(str, 0); if (!str) return NULL; /* The string will be quoted. Unquote, similar to unicode-escape. */ - buf = PyString_AS_STRING (str); - len = PyString_GET_SIZE (str); + buf = PyBytes_AS_STRING (str); + len = PyBytes_GET_SIZE (str); memmove(buf, buf+1, len-2); - if (_PyString_Resize(&str, len-2) < 0) + if (_PyBytes_Resize(&str, len-2) < 0) return NULL; - return codec_tuple(str, PyString_Size(str)); + return codec_tuple(str, PyBytes_Size(str)); } #ifdef Py_USING_UNICODE @@ -640,7 +640,7 @@ &data, &size, &errors)) return NULL; - return codec_tuple(PyString_FromStringAndSize(data, size), + return codec_tuple(PyBytes_FromStringAndSize(data, size), size); } @@ -656,7 +656,7 @@ &data, &size, &errors)) return NULL; - return codec_tuple(PyString_FromStringAndSize(data, size), + return codec_tuple(PyBytes_FromStringAndSize(data, size), size); } @@ -676,13 +676,13 @@ if (PyUnicode_Check(obj)) { data = PyUnicode_AS_DATA(obj); size = PyUnicode_GET_DATA_SIZE(obj); - return codec_tuple(PyString_FromStringAndSize(data, size), + return codec_tuple(PyBytes_FromStringAndSize(data, size), size); } else { if (PyObject_AsReadBuffer(obj, (const void **)&data, &size)) return NULL; - return codec_tuple(PyString_FromStringAndSize(data, size), + return codec_tuple(PyBytes_FromStringAndSize(data, size), size); } } Modified: python/branches/tlee-ast-optimize/Modules/_collectionsmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_collectionsmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/_collectionsmodule.c Sun Jun 1 17:18:10 2008 @@ -668,7 +668,7 @@ if (i != 0) { if (i < 0) return NULL; - return PyString_FromString("[...]"); + return PyBytes_FromString("[...]"); } aslist = PySequence_List(deque); @@ -677,16 +677,16 @@ return NULL; } if (((dequeobject *)deque)->maxlen != -1) - fmt = PyString_FromFormat("deque(%%r, maxlen=%i)", + fmt = PyBytes_FromFormat("deque(%%r, maxlen=%i)", ((dequeobject *)deque)->maxlen); else - fmt = PyString_FromString("deque(%r)"); + fmt = PyBytes_FromString("deque(%r)"); if (fmt == NULL) { Py_DECREF(aslist); Py_ReprLeave(deque); return NULL; } - result = PyString_Format(fmt, aslist); + result = PyBytes_Format(fmt, aslist); Py_DECREF(fmt); Py_DECREF(aslist); Py_ReprLeave(deque); @@ -1298,14 +1298,14 @@ if (baserepr == NULL) return NULL; if (dd->default_factory == NULL) - defrepr = PyString_FromString("None"); + defrepr = PyBytes_FromString("None"); else { int status = Py_ReprEnter(dd->default_factory); if (status != 0) { if (status < 0) return NULL; - defrepr = PyString_FromString("..."); + defrepr = PyBytes_FromString("..."); } else defrepr = PyObject_Repr(dd->default_factory); @@ -1315,9 +1315,9 @@ Py_DECREF(baserepr); return NULL; } - result = PyString_FromFormat("defaultdict(%s, %s)", - PyString_AS_STRING(defrepr), - PyString_AS_STRING(baserepr)); + result = PyBytes_FromFormat("defaultdict(%s, %s)", + PyBytes_AS_STRING(defrepr), + PyBytes_AS_STRING(baserepr)); Py_DECREF(defrepr); Py_DECREF(baserepr); return result; Modified: python/branches/tlee-ast-optimize/Modules/_csv.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_csv.c (original) +++ python/branches/tlee-ast-optimize/Modules/_csv.c Sun Jun 1 17:18:10 2008 @@ -176,7 +176,7 @@ return Py_None; } else - return PyString_FromStringAndSize((char*)&c, 1); + return PyBytes_FromStringAndSize((char*)&c, 1); } static PyObject * @@ -235,16 +235,16 @@ if (src == NULL) *target = dflt; else { - if (src == Py_None || PyString_Size(src) == 0) + if (src == Py_None || PyBytes_Size(src) == 0) *target = '\0'; - else if (!PyString_Check(src) || PyString_Size(src) != 1) { + else if (!PyBytes_Check(src) || PyBytes_Size(src) != 1) { PyErr_Format(PyExc_TypeError, "\"%s\" must be an 1-character string", name); return -1; } else { - char *s = PyString_AsString(src); + char *s = PyBytes_AsString(src); if (s == NULL) return -1; *target = s[0]; @@ -257,7 +257,7 @@ _set_str(const char *name, PyObject **target, PyObject *src, const char *dflt) { if (src == NULL) - *target = PyString_FromString(dflt); + *target = PyBytes_FromString(dflt); else { if (src == Py_None) *target = NULL; @@ -528,7 +528,7 @@ { PyObject *field; - field = PyString_FromStringAndSize(self->field, self->field_len); + field = PyBytes_FromStringAndSize(self->field, self->field_len); if (field == NULL) return -1; self->field_len = 0; @@ -787,8 +787,8 @@ } ++self->line_num; - line = PyString_AsString(lineobj); - linelen = PyString_Size(lineobj); + line = PyBytes_AsString(lineobj); + linelen = PyBytes_Size(lineobj); if (line == NULL || linelen < 0) { Py_DECREF(lineobj); @@ -976,7 +976,7 @@ rec_len++;\ } while(0) - lineterm = PyString_AsString(dialect->lineterminator); + lineterm = PyBytes_AsString(dialect->lineterminator); if (lineterm == NULL) return -1; @@ -1101,7 +1101,7 @@ int terminator_len; char *terminator; - terminator_len = PyString_Size(self->dialect->lineterminator); + terminator_len = PyBytes_Size(self->dialect->lineterminator); if (terminator_len == -1) return 0; @@ -1109,7 +1109,7 @@ if (!join_check_rec_size(self, self->rec_len + terminator_len)) return 0; - terminator = PyString_AsString(self->dialect->lineterminator); + terminator = PyBytes_AsString(self->dialect->lineterminator); if (terminator == NULL) return 0; memmove(self->rec + self->rec_len, terminator, terminator_len); @@ -1161,9 +1161,9 @@ break; } - if (PyString_Check(field)) { + if (PyBytes_Check(field)) { append_ok = join_append(self, - PyString_AS_STRING(field), + PyBytes_AS_STRING(field), "ed, len == 1); Py_DECREF(field); } @@ -1179,7 +1179,7 @@ if (str == NULL) return NULL; - append_ok = join_append(self, PyString_AS_STRING(str), + append_ok = join_append(self, PyBytes_AS_STRING(str), "ed, len == 1); Py_DECREF(str); } Modified: python/branches/tlee-ast-optimize/Modules/_ctypes/_ctypes.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_ctypes/_ctypes.c (original) +++ python/branches/tlee-ast-optimize/Modules/_ctypes/_ctypes.c Sun Jun 1 17:18:10 2008 @@ -477,7 +477,7 @@ static PyObject * CDataType_from_buffer_copy(PyObject *type, PyObject *args) { - void *buffer; + const void *buffer; Py_ssize_t buffer_len; Py_ssize_t offset = 0; PyObject *obj, *result; @@ -684,8 +684,8 @@ if (-1 == PyType_Type.tp_setattro(self, key, value)) return -1; - if (value && PyString_Check(key) && - 0 == strcmp(PyString_AS_STRING(key), "_fields_")) + if (value && PyBytes_Check(key) && + 0 == strcmp(PyBytes_AS_STRING(key), "_fields_")) return StructUnionType_update_stgdict(self, value, 1); return 0; } @@ -698,8 +698,8 @@ if (-1 == PyObject_GenericSetAttr(self, key, value)) return -1; - if (PyString_Check(key) && - 0 == strcmp(PyString_AS_STRING(key), "_fields_")) + if (PyBytes_Check(key) && + 0 == strcmp(PyBytes_AS_STRING(key), "_fields_")) return StructUnionType_update_stgdict(self, value, 0); return 0; } @@ -1025,7 +1025,7 @@ size = Py_TYPE(value)->tp_as_buffer->bf_getreadbuffer(value, 0, (void *)&ptr); if (size < 0) return -1; - } else if (-1 == PyString_AsStringAndSize(value, &ptr, &size)) { + } else if (-1 == PyBytes_AsStringAndSize(value, &ptr, &size)) { return -1; } if (size > self->b_size) { @@ -1042,7 +1042,7 @@ static PyObject * CharArray_get_raw(CDataObject *self) { - return PyString_FromStringAndSize(self->b_ptr, self->b_size); + return PyBytes_FromStringAndSize(self->b_ptr, self->b_size); } static PyObject * @@ -1053,7 +1053,7 @@ for (i = 0; i < self->b_size; ++i) if (*ptr++ == '\0') break; - return PyString_FromStringAndSize(self->b_ptr, i); + return PyBytes_FromStringAndSize(self->b_ptr, i); } static int @@ -1074,14 +1074,14 @@ conversion_mode_errors); if (!value) return -1; - } else if (!PyString_Check(value)) { + } else if (!PyBytes_Check(value)) { PyErr_Format(PyExc_TypeError, "string expected instead of %s instance", Py_TYPE(value)->tp_name); return -1; } else Py_INCREF(value); - size = PyString_GET_SIZE(value); + size = PyBytes_GET_SIZE(value); if (size > self->b_size) { PyErr_SetString(PyExc_ValueError, "string too long"); @@ -1089,7 +1089,7 @@ return -1; } - ptr = PyString_AS_STRING(value); + ptr = PyBytes_AS_STRING(value); memcpy(self->b_ptr, ptr, size); if (size < self->b_size) self->b_ptr[size] = '\0'; @@ -1128,7 +1128,7 @@ "can't delete attribute"); return -1; } - if (PyString_Check(value)) { + if (PyBytes_Check(value)) { value = PyUnicode_FromEncodedObject(value, conversion_mode_encoding, conversion_mode_errors); @@ -1402,7 +1402,7 @@ Py_INCREF(Py_None); return Py_None; } - if (PyUnicode_Check(value) || PyString_Check(value)) { + if (PyUnicode_Check(value) || PyBytes_Check(value)) { PyCArgObject *parg; struct fielddesc *fd = getentry("Z"); @@ -1466,7 +1466,7 @@ Py_INCREF(Py_None); return Py_None; } - if (PyString_Check(value) || PyUnicode_Check(value)) { + if (PyBytes_Check(value) || PyUnicode_Check(value)) { PyCArgObject *parg; struct fielddesc *fd = getentry("z"); @@ -1552,7 +1552,7 @@ return (PyObject *)parg; } /* string */ - if (PyString_Check(value)) { + if (PyBytes_Check(value)) { PyCArgObject *parg; struct fielddesc *fd = getentry("z"); @@ -1623,10 +1623,10 @@ } /* c_char_p, c_wchar_p */ stgd = PyObject_stgdict(value); - if (stgd && CDataObject_Check(value) && stgd->proto && PyString_Check(stgd->proto)) { + if (stgd && CDataObject_Check(value) && stgd->proto && PyBytes_Check(stgd->proto)) { PyCArgObject *parg; - switch (PyString_AS_STRING(stgd->proto)[0]) { + switch (PyBytes_AS_STRING(stgd->proto)[0]) { case 'z': /* c_char_p */ case 'Z': /* c_wchar_p */ parg = new_CArgObject(); @@ -1683,13 +1683,13 @@ if (suffix == NULL) #ifdef WORDS_BIGENDIAN - suffix = PyString_InternFromString("_le"); + suffix = PyBytes_InternFromString("_le"); #else - suffix = PyString_InternFromString("_be"); + suffix = PyBytes_InternFromString("_be"); #endif Py_INCREF(name); - PyString_Concat(&name, suffix); + PyBytes_Concat(&name, suffix); if (name == NULL) return NULL; @@ -1744,7 +1744,7 @@ dict = PyObject_stgdict((PyObject *)self); assert(dict); /* Cannot be NULL for CDataObject instances */ - fmt = PyString_AsString(dict->proto); + fmt = PyBytes_AsString(dict->proto); assert(fmt); fd = getentry(fmt); @@ -1779,9 +1779,9 @@ proto = PyObject_GetAttrString((PyObject *)result, "_type_"); /* new ref */ if (!proto - || !PyString_Check(proto) - || 1 != strlen(PyString_AS_STRING(proto)) - || !strchr(SIMPLE_TYPE_CHARS, PyString_AS_STRING(proto)[0])) { + || !PyBytes_Check(proto) + || 1 != strlen(PyBytes_AS_STRING(proto)) + || !strchr(SIMPLE_TYPE_CHARS, PyBytes_AS_STRING(proto)[0])) { PyErr_Format(PyExc_AttributeError, "class must define a '_type_' attribute which must be\n" "a single character string containing one of '%s'.", @@ -1790,12 +1790,12 @@ Py_DECREF(result); return NULL; } - fmt = getentry(PyString_AS_STRING(proto)); + fmt = getentry(PyBytes_AS_STRING(proto)); if (fmt == NULL) { Py_DECREF(result); PyErr_Format(PyExc_ValueError, "_type_ '%s' not supported", - PyString_AS_STRING(proto)); + PyBytes_AS_STRING(proto)); return NULL; } @@ -1835,7 +1835,7 @@ Overrides the SimpleType_from_param generic method. */ if (result->tp_base == &Simple_Type) { - switch (PyString_AS_STRING(proto)[0]) { + switch (PyBytes_AS_STRING(proto)[0]) { case 'z': /* c_char_p */ ml = &c_char_p_method; stgdict->flags |= TYPEFLAG_ISPOINTER; @@ -1940,7 +1940,7 @@ assert(dict); /* I think we can rely on this being a one-character string */ - fmt = PyString_AsString(dict->proto); + fmt = PyBytes_AsString(dict->proto); assert(fmt); fd = getentry(fmt); @@ -2290,7 +2290,7 @@ #endif target = target->b_base; } - return PyString_FromStringAndSize(string, cp-string); + return PyBytes_FromStringAndSize(string, cp-string); } /* @@ -2435,7 +2435,7 @@ _unpickle, Py_TYPE(_self), PyObject_GetAttrString(_self, "__dict__"), - PyString_FromStringAndSize(self->b_ptr, self->b_size)); + PyBytes_FromStringAndSize(self->b_ptr, self->b_size)); } static PyObject * @@ -2984,9 +2984,9 @@ dict = PyType_stgdict(arg); if (dict /* simple pointer types, c_void_p, c_wchar_p, BSTR, ... */ - && PyString_Check(dict->proto) + && PyBytes_Check(dict->proto) /* We only allow c_void_p, c_char_p and c_wchar_p as a simple output parameter type */ - && (strchr("PzZ", PyString_AS_STRING(dict->proto)[0]))) { + && (strchr("PzZ", PyBytes_AS_STRING(dict->proto)[0]))) { return 1; } @@ -3071,8 +3071,8 @@ return 1; } #endif - if (PyString_Check(obj) || PyUnicode_Check(obj)) { - *pname = PyString_AsString(obj); + if (PyBytes_Check(obj) || PyUnicode_Check(obj)) { + *pname = PyBytes_AsString(obj); return *pname ? 1 : 0; } PyErr_SetString(PyExc_TypeError, @@ -3422,7 +3422,7 @@ /* We HAVE already checked that the tuple can be parsed with "i|zO", so... */ Py_ssize_t tsize = PyTuple_GET_SIZE(item); flag = PyInt_AS_LONG(PyTuple_GET_ITEM(item, 0)); - name = tsize > 1 ? PyString_AS_STRING(PyTuple_GET_ITEM(item, 1)) : NULL; + name = tsize > 1 ? PyBytes_AS_STRING(PyTuple_GET_ITEM(item, 1)) : NULL; defval = tsize > 2 ? PyTuple_GET_ITEM(item, 2) : NULL; switch (flag & (PARAMFLAG_FIN | PARAMFLAG_FOUT | PARAMFLAG_FLCID)) { @@ -3476,7 +3476,7 @@ "NULL stgdict unexpected"); goto error; } - if (PyString_Check(dict->proto)) { + if (PyBytes_Check(dict->proto)) { PyErr_Format( PyExc_TypeError, "%s 'out' parameter must be passed as default value", @@ -3774,16 +3774,36 @@ { #ifdef MS_WIN32 if (self->index) - return PyString_FromFormat("", + return PyBytes_FromFormat("", self->index - 0x1000, Py_TYPE(self)->tp_name, self); #endif - return PyString_FromFormat("<%s object at %p>", + return PyBytes_FromFormat("<%s object at %p>", Py_TYPE(self)->tp_name, self); } +static int +Pointer_nonzero(CDataObject *self) +{ + return *(void **)self->b_ptr != NULL; +} + +static PyNumberMethods Pointer_as_number = { + 0, /* nb_add */ + 0, /* nb_subtract */ + 0, /* nb_multiply */ + 0, /* nb_divide */ + 0, /* nb_remainder */ + 0, /* nb_divmod */ + 0, /* nb_power */ + 0, /* nb_negative */ + 0, /* nb_positive */ + 0, /* nb_absolute */ + (inquiry)Pointer_nonzero, /* nb_nonzero */ +}; + PyTypeObject CFuncPtr_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_ctypes.CFuncPtr", @@ -3795,7 +3815,7 @@ 0, /* tp_setattr */ 0, /* tp_compare */ (reprfunc)CFuncPtr_repr, /* tp_repr */ - 0, /* tp_as_number */ + &Pointer_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ @@ -3888,7 +3908,7 @@ } if (kwds && PyDict_GetItem(kwds, name)) { - char *field = PyString_AsString(name); + char *field = PyBytes_AsString(name); if (field == NULL) { PyErr_Clear(); field = "???"; @@ -4090,7 +4110,7 @@ type, so this cannot be NULL */ if (itemdict->getfunc == getentry("c")->getfunc) { char *ptr = (char *)self->b_ptr; - return PyString_FromStringAndSize(ptr + ilow, len); + return PyBytes_FromStringAndSize(ptr + ilow, len); #ifdef CTYPES_UNICODE } else if (itemdict->getfunc == getentry("u")->getfunc) { wchar_t *ptr = (wchar_t *)self->b_ptr; @@ -4147,9 +4167,9 @@ char *dest; if (slicelen <= 0) - return PyString_FromString(""); + return PyBytes_FromString(""); if (step == 1) { - return PyString_FromStringAndSize(ptr + start, + return PyBytes_FromStringAndSize(ptr + start, slicelen); } dest = (char *)PyMem_Malloc(slicelen); @@ -4162,7 +4182,7 @@ dest[i] = ptr[cur]; } - np = PyString_FromStringAndSize(dest, slicelen); + np = PyBytes_FromStringAndSize(dest, slicelen); PyMem_Free(dest); return np; } @@ -4572,12 +4592,12 @@ static PyObject *format; if (Py_TYPE(self)->tp_base != &Simple_Type) { - return PyString_FromFormat("<%s object at %p>", + return PyBytes_FromFormat("<%s object at %p>", Py_TYPE(self)->tp_name, self); } if (format == NULL) { - format = PyString_InternFromString("%s(%r)"); + format = PyBytes_InternFromString("%s(%r)"); if (format == NULL) return NULL; } @@ -4586,7 +4606,7 @@ if (val == NULL) return NULL; - name = PyString_FromString(Py_TYPE(self)->tp_name); + name = PyBytes_FromString(Py_TYPE(self)->tp_name); if (name == NULL) { Py_DECREF(val); return NULL; @@ -4598,7 +4618,7 @@ if (args == NULL) return NULL; - result = PyString_Format(format, args); + result = PyBytes_Format(format, args); Py_DECREF(args); return result; } @@ -4832,7 +4852,7 @@ assert(itemdict); if (itemdict->getfunc == getentry("c")->getfunc) { char *ptr = *(char **)self->b_ptr; - return PyString_FromStringAndSize(ptr + ilow, len); + return PyBytes_FromStringAndSize(ptr + ilow, len); #ifdef CTYPES_UNICODE } else if (itemdict->getfunc == getentry("u")->getfunc) { wchar_t *ptr = *(wchar_t **)self->b_ptr; @@ -4929,9 +4949,9 @@ char *dest; if (len <= 0) - return PyString_FromString(""); + return PyBytes_FromString(""); if (step == 1) { - return PyString_FromStringAndSize(ptr + start, + return PyBytes_FromStringAndSize(ptr + start, len); } dest = (char *)PyMem_Malloc(len); @@ -4940,7 +4960,7 @@ for (cur = start, i = 0; i < len; cur += step, i++) { dest[i] = ptr[cur]; } - np = PyString_FromStringAndSize(dest, len); + np = PyBytes_FromStringAndSize(dest, len); PyMem_Free(dest); return np; } @@ -5003,26 +5023,6 @@ Pointer_subscript, }; -static int -Pointer_nonzero(CDataObject *self) -{ - return *(void **)self->b_ptr != NULL; -} - -static PyNumberMethods Pointer_as_number = { - 0, /* nb_add */ - 0, /* nb_subtract */ - 0, /* nb_multiply */ - 0, /* nb_divide */ - 0, /* nb_remainder */ - 0, /* nb_divmod */ - 0, /* nb_power */ - 0, /* nb_negative */ - 0, /* nb_positive */ - 0, /* nb_absolute */ - (inquiry)Pointer_nonzero, /* nb_nonzero */ -}; - PyTypeObject Pointer_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_ctypes._Pointer", @@ -5140,7 +5140,7 @@ ++methods; } - s = PyString_FromString(comerror_doc); + s = PyBytes_FromString(comerror_doc); if (s == NULL) goto error; status = PyDict_SetItemString(dict, "__doc__", s); @@ -5166,8 +5166,8 @@ string_at(const char *ptr, int size) { if (size == -1) - return PyString_FromString(ptr); - return PyString_FromStringAndSize(ptr, size); + return PyBytes_FromString(ptr); + return PyBytes_FromStringAndSize(ptr, size); } static int @@ -5181,8 +5181,8 @@ return 1; dict = PyType_stgdict(arg); if (dict) { - if (PyString_Check(dict->proto) - && (strchr("sPzUZXO", PyString_AS_STRING(dict->proto)[0]))) { + if (PyBytes_Check(dict->proto) + && (strchr("sPzUZXO", PyBytes_AS_STRING(dict->proto)[0]))) { /* simple pointer types, c_void_p, c_wchar_p, BSTR, ... */ return 1; } Modified: python/branches/tlee-ast-optimize/Modules/_ctypes/callbacks.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_ctypes/callbacks.c (original) +++ python/branches/tlee-ast-optimize/Modules/_ctypes/callbacks.c Sun Jun 1 17:18:10 2008 @@ -107,15 +107,15 @@ PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; - py_srcfile = PyString_FromString(filename); + py_srcfile = PyBytes_FromString(filename); if (!py_srcfile) goto bad; - py_funcname = PyString_FromString(funcname); + py_funcname = PyBytes_FromString(funcname); if (!py_funcname) goto bad; py_globals = PyDict_New(); if (!py_globals) goto bad; empty_tuple = PyTuple_New(0); if (!empty_tuple) goto bad; - empty_string = PyString_FromString(""); + empty_string = PyBytes_FromString(""); if (!empty_string) goto bad; py_code = PyCode_New( 0, /*int argcount,*/ @@ -460,7 +460,7 @@ static PyObject *context; if (context == NULL) - context = PyString_InternFromString("_ctypes.DllGetClassObject"); + context = PyBytes_InternFromString("_ctypes.DllGetClassObject"); mod = PyImport_ImportModuleNoBlock("ctypes"); if (!mod) { @@ -539,7 +539,7 @@ static PyObject *context; if (context == NULL) - context = PyString_InternFromString("_ctypes.DllCanUnloadNow"); + context = PyBytes_InternFromString("_ctypes.DllCanUnloadNow"); mod = PyImport_ImportModuleNoBlock("ctypes"); if (!mod) { Modified: python/branches/tlee-ast-optimize/Modules/_ctypes/callproc.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_ctypes/callproc.c (original) +++ python/branches/tlee-ast-optimize/Modules/_ctypes/callproc.c Sun Jun 1 17:18:10 2008 @@ -370,7 +370,7 @@ self->tag, self); break; } - return PyString_FromString(buffer); + return PyBytes_FromString(buffer); } static PyMemberDef PyCArgType_members[] = { @@ -518,9 +518,9 @@ return 0; } - if (PyString_Check(obj)) { + if (PyBytes_Check(obj)) { pa->ffi_type = &ffi_type_pointer; - pa->value.p = PyString_AS_STRING(obj); + pa->value.p = PyBytes_AS_STRING(obj); Py_INCREF(obj); pa->keep = obj; return 0; @@ -781,7 +781,7 @@ PyObject *tp, *v, *tb, *s, *cls_str, *msg_str; va_start(vargs, fmt); - s = PyString_FromFormatV(fmt, vargs); + s = PyBytes_FromFormatV(fmt, vargs); va_end(vargs); if (!s) return; @@ -790,18 +790,18 @@ PyErr_NormalizeException(&tp, &v, &tb); cls_str = PyObject_Str(tp); if (cls_str) { - PyString_ConcatAndDel(&s, cls_str); - PyString_ConcatAndDel(&s, PyString_FromString(": ")); + PyBytes_ConcatAndDel(&s, cls_str); + PyBytes_ConcatAndDel(&s, PyBytes_FromString(": ")); if (s == NULL) goto error; } else PyErr_Clear(); msg_str = PyObject_Str(v); if (msg_str) - PyString_ConcatAndDel(&s, msg_str); + PyBytes_ConcatAndDel(&s, msg_str); else { PyErr_Clear(); - PyString_ConcatAndDel(&s, PyString_FromString("???")); + PyBytes_ConcatAndDel(&s, PyBytes_FromString("???")); if (s == NULL) goto error; } @@ -1105,7 +1105,7 @@ if (!PyArg_ParseTuple(args, "O|O:LoadLibrary", &nameobj, &ignored)) return NULL; #ifdef _UNICODE - name = alloca((PyString_Size(nameobj) + 1) * sizeof(WCHAR)); + name = alloca((PyBytes_Size(nameobj) + 1) * sizeof(WCHAR)); if (!name) { PyErr_NoMemory(); return NULL; @@ -1113,14 +1113,14 @@ { int r; - char *aname = PyString_AsString(nameobj); + char *aname = PyBytes_AsString(nameobj); if(!aname) return NULL; - r = MultiByteToWideChar(CP_ACP, 0, aname, -1, name, PyString_Size(nameobj) + 1); + r = MultiByteToWideChar(CP_ACP, 0, aname, -1, name, PyBytes_Size(nameobj) + 1); name[r] = 0; } #else - name = PyString_AsString(nameobj); + name = PyBytes_AsString(nameobj); if(!name) return NULL; #endif @@ -1613,9 +1613,9 @@ Py_INCREF(result); return result; } - if (PyString_CheckExact(cls)) { - buf = alloca(strlen(PyString_AS_STRING(cls)) + 3 + 1); - sprintf(buf, "LP_%s", PyString_AS_STRING(cls)); + if (PyBytes_CheckExact(cls)) { + buf = alloca(strlen(PyBytes_AS_STRING(cls)) + 3 + 1); + sprintf(buf, "LP_%s", PyBytes_AS_STRING(cls)); result = PyObject_CallFunction((PyObject *)Py_TYPE(&Pointer_Type), "s(O){}", buf, Modified: python/branches/tlee-ast-optimize/Modules/_ctypes/cfield.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_ctypes/cfield.c (original) +++ python/branches/tlee-ast-optimize/Modules/_ctypes/cfield.c Sun Jun 1 17:18:10 2008 @@ -272,7 +272,7 @@ name = ((PyTypeObject *)self->proto)->tp_name; if (bits) - result = PyString_FromFormat( + result = PyBytes_FromFormat( #if (PY_VERSION_HEX < 0x02050000) "", #else @@ -280,7 +280,7 @@ #endif name, self->offset, size, bits); else - result = PyString_FromFormat( + result = PyBytes_FromFormat( #if (PY_VERSION_HEX < 0x02050000) "", #else @@ -1164,12 +1164,12 @@ static PyObject * c_set(void *ptr, PyObject *value, Py_ssize_t size) { - if (!PyString_Check(value) || (1 != PyString_Size(value))) { + if (!PyBytes_Check(value) || (1 != PyBytes_Size(value))) { PyErr_Format(PyExc_TypeError, "one character string expected"); return NULL; } - *(char *)ptr = PyString_AS_STRING(value)[0]; + *(char *)ptr = PyBytes_AS_STRING(value)[0]; _RET(value); } @@ -1177,7 +1177,7 @@ static PyObject * c_get(void *ptr, Py_ssize_t size) { - return PyString_FromStringAndSize((char *)ptr, 1); + return PyBytes_FromStringAndSize((char *)ptr, 1); } #ifdef CTYPES_UNICODE @@ -1187,7 +1187,7 @@ { Py_ssize_t len; - if (PyString_Check(value)) { + if (PyBytes_Check(value)) { value = PyUnicode_FromEncodedObject(value, conversion_mode_encoding, conversion_mode_errors); @@ -1262,7 +1262,7 @@ /* It's easier to calculate in characters than in bytes */ length /= sizeof(wchar_t); - if (PyString_Check(value)) { + if (PyBytes_Check(value)) { value = PyUnicode_FromEncodedObject(value, conversion_mode_encoding, conversion_mode_errors); @@ -1301,21 +1301,21 @@ PyObject *result; size_t slen; - result = PyString_FromString((char *)ptr); + result = PyBytes_FromString((char *)ptr); if (!result) return NULL; /* chop off at the first NUL character, if any. * On error, result will be deallocated and set to NULL. */ - slen = strlen(PyString_AS_STRING(result)); + slen = strlen(PyBytes_AS_STRING(result)); size = min(size, (Py_ssize_t)slen); if (result->ob_refcnt == 1) { /* shorten the result */ - _PyString_Resize(&result, size); + _PyBytes_Resize(&result, size); return result; } else /* cannot shorten the result */ - return PyString_FromStringAndSize(ptr, size); + return PyBytes_FromStringAndSize(ptr, size); } static PyObject * @@ -1324,7 +1324,7 @@ char *data; Py_ssize_t size; - data = PyString_AsString(value); + data = PyBytes_AsString(value); if (!data) return NULL; size = strlen(data); @@ -1356,8 +1356,8 @@ Py_INCREF(value); return value; } - if (PyString_Check(value)) { - *(char **)ptr = PyString_AS_STRING(value); + if (PyBytes_Check(value)) { + *(char **)ptr = PyBytes_AS_STRING(value); Py_INCREF(value); return value; } else if (PyUnicode_Check(value)) { @@ -1366,7 +1366,7 @@ conversion_mode_errors); if (str == NULL) return NULL; - *(char **)ptr = PyString_AS_STRING(str); + *(char **)ptr = PyBytes_AS_STRING(str); return str; } else if (PyInt_Check(value) || PyLong_Check(value)) { #if SIZEOF_VOID_P == SIZEOF_LONG_LONG @@ -1395,7 +1395,7 @@ return NULL; } #endif - return PyString_FromString(*(char **)ptr); + return PyBytes_FromString(*(char **)ptr); } else { Py_INCREF(Py_None); return Py_None; @@ -1411,7 +1411,7 @@ Py_INCREF(value); return value; } - if (PyString_Check(value)) { + if (PyBytes_Check(value)) { value = PyUnicode_FromEncodedObject(value, conversion_mode_encoding, conversion_mode_errors); @@ -1502,7 +1502,7 @@ /* convert value into a PyUnicodeObject or NULL */ if (Py_None == value) { value = NULL; - } else if (PyString_Check(value)) { + } else if (PyBytes_Check(value)) { value = PyUnicode_FromEncodedObject(value, conversion_mode_encoding, conversion_mode_errors); Modified: python/branches/tlee-ast-optimize/Modules/_curses_panel.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_curses_panel.c (original) +++ python/branches/tlee-ast-optimize/Modules/_curses_panel.c Sun Jun 1 17:18:10 2008 @@ -472,7 +472,7 @@ PyDict_SetItemString(d, "error", PyCursesError); /* Make the version available */ - v = PyString_FromString(PyCursesVersion); + v = PyBytes_FromString(PyCursesVersion); PyDict_SetItemString(d, "version", v); PyDict_SetItemString(d, "__version__", v); Py_DECREF(v); Modified: python/branches/tlee-ast-optimize/Modules/_cursesmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_cursesmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/_cursesmodule.c Sun Jun 1 17:18:10 2008 @@ -198,9 +198,9 @@ { if (PyInt_Check(obj)) { *ch = (chtype) PyInt_AsLong(obj); - } else if(PyString_Check(obj) - && (PyString_Size(obj) == 1)) { - *ch = (chtype) *PyString_AsString(obj); + } else if(PyBytes_Check(obj) + && (PyBytes_Size(obj) == 1)) { + *ch = (chtype) *PyBytes_AsString(obj); } else { return 0; } @@ -886,9 +886,9 @@ return Py_BuildValue("c", rtn); else #if defined(__NetBSD__) - return PyString_FromString(unctrl(rtn)); + return PyBytes_FromString(unctrl(rtn)); #else - return PyString_FromString((char *)keyname(rtn)); + return PyBytes_FromString((char *)keyname(rtn)); #endif } @@ -943,7 +943,7 @@ } if (rtn2 == ERR) rtn[0] = 0; - return PyString_FromString(rtn); + return PyBytes_FromString(rtn); } static PyObject * @@ -1095,7 +1095,7 @@ } if (rtn2 == ERR) rtn[0] = 0; - return PyString_FromString(rtn); + return PyBytes_FromString(rtn); } static PyObject * @@ -1757,7 +1757,7 @@ ch = erasechar(); - return PyString_FromStringAndSize(&ch, 1); + return PyBytes_FromStringAndSize(&ch, 1); } static PyObject * @@ -2114,7 +2114,7 @@ } knp = keyname(ch); - return PyString_FromString((knp == NULL) ? "" : (char *)knp); + return PyBytes_FromString((knp == NULL) ? "" : (char *)knp); } #endif @@ -2125,7 +2125,7 @@ ch = killchar(); - return PyString_FromStringAndSize(&ch, 1); + return PyBytes_FromStringAndSize(&ch, 1); } static PyObject * @@ -2496,7 +2496,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString( capname ); + return PyBytes_FromString( capname ); } static PyObject * @@ -2520,7 +2520,7 @@ return NULL; } - return PyString_FromString(result); + return PyBytes_FromString(result); } static PyObject * @@ -2547,14 +2547,14 @@ if (PyInt_Check(temp)) ch = (chtype) PyInt_AsLong(temp); - else if (PyString_Check(temp)) - ch = (chtype) *PyString_AsString(temp); + else if (PyBytes_Check(temp)) + ch = (chtype) *PyBytes_AsString(temp); else { PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int"); return NULL; } - return PyString_FromString(unctrl(ch)); + return PyBytes_FromString(unctrl(ch)); } static PyObject * @@ -2569,8 +2569,8 @@ if (PyInt_Check(temp)) ch = (int) PyInt_AsLong(temp); - else if (PyString_Check(temp)) - ch = (int) *PyString_AsString(temp); + else if (PyBytes_Check(temp)) + ch = (int) *PyBytes_AsString(temp); else { PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int"); return NULL; @@ -2753,7 +2753,7 @@ PyDict_SetItemString(d, "error", PyCursesError); /* Make the version available */ - v = PyString_FromString(PyCursesVersion); + v = PyBytes_FromString(PyCursesVersion); PyDict_SetItemString(d, "version", v); PyDict_SetItemString(d, "__version__", v); Py_DECREF(v); Modified: python/branches/tlee-ast-optimize/Modules/_elementtree.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_elementtree.c (original) +++ python/branches/tlee-ast-optimize/Modules/_elementtree.c Sun Jun 1 17:18:10 2008 @@ -103,7 +103,7 @@ #define PyDict_CheckExact PyDict_Check #if (PY_VERSION_HEX < 0x02020000) #define PyList_CheckExact PyList_Check -#define PyString_CheckExact PyString_Check +#define PyBytes_CheckExact PyBytes_Check #if (PY_VERSION_HEX >= 0x01060000) #define Py_USING_UNICODE /* always enabled for 2.0 and 2.1 */ #endif @@ -173,7 +173,7 @@ switch (PyList_GET_SIZE(list)) { case 0: Py_DECREF(list); - return PyString_FromString(""); + return PyBytes_FromString(""); case 1: result = PyList_GET_ITEM(list, 0); Py_INCREF(result); @@ -748,9 +748,9 @@ return 0; } #endif - if (PyString_Check(tag)) { - char *p = PyString_AS_STRING(tag); - for (i = 0; i < PyString_GET_SIZE(tag); i++) { + if (PyBytes_Check(tag)) { + char *p = PyBytes_AS_STRING(tag); + for (i = 0; i < PyBytes_GET_SIZE(tag); i++) { if (p[i] == '{') check = 0; else if (p[i] == '}') @@ -818,7 +818,7 @@ if (Element_CheckExact(item) && !PyObject_Compare(item->tag, tag)) { PyObject* text = element_get_text(item); if (text == Py_None) - return PyString_FromString(""); + return PyBytes_FromString(""); Py_XINCREF(text); return text; } @@ -1154,12 +1154,12 @@ PyObject* repr; char buffer[100]; - repr = PyString_FromString("tag)); + PyBytes_ConcatAndDel(&repr, PyObject_Repr(self->tag)); sprintf(buffer, " at %p>", self); - PyString_ConcatAndDel(&repr, PyString_FromString(buffer)); + PyBytes_ConcatAndDel(&repr, PyBytes_FromString(buffer)); return repr; } @@ -1617,14 +1617,14 @@ Py_INCREF(data); self->data = data; } else { /* more than one item; use a list to collect items */ - if (PyString_CheckExact(self->data) && Py_REFCNT(self->data) == 1 && - PyString_CheckExact(data) && PyString_GET_SIZE(data) == 1) { + if (PyBytes_CheckExact(self->data) && Py_REFCNT(self->data) == 1 && + PyBytes_CheckExact(data) && PyBytes_GET_SIZE(data) == 1) { /* expat often generates single character data sections; handle the most common case by resizing the existing string... */ - Py_ssize_t size = PyString_GET_SIZE(self->data); - if (_PyString_Resize(&self->data, size + 1) < 0) + Py_ssize_t size = PyBytes_GET_SIZE(self->data); + if (_PyBytes_Resize(&self->data, size + 1) < 0) return NULL; - PyString_AS_STRING(self->data)[size] = PyString_AS_STRING(data)[0]; + PyBytes_AS_STRING(self->data)[size] = PyBytes_AS_STRING(data)[0]; } else if (PyList_CheckExact(self->data)) { if (PyList_Append(self->data, data) < 0) return NULL; @@ -1896,7 +1896,7 @@ return PyUnicode_DecodeUTF8(string, size, "strict"); #endif - return PyString_FromStringAndSize(string, size); + return PyBytes_FromStringAndSize(string, size); } LOCAL(PyObject*) @@ -1910,7 +1910,7 @@ PyObject* value; /* look the 'raw' name up in the names dictionary */ - key = PyString_FromStringAndSize(string, size); + key = PyBytes_FromStringAndSize(string, size); if (!key) return NULL; @@ -1932,8 +1932,8 @@ break; if (i != size) { /* convert to universal name */ - tag = PyString_FromStringAndSize(NULL, size+1); - p = PyString_AS_STRING(tag); + tag = PyBytes_FromStringAndSize(NULL, size+1); + p = PyBytes_AS_STRING(tag); p[0] = '{'; memcpy(p+1, string, size); size++; @@ -1947,7 +1947,7 @@ #if defined(Py_USING_UNICODE) /* inline makestring, to avoid duplicating the source string if it's not an utf-8 string */ - p = PyString_AS_STRING(tag); + p = PyBytes_AS_STRING(tag); if (checkstring(p, size)) { value = PyUnicode_DecodeUTF8(p, size, "strict"); Py_DECREF(tag); @@ -2004,7 +2004,7 @@ } else { PyErr_Format( PyExc_SyntaxError, "undefined entity &%s;: line %ld, column %ld", - PyString_AS_STRING(key), + PyBytes_AS_STRING(key), EXPAT(GetErrorLineNumber)(self->parser), EXPAT(GetErrorColumnNumber)(self->parser) ); @@ -2435,13 +2435,13 @@ return NULL; } - if (!PyString_CheckExact(buffer) || PyString_GET_SIZE(buffer) == 0) { + if (!PyBytes_CheckExact(buffer) || PyBytes_GET_SIZE(buffer) == 0) { Py_DECREF(buffer); break; } res = expat_parse( - self, PyString_AS_STRING(buffer), PyString_GET_SIZE(buffer), 0 + self, PyBytes_AS_STRING(buffer), PyBytes_GET_SIZE(buffer), 0 ); Py_DECREF(buffer); @@ -2503,7 +2503,7 @@ if (event_set == Py_None) { /* default is "end" only */ - target->end_event_obj = PyString_FromString("end"); + target->end_event_obj = PyBytes_FromString("end"); Py_RETURN_NONE; } @@ -2513,9 +2513,9 @@ for (i = 0; i < PyTuple_GET_SIZE(event_set); i++) { PyObject* item = PyTuple_GET_ITEM(event_set, i); char* event; - if (!PyString_Check(item)) + if (!PyBytes_Check(item)) goto error; - event = PyString_AS_STRING(item); + event = PyBytes_AS_STRING(item); if (strcmp(event, "start") == 0) { Py_INCREF(item); target->start_event_obj = item; @@ -2587,7 +2587,7 @@ char buffer[100]; sprintf(buffer, "Expat %d.%d.%d", XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); - return PyString_FromString(buffer); + return PyBytes_FromString(buffer); } else { PyErr_SetString(PyExc_AttributeError, name); return NULL; Modified: python/branches/tlee-ast-optimize/Modules/_fileio.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_fileio.c (original) +++ python/branches/tlee-ast-optimize/Modules/_fileio.c Sun Jun 1 17:18:10 2008 @@ -392,14 +392,14 @@ Py_ssize_t total = 0; int n; - result = PyString_FromStringAndSize(NULL, DEFAULT_BUFFER_SIZE); + result = PyBytes_FromStringAndSize(NULL, DEFAULT_BUFFER_SIZE); if (result == NULL) return NULL; while (1) { Py_ssize_t newsize = total + DEFAULT_BUFFER_SIZE; - if (PyString_GET_SIZE(result) < newsize) { - if (_PyString_Resize(&result, newsize) < 0) { + if (PyBytes_GET_SIZE(result) < newsize) { + if (_PyBytes_Resize(&result, newsize) < 0) { if (total == 0) { Py_DECREF(result); return NULL; @@ -411,7 +411,7 @@ Py_BEGIN_ALLOW_THREADS errno = 0; n = read(self->fd, - PyString_AS_STRING(result) + total, + PyBytes_AS_STRING(result) + total, newsize - total); Py_END_ALLOW_THREADS if (n == 0) @@ -430,8 +430,8 @@ total += n; } - if (PyString_GET_SIZE(result) > total) { - if (_PyString_Resize(&result, total) < 0) { + if (PyBytes_GET_SIZE(result) > total) { + if (_PyBytes_Resize(&result, total) < 0) { /* This should never happen, but just in case */ Py_DECREF(result); return NULL; @@ -460,10 +460,10 @@ return fileio_readall(self); } - bytes = PyString_FromStringAndSize(NULL, size); + bytes = PyBytes_FromStringAndSize(NULL, size); if (bytes == NULL) return NULL; - ptr = PyString_AS_STRING(bytes); + ptr = PyBytes_AS_STRING(bytes); Py_BEGIN_ALLOW_THREADS errno = 0; @@ -478,7 +478,7 @@ } if (n != size) { - if (_PyString_Resize(&bytes, n) < 0) { + if (_PyBytes_Resize(&bytes, n) < 0) { Py_DECREF(bytes); return NULL; } @@ -690,9 +690,9 @@ fileio_repr(PyFileIOObject *self) { if (self->fd < 0) - return PyString_FromFormat("_fileio._FileIO(-1)"); + return PyBytes_FromFormat("_fileio._FileIO(-1)"); - return PyString_FromFormat("_fileio._FileIO(%d, '%s')", + return PyBytes_FromFormat("_fileio._FileIO(%d, '%s')", self->fd, mode_string(self)); } @@ -816,7 +816,7 @@ static PyObject * get_mode(PyFileIOObject *self, void *closure) { - return PyString_FromString(mode_string(self)); + return PyBytes_FromString(mode_string(self)); } static PyGetSetDef fileio_getsetlist[] = { Modified: python/branches/tlee-ast-optimize/Modules/_hashopenssl.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_hashopenssl.c (original) +++ python/branches/tlee-ast-optimize/Modules/_hashopenssl.c Sun Jun 1 17:18:10 2008 @@ -103,7 +103,7 @@ digest_size = EVP_MD_CTX_size(&temp_ctx); EVP_DigestFinal(&temp_ctx, digest, NULL); - retval = PyString_FromStringAndSize((const char *)digest, digest_size); + retval = PyBytes_FromStringAndSize((const char *)digest, digest_size); EVP_MD_CTX_cleanup(&temp_ctx); return retval; } @@ -130,10 +130,10 @@ /* Create a new string */ /* NOTE: not thread safe! modifying an already created string object */ /* (not a problem because we hold the GIL by default) */ - retval = PyString_FromStringAndSize(NULL, digest_size * 2); + retval = PyBytes_FromStringAndSize(NULL, digest_size * 2); if (!retval) return NULL; - hex_digest = PyString_AsString(retval); + hex_digest = PyBytes_AsString(retval); if (!hex_digest) { Py_DECREF(retval); return NULL; @@ -220,8 +220,8 @@ { char buf[100]; PyOS_snprintf(buf, sizeof(buf), "<%s HASH object @ %p>", - PyString_AsString(((EVPobject *)self)->name), self); - return PyString_FromString(buf); + PyBytes_AsString(((EVPobject *)self)->name), self); + return PyBytes_FromString(buf); } #if HASH_OBJ_CONSTRUCTOR @@ -421,7 +421,7 @@ /* used in the init function to setup a constructor */ #define INIT_CONSTRUCTOR_CONSTANTS(NAME) do { \ - CONST_ ## NAME ## _name_obj = PyString_FromString(#NAME); \ + CONST_ ## NAME ## _name_obj = PyBytes_FromString(#NAME); \ if (EVP_get_digestbyname(#NAME)) { \ CONST_new_ ## NAME ## _ctx_p = &CONST_new_ ## NAME ## _ctx; \ EVP_DigestInit(CONST_new_ ## NAME ## _ctx_p, EVP_get_digestbyname(#NAME)); \ Modified: python/branches/tlee-ast-optimize/Modules/_heapqmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_heapqmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/_heapqmodule.c Sun Jun 1 17:18:10 2008 @@ -28,12 +28,12 @@ while (pos > startpos){ parentpos = (pos - 1) >> 1; parent = PyList_GET_ITEM(heap, parentpos); - cmp = PyObject_RichCompareBool(parent, newitem, Py_LE); + cmp = PyObject_RichCompareBool(newitem, parent, Py_LT); if (cmp == -1) { Py_DECREF(newitem); return -1; } - if (cmp == 1) + if (cmp == 0) break; Py_INCREF(parent); Py_DECREF(PyList_GET_ITEM(heap, pos)); @@ -69,14 +69,14 @@ rightpos = childpos + 1; if (rightpos < endpos) { cmp = PyObject_RichCompareBool( - PyList_GET_ITEM(heap, rightpos), PyList_GET_ITEM(heap, childpos), - Py_LE); + PyList_GET_ITEM(heap, rightpos), + Py_LT); if (cmp == -1) { Py_DECREF(newitem); return -1; } - if (cmp == 1) + if (cmp == 0) childpos = rightpos; } /* Move the smaller child up. */ @@ -214,10 +214,10 @@ return item; } - cmp = PyObject_RichCompareBool(item, PyList_GET_ITEM(heap, 0), Py_LE); + cmp = PyObject_RichCompareBool(PyList_GET_ITEM(heap, 0), item, Py_LT); if (cmp == -1) return NULL; - if (cmp == 1) { + if (cmp == 0) { Py_INCREF(item); return item; } @@ -270,6 +270,7 @@ { PyObject *heap=NULL, *elem, *iterable, *sol, *it, *oldelem; Py_ssize_t i, n; + int cmp; if (!PyArg_ParseTuple(args, "nO:nlargest", &n, &iterable)) return NULL; @@ -312,7 +313,12 @@ else goto sortit; } - if (PyObject_RichCompareBool(elem, sol, Py_LE)) { + cmp = PyObject_RichCompareBool(sol, elem, Py_LT); + if (cmp == -1) { + Py_DECREF(elem); + goto fail; + } + if (cmp == 0) { Py_DECREF(elem); continue; } @@ -362,12 +368,12 @@ while (pos > startpos){ parentpos = (pos - 1) >> 1; parent = PyList_GET_ITEM(heap, parentpos); - cmp = PyObject_RichCompareBool(newitem, parent, Py_LE); + cmp = PyObject_RichCompareBool(parent, newitem, Py_LT); if (cmp == -1) { Py_DECREF(newitem); return -1; } - if (cmp == 1) + if (cmp == 0) break; Py_INCREF(parent); Py_DECREF(PyList_GET_ITEM(heap, pos)); @@ -403,14 +409,14 @@ rightpos = childpos + 1; if (rightpos < endpos) { cmp = PyObject_RichCompareBool( - PyList_GET_ITEM(heap, childpos), PyList_GET_ITEM(heap, rightpos), - Py_LE); + PyList_GET_ITEM(heap, childpos), + Py_LT); if (cmp == -1) { Py_DECREF(newitem); return -1; } - if (cmp == 1) + if (cmp == 0) childpos = rightpos; } /* Move the smaller child up. */ @@ -434,6 +440,7 @@ { PyObject *heap=NULL, *elem, *iterable, *los, *it, *oldelem; Py_ssize_t i, n; + int cmp; if (!PyArg_ParseTuple(args, "nO:nsmallest", &n, &iterable)) return NULL; @@ -477,7 +484,12 @@ else goto sortit; } - if (PyObject_RichCompareBool(los, elem, Py_LE)) { + cmp = PyObject_RichCompareBool(elem, los, Py_LT); + if (cmp == -1) { + Py_DECREF(elem); + goto fail; + } + if (cmp == 0) { Py_DECREF(elem); continue; } @@ -658,6 +670,6 @@ m = Py_InitModule3("_heapq", heapq_methods, module_doc); if (m == NULL) return; - PyModule_AddObject(m, "__about__", PyString_FromString(__about__)); + PyModule_AddObject(m, "__about__", PyBytes_FromString(__about__)); } Modified: python/branches/tlee-ast-optimize/Modules/_hotshot.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_hotshot.c (original) +++ python/branches/tlee-ast-optimize/Modules/_hotshot.c Sun Jun 1 17:18:10 2008 @@ -326,7 +326,7 @@ return ERR_EOF; } } - *pvalue = PyString_FromStringAndSize(buf, len); + *pvalue = PyBytes_FromStringAndSize(buf, len); free(buf); if (*pvalue == NULL) { return ERR_EXCEPTION; @@ -562,7 +562,7 @@ self->index - written); self->index -= written; if (written == 0) { - char *s = PyString_AsString(self->logfilename); + char *s = PyBytes_AsString(self->logfilename); PyErr_SetFromErrnoWithFilename(PyExc_IOError, s); do_stop(self); return -1; @@ -570,7 +570,7 @@ } if (written > 0) { if (fflush(self->logfp)) { - char *s = PyString_AsString(self->logfilename); + char *s = PyBytes_AsString(self->logfilename); PyErr_SetFromErrnoWithFilename(PyExc_IOError, s); do_stop(self); return -1; @@ -792,7 +792,7 @@ self->next_fileno++; Py_DECREF(obj); if (pack_define_file(self, fileno, - PyString_AS_STRING(fcode->co_filename)) < 0) + PyBytes_AS_STRING(fcode->co_filename)) < 0) return -1; } else { @@ -810,7 +810,7 @@ PyObject *name = PyDict_GetItem(dict, obj); if (name == NULL) { if (pack_define_func(self, fileno, fcode->co_firstlineno, - PyString_AS_STRING(fcode->co_name)) < 0) { + PyBytes_AS_STRING(fcode->co_name)) < 0) { Py_DECREF(obj); return -1; } @@ -1471,7 +1471,7 @@ len = PyList_GET_SIZE(temp); for (i = 0; i < len; ++i) { PyObject *item = PyList_GET_ITEM(temp, i); - buffer = PyString_AsString(item); + buffer = PyBytes_AsString(item); if (buffer == NULL) { pack_add_info(self, "sys-path-entry", ""); PyErr_Clear(); Modified: python/branches/tlee-ast-optimize/Modules/_json.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_json.c (original) +++ python/branches/tlee-ast-optimize/Modules/_json.c Sun Jun 1 17:18:10 2008 @@ -70,11 +70,11 @@ input_unicode = PyUnicode_AS_UNICODE(pystr); /* One char input can be up to 6 chars output, estimate 4 of these */ output_size = 2 + (MIN_EXPANSION * 4) + input_chars; - rval = PyString_FromStringAndSize(NULL, output_size); + rval = PyBytes_FromStringAndSize(NULL, output_size); if (rval == NULL) { return NULL; } - output = PyString_AS_STRING(rval); + output = PyBytes_AS_STRING(rval); chars = 0; output[chars++] = '"'; for (i = 0; i < input_chars; i++) { @@ -92,14 +92,14 @@ if (output_size > 2 + (input_chars * MAX_EXPANSION)) { output_size = 2 + (input_chars * MAX_EXPANSION); } - if (_PyString_Resize(&rval, output_size) == -1) { + if (_PyBytes_Resize(&rval, output_size) == -1) { return NULL; } - output = PyString_AS_STRING(rval); + output = PyBytes_AS_STRING(rval); } } output[chars++] = '"'; - if (_PyString_Resize(&rval, chars) == -1) { + if (_PyBytes_Resize(&rval, chars) == -1) { return NULL; } return rval; @@ -116,15 +116,15 @@ char *output; char *input_str; - input_chars = PyString_GET_SIZE(pystr); - input_str = PyString_AS_STRING(pystr); + input_chars = PyBytes_GET_SIZE(pystr); + input_str = PyBytes_AS_STRING(pystr); /* One char input can be up to 6 chars output, estimate 4 of these */ output_size = 2 + (MIN_EXPANSION * 4) + input_chars; - rval = PyString_FromStringAndSize(NULL, output_size); + rval = PyBytes_FromStringAndSize(NULL, output_size); if (rval == NULL) { return NULL; } - output = PyString_AS_STRING(rval); + output = PyBytes_AS_STRING(rval); chars = 0; output[chars++] = '"'; for (i = 0; i < input_chars; i++) { @@ -154,14 +154,14 @@ if (output_size > 2 + (input_chars * MIN_EXPANSION)) { output_size = 2 + (input_chars * MIN_EXPANSION); } - if (_PyString_Resize(&rval, output_size) == -1) { + if (_PyBytes_Resize(&rval, output_size) == -1) { return NULL; } - output = PyString_AS_STRING(rval); + output = PyBytes_AS_STRING(rval); } } output[chars++] = '"'; - if (_PyString_Resize(&rval, chars) == -1) { + if (_PyBytes_Resize(&rval, chars) == -1) { return NULL; } return rval; @@ -215,7 +215,7 @@ ustr = PyUnicode_FromUnicode(&c, 0); } if (joinstr == NULL) { - joinstr = PyString_InternFromString("join"); + joinstr = PyBytes_InternFromString("join"); } if (joinstr == NULL || ustr == NULL) { return NULL; @@ -227,10 +227,10 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict) { PyObject *rval; - Py_ssize_t len = PyString_GET_SIZE(pystr); + Py_ssize_t len = PyBytes_GET_SIZE(pystr); Py_ssize_t begin = end - 1; Py_ssize_t next = begin; - char *buf = PyString_AS_STRING(pystr); + char *buf = PyBytes_AS_STRING(pystr); PyObject *chunks = PyList_New(0); if (chunks == NULL) { goto bail; @@ -555,7 +555,7 @@ if (encoding == NULL) { encoding = DEFAULT_ENCODING; } - if (PyString_Check(pystr)) { + if (PyBytes_Check(pystr)) { return scanstring_str(pystr, end, encoding, strict); } else if (PyUnicode_Check(pystr)) { @@ -576,7 +576,7 @@ py_encode_basestring_ascii(PyObject* self, PyObject *pystr) { /* METH_O */ - if (PyString_Check(pystr)) { + if (PyBytes_Check(pystr)) { return ascii_escape_str(pystr); } else if (PyUnicode_Check(pystr)) { Modified: python/branches/tlee-ast-optimize/Modules/_localemodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_localemodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/_localemodule.c Sun Jun 1 17:18:10 2008 @@ -119,7 +119,7 @@ if (isupper(c)) ul[n++] = c; } - ulo = PyString_FromStringAndSize((const char *)ul, n); + ulo = PyBytes_FromStringAndSize((const char *)ul, n); if (!ulo) return; if (string) @@ -134,7 +134,7 @@ if (islower(c)) ul[n++] = c; } - ulo = PyString_FromStringAndSize((const char *)ul, n); + ulo = PyBytes_FromStringAndSize((const char *)ul, n); if (!ulo) return; if (string) @@ -149,7 +149,7 @@ if (isalpha(c)) ul[n++] = c; } - ulo = PyString_FromStringAndSize((const char *)ul, n); + ulo = PyBytes_FromStringAndSize((const char *)ul, n); if (!ulo) return; if (string) @@ -175,7 +175,7 @@ PyErr_SetString(Error, "unsupported locale setting"); return NULL; } - result_object = PyString_FromString(result); + result_object = PyBytes_FromString(result); if (!result_object) return NULL; /* record changes to LC_CTYPE */ @@ -190,7 +190,7 @@ PyErr_SetString(Error, "locale query failed"); return NULL; } - result_object = PyString_FromString(result); + result_object = PyBytes_FromString(result); } return result_object; } @@ -216,7 +216,7 @@ involved herein */ #define RESULT_STRING(s)\ - x = PyString_FromString(l->s);\ + x = PyBytes_FromString(l->s);\ if (!x) goto failed;\ PyDict_SetItemString(result, #s, x);\ Py_XDECREF(x) @@ -284,9 +284,9 @@ if (!PyArg_UnpackTuple(args, "strcoll", 2, 2, &os1, &os2)) return NULL; /* If both arguments are byte strings, use strcoll. */ - if (PyString_Check(os1) && PyString_Check(os2)) - return PyInt_FromLong(strcoll(PyString_AS_STRING(os1), - PyString_AS_STRING(os2))); + if (PyBytes_Check(os1) && PyBytes_Check(os2)) + return PyInt_FromLong(strcoll(PyBytes_AS_STRING(os1), + PyBytes_AS_STRING(os2))); /* If neither argument is unicode, it's an error. */ if (!PyUnicode_Check(os1) && !PyUnicode_Check(os2)) { PyErr_SetString(PyExc_ValueError, "strcoll arguments must be strings"); @@ -368,7 +368,7 @@ return PyErr_NoMemory(); strxfrm(buf, s, n2); } - result = PyString_FromString(buf); + result = PyBytes_FromString(buf); PyMem_Free(buf); return result; } @@ -563,13 +563,13 @@ return NULL; /* Check whether this is a supported constant. GNU libc sometimes returns numeric values in the char* return value, which would - crash PyString_FromString. */ + crash PyBytes_FromString. */ for (i = 0; langinfo_constants[i].name; i++) if (langinfo_constants[i].value == item) { /* Check NULL as a workaround for GNU libc's returning NULL instead of an empty string for nl_langinfo(ERA). */ const char *result = nl_langinfo(item); - return PyString_FromString(result != NULL ? result : ""); + return PyBytes_FromString(result != NULL ? result : ""); } PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant"); return NULL; @@ -588,7 +588,7 @@ char *in; if (!PyArg_ParseTuple(args, "z", &in)) return 0; - return PyString_FromString(gettext(in)); + return PyBytes_FromString(gettext(in)); } PyDoc_STRVAR(dgettext__doc__, @@ -601,7 +601,7 @@ char *domain, *in; if (!PyArg_ParseTuple(args, "zz", &domain, &in)) return 0; - return PyString_FromString(dgettext(domain, in)); + return PyBytes_FromString(dgettext(domain, in)); } PyDoc_STRVAR(dcgettext__doc__, @@ -615,7 +615,7 @@ int category; if (!PyArg_ParseTuple(args, "zzi", &domain, &msgid, &category)) return 0; - return PyString_FromString(dcgettext(domain,msgid,category)); + return PyBytes_FromString(dcgettext(domain,msgid,category)); } PyDoc_STRVAR(textdomain__doc__, @@ -633,7 +633,7 @@ PyErr_SetFromErrno(PyExc_OSError); return NULL; } - return PyString_FromString(domain); + return PyBytes_FromString(domain); } PyDoc_STRVAR(bindtextdomain__doc__, @@ -651,7 +651,7 @@ PyErr_SetFromErrno(PyExc_OSError); return NULL; } - return PyString_FromString(dirname); + return PyBytes_FromString(dirname); } #ifdef HAVE_BIND_TEXTDOMAIN_CODESET @@ -667,7 +667,7 @@ return NULL; codeset = bind_textdomain_codeset(domain, codeset); if (codeset) - return PyString_FromString(codeset); + return PyBytes_FromString(codeset); Py_RETURN_NONE; } #endif @@ -760,7 +760,7 @@ Error = PyErr_NewException("locale.Error", NULL, NULL); PyDict_SetItemString(d, "Error", Error); - x = PyString_FromString(locale__doc__); + x = PyBytes_FromString(locale__doc__); PyDict_SetItemString(d, "__doc__", x); Py_XDECREF(x); Modified: python/branches/tlee-ast-optimize/Modules/_lsprof.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_lsprof.c (original) +++ python/branches/tlee-ast-optimize/Modules/_lsprof.c Sun Jun 1 17:18:10 2008 @@ -179,8 +179,8 @@ /* built-in function: look up the module name */ PyObject *mod = fn->m_module; char *modname; - if (mod && PyString_Check(mod)) { - modname = PyString_AS_STRING(mod); + if (mod && PyBytes_Check(mod)) { + modname = PyBytes_AS_STRING(mod); } else if (mod && PyModule_Check(mod)) { modname = PyModule_GetName(mod); @@ -193,11 +193,11 @@ modname = "__builtin__"; } if (strcmp(modname, "__builtin__") != 0) - return PyString_FromFormat("<%s.%s>", + return PyBytes_FromFormat("<%s.%s>", modname, fn->m_ml->ml_name); else - return PyString_FromFormat("<%s>", + return PyBytes_FromFormat("<%s>", fn->m_ml->ml_name); } else { @@ -205,7 +205,7 @@ repr(getattr(type(__self__), __name__)) */ PyObject *self = fn->m_self; - PyObject *name = PyString_FromString(fn->m_ml->ml_name); + PyObject *name = PyBytes_FromString(fn->m_ml->ml_name); if (name != NULL) { PyObject *mo = _PyType_Lookup(Py_TYPE(self), name); Py_XINCREF(mo); @@ -218,7 +218,7 @@ } } PyErr_Clear(); - return PyString_FromFormat("", + return PyBytes_FromFormat("", fn->m_ml->ml_name); } } Modified: python/branches/tlee-ast-optimize/Modules/_sqlite/cache.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_sqlite/cache.c (original) +++ python/branches/tlee-ast-optimize/Modules/_sqlite/cache.c Sun Jun 1 17:18:10 2008 @@ -241,12 +241,12 @@ if (!fmt_args) { return NULL; } - template = PyString_FromString("%s <- %s ->%s\n"); + template = PyBytes_FromString("%s <- %s ->%s\n"); if (!template) { Py_DECREF(fmt_args); return NULL; } - display_str = PyString_Format(template, fmt_args); + display_str = PyBytes_Format(template, fmt_args); Py_DECREF(template); Py_DECREF(fmt_args); if (!display_str) { Modified: python/branches/tlee-ast-optimize/Modules/_sqlite/connection.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_sqlite/connection.c (original) +++ python/branches/tlee-ast-optimize/Modules/_sqlite/connection.c Sun Jun 1 17:18:10 2008 @@ -84,8 +84,8 @@ Py_INCREF(&PyUnicode_Type); self->text_factory = (PyObject*)&PyUnicode_Type; - if (PyString_Check(database) || PyUnicode_Check(database)) { - if (PyString_Check(database)) { + if (PyBytes_Check(database) || PyUnicode_Check(database)) { + if (PyBytes_Check(database)) { database_utf8 = database; Py_INCREF(database_utf8); } else { @@ -96,7 +96,7 @@ } Py_BEGIN_ALLOW_THREADS - rc = sqlite3_open(PyString_AsString(database_utf8), &self->db); + rc = sqlite3_open(PyBytes_AsString(database_utf8), &self->db); Py_END_ALLOW_THREADS Py_DECREF(database_utf8); @@ -111,7 +111,7 @@ if (class_attr) { class_attr_str = PyObject_Str(class_attr); if (class_attr_str) { - if (strcmp(PyString_AsString(class_attr_str), "") == 0) { + if (strcmp(PyBytes_AsString(class_attr_str), "") == 0) { /* In the APSW Connection object, the first entry after * PyObject_HEAD is the sqlite3* we want to get hold of. * Luckily, this is the same layout as we have in our @@ -134,7 +134,7 @@ } if (!isolation_level) { - isolation_level = PyString_FromString(""); + isolation_level = PyBytes_FromString(""); if (!isolation_level) { return -1; } @@ -499,12 +499,12 @@ } else { sqlite3_result_blob(context, buffer, buflen, SQLITE_TRANSIENT); } - } else if (PyString_Check(py_val)) { - sqlite3_result_text(context, PyString_AsString(py_val), -1, SQLITE_TRANSIENT); + } else if (PyBytes_Check(py_val)) { + sqlite3_result_text(context, PyBytes_AsString(py_val), -1, SQLITE_TRANSIENT); } else if (PyUnicode_Check(py_val)) { stringval = PyUnicode_AsUTF8String(py_val); if (stringval) { - sqlite3_result_text(context, PyString_AsString(stringval), -1, SQLITE_TRANSIENT); + sqlite3_result_text(context, PyBytes_AsString(stringval), -1, SQLITE_TRANSIENT); Py_DECREF(stringval); } } else { @@ -963,21 +963,21 @@ Py_INCREF(isolation_level); self->isolation_level = isolation_level; - begin_statement = PyString_FromString("BEGIN "); + begin_statement = PyBytes_FromString("BEGIN "); if (!begin_statement) { return -1; } - PyString_Concat(&begin_statement, isolation_level); + PyBytes_Concat(&begin_statement, isolation_level); if (!begin_statement) { return -1; } - self->begin_statement = PyMem_Malloc(PyString_Size(begin_statement) + 2); + self->begin_statement = PyMem_Malloc(PyBytes_Size(begin_statement) + 2); if (!self->begin_statement) { return -1; } - strcpy(self->begin_statement, PyString_AsString(begin_statement)); + strcpy(self->begin_statement, PyBytes_AsString(begin_statement)); Py_DECREF(begin_statement); } @@ -1152,8 +1152,8 @@ goto finally; } - string1 = PyString_FromStringAndSize((const char*)text1_data, text1_length); - string2 = PyString_FromStringAndSize((const char*)text2_data, text2_length); + string1 = PyBytes_FromStringAndSize((const char*)text1_data, text1_length); + string2 = PyBytes_FromStringAndSize((const char*)text2_data, text2_length); if (!string1 || !string2) { goto finally; /* failed to allocate strings */ @@ -1259,7 +1259,7 @@ goto finally; } - if (!PyArg_ParseTuple(args, "O!O:create_collation(name, callback)", &PyString_Type, &name, &callable)) { + if (!PyArg_ParseTuple(args, "O!O:create_collation(name, callback)", &PyBytes_Type, &name, &callable)) { goto finally; } @@ -1268,7 +1268,7 @@ goto finally; } - chk = PyString_AsString(uppercase_name); + chk = PyBytes_AsString(uppercase_name); while (*chk) { if ((*chk >= '0' && *chk <= '9') || (*chk >= 'A' && *chk <= 'Z') @@ -1293,7 +1293,7 @@ } rc = sqlite3_create_collation(self->db, - PyString_AsString(uppercase_name), + PyBytes_AsString(uppercase_name), SQLITE_UTF8, (callable != Py_None) ? callable : NULL, (callable != Py_None) ? pysqlite_collation_callback : NULL); Modified: python/branches/tlee-ast-optimize/Modules/_sqlite/connection.h ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_sqlite/connection.h (original) +++ python/branches/tlee-ast-optimize/Modules/_sqlite/connection.h Sun Jun 1 17:18:10 2008 @@ -80,7 +80,7 @@ /* Determines how bytestrings from SQLite are converted to Python objects: * - PyUnicode_Type: Python Unicode objects are constructed from UTF-8 bytestrings * - OptimizedUnicode: Like before, but for ASCII data, only PyStrings are created. - * - PyString_Type: PyStrings are created as-is. + * - PyBytes_Type: PyStrings are created as-is. * - Any custom callable: Any object returned from the callable called with the bytestring * as single parameter. */ Modified: python/branches/tlee-ast-optimize/Modules/_sqlite/cursor.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_sqlite/cursor.c (original) +++ python/branches/tlee-ast-optimize/Modules/_sqlite/cursor.c Sun Jun 1 17:18:10 2008 @@ -101,10 +101,7 @@ self->arraysize = 1; - self->rowcount = PyInt_FromLong(-1L); - if (!self->rowcount) { - return -1; - } + self->rowcount = -1L; Py_INCREF(Py_None); self->row_factory = Py_None; @@ -130,7 +127,6 @@ Py_XDECREF(self->row_cast_map); Py_XDECREF(self->description); Py_XDECREF(self->lastrowid); - Py_XDECREF(self->rowcount); Py_XDECREF(self->row_factory); Py_XDECREF(self->next_row); @@ -182,7 +178,7 @@ if (*pos == '[') { type_start = pos + 1; } else if (*pos == ']' && type_start != (const char*)-1) { - key = PyString_FromStringAndSize(type_start, pos - type_start); + key = PyBytes_FromStringAndSize(type_start, pos - type_start); if (!key) { /* creating a string failed, but it is too complicated * to propagate the error here, we just assume there is @@ -207,7 +203,7 @@ * 'NUMBER(10)' to be treated as 'NUMBER', for example. * In other words, it will work as people expect it to work.*/ if (*pos == ' ' || *pos == '(' || *pos == 0) { - py_decltype = PyString_FromStringAndSize(decltype, pos - decltype); + py_decltype = PyBytes_FromStringAndSize(decltype, pos - decltype); if (!py_decltype) { return -1; } @@ -252,7 +248,7 @@ if ((*pos == '[') && (pos > colname) && (*(pos-1) == ' ')) { pos--; } - return PyString_FromStringAndSize(colname, pos - colname); + return PyBytes_FromStringAndSize(colname, pos - colname); } } } @@ -277,7 +273,7 @@ } if (is_ascii) { - return PyString_FromString(val_str); + return PyBytes_FromString(val_str); } else { return PyUnicode_DecodeUTF8(val_str, strlen(val_str), NULL); } @@ -331,7 +327,7 @@ Py_INCREF(Py_None); converted = Py_None; } else { - item = PyString_FromStringAndSize(val_str, nbytes); + item = PyBytes_FromStringAndSize(val_str, nbytes); if (!item) { return NULL; } @@ -374,8 +370,8 @@ colname , val_str); PyErr_SetString(pysqlite_OperationalError, buf); } - } else if (self->connection->text_factory == (PyObject*)&PyString_Type) { - converted = PyString_FromString(val_str); + } else if (self->connection->text_factory == (PyObject*)&PyBytes_Type) { + converted = PyBytes_FromString(val_str); } else { converted = PyObject_CallFunction(self->connection->text_factory, "s", val_str); } @@ -427,12 +423,12 @@ int statement_type; PyObject* descriptor; PyObject* second_argument = NULL; - long rowcount = 0; int allow_8bit_chars; if (!pysqlite_check_thread(self->connection) || !pysqlite_check_connection(self->connection)) { return NULL; } + /* Make shooting yourself in the foot with not utf-8 decodable 8-bit-strings harder */ allow_8bit_chars = ((self->connection->text_factory != (PyObject*)&PyUnicode_Type) && (self->connection->text_factory != (PyObject*)&PyUnicode_Type && pysqlite_OptimizedUnicode)); @@ -446,7 +442,7 @@ return NULL; } - if (!PyString_Check(operation) && !PyUnicode_Check(operation)) { + if (!PyBytes_Check(operation) && !PyUnicode_Check(operation)) { PyErr_SetString(PyExc_ValueError, "operation parameter must be str or unicode"); return NULL; } @@ -468,7 +464,7 @@ return NULL; } - if (!PyString_Check(operation) && !PyUnicode_Check(operation)) { + if (!PyBytes_Check(operation) && !PyUnicode_Check(operation)) { PyErr_SetString(PyExc_ValueError, "operation parameter must be str or unicode"); return NULL; } @@ -503,21 +499,22 @@ rc = pysqlite_statement_reset(self->statement); } - if (PyString_Check(operation)) { - operation_cstr = PyString_AsString(operation); + if (PyBytes_Check(operation)) { + operation_cstr = PyBytes_AsString(operation); } else { operation_bytestr = PyUnicode_AsUTF8String(operation); if (!operation_bytestr) { goto error; } - operation_cstr = PyString_AsString(operation_bytestr); + operation_cstr = PyBytes_AsString(operation_bytestr); } - /* reset description */ + /* reset description and rowcount */ Py_DECREF(self->description); Py_INCREF(Py_None); self->description = Py_None; + self->rowcount = -1L; func_args = PyTuple_New(1); if (!func_args) { @@ -693,7 +690,10 @@ case STATEMENT_DELETE: case STATEMENT_INSERT: case STATEMENT_REPLACE: - rowcount += (long)sqlite3_changes(self->connection->db); + if (self->rowcount == -1L) { + self->rowcount = 0L; + } + self->rowcount += (long)sqlite3_changes(self->connection->db); } Py_DECREF(self->lastrowid); @@ -728,13 +728,9 @@ Py_XDECREF(parameters_list); if (PyErr_Occurred()) { - Py_DECREF(self->rowcount); - self->rowcount = PyInt_FromLong(-1L); + self->rowcount = -1L; return NULL; } else { - Py_DECREF(self->rowcount); - self->rowcount = PyInt_FromLong(rowcount); - Py_INCREF(self); return (PyObject*)self; } @@ -768,15 +764,15 @@ return NULL; } - if (PyString_Check(script_obj)) { - script_cstr = PyString_AsString(script_obj); + if (PyBytes_Check(script_obj)) { + script_cstr = PyBytes_AsString(script_obj); } else if (PyUnicode_Check(script_obj)) { script_str = PyUnicode_AsUTF8String(script_obj); if (!script_str) { return NULL; } - script_cstr = PyString_AsString(script_str); + script_cstr = PyBytes_AsString(script_str); } else { PyErr_SetString(PyExc_ValueError, "script argument must be unicode or string."); return NULL; @@ -1028,7 +1024,7 @@ {"description", T_OBJECT, offsetof(pysqlite_Cursor, description), RO}, {"arraysize", T_INT, offsetof(pysqlite_Cursor, arraysize), 0}, {"lastrowid", T_OBJECT, offsetof(pysqlite_Cursor, lastrowid), RO}, - {"rowcount", T_OBJECT, offsetof(pysqlite_Cursor, rowcount), RO}, + {"rowcount", T_LONG, offsetof(pysqlite_Cursor, rowcount), RO}, {"row_factory", T_OBJECT, offsetof(pysqlite_Cursor, row_factory), 0}, {NULL} }; Modified: python/branches/tlee-ast-optimize/Modules/_sqlite/cursor.h ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_sqlite/cursor.h (original) +++ python/branches/tlee-ast-optimize/Modules/_sqlite/cursor.h Sun Jun 1 17:18:10 2008 @@ -37,7 +37,7 @@ PyObject* row_cast_map; int arraysize; PyObject* lastrowid; - PyObject* rowcount; + long rowcount; PyObject* row_factory; pysqlite_Statement* statement; Modified: python/branches/tlee-ast-optimize/Modules/_sqlite/module.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_sqlite/module.c (original) +++ python/branches/tlee-ast-optimize/Modules/_sqlite/module.c Sun Jun 1 17:18:10 2008 @@ -137,7 +137,7 @@ /* a basic type is adapted; there's a performance optimization if that's not the case * (99 % of all usages) */ if (type == &PyInt_Type || type == &PyLong_Type || type == &PyFloat_Type - || type == &PyString_Type || type == &PyUnicode_Type || type == &PyBuffer_Type) { + || type == &PyBytes_Type || type == &PyUnicode_Type || type == &PyBuffer_Type) { pysqlite_BaseTypeAdapted = 1; } @@ -367,13 +367,13 @@ Py_DECREF(tmp_obj); } - if (!(tmp_obj = PyString_FromString(PYSQLITE_VERSION))) { + if (!(tmp_obj = PyBytes_FromString(PYSQLITE_VERSION))) { goto error; } PyDict_SetItemString(dict, "version", tmp_obj); Py_DECREF(tmp_obj); - if (!(tmp_obj = PyString_FromString(sqlite3_libversion()))) { + if (!(tmp_obj = PyBytes_FromString(sqlite3_libversion()))) { goto error; } PyDict_SetItemString(dict, "sqlite_version", tmp_obj); Modified: python/branches/tlee-ast-optimize/Modules/_sqlite/row.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_sqlite/row.c (original) +++ python/branches/tlee-ast-optimize/Modules/_sqlite/row.c Sun Jun 1 17:18:10 2008 @@ -86,13 +86,13 @@ item = PyTuple_GetItem(self->data, _idx); Py_XINCREF(item); return item; - } else if (PyString_Check(idx)) { - key = PyString_AsString(idx); + } else if (PyBytes_Check(idx)) { + key = PyBytes_AsString(idx); nitems = PyTuple_Size(self->description); for (i = 0; i < nitems; i++) { - compare_key = PyString_AsString(PyTuple_GET_ITEM(PyTuple_GET_ITEM(self->description, i), 0)); + compare_key = PyBytes_AsString(PyTuple_GET_ITEM(PyTuple_GET_ITEM(self->description, i), 0)); if (!compare_key) { return NULL; } Modified: python/branches/tlee-ast-optimize/Modules/_sqlite/statement.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_sqlite/statement.c (original) +++ python/branches/tlee-ast-optimize/Modules/_sqlite/statement.c Sun Jun 1 17:18:10 2008 @@ -60,7 +60,7 @@ self->st = NULL; self->in_use = 0; - if (PyString_Check(sql)) { + if (PyBytes_Check(sql)) { sql_str = sql; Py_INCREF(sql_str); } else if (PyUnicode_Check(sql)) { @@ -77,7 +77,7 @@ self->in_weakreflist = NULL; self->sql = sql_str; - sql_cstr = PyString_AsString(sql_str); + sql_cstr = PyBytes_AsString(sql_str); rc = sqlite3_prepare(connection->db, sql_cstr, @@ -119,7 +119,7 @@ paramtype = TYPE_LONG; } else if (PyFloat_CheckExact(parameter)) { paramtype = TYPE_FLOAT; - } else if (PyString_CheckExact(parameter)) { + } else if (PyBytes_CheckExact(parameter)) { paramtype = TYPE_STRING; } else if (PyUnicode_CheckExact(parameter)) { paramtype = TYPE_UNICODE; @@ -131,7 +131,7 @@ paramtype = TYPE_LONG; } else if (PyFloat_Check(parameter)) { paramtype = TYPE_FLOAT; - } else if (PyString_Check(parameter)) { + } else if (PyBytes_Check(parameter)) { paramtype = TYPE_STRING; } else if (PyUnicode_Check(parameter)) { paramtype = TYPE_UNICODE; @@ -140,7 +140,7 @@ } if (paramtype == TYPE_STRING && !allow_8bit_chars) { - string = PyString_AS_STRING(parameter); + string = PyBytes_AS_STRING(parameter); for (c = string; *c != 0; c++) { if (*c & 0x80) { PyErr_SetString(pysqlite_ProgrammingError, "You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings."); @@ -164,12 +164,12 @@ rc = sqlite3_bind_double(self->st, pos, PyFloat_AsDouble(parameter)); break; case TYPE_STRING: - string = PyString_AS_STRING(parameter); + string = PyBytes_AS_STRING(parameter); rc = sqlite3_bind_text(self->st, pos, string, -1, SQLITE_TRANSIENT); break; case TYPE_UNICODE: stringval = PyUnicode_AsUTF8String(parameter); - string = PyString_AsString(stringval); + string = PyBytes_AsString(stringval); rc = sqlite3_bind_text(self->st, pos, string, -1, SQLITE_TRANSIENT); Py_DECREF(stringval); break; @@ -197,7 +197,7 @@ } if (PyInt_CheckExact(obj) || PyLong_CheckExact(obj) - || PyFloat_CheckExact(obj) || PyString_CheckExact(obj) + || PyFloat_CheckExact(obj) || PyBytes_CheckExact(obj) || PyUnicode_CheckExact(obj) || PyBuffer_Check(obj)) { return 0; } else { @@ -326,7 +326,7 @@ char* sql_cstr; sqlite3_stmt* new_st; - sql_cstr = PyString_AsString(self->sql); + sql_cstr = PyBytes_AsString(self->sql); rc = sqlite3_prepare(self->db, sql_cstr, Modified: python/branches/tlee-ast-optimize/Modules/_sre.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_sre.c (original) +++ python/branches/tlee-ast-optimize/Modules/_sre.c Sun Jun 1 17:18:10 2008 @@ -1715,7 +1715,7 @@ size = PyObject_Length(string); #endif - if (PyString_Check(string) || bytes == size) + if (PyBytes_Check(string) || bytes == size) charsize = 1; #if defined(HAVE_UNICODE) else if (bytes == (Py_ssize_t) (size * sizeof(Py_UNICODE))) @@ -1949,7 +1949,7 @@ if (!args) return NULL; - name = PyString_FromString(module); + name = PyBytes_FromString(module); if (!name) return NULL; mod = PyImport_Import(name); @@ -3416,7 +3416,7 @@ Py_DECREF(x); } - x = PyString_FromString(copyright); + x = PyBytes_FromString(copyright); if (x) { PyDict_SetItemString(d, "copyright", x); Py_DECREF(x); Modified: python/branches/tlee-ast-optimize/Modules/_ssl.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_ssl.c (original) +++ python/branches/tlee-ast-optimize/Modules/_ssl.c Sun Jun 1 17:18:10 2008 @@ -491,13 +491,13 @@ static PyObject * PySSL_server(PySSLObject *self) { - return PyString_FromString(self->server); + return PyBytes_FromString(self->server); } static PyObject * PySSL_issuer(PySSLObject *self) { - return PyString_FromString(self->issuer); + return PyBytes_FromString(self->issuer); } static PyObject * @@ -515,7 +515,7 @@ _setSSLError(NULL, 0, __FILE__, __LINE__); goto fail; } - name_obj = PyString_FromStringAndSize(namebuf, buflen); + name_obj = PyBytes_FromStringAndSize(namebuf, buflen); if (name_obj == NULL) goto fail; @@ -603,8 +603,8 @@ /* fprintf(stderr, "RDN level %d, attribute %s: %s\n", entry->set, - PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)), - PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1))); + PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 0)), + PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 1))); */ if (attr == NULL) goto fail1; @@ -711,7 +711,7 @@ goto fail; } - v = PyString_FromString("DirName"); + v = PyBytes_FromString("DirName"); if (v == NULL) { Py_DECREF(t); goto fail; @@ -742,13 +742,13 @@ t = PyTuple_New(2); if (t == NULL) goto fail; - v = PyString_FromStringAndSize(buf, (vptr - buf)); + v = PyBytes_FromStringAndSize(buf, (vptr - buf)); if (v == NULL) { Py_DECREF(t); goto fail; } PyTuple_SET_ITEM(t, 0, v); - v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1))); + v = PyBytes_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1))); if (v == NULL) { Py_DECREF(t); goto fail; @@ -849,7 +849,7 @@ _setSSLError(NULL, 0, __FILE__, __LINE__); goto fail1; } - sn_obj = PyString_FromStringAndSize(buf, len); + sn_obj = PyBytes_FromStringAndSize(buf, len); if (sn_obj == NULL) goto fail1; if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) { @@ -866,7 +866,7 @@ _setSSLError(NULL, 0, __FILE__, __LINE__); goto fail1; } - pnotBefore = PyString_FromStringAndSize(buf, len); + pnotBefore = PyBytes_FromStringAndSize(buf, len); if (pnotBefore == NULL) goto fail1; if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) { @@ -884,7 +884,7 @@ _setSSLError(NULL, 0, __FILE__, __LINE__); goto fail1; } - pnotAfter = PyString_FromStringAndSize(buf, len); + pnotAfter = PyBytes_FromStringAndSize(buf, len); if (pnotAfter == NULL) goto fail1; if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) { @@ -981,7 +981,7 @@ PySSL_SetError(self, len, __FILE__, __LINE__); return NULL; } - retval = PyString_FromStringAndSize((const char *) bytes_buf, len); + retval = PyBytes_FromStringAndSize((const char *) bytes_buf, len); OPENSSL_free(bytes_buf); return retval; @@ -1028,7 +1028,7 @@ if (cipher_name == NULL) { PyTuple_SET_ITEM(retval, 0, Py_None); } else { - v = PyString_FromString(cipher_name); + v = PyBytes_FromString(cipher_name); if (v == NULL) goto fail0; PyTuple_SET_ITEM(retval, 0, v); @@ -1037,7 +1037,7 @@ if (cipher_protocol == NULL) { PyTuple_SET_ITEM(retval, 1, Py_None); } else { - v = PyString_FromString(cipher_protocol); + v = PyBytes_FromString(cipher_protocol); if (v == NULL) goto fail0; PyTuple_SET_ITEM(retval, 1, v); @@ -1211,7 +1211,7 @@ if (!PyArg_ParseTuple(args, "|i:read", &len)) return NULL; - if (!(buf = PyString_FromStringAndSize((char *) 0, len))) + if (!(buf = PyBytes_FromStringAndSize((char *) 0, len))) return NULL; /* first check if there are bytes ready to be read */ @@ -1233,14 +1233,14 @@ return NULL; } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { /* should contain a zero-length string */ - _PyString_Resize(&buf, 0); + _PyBytes_Resize(&buf, 0); return buf; } } do { err = 0; PySSL_BEGIN_ALLOW_THREADS - count = SSL_read(self->ssl, PyString_AsString(buf), len); + count = SSL_read(self->ssl, PyBytes_AsString(buf), len); err = SSL_get_error(self->ssl, count); PySSL_END_ALLOW_THREADS if(PyErr_CheckSignals()) { @@ -1257,7 +1257,7 @@ (SSL_get_shutdown(self->ssl) == SSL_RECEIVED_SHUTDOWN)) { - _PyString_Resize(&buf, 0); + _PyBytes_Resize(&buf, 0); return buf; } else { sockstate = SOCKET_OPERATION_OK; @@ -1276,7 +1276,7 @@ return PySSL_SetError(self, count, __FILE__, __LINE__); } if (count != len) - _PyString_Resize(&buf, count); + _PyBytes_Resize(&buf, count); return buf; } @@ -1362,11 +1362,11 @@ { int bytes; - if (!PyString_Check(arg)) + if (!PyBytes_Check(arg)) return PyErr_Format(PyExc_TypeError, "RAND_egd() expected string, found %s", Py_TYPE(arg)->tp_name); - bytes = RAND_egd(PyString_AS_STRING(arg)); + bytes = RAND_egd(PyBytes_AS_STRING(arg)); if (bytes == -1) { PyErr_SetString(PySSLErrorObject, "EGD connection failed or EGD did not return " Modified: python/branches/tlee-ast-optimize/Modules/_struct.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_struct.c (original) +++ python/branches/tlee-ast-optimize/Modules/_struct.c Sun Jun 1 17:18:10 2008 @@ -413,7 +413,7 @@ if (msg == NULL) return -1; rval = PyErr_WarnEx(PyExc_DeprecationWarning, - PyString_AS_STRING(msg), 2); + PyBytes_AS_STRING(msg), 2); Py_DECREF(msg); if (rval == 0) return 0; @@ -446,7 +446,7 @@ static PyObject * nu_char(const char *p, const formatdef *f) { - return PyString_FromStringAndSize(p, 1); + return PyBytes_FromStringAndSize(p, 1); } static PyObject * @@ -610,12 +610,12 @@ static int np_char(char *p, PyObject *v, const formatdef *f) { - if (!PyString_Check(v) || PyString_Size(v) != 1) { + if (!PyBytes_Check(v) || PyBytes_Size(v) != 1) { PyErr_SetString(StructError, "char format require string of length 1"); return -1; } - *p = *PyString_AsString(v); + *p = *PyBytes_AsString(v); return 0; } @@ -1335,7 +1335,7 @@ char c; Py_ssize_t size, len, num, itemsize, x; - fmt = PyString_AS_STRING(self->s_format); + fmt = PyBytes_AS_STRING(self->s_format); f = whichtable((char **)&fmt); @@ -1503,12 +1503,12 @@ const formatdef *e = code->fmtdef; const char *res = startfrom + code->offset; if (e->format == 's') { - v = PyString_FromStringAndSize(res, code->size); + v = PyBytes_FromStringAndSize(res, code->size); } else if (e->format == 'p') { Py_ssize_t n = *(unsigned char*)res; if (n >= code->size) n = code->size - 1; - v = PyString_FromStringAndSize(res + 1, n); + v = PyBytes_FromStringAndSize(res + 1, n); } else { v = e->unpack(res, e); } @@ -1542,9 +1542,9 @@ assert(soself->s_codes != NULL); if (inputstr == NULL) goto fail; - if (PyString_Check(inputstr) && - PyString_GET_SIZE(inputstr) == soself->s_size) { - return s_unpack_internal(soself, PyString_AS_STRING(inputstr)); + if (PyBytes_Check(inputstr) && + PyBytes_GET_SIZE(inputstr) == soself->s_size) { + return s_unpack_internal(soself, PyBytes_AS_STRING(inputstr)); } args = PyTuple_Pack(1, inputstr); if (args == NULL) @@ -1637,27 +1637,27 @@ const formatdef *e = code->fmtdef; char *res = buf + code->offset; if (e->format == 's') { - if (!PyString_Check(v)) { + if (!PyBytes_Check(v)) { PyErr_SetString(StructError, "argument for 's' must be a string"); return -1; } - n = PyString_GET_SIZE(v); + n = PyBytes_GET_SIZE(v); if (n > code->size) n = code->size; if (n > 0) - memcpy(res, PyString_AS_STRING(v), n); + memcpy(res, PyBytes_AS_STRING(v), n); } else if (e->format == 'p') { - if (!PyString_Check(v)) { + if (!PyBytes_Check(v)) { PyErr_SetString(StructError, "argument for 'p' must be a string"); return -1; } - n = PyString_GET_SIZE(v); + n = PyBytes_GET_SIZE(v); if (n > (code->size - 1)) n = code->size - 1; if (n > 0) - memcpy(res + 1, PyString_AS_STRING(v), n); + memcpy(res + 1, PyBytes_AS_STRING(v), n); if (n > 255) n = 255; *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char); @@ -1700,12 +1700,12 @@ } /* Allocate a new string */ - result = PyString_FromStringAndSize((char *)NULL, soself->s_size); + result = PyBytes_FromStringAndSize((char *)NULL, soself->s_size); if (result == NULL) return NULL; /* Call the guts */ - if ( s_pack_internal(soself, args, 0, PyString_AS_STRING(result)) != 0 ) { + if ( s_pack_internal(soself, args, 0, PyBytes_AS_STRING(result)) != 0 ) { Py_DECREF(result); return NULL; } @@ -2061,7 +2061,7 @@ { PyObject *ver, *m; - ver = PyString_FromString("0.2"); + ver = PyBytes_FromString("0.2"); if (ver == NULL) return; Modified: python/branches/tlee-ast-optimize/Modules/_testcapimodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_testcapimodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/_testcapimodule.c Sun Jun 1 17:18:10 2008 @@ -691,7 +691,7 @@ } #endif -/* Some tests of PyString_FromFormat(). This needs more tests. */ +/* Some tests of PyBytes_FromFormat(). This needs more tests. */ static PyObject * test_string_from_format(PyObject *self, PyObject *args) { @@ -699,10 +699,10 @@ char *msg; #define CHECK_1_FORMAT(FORMAT, TYPE) \ - result = PyString_FromFormat(FORMAT, (TYPE)1); \ + result = PyBytes_FromFormat(FORMAT, (TYPE)1); \ if (result == NULL) \ return NULL; \ - if (strcmp(PyString_AsString(result), "1")) { \ + if (strcmp(PyBytes_AsString(result), "1")) { \ msg = FORMAT " failed at 1"; \ goto Fail; \ } \ Modified: python/branches/tlee-ast-optimize/Modules/_tkinter.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/_tkinter.c (original) +++ python/branches/tlee-ast-optimize/Modules/_tkinter.c Sun Jun 1 17:18:10 2008 @@ -335,8 +335,8 @@ static char * AsString(PyObject *value, PyObject *tmp) { - if (PyString_Check(value)) - return PyString_AsString(value); + if (PyBytes_Check(value)) + return PyBytes_AsString(value); #ifdef Py_USING_UNICODE else if (PyUnicode_Check(value)) { PyObject *v = PyUnicode_AsUTF8String(value); @@ -347,7 +347,7 @@ return NULL; } Py_DECREF(v); - return PyString_AsString(v); + return PyBytes_AsString(v); } #endif else { @@ -359,7 +359,7 @@ return NULL; } Py_DECREF(v); - return PyString_AsString(v); + return PyBytes_AsString(v); } } @@ -462,13 +462,13 @@ * Could be a quoted string containing funnies, e.g. {"}. * Return the string itself. */ - return PyString_FromString(list); + return PyBytes_FromString(list); } if (argc == 0) - v = PyString_FromString(""); + v = PyBytes_FromString(""); else if (argc == 1) - v = PyString_FromString(argv[0]); + v = PyBytes_FromString(argv[0]); else if ((v = PyTuple_New(argc)) != NULL) { int i; PyObject *w; @@ -530,10 +530,10 @@ return result; /* Fall through, returning arg. */ } - else if (PyString_Check(arg)) { + else if (PyBytes_Check(arg)) { int argc; char **argv; - char *list = PyString_AsString(arg); + char *list = PyBytes_AsString(arg); if (Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) { Py_INCREF(arg); @@ -541,7 +541,7 @@ } Tcl_Free(FREECAST argv); if (argc > 1) - return Split(PyString_AsString(arg)); + return Split(PyBytes_AsString(arg)); /* Fall through, returning arg. */ } Py_INCREF(arg); @@ -747,12 +747,12 @@ static PyObject * PyTclObject_str(PyTclObject *self) { - if (self->string && PyString_Check(self->string)) { + if (self->string && PyBytes_Check(self->string)) { Py_INCREF(self->string); return self->string; } /* XXX Could cache value if it is an ASCII string. */ - return PyString_FromString(Tcl_GetString(self->value)); + return PyBytes_FromString(Tcl_GetString(self->value)); } static char* @@ -778,16 +778,16 @@ #ifdef Py_USING_UNICODE if (i == len) /* It is an ASCII string. */ - self->string = PyString_FromStringAndSize(s, len); + self->string = PyBytes_FromStringAndSize(s, len); else { self->string = PyUnicode_DecodeUTF8(s, len, "strict"); if (!self->string) { PyErr_Clear(); - self->string = PyString_FromStringAndSize(s, len); + self->string = PyBytes_FromStringAndSize(s, len); } } #else - self->string = PyString_FromStringAndSize(s, len); + self->string = PyBytes_FromStringAndSize(s, len); #endif if (!self->string) return NULL; @@ -820,7 +820,7 @@ char buf[50]; PyOS_snprintf(buf, 50, "<%s object at %p>", self->value->typePtr->name, self->value); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int @@ -839,7 +839,7 @@ static PyObject* get_typename(PyTclObject* obj, void* ignored) { - return PyString_FromString(obj->value->typePtr->name); + return PyBytes_FromString(obj->value->typePtr->name); } @@ -908,9 +908,9 @@ { Tcl_Obj *result; - if (PyString_Check(value)) - return Tcl_NewStringObj(PyString_AS_STRING(value), - PyString_GET_SIZE(value)); + if (PyBytes_Check(value)) + return Tcl_NewStringObj(PyBytes_AS_STRING(value), + PyBytes_GET_SIZE(value)); else if (PyBool_Check(value)) return Tcl_NewBooleanObj(PyObject_IsTrue(value)); else if (PyInt_Check(value)) @@ -999,17 +999,17 @@ } if (i == value->length) - result = PyString_FromStringAndSize(s, len); + result = PyBytes_FromStringAndSize(s, len); else { /* Convert UTF-8 to Unicode string */ result = PyUnicode_DecodeUTF8(s, len, "strict"); if (result == NULL) { PyErr_Clear(); - result = PyString_FromStringAndSize(s, len); + result = PyBytes_FromStringAndSize(s, len); } } #else - result = PyString_FromStringAndSize(value->bytes, value->length); + result = PyBytes_FromStringAndSize(value->bytes, value->length); #endif return result; } @@ -1023,7 +1023,7 @@ if (value->typePtr == app->ByteArrayType) { int size; char *data = (char*)Tcl_GetByteArrayFromObj(value, &size); - return PyString_FromStringAndSize(data, size); + return PyBytes_FromStringAndSize(data, size); } if (value->typePtr == app->DoubleType) { @@ -1092,7 +1092,7 @@ int size; char *c; c = Tcl_GetStringFromObj(value, &size); - return PyString_FromStringAndSize(c, size); + return PyBytes_FromStringAndSize(c, size); #endif } @@ -1204,19 +1204,19 @@ } if (*p == '\0') - res = PyString_FromStringAndSize(s, (int)(p-s)); + res = PyBytes_FromStringAndSize(s, (int)(p-s)); else { /* Convert UTF-8 to Unicode string */ p = strchr(p, '\0'); res = PyUnicode_DecodeUTF8(s, (int)(p-s), "strict"); if (res == NULL) { PyErr_Clear(); - res = PyString_FromStringAndSize(s, (int)(p-s)); + res = PyBytes_FromStringAndSize(s, (int)(p-s)); } } #else p = strchr(p, '\0'); - res = PyString_FromStringAndSize(s, (int)(p-s)); + res = PyBytes_FromStringAndSize(s, (int)(p-s)); #endif } return res; @@ -1370,7 +1370,7 @@ if (err == TCL_ERROR) res = Tkinter_Error(self); else - res = PyString_FromString(Tkapp_Result(self)); + res = PyBytes_FromString(Tkapp_Result(self)); LEAVE_OVERLAP_TCL ckfree(cmd); } @@ -1396,7 +1396,7 @@ if (err == TCL_ERROR) res = Tkinter_Error(self); else - res = PyString_FromString(Tkapp_Result(self)); + res = PyBytes_FromString(Tkapp_Result(self)); LEAVE_OVERLAP_TCL return res; } @@ -1419,7 +1419,7 @@ if (err == TCL_ERROR) res = Tkinter_Error(self); else - res = PyString_FromString(Tkapp_Result(self)); + res = PyBytes_FromString(Tkapp_Result(self)); LEAVE_OVERLAP_TCL return res; } @@ -1443,7 +1443,7 @@ res = Tkinter_Error(self); else - res = PyString_FromString(Tkapp_Result(self)); + res = PyBytes_FromString(Tkapp_Result(self)); LEAVE_OVERLAP_TCL return res; } @@ -1466,7 +1466,7 @@ if (err == TCL_ERROR) res = Tkinter_Error(self); else - res = PyString_FromString(Tkapp_Result(self)); + res = PyBytes_FromString(Tkapp_Result(self)); LEAVE_OVERLAP_TCL return res; } @@ -1511,8 +1511,8 @@ varname_converter(PyObject *in, void *_out) { char **out = (char**)_out; - if (PyString_Check(in)) { - *out = PyString_AsString(in); + if (PyBytes_Check(in)) { + *out = PyBytes_AsString(in); return 1; } if (PyTclObject_Check(in)) { @@ -1676,7 +1676,7 @@ res = FromObj(self, tres); } else { - res = PyString_FromString(Tcl_GetString(tres)); + res = PyBytes_FromString(Tcl_GetString(tres)); } } LEAVE_OVERLAP_TCL @@ -1920,7 +1920,7 @@ goto finally; for (i = 0; i < argc; i++) { - PyObject *s = PyString_FromString(argv[i]); + PyObject *s = PyBytes_FromString(argv[i]); if (!s || PyTuple_SetItem(v, i, s)) { Py_DECREF(v); v = NULL; @@ -1961,7 +1961,7 @@ PyObject *res = NULL; if (s) { - res = PyString_FromString(s); + res = PyBytes_FromString(s); ckfree(s); } @@ -2011,7 +2011,7 @@ return PythonCmd_Error(interp); for (i = 0; i < (argc - 1); i++) { - PyObject *s = PyString_FromString(argv[i + 1]); + PyObject *s = PyBytes_FromString(argv[i + 1]); if (!s || PyTuple_SetItem(arg, i, s)) { Py_DECREF(arg); return PythonCmd_Error(interp); @@ -2406,7 +2406,7 @@ PyOS_snprintf(buf, sizeof(buf), "", v, v->func == NULL ? ", handler deleted" : ""); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static PyObject * @@ -3087,7 +3087,7 @@ static void ins_string(PyObject *d, char *name, char *val) { - PyObject *v = PyString_FromString(val); + PyObject *v = PyBytes_FromString(val); if (v) { PyDict_SetItemString(d, name, v); Py_DECREF(v); Modified: python/branches/tlee-ast-optimize/Modules/almodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/almodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/almodule.c Sun Jun 1 17:18:10 2008 @@ -84,7 +84,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString((char *) value.ptr); + return PyBytes_FromString((char *) value.ptr); default: PyErr_SetString(ErrorObject, "unknown element type"); return NULL; @@ -149,12 +149,12 @@ PyErr_SetString(ErrorObject, "unknown element type"); return -1; } - if (!PyString_Check(value)) { + if (!PyBytes_Check(value)) { PyErr_BadArgument(); return -1; } - param->value.ptr = PyString_AS_STRING(value); - param->sizeIn = PyString_GET_SIZE(value)+1; /*account for NUL*/ + param->value.ptr = PyBytes_AS_STRING(value); + param->sizeIn = PyBytes_GET_SIZE(value)+1; /*account for NUL*/ break; case AL_SET_VAL: case AL_VECTOR_VAL: @@ -765,12 +765,12 @@ return NULL; } size *= ch; - v = PyString_FromStringAndSize((char *) NULL, size * framecount); + v = PyBytes_FromStringAndSize((char *) NULL, size * framecount); if (v == NULL) return NULL; Py_BEGIN_ALLOW_THREADS - alReadFrames(self->port, (void *) PyString_AS_STRING(v), framecount); + alReadFrames(self->port, (void *) PyBytes_AS_STRING(v), framecount); Py_END_ALLOW_THREADS return v; @@ -1068,12 +1068,12 @@ width = ALgetwidth(c); #endif /* AL_405 */ ALfreeconfig(c); - v = PyString_FromStringAndSize((char *)NULL, width * count); + v = PyBytes_FromStringAndSize((char *)NULL, width * count); if (v == NULL) return NULL; Py_BEGIN_ALLOW_THREADS - ret = ALreadsamps(self->port, (void *) PyString_AsString(v), count); + ret = ALreadsamps(self->port, (void *) PyBytes_AsString(v), count); Py_END_ALLOW_THREADS if (ret == -1) { Py_DECREF(v); @@ -1498,7 +1498,7 @@ Py_INCREF(item); break; case AL_STRING_VAL: - item = PyString_FromString(pvs[i].value.ptr); + item = PyBytes_FromString(pvs[i].value.ptr); PyMem_DEL(pvs[i].value.ptr); break; case AL_MATRIX_VAL: @@ -1725,7 +1725,7 @@ PyDict_SetItemString(v, "elementType", item); Py_DECREF(item); - item = PyString_FromString(pinfo.name); + item = PyBytes_FromString(pinfo.name); PyDict_SetItemString(v, "name", item); Py_DECREF(item); @@ -1920,7 +1920,7 @@ return NULL; if ((name = ALgetname(device, descriptor)) == NULL) return NULL; - return PyString_FromString(name); + return PyBytes_FromString(name); } static PyObject * Modified: python/branches/tlee-ast-optimize/Modules/arraymodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/arraymodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/arraymodule.c Sun Jun 1 17:18:10 2008 @@ -104,7 +104,7 @@ static PyObject * c_getitem(arrayobject *ap, Py_ssize_t i) { - return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1); + return PyBytes_FromStringAndSize(&((char *)ap->ob_item)[i], 1); } static int @@ -1414,7 +1414,7 @@ static PyObject * array_tostring(arrayobject *self, PyObject *unused) { - return PyString_FromStringAndSize(self->ob_item, + return PyBytes_FromStringAndSize(self->ob_item, Py_SIZE(self) * self->ob_descr->itemsize); } @@ -1494,7 +1494,7 @@ array_get_typecode(arrayobject *a, void *closure) { char tc = a->ob_descr->typecode; - return PyString_FromStringAndSize(&tc, 1); + return PyBytes_FromStringAndSize(&tc, 1); } static PyObject * @@ -1578,7 +1578,7 @@ typecode = a->ob_descr->typecode; if (len == 0) { PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } if (typecode == 'c') @@ -1593,9 +1593,9 @@ Py_XDECREF(v); PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode); - s = PyString_FromString(buf); - PyString_ConcatAndDel(&s, t); - PyString_ConcatAndDel(&s, PyString_FromString(")")); + s = PyBytes_FromString(buf); + PyBytes_ConcatAndDel(&s, t); + PyBytes_ConcatAndDel(&s, PyBytes_FromString(")")); return s; } @@ -1881,7 +1881,7 @@ return NULL; if (!(initial == NULL || PyList_Check(initial) - || PyString_Check(initial) || PyTuple_Check(initial) + || PyBytes_Check(initial) || PyTuple_Check(initial) || (c == 'u' && PyUnicode_Check(initial)))) { it = PyObject_GetIter(initial); if (it == NULL) @@ -1924,7 +1924,7 @@ } Py_DECREF(v); } - } else if (initial != NULL && PyString_Check(initial)) { + } else if (initial != NULL && PyBytes_Check(initial)) { PyObject *t_initial, *v; t_initial = PyTuple_Pack(1, initial); if (t_initial == NULL) { Modified: python/branches/tlee-ast-optimize/Modules/audioop.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/audioop.c (original) +++ python/branches/tlee-ast-optimize/Modules/audioop.c Sun Jun 1 17:18:10 2008 @@ -474,7 +474,7 @@ /* Passing a short** for an 's' argument is correct only if the string contents is aligned for interpretation - as short[]. Due to the definition of PyStringObject, + as short[]. Due to the definition of PyBytesObject, this is currently (Python 2.6) the case. */ if ( !PyArg_ParseTuple(args, "s#s#:findfit", (char**)&cp1, &len1, (char**)&cp2, &len2) ) @@ -759,10 +759,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, len); + rv = PyBytes_FromStringAndSize(NULL, len); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { @@ -801,10 +801,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, len/2); + rv = PyBytes_FromStringAndSize(NULL, len/2); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size*2 ) { @@ -846,10 +846,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, len*2); + rv = PyBytes_FromStringAndSize(NULL, len*2); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { @@ -903,10 +903,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, len1); + rv = PyBytes_FromStringAndSize(NULL, len1); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len1; i += size ) { if ( size == 1 ) val1 = (int)*CHARP(cp1, i); @@ -949,10 +949,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, len); + rv = PyBytes_FromStringAndSize(NULL, len); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { @@ -985,10 +985,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, len); + rv = PyBytes_FromStringAndSize(NULL, len); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; @@ -1023,10 +1023,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, (len/size)*size2); + rv = PyBytes_FromStringAndSize(NULL, (len/size)*size2); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0, j=0; i < len; i += size, j += size2 ) { if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; @@ -1157,7 +1157,7 @@ nbytes / bytes_per_frame != ceiling) str = NULL; else - str = PyString_FromStringAndSize(NULL, nbytes); + str = PyBytes_FromStringAndSize(NULL, nbytes); if (str == NULL) { PyErr_SetString(PyExc_MemoryError, @@ -1165,7 +1165,7 @@ goto exit; } } - ncp = PyString_AsString(str); + ncp = PyBytes_AsString(str); for (;;) { while (d < 0) { @@ -1182,13 +1182,13 @@ goto exit; /* We have checked before that the length * of the string fits into int. */ - len = (int)(ncp - PyString_AsString(str)); + len = (int)(ncp - PyBytes_AsString(str)); if (len == 0) { /*don't want to resize to zero length*/ - rv = PyString_FromStringAndSize("", 0); + rv = PyBytes_FromStringAndSize("", 0); Py_DECREF(str); str = rv; - } else if (_PyString_Resize(&str, len) < 0) + } else if (_PyBytes_Resize(&str, len) < 0) goto exit; rv = Py_BuildValue("(O(iO))", str, d, samps); Py_DECREF(samps); @@ -1255,10 +1255,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, len/size); + rv = PyBytes_FromStringAndSize(NULL, len/size); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; @@ -1289,10 +1289,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, len*size); + rv = PyBytes_FromStringAndSize(NULL, len*size); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len*size; i += size ) { cval = *cp++; @@ -1323,10 +1323,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, len/size); + rv = PyBytes_FromStringAndSize(NULL, len/size); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0; i < len; i += size ) { if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8; @@ -1357,10 +1357,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, len*size); + rv = PyBytes_FromStringAndSize(NULL, len*size); if ( rv == 0 ) return 0; - ncp = (signed char *)PyString_AsString(rv); + ncp = (signed char *)PyBytes_AsString(rv); for ( i=0; i < len*size; i += size ) { cval = *cp++; @@ -1393,10 +1393,10 @@ return 0; } - str = PyString_FromStringAndSize(NULL, len/(size*2)); + str = PyBytes_FromStringAndSize(NULL, len/(size*2)); if ( str == 0 ) return 0; - ncp = (signed char *)PyString_AsString(str); + ncp = (signed char *)PyBytes_AsString(str); /* Decode state, should have (value, step) */ if ( state == Py_None ) { @@ -1509,10 +1509,10 @@ } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) ) return 0; - str = PyString_FromStringAndSize(NULL, len*size*2); + str = PyBytes_FromStringAndSize(NULL, len*size*2); if ( str == 0 ) return 0; - ncp = (signed char *)PyString_AsString(str); + ncp = (signed char *)PyBytes_AsString(str); step = stepsizeTable[index]; bufferstep = 0; Modified: python/branches/tlee-ast-optimize/Modules/binascii.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/binascii.c (original) +++ python/branches/tlee-ast-optimize/Modules/binascii.c Sun Jun 1 17:18:10 2008 @@ -141,7 +141,7 @@ #define BASE64_PAD '=' /* Max binary chunk size; limited only by available memory */ -#define BASE64_MAXBIN (INT_MAX/2 - sizeof(PyStringObject) - 3) +#define BASE64_MAXBIN (INT_MAX/2 - sizeof(PyBytesObject) - 3) static unsigned char table_b2a_base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @@ -203,9 +203,9 @@ ascii_len--; /* Allocate the buffer */ - if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL ) + if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len)) == NULL ) return NULL; - bin_data = (unsigned char *)PyString_AsString(rv); + bin_data = (unsigned char *)PyBytes_AsString(rv); for( ; bin_len > 0 ; ascii_len--, ascii_data++ ) { /* XXX is it really best to add NULs if there's no more data */ @@ -280,9 +280,9 @@ } /* We're lazy and allocate to much (fixed up later) */ - if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2+2)) == NULL ) + if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len*2+2)) == NULL ) return NULL; - ascii_data = (unsigned char *)PyString_AsString(rv); + ascii_data = (unsigned char *)PyBytes_AsString(rv); /* Store the length */ *ascii_data++ = ' ' + (bin_len & 077); @@ -304,8 +304,8 @@ } *ascii_data++ = '\n'; /* Append a courtesy newline */ - _PyString_Resize(&rv, (ascii_data - - (unsigned char *)PyString_AsString(rv))); + _PyBytes_Resize(&rv, (ascii_data - + (unsigned char *)PyBytes_AsString(rv))); return rv; } @@ -354,9 +354,9 @@ bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */ /* Allocate the buffer */ - if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL ) + if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len)) == NULL ) return NULL; - bin_data = (unsigned char *)PyString_AsString(rv); + bin_data = (unsigned char *)PyBytes_AsString(rv); bin_len = 0; for( ; ascii_len > 0; ascii_len--, ascii_data++) { @@ -415,13 +415,13 @@ /* And set string size correctly. If the result string is empty ** (because the input was all invalid) return the shared empty - ** string instead; _PyString_Resize() won't do this for us. + ** string instead; _PyBytes_Resize() won't do this for us. */ if (bin_len > 0) - _PyString_Resize(&rv, bin_len); + _PyBytes_Resize(&rv, bin_len); else { Py_DECREF(rv); - rv = PyString_FromString(""); + rv = PyBytes_FromString(""); } return rv; } @@ -448,9 +448,9 @@ /* We're lazy and allocate too much (fixed up later). "+3" leaves room for up to two pad characters and a trailing newline. Note that 'b' gets encoded as 'Yg==\n' (1 in, 5 out). */ - if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2 + 3)) == NULL ) + if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len*2 + 3)) == NULL ) return NULL; - ascii_data = (unsigned char *)PyString_AsString(rv); + ascii_data = (unsigned char *)PyBytes_AsString(rv); for( ; bin_len > 0 ; bin_len--, bin_data++ ) { /* Shift the data into our buffer */ @@ -474,8 +474,8 @@ } *ascii_data++ = '\n'; /* Append a courtesy newline */ - _PyString_Resize(&rv, (ascii_data - - (unsigned char *)PyString_AsString(rv))); + _PyBytes_Resize(&rv, (ascii_data - + (unsigned char *)PyBytes_AsString(rv))); return rv; } @@ -498,9 +498,9 @@ /* Allocate a string that is too big (fixed later) Add two to the initial length to prevent interning which would preclude subsequent resizing. */ - if ( (rv=PyString_FromStringAndSize(NULL, len+2)) == NULL ) + if ( (rv=PyBytes_FromStringAndSize(NULL, len+2)) == NULL ) return NULL; - bin_data = (unsigned char *)PyString_AsString(rv); + bin_data = (unsigned char *)PyBytes_AsString(rv); for( ; len > 0 ; len--, ascii_data++ ) { /* Get the byte and look it up */ @@ -534,8 +534,8 @@ Py_DECREF(rv); return NULL; } - _PyString_Resize( - &rv, (bin_data - (unsigned char *)PyString_AsString(rv))); + _PyBytes_Resize( + &rv, (bin_data - (unsigned char *)PyBytes_AsString(rv))); if (rv) { PyObject *rrv = Py_BuildValue("Oi", rv, done); Py_DECREF(rv); @@ -559,9 +559,9 @@ return NULL; /* Worst case: output is twice as big as input (fixed later) */ - if ( (rv=PyString_FromStringAndSize(NULL, len*2+2)) == NULL ) + if ( (rv=PyBytes_FromStringAndSize(NULL, len*2+2)) == NULL ) return NULL; - out_data = (unsigned char *)PyString_AsString(rv); + out_data = (unsigned char *)PyBytes_AsString(rv); for( in=0; in 0 ; len--, bin_data++ ) { /* Shift into our buffer, and output any 6bits ready */ @@ -627,8 +627,8 @@ leftchar <<= (6-leftbits); *ascii_data++ = table_b2a_hqx[leftchar & 0x3f]; } - _PyString_Resize(&rv, (ascii_data - - (unsigned char *)PyString_AsString(rv))); + _PyBytes_Resize(&rv, (ascii_data - + (unsigned char *)PyBytes_AsString(rv))); return rv; } @@ -647,14 +647,14 @@ /* Empty string is a special case */ if ( in_len == 0 ) - return PyString_FromString(""); + return PyBytes_FromString(""); /* Allocate a buffer of reasonable size. Resized when needed */ out_len = in_len*2; - if ( (rv=PyString_FromStringAndSize(NULL, out_len)) == NULL ) + if ( (rv=PyBytes_FromStringAndSize(NULL, out_len)) == NULL ) return NULL; out_len_left = out_len; - out_data = (unsigned char *)PyString_AsString(rv); + out_data = (unsigned char *)PyBytes_AsString(rv); /* ** We need two macros here to get/put bytes and handle @@ -673,9 +673,9 @@ #define OUTBYTE(b) \ do { \ if ( --out_len_left < 0 ) { \ - _PyString_Resize(&rv, 2*out_len); \ + _PyBytes_Resize(&rv, 2*out_len); \ if ( rv == NULL ) return NULL; \ - out_data = (unsigned char *)PyString_AsString(rv) \ + out_data = (unsigned char *)PyBytes_AsString(rv) \ + out_len; \ out_len_left = out_len-1; \ out_len = out_len * 2; \ @@ -723,8 +723,8 @@ OUTBYTE(in_byte); } } - _PyString_Resize(&rv, (out_data - - (unsigned char *)PyString_AsString(rv))); + _PyBytes_Resize(&rv, (out_data - + (unsigned char *)PyBytes_AsString(rv))); return rv; } @@ -923,10 +923,10 @@ if (!PyArg_ParseTuple(args, "s#:b2a_hex", &argbuf, &arglen)) return NULL; - retval = PyString_FromStringAndSize(NULL, arglen*2); + retval = PyBytes_FromStringAndSize(NULL, arglen*2); if (!retval) return NULL; - retbuf = PyString_AsString(retval); + retbuf = PyBytes_AsString(retval); if (!retbuf) goto finally; @@ -989,10 +989,10 @@ return NULL; } - retval = PyString_FromStringAndSize(NULL, (arglen/2)); + retval = PyBytes_FromStringAndSize(NULL, (arglen/2)); if (!retval) return NULL; - retbuf = PyString_AsString(retval); + retbuf = PyBytes_AsString(retval); if (!retbuf) goto finally; @@ -1106,7 +1106,7 @@ out++; } } - if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) { + if ((rv = PyBytes_FromStringAndSize((char *)odata, out)) == NULL) { PyMem_Free(odata); return NULL; } @@ -1306,7 +1306,7 @@ } } } - if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) { + if ((rv = PyBytes_FromStringAndSize((char *)odata, out)) == NULL) { PyMem_Free(odata); return NULL; } @@ -1354,7 +1354,7 @@ return; d = PyModule_GetDict(m); - x = PyString_FromString(doc_binascii); + x = PyBytes_FromString(doc_binascii); PyDict_SetItemString(d, "__doc__", x); Py_XDECREF(x); Modified: python/branches/tlee-ast-optimize/Modules/bsddbmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/bsddbmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/bsddbmodule.c Sun Jun 1 17:18:10 2008 @@ -312,7 +312,7 @@ return NULL; } - result = PyString_FromStringAndSize(data, (int)drec.size); + result = PyBytes_FromStringAndSize(data, (int)drec.size); if (data != buf) free(data); return result; } @@ -424,7 +424,7 @@ if (dp->di_type == DB_RECNO) item = PyInt_FromLong(*((int*)data)); else - item = PyString_FromStringAndSize(data, + item = PyBytes_FromStringAndSize(data, (int)krec.size); if (data != buf) free(data); if (item == NULL) { Modified: python/branches/tlee-ast-optimize/Modules/bz2module.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/bz2module.c (original) +++ python/branches/tlee-ast-optimize/Modules/bz2module.c Sun Jun 1 17:18:10 2008 @@ -34,7 +34,7 @@ #error "Large file support, but neither off_t nor fpos_t is large enough." #endif -#define BUF(v) PyString_AS_STRING((PyStringObject *)v) +#define BUF(v) PyBytes_AS_STRING((PyBytesObject *)v) #define MODE_CLOSED 0 #define MODE_READ 1 @@ -241,7 +241,7 @@ int univ_newline = f->f_univ_newline; total_v_size = n > 0 ? n : 100; - v = PyString_FromStringAndSize((char *)NULL, total_v_size); + v = PyBytes_FromStringAndSize((char *)NULL, total_v_size); if (v == NULL) return NULL; @@ -307,7 +307,7 @@ Py_DECREF(v); return NULL; } - if (_PyString_Resize(&v, total_v_size) < 0) + if (_PyBytes_Resize(&v, total_v_size) < 0) return NULL; buf = BUF(v) + used_v_size; end = BUF(v) + total_v_size; @@ -315,7 +315,7 @@ used_v_size = buf - BUF(v); if (used_v_size != total_v_size) - _PyString_Resize(&v, used_v_size); + _PyBytes_Resize(&v, used_v_size); return v; } @@ -438,10 +438,10 @@ /* This is a hacked version of Python's * fileobject.c:readahead_get_line_skip(). */ -static PyStringObject * +static PyBytesObject * Util_ReadAheadGetLineSkip(BZ2FileObject *f, int skip, int bufsize) { - PyStringObject* s; + PyBytesObject* s; char *bufptr; char *buf; int len; @@ -452,17 +452,17 @@ len = f->f_bufend - f->f_bufptr; if (len == 0) - return (PyStringObject *) - PyString_FromStringAndSize(NULL, skip); + return (PyBytesObject *) + PyBytes_FromStringAndSize(NULL, skip); bufptr = memchr(f->f_bufptr, '\n', len); if (bufptr != NULL) { bufptr++; /* Count the '\n' */ len = bufptr - f->f_bufptr; - s = (PyStringObject *) - PyString_FromStringAndSize(NULL, skip+len); + s = (PyBytesObject *) + PyBytes_FromStringAndSize(NULL, skip+len); if (s == NULL) return NULL; - memcpy(PyString_AS_STRING(s)+skip, f->f_bufptr, len); + memcpy(PyBytes_AS_STRING(s)+skip, f->f_bufptr, len); f->f_bufptr = bufptr; if (bufptr == f->f_bufend) Util_DropReadAhead(f); @@ -476,7 +476,7 @@ PyMem_Free(buf); return NULL; } - memcpy(PyString_AS_STRING(s)+skip, bufptr, len); + memcpy(PyBytes_AS_STRING(s)+skip, bufptr, len); PyMem_Free(buf); } return s; @@ -509,7 +509,7 @@ case MODE_READ: break; case MODE_READ_EOF: - ret = PyString_FromString(""); + ret = PyBytes_FromString(""); goto cleanup; case MODE_CLOSED: PyErr_SetString(PyExc_ValueError, @@ -531,7 +531,7 @@ "more than a Python string can hold"); goto cleanup; } - ret = PyString_FromStringAndSize((char *)NULL, buffersize); + ret = PyBytes_FromStringAndSize((char *)NULL, buffersize); if (ret == NULL) goto cleanup; bytesread = 0; @@ -557,14 +557,14 @@ } if (bytesrequested < 0) { buffersize = Util_NewBufferSize(buffersize); - if (_PyString_Resize(&ret, buffersize) < 0) + if (_PyBytes_Resize(&ret, buffersize) < 0) goto cleanup; } else { break; } } if (bytesread != buffersize) - _PyString_Resize(&ret, bytesread); + _PyBytes_Resize(&ret, bytesread); cleanup: RELEASE_LOCK(self); @@ -594,7 +594,7 @@ case MODE_READ: break; case MODE_READ_EOF: - ret = PyString_FromString(""); + ret = PyBytes_FromString(""); goto cleanup; case MODE_CLOSED: PyErr_SetString(PyExc_ValueError, @@ -607,7 +607,7 @@ } if (sizehint == 0) - ret = PyString_FromString(""); + ret = PyBytes_FromString(""); else ret = Util_GetLine(self, (sizehint < 0) ? 0 : sizehint); @@ -701,17 +701,17 @@ } if (big_buffer == NULL) { /* Create the big buffer */ - big_buffer = PyString_FromStringAndSize( + big_buffer = PyBytes_FromStringAndSize( NULL, buffersize); if (big_buffer == NULL) goto error; - buffer = PyString_AS_STRING(big_buffer); + buffer = PyBytes_AS_STRING(big_buffer); memcpy(buffer, small_buffer, nfilled); } else { /* Grow the big buffer */ - _PyString_Resize(&big_buffer, buffersize); - buffer = PyString_AS_STRING(big_buffer); + _PyBytes_Resize(&big_buffer, buffersize); + buffer = PyBytes_AS_STRING(big_buffer); } continue; } @@ -720,7 +720,7 @@ while (p != NULL) { /* Process complete lines */ p++; - line = PyString_FromStringAndSize(q, p-q); + line = PyBytes_FromStringAndSize(q, p-q); if (line == NULL) goto error; err = PyList_Append(list, line); @@ -743,7 +743,7 @@ } if (nfilled != 0) { /* Partial last line */ - line = PyString_FromStringAndSize(buffer, nfilled); + line = PyBytes_FromStringAndSize(buffer, nfilled); if (line == NULL) goto error; if (sizehint > 0) { @@ -753,7 +753,7 @@ Py_DECREF(line); goto error; } - PyString_Concat(&line, rest); + PyBytes_Concat(&line, rest); Py_DECREF(rest); if (line == NULL) goto error; @@ -915,7 +915,7 @@ could potentially execute Python code. */ for (i = 0; i < j; i++) { PyObject *v = PyList_GET_ITEM(list, i); - if (!PyString_Check(v)) { + if (!PyBytes_Check(v)) { const char *buffer; Py_ssize_t len; if (PyObject_AsCharBuffer(v, &buffer, &len)) { @@ -926,7 +926,7 @@ "strings"); goto error; } - line = PyString_FromStringAndSize(buffer, + line = PyBytes_FromStringAndSize(buffer, len); if (line == NULL) goto error; @@ -942,9 +942,9 @@ Py_BEGIN_ALLOW_THREADS for (i = 0; i < j; i++) { line = PyList_GET_ITEM(list, i); - len = PyString_GET_SIZE(line); + len = PyBytes_GET_SIZE(line); BZ2_bzWrite (&bzerror, self->fp, - PyString_AS_STRING(line), len); + PyBytes_AS_STRING(line), len); if (bzerror != BZ_OK) { Py_BLOCK_THREADS Util_CatchBZ2Error(bzerror); @@ -1224,13 +1224,13 @@ Py_INCREF(Py_None); return Py_None; case NEWLINE_CR: - return PyString_FromString("\r"); + return PyBytes_FromString("\r"); case NEWLINE_LF: - return PyString_FromString("\n"); + return PyBytes_FromString("\n"); case NEWLINE_CR|NEWLINE_LF: return Py_BuildValue("(ss)", "\r", "\n"); case NEWLINE_CRLF: - return PyString_FromString("\r\n"); + return PyBytes_FromString("\r\n"); case NEWLINE_CR|NEWLINE_CRLF: return Py_BuildValue("(ss)", "\r", "\r\n"); case NEWLINE_LF|NEWLINE_CRLF: @@ -1448,7 +1448,7 @@ static PyObject * BZ2File_iternext(BZ2FileObject *self) { - PyStringObject* ret; + PyBytesObject* ret; ACQUIRE_LOCK(self); if (self->mode == MODE_CLOSED) { PyErr_SetString(PyExc_ValueError, @@ -1457,7 +1457,7 @@ } ret = Util_ReadAheadGetLineSkip(self, 0, READAHEAD_BUFSIZE); RELEASE_LOCK(self); - if (ret == NULL || PyString_GET_SIZE(ret) == 0) { + if (ret == NULL || PyBytes_GET_SIZE(ret) == 0) { Py_XDECREF(ret); return NULL; } @@ -1559,7 +1559,7 @@ return NULL; if (datasize == 0) - return PyString_FromString(""); + return PyBytes_FromString(""); ACQUIRE_LOCK(self); if (!self->running) { @@ -1568,7 +1568,7 @@ goto error; } - ret = PyString_FromStringAndSize(NULL, bufsize); + ret = PyBytes_FromStringAndSize(NULL, bufsize); if (!ret) goto error; @@ -1591,7 +1591,7 @@ break; /* no more input data */ if (bzs->avail_out == 0) { bufsize = Util_NewBufferSize(bufsize); - if (_PyString_Resize(&ret, bufsize) < 0) { + if (_PyBytes_Resize(&ret, bufsize) < 0) { BZ2_bzCompressEnd(bzs); goto error; } @@ -1601,7 +1601,7 @@ } } - _PyString_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)); + _PyBytes_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)); RELEASE_LOCK(self); return ret; @@ -1636,7 +1636,7 @@ } self->running = 0; - ret = PyString_FromStringAndSize(NULL, bufsize); + ret = PyBytes_FromStringAndSize(NULL, bufsize); if (!ret) goto error; @@ -1657,7 +1657,7 @@ } if (bzs->avail_out == 0) { bufsize = Util_NewBufferSize(bufsize); - if (_PyString_Resize(&ret, bufsize) < 0) + if (_PyBytes_Resize(&ret, bufsize) < 0) goto error; bzs->next_out = BUF(ret); bzs->next_out = BUF(ret) + (BZS_TOTAL_OUT(bzs) @@ -1667,7 +1667,7 @@ } if (bzs->avail_out != 0) - _PyString_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)); + _PyBytes_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)); RELEASE_LOCK(self); return ret; @@ -1849,7 +1849,7 @@ goto error; } - ret = PyString_FromStringAndSize(NULL, bufsize); + ret = PyBytes_FromStringAndSize(NULL, bufsize); if (!ret) goto error; @@ -1868,7 +1868,7 @@ if (bzs->avail_in != 0) { Py_DECREF(self->unused_data); self->unused_data = - PyString_FromStringAndSize(bzs->next_in, + PyBytes_FromStringAndSize(bzs->next_in, bzs->avail_in); } self->running = 0; @@ -1882,7 +1882,7 @@ break; /* no more input data */ if (bzs->avail_out == 0) { bufsize = Util_NewBufferSize(bufsize); - if (_PyString_Resize(&ret, bufsize) < 0) { + if (_PyBytes_Resize(&ret, bufsize) < 0) { BZ2_bzDecompressEnd(bzs); goto error; } @@ -1894,7 +1894,7 @@ } if (bzs->avail_out != 0) - _PyString_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)); + _PyBytes_Resize(&ret, (Py_ssize_t)(BZS_TOTAL_OUT(bzs) - totalout)); RELEASE_LOCK(self); return ret; @@ -1930,7 +1930,7 @@ } #endif - self->unused_data = PyString_FromString(""); + self->unused_data = PyBytes_FromString(""); if (!self->unused_data) goto error; @@ -2063,7 +2063,7 @@ * data in one shot. We will check it later anyway. */ bufsize = datasize + (datasize/100+1) + 600; - ret = PyString_FromStringAndSize(NULL, bufsize); + ret = PyBytes_FromStringAndSize(NULL, bufsize); if (!ret) return NULL; @@ -2095,7 +2095,7 @@ } if (bzs->avail_out == 0) { bufsize = Util_NewBufferSize(bufsize); - if (_PyString_Resize(&ret, bufsize) < 0) { + if (_PyBytes_Resize(&ret, bufsize) < 0) { BZ2_bzCompressEnd(bzs); Py_DECREF(ret); return NULL; @@ -2106,7 +2106,7 @@ } if (bzs->avail_out != 0) - _PyString_Resize(&ret, (Py_ssize_t)BZS_TOTAL_OUT(bzs)); + _PyBytes_Resize(&ret, (Py_ssize_t)BZS_TOTAL_OUT(bzs)); BZ2_bzCompressEnd(bzs); return ret; @@ -2134,9 +2134,9 @@ return NULL; if (datasize == 0) - return PyString_FromString(""); + return PyBytes_FromString(""); - ret = PyString_FromStringAndSize(NULL, bufsize); + ret = PyBytes_FromStringAndSize(NULL, bufsize); if (!ret) return NULL; @@ -2175,7 +2175,7 @@ } if (bzs->avail_out == 0) { bufsize = Util_NewBufferSize(bufsize); - if (_PyString_Resize(&ret, bufsize) < 0) { + if (_PyBytes_Resize(&ret, bufsize) < 0) { BZ2_bzDecompressEnd(bzs); Py_DECREF(ret); return NULL; @@ -2186,7 +2186,7 @@ } if (bzs->avail_out != 0) - _PyString_Resize(&ret, (Py_ssize_t)BZS_TOTAL_OUT(bzs)); + _PyBytes_Resize(&ret, (Py_ssize_t)BZS_TOTAL_OUT(bzs)); BZ2_bzDecompressEnd(bzs); return ret; @@ -2223,7 +2223,7 @@ if (m == NULL) return; - PyModule_AddObject(m, "__author__", PyString_FromString(__author__)); + PyModule_AddObject(m, "__author__", PyBytes_FromString(__author__)); Py_INCREF(&BZ2File_Type); PyModule_AddObject(m, "BZ2File", (PyObject *)&BZ2File_Type); Modified: python/branches/tlee-ast-optimize/Modules/cPickle.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/cPickle.c (original) +++ python/branches/tlee-ast-optimize/Modules/cPickle.c Sun Jun 1 17:18:10 2008 @@ -393,13 +393,13 @@ if (format) args = Py_VaBuildValue(format, va); va_end(va); if (format && ! args) return NULL; - if (stringformat && !(retval=PyString_FromString(stringformat))) + if (stringformat && !(retval=PyBytes_FromString(stringformat))) return NULL; if (retval) { if (args) { PyObject *v; - v=PyString_Format(retval, args); + v=PyBytes_Format(retval, args); Py_DECREF(retval); Py_DECREF(args); if (! v) return NULL; @@ -477,7 +477,7 @@ n = (int)_n; if (s == NULL) { if (!( self->buf_size )) return 0; - py_str = PyString_FromStringAndSize(self->write_buf, + py_str = PyBytes_FromStringAndSize(self->write_buf, self->buf_size); if (!py_str) return -1; @@ -490,7 +490,7 @@ if (n > WRITE_BUF_SIZE) { if (!( py_str = - PyString_FromStringAndSize(s, n))) + PyBytes_FromStringAndSize(s, n))) return -1; } else { @@ -655,7 +655,7 @@ Py_XDECREF(self->last_string); self->last_string = str; - if (! (*s = PyString_AsString(str))) return -1; + if (! (*s = PyBytes_AsString(str))) return -1; return n; } @@ -670,13 +670,13 @@ return -1; } - if ((str_size = PyString_Size(str)) < 0) + if ((str_size = PyBytes_Size(str)) < 0) return -1; Py_XDECREF(self->last_string); self->last_string = str; - if (! (*s = PyString_AsString(str))) + if (! (*s = PyBytes_AsString(str))) return -1; return str_size; @@ -1078,9 +1078,9 @@ "to pickle"); goto finally; } - repr = PyString_FromStringAndSize(NULL, (int)nbytes); + repr = PyBytes_FromStringAndSize(NULL, (int)nbytes); if (repr == NULL) goto finally; - pdata = (unsigned char *)PyString_AS_STRING(repr); + pdata = (unsigned char *)PyBytes_AS_STRING(repr); i = _PyLong_AsByteArray((PyLongObject *)args, pdata, nbytes, 1 /* little endian */, 1 /* signed */); @@ -1121,14 +1121,14 @@ if (!( repr = PyObject_Repr(args))) goto finally; - if ((size = PyString_Size(repr)) < 0) + if ((size = PyBytes_Size(repr)) < 0) goto finally; if (self->write_func(self, &l, 1) < 0) goto finally; if (self->write_func(self, - PyString_AS_STRING((PyStringObject *)repr), + PyBytes_AS_STRING((PyBytesObject *)repr), size) < 0) goto finally; @@ -1177,7 +1177,7 @@ int size, len; PyObject *repr=0; - if ((size = PyString_Size(args)) < 0) + if ((size = PyBytes_Size(args)) < 0) return -1; if (!self->bin) { @@ -1188,9 +1188,9 @@ if (!( repr = PyObject_Repr(args))) return -1; - if ((len = PyString_Size(repr)) < 0) + if ((len = PyBytes_Size(repr)) < 0) goto err; - repr_str = PyString_AS_STRING((PyStringObject *)repr); + repr_str = PyBytes_AS_STRING((PyBytesObject *)repr); if (self->write_func(self, &string, 1) < 0) goto err; @@ -1207,7 +1207,7 @@ int i; char c_str[5]; - if ((size = PyString_Size(args)) < 0) + if ((size = PyBytes_Size(args)) < 0) return -1; if (size < 256) { @@ -1233,8 +1233,8 @@ } else { if (self->write_func(self, - PyString_AS_STRING( - (PyStringObject *)args), + PyBytes_AS_STRING( + (PyBytesObject *)args), size) < 0) return -1; } @@ -1264,13 +1264,13 @@ static const char *hexdigit = "0123456789ABCDEF"; - repr = PyString_FromStringAndSize(NULL, 6 * size); + repr = PyBytes_FromStringAndSize(NULL, 6 * size); if (repr == NULL) return NULL; if (size == 0) return repr; - p = q = PyString_AS_STRING(repr); + p = q = PyBytes_AS_STRING(repr); while (size-- > 0) { Py_UNICODE ch = *s++; /* Map 16-bit characters to '\uxxxx' */ @@ -1287,7 +1287,7 @@ *p++ = (char) ch; } *p = '\0'; - _PyString_Resize(&repr, p - q); + _PyBytes_Resize(&repr, p - q); return repr; } @@ -1310,9 +1310,9 @@ if (!repr) return -1; - if ((len = PyString_Size(repr)) < 0) + if ((len = PyBytes_Size(repr)) < 0) goto err; - repr_str = PyString_AS_STRING((PyStringObject *)repr); + repr_str = PyBytes_AS_STRING((PyBytesObject *)repr); if (self->write_func(self, &string, 1) < 0) goto err; @@ -1332,7 +1332,7 @@ if (!( repr = PyUnicode_AsUTF8String(args))) return -1; - if ((size = PyString_Size(repr)) < 0) + if ((size = PyBytes_Size(repr)) < 0) goto err; if (size > INT_MAX) return -1; /* string too large */ @@ -1351,7 +1351,7 @@ PDATA_APPEND(self->file, repr, -1); } else { - if (self->write_func(self, PyString_AS_STRING(repr), + if (self->write_func(self, PyBytes_AS_STRING(repr), size) < 0) goto err; } @@ -1861,12 +1861,12 @@ goto finally; - if ((module_size = PyString_Size(module)) < 0 || - (name_size = PyString_Size(name)) < 0) + if ((module_size = PyBytes_Size(module)) < 0 || + (name_size = PyBytes_Size(name)) < 0) goto finally; - module_str = PyString_AS_STRING((PyStringObject *)module); - name_str = PyString_AS_STRING((PyStringObject *)name); + module_str = PyBytes_AS_STRING((PyBytesObject *)module); + name_str = PyBytes_AS_STRING((PyBytesObject *)name); if (self->write_func(self, &inst, 1) < 0) goto finally; @@ -1961,12 +1961,12 @@ if (!( module = whichmodule(args, global_name))) goto finally; - if ((module_size = PyString_Size(module)) < 0 || - (name_size = PyString_Size(global_name)) < 0) + if ((module_size = PyBytes_Size(module)) < 0 || + (name_size = PyBytes_Size(global_name)) < 0) goto finally; - module_str = PyString_AS_STRING((PyStringObject *)module); - name_str = PyString_AS_STRING((PyStringObject *)global_name); + module_str = PyBytes_AS_STRING((PyBytesObject *)module); + name_str = PyBytes_AS_STRING((PyBytesObject *)global_name); /* XXX This can be doing a relative import. Clearly it shouldn't, but I don't know how to stop it. :-( */ @@ -2099,7 +2099,7 @@ if (pid != Py_None) { if (!self->bin) { - if (!PyString_Check(pid)) { + if (!PyBytes_Check(pid)) { PyErr_SetString(PicklingError, "persistent id must be string"); goto finally; @@ -2108,12 +2108,12 @@ if (self->write_func(self, &persid, 1) < 0) goto finally; - if ((size = PyString_Size(pid)) < 0) + if ((size = PyBytes_Size(pid)) < 0) goto finally; if (self->write_func(self, - PyString_AS_STRING( - (PyStringObject *)pid), + PyBytes_AS_STRING( + (PyBytesObject *)pid), size) < 0) goto finally; @@ -2194,8 +2194,8 @@ use_newobj = 0; } else { - use_newobj = PyString_Check(temp) && - strcmp(PyString_AS_STRING(temp), + use_newobj = PyBytes_Check(temp) && + strcmp(PyBytes_AS_STRING(temp), "__newobj__") == 0; Py_DECREF(temp); } @@ -2362,14 +2362,14 @@ break; case 's': - if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) { + if ((type == &PyBytes_Type) && (PyBytes_GET_SIZE(args) < 2)) { res = save_string(self, args, 0); goto finally; } #ifdef Py_USING_UNICODE case 'u': - if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) { + if ((type == &PyUnicode_Type) && (PyBytes_GET_SIZE(args) < 2)) { res = save_unicode(self, args, 0); goto finally; } @@ -2391,7 +2391,7 @@ switch (type->tp_name[0]) { case 's': - if (type == &PyString_Type) { + if (type == &PyBytes_Type) { res = save_string(self, args, 1); goto finally; } @@ -2526,7 +2526,7 @@ if (t == NULL) goto finally; - if (PyString_Check(t)) { + if (PyBytes_Check(t)) { res = save_global(self, args, t); goto finally; } @@ -2640,8 +2640,8 @@ for (rsize = 0, i = l; --i >= 0; ) { k = data->data[i]; - if (PyString_Check(k)) - rsize += PyString_GET_SIZE(k); + if (PyBytes_Check(k)) + rsize += PyBytes_GET_SIZE(k); else if (PyInt_Check(k)) { /* put */ ik = PyInt_AS_LONG((PyIntObject*)k); @@ -2676,17 +2676,17 @@ } /* Now generate the result */ - r = PyString_FromStringAndSize(NULL, rsize); + r = PyBytes_FromStringAndSize(NULL, rsize); if (r == NULL) goto err; - s = PyString_AS_STRING((PyStringObject *)r); + s = PyBytes_AS_STRING((PyBytesObject *)r); for (i = 0; i < l; i++) { k = data->data[i]; - if (PyString_Check(k)) { - ssize = PyString_GET_SIZE(k); + if (PyBytes_Check(k)) { + ssize = PyBytes_GET_SIZE(k); if (ssize) { - p=PyString_AS_STRING((PyStringObject *)k); + p=PyBytes_AS_STRING((PyBytesObject *)k); while (--ssize >= 0) *s++ = *p++; } @@ -3410,7 +3410,7 @@ goto insecure; /********************************************/ - str = PyString_DecodeEscape(p, len, NULL, 0, NULL); + str = PyBytes_DecodeEscape(p, len, NULL, 0, NULL); free(s); if (str) { PDATA_PUSH(self->stack, str, -1); @@ -3439,7 +3439,7 @@ if (self->read_func(self, &s, l) < 0) return -1; - if (!( py_string = PyString_FromStringAndSize(s, l))) + if (!( py_string = PyBytes_FromStringAndSize(s, l))) return -1; PDATA_PUSH(self->stack, py_string, -1); @@ -3461,7 +3461,7 @@ if (self->read_func(self, &s, l) < 0) return -1; - if (!( py_string = PyString_FromStringAndSize(s, l))) return -1; + if (!( py_string = PyBytes_FromStringAndSize(s, l))) return -1; PDATA_PUSH(self->stack, py_string, -1); return 0; @@ -3688,12 +3688,12 @@ if ((len = self->readline_func(self, &s)) < 0) return -1; if (len < 2) return bad_readline(); - module_name = PyString_FromStringAndSize(s, len - 1); + module_name = PyBytes_FromStringAndSize(s, len - 1); if (!module_name) return -1; if ((len = self->readline_func(self, &s)) >= 0) { if (len < 2) return bad_readline(); - if ((class_name = PyString_FromStringAndSize(s, len - 1))) { + if ((class_name = PyBytes_FromStringAndSize(s, len - 1))) { class = find_class(module_name, class_name, self->find_class); Py_DECREF(class_name); @@ -3772,7 +3772,7 @@ if ((len = self->readline_func(self, &s)) < 0) return -1; if (len < 2) return bad_readline(); - module_name = PyString_FromStringAndSize(s, len - 1); + module_name = PyBytes_FromStringAndSize(s, len - 1); if (!module_name) return -1; if ((len = self->readline_func(self, &s)) >= 0) { @@ -3780,7 +3780,7 @@ Py_DECREF(module_name); return bad_readline(); } - if ((class_name = PyString_FromStringAndSize(s, len - 1))) { + if ((class_name = PyBytes_FromStringAndSize(s, len - 1))) { class = find_class(module_name, class_name, self->find_class); Py_DECREF(class_name); @@ -3805,7 +3805,7 @@ if ((len = self->readline_func(self, &s)) < 0) return -1; if (len < 2) return bad_readline(); - pid = PyString_FromStringAndSize(s, len - 1); + pid = PyBytes_FromStringAndSize(s, len - 1); if (!pid) return -1; if (PyList_Check(self->pers_func)) { @@ -3938,7 +3938,7 @@ if ((len = self->readline_func(self, &s)) < 0) return -1; if (len < 2) return bad_readline(); - if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1; + if (!( py_str = PyBytes_FromStringAndSize(s, len - 1))) return -1; value = PyDict_GetItem(self->memo, py_str); if (! value) { @@ -4064,8 +4064,8 @@ * confirm that pair is really a 2-tuple of strings. */ if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 || - !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) || - !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) { + !PyBytes_Check(module_name = PyTuple_GET_ITEM(pair, 0)) || + !PyBytes_Check(class_name = PyTuple_GET_ITEM(pair, 1))) { Py_DECREF(py_code); PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] " "isn't a 2-tuple of strings", code); @@ -4098,7 +4098,7 @@ if ((l = self->readline_func(self, &s)) < 0) return -1; if (l < 2) return bad_readline(); if (!( len=self->stack->length )) return stackUnderflow(); - if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1; + if (!( py_str = PyBytes_FromStringAndSize(s, l - 1))) return -1; value=self->stack->data[len-1]; l=PyDict_SetItem(self->memo, py_str, value); Py_DECREF(py_str); @@ -5568,7 +5568,7 @@ { PyObject *copyreg, *t, *r; -#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1; +#define INIT_STR(S) if (!( S ## _str=PyBytes_InternFromString(#S))) return -1; if (PyType_Ready(&Unpicklertype) < 0) return -1; @@ -5736,7 +5736,7 @@ /* Add some symbolic constants to the module */ d = PyModule_GetDict(m); - v = PyString_FromString(rev); + v = PyBytes_FromString(rev); PyDict_SetItemString(d, "__version__", v); Py_XDECREF(v); @@ -5755,7 +5755,7 @@ /* These are purely informational; no code uses them. */ /* File format version we write. */ - format_version = PyString_FromString("2.0"); + format_version = PyBytes_FromString("2.0"); /* Format versions we can read. */ compatible_formats = Py_BuildValue("[sssss]", "1.0", /* Original protocol 0 */ Modified: python/branches/tlee-ast-optimize/Modules/cStringIO.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/cStringIO.c (original) +++ python/branches/tlee-ast-optimize/Modules/cStringIO.c Sun Jun 1 17:18:10 2008 @@ -119,7 +119,7 @@ static PyObject * IO_cgetval(PyObject *self) { if (!IO__opencheck(IOOOBJECT(self))) return NULL; - return PyString_FromStringAndSize(((IOobject*)self)->buf, + return PyBytes_FromStringAndSize(((IOobject*)self)->buf, ((IOobject*)self)->pos); } @@ -137,7 +137,7 @@ } else s=self->string_size; - return PyString_FromStringAndSize(self->buf, s); + return PyBytes_FromStringAndSize(self->buf, s); } PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0"); @@ -177,7 +177,7 @@ if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL; - return PyString_FromStringAndSize(output, n); + return PyBytes_FromStringAndSize(output, n); } PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line"); @@ -215,7 +215,7 @@ n -= m; self->pos -= m; } - return PyString_FromStringAndSize(output, n); + return PyBytes_FromStringAndSize(output, n); } PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines"); @@ -238,7 +238,7 @@ goto err; if (n == 0) break; - line = PyString_FromStringAndSize (output, n); + line = PyBytes_FromStringAndSize (output, n); if (!line) goto err; if (PyList_Append (result, line) == -1) { @@ -315,7 +315,7 @@ next = IO_readline((IOobject *)self, NULL); if (!next) return NULL; - if (!PyString_GET_SIZE(next)) { + if (!PyBytes_GET_SIZE(next)) { Py_DECREF(next); PyErr_SetNone(PyExc_StopIteration); return NULL; @@ -456,7 +456,7 @@ while ((s = PyIter_Next(it)) != NULL) { Py_ssize_t n; char *c; - if (PyString_AsStringAndSize(s, &c, &n) == -1) { + if (PyBytes_AsStringAndSize(s, &c, &n) == -1) { Py_DECREF(it); Py_DECREF(s); return NULL; Modified: python/branches/tlee-ast-optimize/Modules/cdmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/cdmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/cdmodule.c Sun Jun 1 17:18:10 2008 @@ -239,19 +239,19 @@ if (!PyArg_ParseTuple(args, "i:readda", &numframes)) return NULL; - result = PyString_FromStringAndSize(NULL, numframes * sizeof(CDFRAME)); + result = PyBytes_FromStringAndSize(NULL, numframes * sizeof(CDFRAME)); if (result == NULL) return NULL; n = CDreadda(self->ob_cdplayer, - (CDFRAME *) PyString_AsString(result), numframes); + (CDFRAME *) PyBytes_AsString(result), numframes); if (n == -1) { Py_DECREF(result); PyErr_SetFromErrno(CdError); return NULL; } if (n < numframes) - _PyString_Resize(&result, n * sizeof(CDFRAME)); + _PyBytes_Resize(&result, n * sizeof(CDFRAME)); return result; } @@ -468,7 +468,7 @@ PyTuple_SetItem(args, 1, PyInt_FromLong((long) type)); switch (type) { case cd_audio: - v = PyString_FromStringAndSize(data, CDDA_DATASIZE); + v = PyBytes_FromStringAndSize(data, CDDA_DATASIZE); break; case cd_pnum: case cd_index: @@ -484,15 +484,15 @@ #undef ptr break; case cd_catalog: - v = PyString_FromStringAndSize(NULL, 13); - p = PyString_AsString(v); + v = PyBytes_FromStringAndSize(NULL, 13); + p = PyBytes_AsString(v); for (i = 0; i < 13; i++) *p++ = ((char *) data)[i] + '0'; break; case cd_ident: #define ptr ((struct cdident *) data) - v = PyString_FromStringAndSize(NULL, 12); - p = PyString_AsString(v); + v = PyBytes_FromStringAndSize(NULL, 12); + p = PyBytes_AsString(v); CDsbtoa(p, ptr->country, 2); p += 2; CDsbtoa(p, ptr->owner, 3); Modified: python/branches/tlee-ast-optimize/Modules/cgensupport.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/cgensupport.c (original) +++ python/branches/tlee-ast-optimize/Modules/cgensupport.c Sun Jun 1 17:18:10 2008 @@ -119,10 +119,10 @@ PyObject *v; if (!PyArg_GetObject(args, nargs, i, &v)) return 0; - if (!PyString_Check(v)) { + if (!PyBytes_Check(v)) { return PyErr_BadArgument(); } - *p_arg = PyString_AsString(v); + *p_arg = PyBytes_AsString(v); return 1; } Modified: python/branches/tlee-ast-optimize/Modules/cjkcodecs/cjkcodecs.h ============================================================================== --- python/branches/tlee-ast-optimize/Modules/cjkcodecs/cjkcodecs.h (original) +++ python/branches/tlee-ast-optimize/Modules/cjkcodecs/cjkcodecs.h Sun Jun 1 17:18:10 2008 @@ -261,7 +261,7 @@ const MultibyteCodec *codec; const char *enc; - if (!PyString_Check(encoding)) { + if (!PyBytes_Check(encoding)) { PyErr_SetString(PyExc_TypeError, "encoding name must be a string."); return NULL; @@ -271,7 +271,7 @@ if (cofunc == NULL) return NULL; - enc = PyString_AS_STRING(encoding); + enc = PyBytes_AS_STRING(encoding); for (codec = codec_list; codec->encoding[0]; codec++) if (strcmp(codec->encoding, enc) == 0) break; Modified: python/branches/tlee-ast-optimize/Modules/cjkcodecs/multibytecodec.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/cjkcodecs/multibytecodec.c (original) +++ python/branches/tlee-ast-optimize/Modules/cjkcodecs/multibytecodec.c Sun Jun 1 17:18:10 2008 @@ -85,7 +85,7 @@ else if (strcmp(errors, "replace") == 0) return ERROR_REPLACE; else - return PyString_FromString(errors); + return PyBytes_FromString(errors); } static PyObject * @@ -93,8 +93,8 @@ { PyObject *args, *cb, *r; - assert(PyString_Check(errors)); - cb = PyCodec_LookupError(PyString_AS_STRING(errors)); + assert(PyBytes_Check(errors)); + cb = PyCodec_LookupError(PyBytes_AS_STRING(errors)); if (cb == NULL) return NULL; @@ -129,7 +129,7 @@ return self->errors; } - return PyString_FromString(errors); + return PyBytes_FromString(errors); } static int @@ -138,12 +138,12 @@ { PyObject *cb; - if (!PyString_Check(value)) { + if (!PyBytes_Check(value)) { PyErr_SetString(PyExc_TypeError, "errors must be a string"); return -1; } - cb = internal_error_callback(PyString_AS_STRING(value)); + cb = internal_error_callback(PyBytes_AS_STRING(value)); if (cb == NULL) return -1; @@ -166,15 +166,15 @@ Py_ssize_t orgpos, orgsize; orgpos = (Py_ssize_t)((char *)buf->outbuf - - PyString_AS_STRING(buf->outobj)); - orgsize = PyString_GET_SIZE(buf->outobj); - if (_PyString_Resize(&buf->outobj, orgsize + ( + PyBytes_AS_STRING(buf->outobj)); + orgsize = PyBytes_GET_SIZE(buf->outobj); + if (_PyBytes_Resize(&buf->outobj, orgsize + ( esize < (orgsize >> 1) ? (orgsize >> 1) | 1 : esize)) == -1) return -1; - buf->outbuf = (unsigned char *)PyString_AS_STRING(buf->outobj) +orgpos; - buf->outbuf_end = (unsigned char *)PyString_AS_STRING(buf->outobj) - + PyString_GET_SIZE(buf->outobj); + buf->outbuf = (unsigned char *)PyBytes_AS_STRING(buf->outobj) +orgpos; + buf->outbuf_end = (unsigned char *)PyBytes_AS_STRING(buf->outobj) + + PyBytes_GET_SIZE(buf->outobj); return 0; } @@ -322,10 +322,10 @@ goto errorexit; } - retstrsize = PyString_GET_SIZE(retstr); + retstrsize = PyBytes_GET_SIZE(retstr); REQUIRE_ENCODEBUFFER(buf, retstrsize); - memcpy(buf->outbuf, PyString_AS_STRING(retstr), retstrsize); + memcpy(buf->outbuf, PyBytes_AS_STRING(retstr), retstrsize); buf->outbuf += retstrsize; newpos = PyInt_AsSsize_t(PyTuple_GET_ITEM(retobj, 1)); @@ -468,16 +468,16 @@ Py_ssize_t finalsize, r = 0; if (datalen == 0) - return PyString_FromString(""); + return PyBytes_FromString(""); buf.excobj = NULL; buf.inbuf = buf.inbuf_top = *data; buf.inbuf_end = buf.inbuf_top + datalen; - buf.outobj = PyString_FromStringAndSize(NULL, datalen * 2 + 16); + buf.outobj = PyBytes_FromStringAndSize(NULL, datalen * 2 + 16); if (buf.outobj == NULL) goto errorexit; - buf.outbuf = (unsigned char *)PyString_AS_STRING(buf.outobj); - buf.outbuf_end = buf.outbuf + PyString_GET_SIZE(buf.outobj); + buf.outbuf = (unsigned char *)PyBytes_AS_STRING(buf.outobj); + buf.outbuf_end = buf.outbuf + PyBytes_GET_SIZE(buf.outobj); while (buf.inbuf < buf.inbuf_end) { Py_ssize_t inleft, outleft; @@ -512,10 +512,10 @@ } finalsize = (Py_ssize_t)((char *)buf.outbuf - - PyString_AS_STRING(buf.outobj)); + PyBytes_AS_STRING(buf.outobj)); - if (finalsize != PyString_GET_SIZE(buf.outobj)) - if (_PyString_Resize(&buf.outobj, finalsize) == -1) + if (finalsize != PyBytes_GET_SIZE(buf.outobj)) + if (_PyBytes_Resize(&buf.outobj, finalsize) == -1) goto errorexit; Py_XDECREF(buf.excobj); @@ -1222,35 +1222,35 @@ if (cres == NULL) goto errorexit; - if (!PyString_Check(cres)) { + if (!PyBytes_Check(cres)) { PyErr_SetString(PyExc_TypeError, "stream function returned a " "non-string object"); goto errorexit; } - endoffile = (PyString_GET_SIZE(cres) == 0); + endoffile = (PyBytes_GET_SIZE(cres) == 0); if (self->pendingsize > 0) { PyObject *ctr; char *ctrdata; - rsize = PyString_GET_SIZE(cres) + self->pendingsize; - ctr = PyString_FromStringAndSize(NULL, rsize); + rsize = PyBytes_GET_SIZE(cres) + self->pendingsize; + ctr = PyBytes_FromStringAndSize(NULL, rsize); if (ctr == NULL) goto errorexit; - ctrdata = PyString_AS_STRING(ctr); + ctrdata = PyBytes_AS_STRING(ctr); memcpy(ctrdata, self->pending, self->pendingsize); memcpy(ctrdata + self->pendingsize, - PyString_AS_STRING(cres), - PyString_GET_SIZE(cres)); + PyBytes_AS_STRING(cres), + PyBytes_GET_SIZE(cres)); Py_DECREF(cres); cres = ctr; self->pendingsize = 0; } - rsize = PyString_GET_SIZE(cres); - if (decoder_prepare_buffer(&buf, PyString_AS_STRING(cres), + rsize = PyBytes_GET_SIZE(cres); + if (decoder_prepare_buffer(&buf, PyBytes_AS_STRING(cres), rsize) != 0) goto errorexit; @@ -1585,7 +1585,7 @@ if (pwrt == NULL) return NULL; - if (PyString_Size(pwrt) > 0) { + if (PyBytes_Size(pwrt) > 0) { PyObject *wr; wr = PyObject_CallMethod(self->stream, "write", "O", pwrt); if (wr == NULL) { Modified: python/branches/tlee-ast-optimize/Modules/clmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/clmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/clmodule.c Sun Jun 1 17:18:10 2008 @@ -111,7 +111,7 @@ return NULL; retry: - compressedBuffer = PyString_FromStringAndSize(NULL, frameBufferSize); + compressedBuffer = PyBytes_FromStringAndSize(NULL, frameBufferSize); if (compressedBuffer == NULL) return NULL; @@ -120,7 +120,7 @@ if (clCompressImage(compressionScheme, width, height, originalFormat, compressionRatio, (void *) frameBuffer, &compressedBufferSize, - (void *) PyString_AsString(compressedBuffer)) + (void *) PyBytes_AsString(compressedBuffer)) == FAILURE || error_handler_called) { Py_DECREF(compressedBuffer); if (!error_handler_called) @@ -135,7 +135,7 @@ } if (compressedBufferSize < frameBufferSize) - _PyString_Resize(&compressedBuffer, compressedBufferSize); + _PyBytes_Resize(&compressedBuffer, compressedBufferSize); return compressedBuffer; } @@ -155,14 +155,14 @@ frameBufferSize = width * height * CL_BytesPerPixel(originalFormat); - frameBuffer = PyString_FromStringAndSize(NULL, frameBufferSize); + frameBuffer = PyBytes_FromStringAndSize(NULL, frameBufferSize); if (frameBuffer == NULL) return NULL; error_handler_called = 0; if (clDecompressImage(compressionScheme, width, height, originalFormat, compressedBufferSize, compressedBuffer, - (void *) PyString_AsString(frameBuffer)) + (void *) PyBytes_AsString(frameBuffer)) == FAILURE || error_handler_called) { Py_DECREF(frameBuffer); if (!error_handler_called) @@ -236,14 +236,14 @@ if (error_handler_called) return NULL; - data = PyString_FromStringAndSize(NULL, size); + data = PyBytes_FromStringAndSize(NULL, size); if (data == NULL) return NULL; error_handler_called = 0; if (clCompress(SELF->ob_compressorHdl, numberOfFrames, (void *) frameBuffer, &compressedBufferSize, - (void *) PyString_AsString(data)) == FAILURE || + (void *) PyBytes_AsString(data)) == FAILURE || error_handler_called) { Py_DECREF(data); if (!error_handler_called) @@ -252,7 +252,7 @@ } if (compressedBufferSize < size) - if (_PyString_Resize(&data, compressedBufferSize)) + if (_PyBytes_Resize(&data, compressedBufferSize)) return NULL; if (compressedBufferSize > size) { @@ -285,14 +285,14 @@ if (error_handler_called) return NULL; - data = PyString_FromStringAndSize(NULL, dataSize); + data = PyBytes_FromStringAndSize(NULL, dataSize); if (data == NULL) return NULL; error_handler_called = 0; if (clDecompress(SELF->ob_compressorHdl, numberOfFrames, compressedDataSize, (void *) compressedData, - (void *) PyString_AsString(data)) == FAILURE || + (void *) PyBytes_AsString(data)) == FAILURE || error_handler_called) { Py_DECREF(data); if (!error_handler_called) @@ -514,7 +514,7 @@ PyList_SetItem(list, i, Py_None); } else PyList_SetItem(list, i, - PyString_FromString((char *) PVbuffer[i])); + PyBytes_FromString((char *) PVbuffer[i])); } PyMem_DEL(PVbuffer); @@ -563,7 +563,7 @@ return NULL; } - return PyString_FromString(name); + return PyBytes_FromString(name); } static PyObject * @@ -775,7 +775,7 @@ PyList_SetItem(list, i, Py_None); } else PyList_SetItem(list, i, - PyString_FromString((char *) PVbuffer[i])); + PyBytes_FromString((char *) PVbuffer[i])); } PyMem_DEL(PVbuffer); @@ -818,7 +818,7 @@ return NULL; } - return PyString_FromString(name); + return PyBytes_FromString(name); } static PyObject * Modified: python/branches/tlee-ast-optimize/Modules/datetimemodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/datetimemodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/datetimemodule.c Sun Jun 1 17:18:10 2008 @@ -945,7 +945,7 @@ else result = PyObject_CallMethod(tzinfo, "tzname", "O", tzinfoarg); - if (result != NULL && result != Py_None && ! PyString_Check(result)) { + if (result != NULL && result != Py_None && ! PyBytes_Check(result)) { PyErr_Format(PyExc_TypeError, "tzinfo.tzname() must " "return None or a string, not '%s'", Py_TYPE(result)->tp_name); @@ -1044,27 +1044,27 @@ { PyObject *temp; - assert(PyString_Check(repr)); + assert(PyBytes_Check(repr)); assert(tzinfo); if (tzinfo == Py_None) return repr; /* Get rid of the trailing ')'. */ - assert(PyString_AsString(repr)[PyString_Size(repr)-1] == ')'); - temp = PyString_FromStringAndSize(PyString_AsString(repr), - PyString_Size(repr) - 1); + assert(PyBytes_AsString(repr)[PyBytes_Size(repr)-1] == ')'); + temp = PyBytes_FromStringAndSize(PyBytes_AsString(repr), + PyBytes_Size(repr) - 1); Py_DECREF(repr); if (temp == NULL) return NULL; repr = temp; /* Append ", tzinfo=". */ - PyString_ConcatAndDel(&repr, PyString_FromString(", tzinfo=")); + PyBytes_ConcatAndDel(&repr, PyBytes_FromString(", tzinfo=")); /* Append repr(tzinfo). */ - PyString_ConcatAndDel(&repr, PyObject_Repr(tzinfo)); + PyBytes_ConcatAndDel(&repr, PyObject_Repr(tzinfo)); /* Add a closing paren. */ - PyString_ConcatAndDel(&repr, PyString_FromString(")")); + PyBytes_ConcatAndDel(&repr, PyBytes_FromString(")")); return repr; } @@ -1090,7 +1090,7 @@ DayNames[wday], MonthNames[GET_MONTH(date) - 1], GET_DAY(date), hours, minutes, seconds, GET_YEAR(date)); - return PyString_FromString(buffer); + return PyBytes_FromString(buffer); } /* Add an hours & minutes UTC offset string to buf. buf has no more than @@ -1141,7 +1141,7 @@ else sprintf(freplacement, "%06d", 0); - return PyString_FromStringAndSize(freplacement, strlen(freplacement)); + return PyBytes_FromStringAndSize(freplacement, strlen(freplacement)); } /* I sure don't want to reproduce the strftime code from the time module, @@ -1174,7 +1174,7 @@ int ntoappend; /* # of bytes to append to output buffer */ assert(object && format && timetuple); - assert(PyString_Check(format)); + assert(PyBytes_Check(format)); /* Give up if the year is before 1900. * Python strftime() plays games with the year, and different @@ -1205,13 +1205,13 @@ * a new format. Since computing the replacements for those codes * is expensive, don't unless they're actually used. */ - totalnew = PyString_Size(format) + 1; /* realistic if no %z/%Z/%f */ - newfmt = PyString_FromStringAndSize(NULL, totalnew); + totalnew = PyBytes_Size(format) + 1; /* realistic if no %z/%Z/%f */ + newfmt = PyBytes_FromStringAndSize(NULL, totalnew); if (newfmt == NULL) goto Done; - pnew = PyString_AsString(newfmt); + pnew = PyBytes_AsString(newfmt); usednew = 0; - pin = PyString_AsString(format); + pin = PyBytes_AsString(format); while ((ch = *pin++) != '\0') { if (ch != '%') { ptoappend = pin - 1; @@ -1229,7 +1229,7 @@ /* format utcoffset */ char buf[100]; PyObject *tzinfo = get_tzinfo_member(object); - zreplacement = PyString_FromString(""); + zreplacement = PyBytes_FromString(""); if (zreplacement == NULL) goto Done; if (tzinfo != Py_None && tzinfo != NULL) { assert(tzinfoarg != NULL); @@ -1240,19 +1240,19 @@ tzinfoarg) < 0) goto Done; Py_DECREF(zreplacement); - zreplacement = PyString_FromString(buf); + zreplacement = PyBytes_FromString(buf); if (zreplacement == NULL) goto Done; } } assert(zreplacement != NULL); - ptoappend = PyString_AS_STRING(zreplacement); - ntoappend = PyString_GET_SIZE(zreplacement); + ptoappend = PyBytes_AS_STRING(zreplacement); + ntoappend = PyBytes_GET_SIZE(zreplacement); } else if (ch == 'Z') { /* format tzname */ if (Zreplacement == NULL) { PyObject *tzinfo = get_tzinfo_member(object); - Zreplacement = PyString_FromString(""); + Zreplacement = PyBytes_FromString(""); if (Zreplacement == NULL) goto Done; if (tzinfo != Py_None && tzinfo != NULL) { PyObject *temp; @@ -1260,7 +1260,7 @@ temp = call_tzname(tzinfo, tzinfoarg); if (temp == NULL) goto Done; if (temp != Py_None) { - assert(PyString_Check(temp)); + assert(PyBytes_Check(temp)); /* Since the tzname is getting * stuffed into the format, we * have to double any % signs @@ -1274,7 +1274,7 @@ Py_DECREF(temp); if (Zreplacement == NULL) goto Done; - if (!PyString_Check(Zreplacement)) { + if (!PyBytes_Check(Zreplacement)) { PyErr_SetString(PyExc_TypeError, "tzname.replace() did not return a string"); goto Done; } @@ -1284,8 +1284,8 @@ } } assert(Zreplacement != NULL); - ptoappend = PyString_AS_STRING(Zreplacement); - ntoappend = PyString_GET_SIZE(Zreplacement); + ptoappend = PyBytes_AS_STRING(Zreplacement); + ntoappend = PyBytes_GET_SIZE(Zreplacement); } else if (ch == 'f') { /* format microseconds */ @@ -1295,9 +1295,9 @@ goto Done; } assert(freplacement != NULL); - assert(PyString_Check(freplacement)); - ptoappend = PyString_AS_STRING(freplacement); - ntoappend = PyString_GET_SIZE(freplacement); + assert(PyBytes_Check(freplacement)); + ptoappend = PyBytes_AS_STRING(freplacement); + ntoappend = PyBytes_GET_SIZE(freplacement); } else { /* percent followed by neither z nor Z */ @@ -1318,10 +1318,10 @@ PyErr_NoMemory(); goto Done; } - if (_PyString_Resize(&newfmt, bigger) < 0) + if (_PyBytes_Resize(&newfmt, bigger) < 0) goto Done; totalnew = bigger; - pnew = PyString_AsString(newfmt) + usednew; + pnew = PyBytes_AsString(newfmt) + usednew; } memcpy(pnew, ptoappend, ntoappend); pnew += ntoappend; @@ -1329,7 +1329,7 @@ assert(usednew <= totalnew); } /* end while() */ - if (_PyString_Resize(&newfmt, usednew) < 0) + if (_PyBytes_Resize(&newfmt, usednew) < 0) goto Done; { PyObject *time = PyImport_ImportModuleNoBlock("time"); @@ -2007,18 +2007,18 @@ delta_repr(PyDateTime_Delta *self) { if (GET_TD_MICROSECONDS(self) != 0) - return PyString_FromFormat("%s(%d, %d, %d)", + return PyBytes_FromFormat("%s(%d, %d, %d)", Py_TYPE(self)->tp_name, GET_TD_DAYS(self), GET_TD_SECONDS(self), GET_TD_MICROSECONDS(self)); if (GET_TD_SECONDS(self) != 0) - return PyString_FromFormat("%s(%d, %d)", + return PyBytes_FromFormat("%s(%d, %d)", Py_TYPE(self)->tp_name, GET_TD_DAYS(self), GET_TD_SECONDS(self)); - return PyString_FromFormat("%s(%d)", + return PyBytes_FromFormat("%s(%d)", Py_TYPE(self)->tp_name, GET_TD_DAYS(self)); } @@ -2062,7 +2062,7 @@ pbuf += n; } - return PyString_FromStringAndSize(buf, pbuf - buf); + return PyBytes_FromStringAndSize(buf, pbuf - buf); Fail: PyErr_SetString(PyExc_SystemError, "goofy result from PyOS_snprintf"); @@ -2241,15 +2241,15 @@ /* Check for invocation from pickle with __getstate__ state */ if (PyTuple_GET_SIZE(args) == 1 && - PyString_Check(state = PyTuple_GET_ITEM(args, 0)) && - PyString_GET_SIZE(state) == _PyDateTime_DATE_DATASIZE && - MONTH_IS_SANE(PyString_AS_STRING(state)[2])) + PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) && + PyBytes_GET_SIZE(state) == _PyDateTime_DATE_DATASIZE && + MONTH_IS_SANE(PyBytes_AS_STRING(state)[2])) { PyDateTime_Date *me; me = (PyDateTime_Date *) (type->tp_alloc(type, 0)); if (me != NULL) { - char *pdata = PyString_AS_STRING(state); + char *pdata = PyBytes_AS_STRING(state); memcpy(me->data, pdata, _PyDateTime_DATE_DATASIZE); me->hashcode = -1; } @@ -2447,7 +2447,7 @@ type_name, GET_YEAR(self), GET_MONTH(self), GET_DAY(self)); - return PyString_FromString(buffer); + return PyBytes_FromString(buffer); } static PyObject * @@ -2456,7 +2456,7 @@ char buffer[128]; isoformat_date(self, buffer, sizeof(buffer)); - return PyString_FromString(buffer); + return PyBytes_FromString(buffer); } /* str() calls the appropriate isoformat() method. */ @@ -2485,7 +2485,7 @@ static char *keywords[] = {"format", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:strftime", keywords, - &PyString_Type, &format)) + &PyBytes_Type, &format)) return NULL; tuple = PyObject_CallMethod((PyObject *)self, "timetuple", "()"); @@ -2506,9 +2506,9 @@ return NULL; /* Check for str or unicode */ - if (PyString_Check(format)) { + if (PyBytes_Check(format)) { /* If format is zero length, return str(self) */ - if (PyString_GET_SIZE(format) == 0) + if (PyBytes_GET_SIZE(format) == 0) return PyObject_Str((PyObject *)self); } else if (PyUnicode_Check(format)) { /* If format is zero length, return str(self) */ @@ -2651,7 +2651,7 @@ { return Py_BuildValue( "(N)", - PyString_FromStringAndSize((char *)self->data, + PyBytes_FromStringAndSize((char *)self->data, _PyDateTime_DATE_DATASIZE)); } @@ -3107,9 +3107,9 @@ /* Check for invocation from pickle with __getstate__ state */ if (PyTuple_GET_SIZE(args) >= 1 && PyTuple_GET_SIZE(args) <= 2 && - PyString_Check(state = PyTuple_GET_ITEM(args, 0)) && - PyString_GET_SIZE(state) == _PyDateTime_TIME_DATASIZE && - ((unsigned char) (PyString_AS_STRING(state)[0])) < 24) + PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) && + PyBytes_GET_SIZE(state) == _PyDateTime_TIME_DATASIZE && + ((unsigned char) (PyBytes_AS_STRING(state)[0])) < 24) { PyDateTime_Time *me; char aware; @@ -3125,7 +3125,7 @@ aware = (char)(tzinfo != Py_None); me = (PyDateTime_Time *) (type->tp_alloc(type, aware)); if (me != NULL) { - char *pdata = PyString_AS_STRING(state); + char *pdata = PyBytes_AS_STRING(state); memcpy(me->data, pdata, _PyDateTime_TIME_DATASIZE); me->hashcode = -1; @@ -3211,7 +3211,7 @@ else PyOS_snprintf(buffer, sizeof(buffer), "%s(%d, %d)", type_name, h, m); - result = PyString_FromString(buffer); + result = PyBytes_FromString(buffer); if (result != NULL && HASTZINFO(self)) result = append_keyword_tzinfo(result, self->tzinfo); return result; @@ -3238,7 +3238,7 @@ _PyDateTime_TIME_DATASIZE); isoformat_time(pdatetime, buf, sizeof(buf)); - result = PyString_FromString(buf); + result = PyBytes_FromString(buf); if (result == NULL || ! HASTZINFO(self) || self->tzinfo == Py_None) return result; @@ -3248,7 +3248,7 @@ Py_DECREF(result); return NULL; } - PyString_ConcatAndDel(&result, PyString_FromString(buf)); + PyBytes_ConcatAndDel(&result, PyBytes_FromString(buf)); return result; } @@ -3261,7 +3261,7 @@ static char *keywords[] = {"format", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:strftime", keywords, - &PyString_Type, &format)) + &PyBytes_Type, &format)) return NULL; /* Python's strftime does insane things with the year part of the @@ -3360,7 +3360,7 @@ /* Reduce this to a hash of another object. */ if (offset == 0) - temp = PyString_FromStringAndSize((char *)self->data, + temp = PyBytes_FromStringAndSize((char *)self->data, _PyDateTime_TIME_DATASIZE); else { int hour; @@ -3448,7 +3448,7 @@ PyObject *basestate; PyObject *result = NULL; - basestate = PyString_FromStringAndSize((char *)self->data, + basestate = PyBytes_FromStringAndSize((char *)self->data, _PyDateTime_TIME_DATASIZE); if (basestate != NULL) { if (! HASTZINFO(self) || self->tzinfo == Py_None) @@ -3635,9 +3635,9 @@ /* Check for invocation from pickle with __getstate__ state */ if (PyTuple_GET_SIZE(args) >= 1 && PyTuple_GET_SIZE(args) <= 2 && - PyString_Check(state = PyTuple_GET_ITEM(args, 0)) && - PyString_GET_SIZE(state) == _PyDateTime_DATETIME_DATASIZE && - MONTH_IS_SANE(PyString_AS_STRING(state)[2])) + PyBytes_Check(state = PyTuple_GET_ITEM(args, 0)) && + PyBytes_GET_SIZE(state) == _PyDateTime_DATETIME_DATASIZE && + MONTH_IS_SANE(PyBytes_AS_STRING(state)[2])) { PyDateTime_DateTime *me; char aware; @@ -3653,7 +3653,7 @@ aware = (char)(tzinfo != Py_None); me = (PyDateTime_DateTime *) (type->tp_alloc(type , aware)); if (me != NULL) { - char *pdata = PyString_AS_STRING(state); + char *pdata = PyBytes_AS_STRING(state); memcpy(me->data, pdata, _PyDateTime_DATETIME_DATASIZE); me->hashcode = -1; @@ -4162,7 +4162,7 @@ GET_YEAR(self), GET_MONTH(self), GET_DAY(self), DATE_GET_HOUR(self), DATE_GET_MINUTE(self)); } - baserepr = PyString_FromString(buffer); + baserepr = PyBytes_FromString(buffer); if (baserepr == NULL || ! HASTZINFO(self)) return baserepr; return append_keyword_tzinfo(baserepr, self->tzinfo); @@ -4190,7 +4190,7 @@ assert(cp != NULL); *cp++ = sep; isoformat_time(self, cp, sizeof(buffer) - (cp - buffer)); - result = PyString_FromString(buffer); + result = PyBytes_FromString(buffer); if (result == NULL || ! HASTZINFO(self)) return result; @@ -4200,7 +4200,7 @@ Py_DECREF(result); return NULL; } - PyString_ConcatAndDel(&result, PyString_FromString(buffer)); + PyBytes_ConcatAndDel(&result, PyBytes_FromString(buffer)); return result; } @@ -4306,7 +4306,7 @@ /* Reduce this to a hash of another object. */ if (n == OFFSET_NAIVE) - temp = PyString_FromStringAndSize( + temp = PyBytes_FromStringAndSize( (char *)self->data, _PyDateTime_DATETIME_DATASIZE); else { @@ -4529,7 +4529,7 @@ PyObject *basestate; PyObject *result = NULL; - basestate = PyString_FromStringAndSize((char *)self->data, + basestate = PyBytes_FromStringAndSize((char *)self->data, _PyDateTime_DATETIME_DATASIZE); if (basestate != NULL) { if (! HASTZINFO(self) || self->tzinfo == Py_None) Modified: python/branches/tlee-ast-optimize/Modules/dbmmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/dbmmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/dbmmodule.c Sun Jun 1 17:18:10 2008 @@ -104,7 +104,7 @@ drec = dbm_fetch(dp->di_dbm, krec); if ( drec.dptr == 0 ) { PyErr_SetString(PyExc_KeyError, - PyString_AS_STRING((PyStringObject *)key)); + PyBytes_AS_STRING((PyBytesObject *)key)); return NULL; } if ( dbm_error(dp->di_dbm) ) { @@ -112,7 +112,7 @@ PyErr_SetString(DbmError, ""); return NULL; } - return PyString_FromStringAndSize(drec.dptr, drec.dsize); + return PyBytes_FromStringAndSize(drec.dptr, drec.dsize); } static int @@ -136,7 +136,7 @@ if ( dbm_delete(dp->di_dbm, krec) < 0 ) { dbm_clearerr(dp->di_dbm); PyErr_SetString(PyExc_KeyError, - PyString_AS_STRING((PyStringObject *)v)); + PyBytes_AS_STRING((PyBytesObject *)v)); return -1; } } else { @@ -166,7 +166,7 @@ { datum key, val; - if (PyString_AsStringAndSize(v, (char **)&key.dptr, + if (PyBytes_AsStringAndSize(v, (char **)&key.dptr, (Py_ssize_t *)&key.dsize)) { return -1; } @@ -222,7 +222,7 @@ return NULL; for (key = dbm_firstkey(dp->di_dbm); key.dptr; key = dbm_nextkey(dp->di_dbm)) { - item = PyString_FromStringAndSize(key.dptr, key.dsize); + item = PyBytes_FromStringAndSize(key.dptr, key.dsize); if (item == NULL) { Py_DECREF(v); return NULL; @@ -269,7 +269,7 @@ check_dbmobject_open(dp); val = dbm_fetch(dp->di_dbm, key); if (val.dptr != NULL) - return PyString_FromStringAndSize(val.dptr, val.dsize); + return PyBytes_FromStringAndSize(val.dptr, val.dsize); else { Py_INCREF(defvalue); return defvalue; @@ -292,16 +292,16 @@ check_dbmobject_open(dp); val = dbm_fetch(dp->di_dbm, key); if (val.dptr != NULL) - return PyString_FromStringAndSize(val.dptr, val.dsize); + return PyBytes_FromStringAndSize(val.dptr, val.dsize); if (defvalue == NULL) { - defvalue = PyString_FromStringAndSize(NULL, 0); + defvalue = PyBytes_FromStringAndSize(NULL, 0); if (defvalue == NULL) return NULL; } else Py_INCREF(defvalue); - val.dptr = PyString_AS_STRING(defvalue); - val.dsize = PyString_GET_SIZE(defvalue); + val.dptr = PyBytes_AS_STRING(defvalue); + val.dsize = PyBytes_GET_SIZE(defvalue); if (dbm_store(dp->di_dbm, key, val, DBM_INSERT) < 0) { dbm_clearerr(dp->di_dbm); PyErr_SetString(DbmError, "cannot add item to database"); @@ -404,7 +404,7 @@ d = PyModule_GetDict(m); if (DbmError == NULL) DbmError = PyErr_NewException("dbm.error", NULL, NULL); - s = PyString_FromString(which_dbm); + s = PyBytes_FromString(which_dbm); if (s != NULL) { PyDict_SetItemString(d, "library", s); Py_DECREF(s); Modified: python/branches/tlee-ast-optimize/Modules/dlmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/dlmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/dlmodule.c Sun Jun 1 17:18:10 2008 @@ -58,8 +58,8 @@ { char *name; PyUnivPtr *func; - if (PyString_Check(args)) { - name = PyString_AS_STRING(args); + if (PyBytes_Check(args)) { + name = PyBytes_AS_STRING(args); } else { PyErr_Format(PyExc_TypeError, "expected string, found %.200s", Py_TYPE(args)->tp_name); @@ -88,14 +88,14 @@ return NULL; } name = PyTuple_GetItem(args, 0); - if (!PyString_Check(name)) { + if (!PyBytes_Check(name)) { PyErr_SetString(PyExc_TypeError, "function name must be a string"); return NULL; } func = (long (*)(long, long, long, long, long, long, long, long, long, long)) - dlsym(xp->dl_handle, PyString_AsString(name)); + dlsym(xp->dl_handle, PyBytes_AsString(name)); if (func == NULL) { PyErr_SetString(PyExc_ValueError, dlerror()); return NULL; @@ -109,8 +109,8 @@ PyObject *v = PyTuple_GetItem(args, i); if (PyInt_Check(v)) alist[i-1] = PyInt_AsLong(v); - else if (PyString_Check(v)) - alist[i-1] = (long)PyString_AsString(v); + else if (PyBytes_Check(v)) + alist[i-1] = (long)PyBytes_AsString(v); else if (v == Py_None) alist[i-1] = (long) ((char *)NULL); else { Modified: python/branches/tlee-ast-optimize/Modules/errnomodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/errnomodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/errnomodule.c Sun Jun 1 17:18:10 2008 @@ -21,7 +21,7 @@ static void _inscode(PyObject *d, PyObject *de, char *name, int code) { - PyObject *u = PyString_FromString(name); + PyObject *u = PyBytes_FromString(name); PyObject *v = PyInt_FromLong((long) code); /* Don't bother checking for errors; they'll be caught at the end Modified: python/branches/tlee-ast-optimize/Modules/fcntlmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/fcntlmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/fcntlmodule.c Sun Jun 1 17:18:10 2008 @@ -55,7 +55,7 @@ PyErr_SetFromErrno(PyExc_IOError); return NULL; } - return PyString_FromStringAndSize(buf, len); + return PyBytes_FromStringAndSize(buf, len); } PyErr_Clear(); @@ -164,7 +164,7 @@ return PyInt_FromLong(ret); } else { - return PyString_FromStringAndSize(buf, len); + return PyBytes_FromStringAndSize(buf, len); } } @@ -185,7 +185,7 @@ PyErr_SetFromErrno(PyExc_IOError); return NULL; } - return PyString_FromStringAndSize(buf, len); + return PyBytes_FromStringAndSize(buf, len); } PyErr_Clear(); Modified: python/branches/tlee-ast-optimize/Modules/flmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/flmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/flmodule.c Sun Jun 1 17:18:10 2008 @@ -324,7 +324,7 @@ /* "label" is an exception, getmember only works for char pointers, not for char arrays */ if (strcmp(name, "label") == 0) - return PyString_FromString(g->ob_generic->label); + return PyBytes_FromString(g->ob_generic->label); return PyMember_Get((char *)g->ob_generic, generic_memberlist, name); } @@ -343,12 +343,12 @@ /* "label" is an exception: setmember doesn't set strings; and FORMS wants you to call a function to set the label */ if (strcmp(name, "label") == 0) { - if (!PyString_Check(v)) { + if (!PyBytes_Check(v)) { PyErr_SetString(PyExc_TypeError, "label attr must be string"); return -1; } - fl_set_object_label(g->ob_generic, PyString_AsString(v)); + fl_set_object_label(g->ob_generic, PyBytes_AsString(v)); return 0; } @@ -369,7 +369,7 @@ char buf[100]; PyOS_snprintf(buf, sizeof(buf), "", g, g->ob_generic->objclass); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static PyTypeObject GenericObjecttype = { @@ -530,7 +530,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString (str); + return PyBytes_FromString (str); } /* int func (object) */ @@ -628,7 +628,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString (str); + return PyBytes_FromString (str); } static PyObject * @@ -1594,7 +1594,7 @@ char buf[100]; PyOS_snprintf(buf, sizeof(buf), "", f, f->ob_form->window); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static PyTypeObject Formtype = { @@ -2027,7 +2027,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString(str); + return PyBytes_FromString(str); } static PyObject * @@ -2046,7 +2046,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString(str); + return PyBytes_FromString(str); } @@ -2061,7 +2061,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString(str); + return PyBytes_FromString(str); } static PyObject * Modified: python/branches/tlee-ast-optimize/Modules/fmmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/fmmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/fmmodule.c Sun Jun 1 17:18:10 2008 @@ -66,7 +66,7 @@ PyErr_SetString(PyExc_RuntimeError, "error in fmgetfontname"); return NULL; } - return PyString_FromStringAndSize(fontname, len); + return PyBytes_FromStringAndSize(fontname, len); } static PyObject * @@ -79,7 +79,7 @@ PyErr_SetString(PyExc_RuntimeError, "error in fmgetcomment"); return NULL; } - return PyString_FromStringAndSize(comment, len); + return PyBytes_FromStringAndSize(comment, len); } static PyObject * @@ -200,7 +200,7 @@ PyObject *v; if (fontlist == NULL) return; - v = PyString_FromString(fontname); + v = PyBytes_FromString(fontname); if (v == NULL) err = -1; else { @@ -240,7 +240,7 @@ static PyObject * fm_fontpath(PyObject *self) { - return PyString_FromString(fmfontpath()); + return PyBytes_FromString(fmfontpath()); } static PyMethodDef fm_methods[] = { Modified: python/branches/tlee-ast-optimize/Modules/gcmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/gcmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/gcmodule.c Sun Jun 1 17:18:10 2008 @@ -639,8 +639,8 @@ char *cname; /* simple version of instance_repr */ PyObject *classname = inst->in_class->cl_name; - if (classname != NULL && PyString_Check(classname)) - cname = PyString_AsString(classname); + if (classname != NULL && PyBytes_Check(classname)) + cname = PyBytes_AsString(classname); else cname = "?"; PySys_WriteStderr("gc: %.100s <%.100s instance at %p>\n", @@ -754,7 +754,7 @@ double t1 = 0.0; if (delstr == NULL) { - delstr = PyString_InternFromString("__del__"); + delstr = PyBytes_InternFromString("__del__"); if (delstr == NULL) Py_FatalError("gc couldn't allocate \"__del__\""); } @@ -898,7 +898,7 @@ if (PyErr_Occurred()) { if (gc_str == NULL) - gc_str = PyString_FromString("garbage collection"); + gc_str = PyBytes_FromString("garbage collection"); PyErr_WriteUnraisable(gc_str); Py_FatalError("unexpected exception during garbage collection"); } Modified: python/branches/tlee-ast-optimize/Modules/gdbmmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/gdbmmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/gdbmmodule.c Sun Jun 1 17:18:10 2008 @@ -128,10 +128,10 @@ drec = gdbm_fetch(dp->di_dbm, krec); if (drec.dptr == 0) { PyErr_SetString(PyExc_KeyError, - PyString_AS_STRING((PyStringObject *)key)); + PyBytes_AS_STRING((PyBytesObject *)key)); return NULL; } - v = PyString_FromStringAndSize(drec.dptr, drec.dsize); + v = PyBytes_FromStringAndSize(drec.dptr, drec.dsize); free(drec.dptr); return v; } @@ -155,7 +155,7 @@ if (w == NULL) { if (gdbm_delete(dp->di_dbm, krec) < 0) { PyErr_SetString(PyExc_KeyError, - PyString_AS_STRING((PyStringObject *)v)); + PyBytes_AS_STRING((PyBytesObject *)v)); return -1; } } @@ -188,14 +188,14 @@ "GDBM object has already been closed"); return -1; } - if (!PyString_Check(arg)) { + if (!PyBytes_Check(arg)) { PyErr_Format(PyExc_TypeError, "gdbm key must be string, not %.100s", arg->ob_type->tp_name); return -1; } - key.dptr = PyString_AS_STRING(arg); - key.dsize = PyString_GET_SIZE(arg); + key.dptr = PyBytes_AS_STRING(arg); + key.dsize = PyBytes_GET_SIZE(arg); return gdbm_exists(dp->di_dbm, key); } @@ -255,7 +255,7 @@ key = gdbm_firstkey(dp->di_dbm); while (key.dptr) { - item = PyString_FromStringAndSize(key.dptr, key.dsize); + item = PyBytes_FromStringAndSize(key.dptr, key.dsize); if (item == NULL) { free(key.dptr); Py_DECREF(v); @@ -306,7 +306,7 @@ check_dbmobject_open(dp); key = gdbm_firstkey(dp->di_dbm); if (key.dptr) { - v = PyString_FromStringAndSize(key.dptr, key.dsize); + v = PyBytes_FromStringAndSize(key.dptr, key.dsize); free(key.dptr); return v; } @@ -338,7 +338,7 @@ check_dbmobject_open(dp); nextkey = gdbm_nextkey(dp->di_dbm, key); if (nextkey.dptr) { - v = PyString_FromStringAndSize(nextkey.dptr, nextkey.dsize); + v = PyBytes_FromStringAndSize(nextkey.dptr, nextkey.dsize); free(nextkey.dptr); return v; } @@ -541,7 +541,7 @@ DbmError = PyErr_NewException("gdbm.error", NULL, NULL); if (DbmError != NULL) { PyDict_SetItemString(d, "error", DbmError); - s = PyString_FromString(dbmmodule_open_flags); + s = PyBytes_FromString(dbmmodule_open_flags); PyDict_SetItemString(d, "open_flags", s); Py_DECREF(s); } Modified: python/branches/tlee-ast-optimize/Modules/glmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/glmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/glmodule.c Sun Jun 1 17:18:10 2008 @@ -593,7 +593,7 @@ #if 0 /* Don't check this, it breaks experiments with pixmode(PM_SIZE, ...) */ pixcount = (long)(x2+1-x1) * (long)(y2+1-y1); - if (!PyString_Check(s) || PyString_Size(s) != pixcount*sizeof(long)) { + if (!PyBytes_Check(s) || PyBytes_Size(s) != pixcount*sizeof(long)) { PyErr_SetString(PyExc_RuntimeError, "string arg to lrectwrite has wrong size"); return NULL; @@ -623,10 +623,10 @@ if (!PyArg_GetShort(args, 4, 3, &y2)) return NULL; pixcount = (long)(x2+1-x1) * (long)(y2+1-y1); - parray = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long)); + parray = PyBytes_FromStringAndSize((char *)NULL, pixcount*sizeof(long)); if (parray == NULL) return NULL; /* No memory */ - lrectread(x1, y1, x2, y2, (unsigned long *) PyString_AsString(parray)); + lrectread(x1, y1, x2, y2, (unsigned long *) PyBytes_AsString(parray)); return parray; } @@ -642,10 +642,10 @@ if ( !PyArg_Parse(args, "hhhhl", &x1, &y1, &x2, &y2, &hints) ) return 0; size = (long)(x2+1-x1) * (long)(y2+1-y1); - rv = PyString_FromStringAndSize((char *)NULL, size*sizeof(long)); + rv = PyBytes_FromStringAndSize((char *)NULL, size*sizeof(long)); if ( rv == NULL ) return NULL; - parray = (unsigned long *)PyString_AsString(rv); + parray = (unsigned long *)PyBytes_AsString(rv); size_ret = readdisplay(x1, y1, x2, y2, parray, hints); if ( size_ret != size ) { printf("gl_readdisplay: got %ld pixels, expected %ld\n", @@ -700,16 +700,16 @@ pixcount = width*height; packedcount = ((width+packfactor-1)/packfactor) * ((height+packfactor-1)/packfactor); - if (PyString_Size(unpacked) != pixcount*sizeof(long)) { + if (PyBytes_Size(unpacked) != pixcount*sizeof(long)) { PyErr_SetString(PyExc_RuntimeError, "string arg to packrect has wrong size"); return NULL; } - packed = PyString_FromStringAndSize((char *)NULL, packedcount); + packed = PyBytes_FromStringAndSize((char *)NULL, packedcount); if (packed == NULL) return NULL; - parray = (unsigned long *) PyString_AsString(unpacked); - p = (unsigned char *) PyString_AsString(packed); + parray = (unsigned long *) PyBytes_AsString(unpacked); + p = (unsigned char *) PyBytes_AsString(packed); for (y = 0; y < height; y += packfactor, parray += packfactor*width) { for (x = 0; x < width; x += packfactor) { pixel = parray[x]; @@ -758,16 +758,16 @@ pixcount = width*height; packedcount = ((width+packfactor-1)/packfactor) * ((height+packfactor-1)/packfactor); - if (PyString_Size(packed) != packedcount) { + if (PyBytes_Size(packed) != packedcount) { PyErr_SetString(PyExc_RuntimeError, "string arg to unpackrect has wrong size"); return NULL; } - unpacked = PyString_FromStringAndSize((char *)NULL, pixcount*sizeof(long)); + unpacked = PyBytes_FromStringAndSize((char *)NULL, pixcount*sizeof(long)); if (unpacked == NULL) return NULL; - parray = (unsigned long *) PyString_AsString(unpacked); - p = (unsigned char *) PyString_AsString(packed); + parray = (unsigned long *) PyBytes_AsString(unpacked); + p = (unsigned char *) PyBytes_AsString(packed); if (packfactor == 1 && width*height > 0) { /* Just expand bytes to longs */ register int x = width * height; @@ -799,7 +799,7 @@ { char buf[20]; gversion(buf); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } Modified: python/branches/tlee-ast-optimize/Modules/grpmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/grpmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/grpmodule.c Sun Jun 1 17:18:10 2008 @@ -47,7 +47,7 @@ return NULL; } for (member = p->gr_mem; *member != NULL; member++) { - PyObject *x = PyString_FromString(*member); + PyObject *x = PyBytes_FromString(*member); if (x == NULL || PyList_Append(w, x) != 0) { Py_XDECREF(x); Py_DECREF(w); @@ -58,13 +58,13 @@ } #define SET(i,val) PyStructSequence_SET_ITEM(v, i, val) - SET(setIndex++, PyString_FromString(p->gr_name)); + SET(setIndex++, PyBytes_FromString(p->gr_name)); #ifdef __VMS SET(setIndex++, Py_None); Py_INCREF(Py_None); #else if (p->gr_passwd) - SET(setIndex++, PyString_FromString(p->gr_passwd)); + SET(setIndex++, PyBytes_FromString(p->gr_passwd)); else { SET(setIndex++, Py_None); Py_INCREF(Py_None); @@ -113,7 +113,7 @@ py_str_name = PyObject_Str(pyo_name); if (!py_str_name) return NULL; - name = PyString_AS_STRING(py_str_name); + name = PyBytes_AS_STRING(py_str_name); if ((p = getgrnam(name)) == NULL) { PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %s", name); Modified: python/branches/tlee-ast-optimize/Modules/imageop.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/imageop.c (original) +++ python/branches/tlee-ast-optimize/Modules/imageop.c Sun Jun 1 17:18:10 2008 @@ -54,7 +54,7 @@ return 1; if (bcos == NULL) { /* cache string object for future use */ - bcos = PyString_FromString("backward_compatible"); + bcos = PyBytes_FromString("backward_compatible"); if (bcos == NULL) return 1; } @@ -97,11 +97,11 @@ xstep = (newx1 < newx2)? 1 : -1; ystep = (newy1 < newy2)? 1 : -1; - rv = PyString_FromStringAndSize(NULL, + rv = PyBytes_FromStringAndSize(NULL, (abs(newx2-newx1)+1)*(abs(newy2-newy1)+1)*size); if ( rv == 0 ) return 0; - ncp = (char *)PyString_AsString(rv); + ncp = (char *)PyBytes_AsString(rv); nsp = (short *)ncp; nlp = (Py_Int32 *)ncp; newy2 += ystep; @@ -150,10 +150,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, newx*newy*size); + rv = PyBytes_FromStringAndSize(NULL, newx*newy*size); if ( rv == 0 ) return 0; - ncp = (char *)PyString_AsString(rv); + ncp = (char *)PyBytes_AsString(rv); nsp = (short *)ncp; nlp = (Py_Int32 *)ncp; for( iy = 0; iy < newy; iy++ ) { @@ -195,10 +195,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, len); + rv = PyBytes_FromStringAndSize(NULL, len); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); if ( width == 1 ) { memcpy(ncp, cp, maxx); /* Copy first line */ @@ -245,10 +245,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, (len+7)/8); + rv = PyBytes_FromStringAndSize(NULL, (len+7)/8); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); bit = 0x80; ovalue = 0; @@ -286,10 +286,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, (len+1)/2); + rv = PyBytes_FromStringAndSize(NULL, (len+1)/2); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); pos = 0; ovalue = 0; for ( i=0; i < len; i++ ) { @@ -325,10 +325,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, (len+3)/4); + rv = PyBytes_FromStringAndSize(NULL, (len+3)/4); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); pos = 0; ovalue = 0; for ( i=0; i < len; i++ ) { @@ -363,10 +363,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, (len+7)/8); + rv = PyBytes_FromStringAndSize(NULL, (len+7)/8); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); bit = 0x80; ovalue = 0; @@ -409,10 +409,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, (len+3)/4); + rv = PyBytes_FromStringAndSize(NULL, (len+3)/4); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); pos = 1; ovalue = 0; for ( i=0; i < len; i++ ) { @@ -449,10 +449,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, nlen); + rv = PyBytes_FromStringAndSize(NULL, nlen); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); bit = 0x80; for ( i=0; i < nlen; i++ ) { @@ -486,10 +486,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, nlen); + rv = PyBytes_FromStringAndSize(NULL, nlen); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); pos = 0; for ( i=0; i < nlen; i++ ) { @@ -522,10 +522,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, nlen); + rv = PyBytes_FromStringAndSize(NULL, nlen); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); pos = 0; for ( i=0; i < nlen; i++ ) { @@ -559,10 +559,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, nlen); + rv = PyBytes_FromStringAndSize(NULL, nlen); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0; i < nlen; i++ ) { /* Bits in source: aaaaaaaa BBbbbbbb GGGggggg RRRrrrrr */ @@ -603,10 +603,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, nlen*4); + rv = PyBytes_FromStringAndSize(NULL, nlen*4); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0; i < nlen; i++ ) { /* Bits in source: RRRBBGGG @@ -653,10 +653,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, nlen); + rv = PyBytes_FromStringAndSize(NULL, nlen); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0; i < nlen; i++ ) { if (backward_compatible) { @@ -698,10 +698,10 @@ return 0; } - rv = PyString_FromStringAndSize(NULL, nlen*4); + rv = PyBytes_FromStringAndSize(NULL, nlen*4); if ( rv == 0 ) return 0; - ncp = (unsigned char *)PyString_AsString(rv); + ncp = (unsigned char *)PyBytes_AsString(rv); for ( i=0; i < nlen; i++ ) { value = *cp++; Modified: python/branches/tlee-ast-optimize/Modules/imgfile.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/imgfile.c (original) +++ python/branches/tlee-ast-optimize/Modules/imgfile.c Sun Jun 1 17:18:10 2008 @@ -130,12 +130,12 @@ } if ( zsize == 3 ) zsize = 4; - rv = PyString_FromStringAndSize((char *)NULL, xsize*ysize*zsize); + rv = PyBytes_FromStringAndSize((char *)NULL, xsize*ysize*zsize); if ( rv == NULL ) { iclose(image); return NULL; } - cdatap = PyString_AsString(rv); + cdatap = PyBytes_AsString(rv); idatap = (long *)cdatap; if (top_to_bottom) { @@ -319,7 +319,7 @@ } if ( zsize == 3 ) zsize = 4; - rv = PyString_FromStringAndSize(NULL, xwtd*ywtd*zsize); + rv = PyBytes_FromStringAndSize(NULL, xwtd*ywtd*zsize); if ( rv == NULL ) { iclose(image); return NULL; @@ -328,7 +328,7 @@ xfac = (float)xsize/(float)xwtd; yfac = (float)ysize/(float)ywtd; PyFPE_END_PROTECT(yfac) - cdatap = PyString_AsString(rv); + cdatap = PyBytes_AsString(rv); idatap = (long *)cdatap; if ( extended ) { Modified: python/branches/tlee-ast-optimize/Modules/itertoolsmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/itertoolsmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/itertoolsmodule.c Sun Jun 1 17:18:10 2008 @@ -2904,12 +2904,12 @@ PyObject *result; if (lz->cnt != PY_SSIZE_T_MAX) - return PyString_FromFormat("count(%zd)", lz->cnt); + return PyBytes_FromFormat("count(%zd)", lz->cnt); cnt_repr = PyObject_Repr(lz->long_cnt); if (cnt_repr == NULL) return NULL; - result = PyString_FromFormat("count(%s)", PyString_AS_STRING(cnt_repr)); + result = PyBytes_FromFormat("count(%s)", PyBytes_AS_STRING(cnt_repr)); Py_DECREF(cnt_repr); return result; } @@ -3221,11 +3221,11 @@ return NULL; if (ro->cnt == -1) - result = PyString_FromFormat("repeat(%s)", - PyString_AS_STRING(objrepr)); + result = PyBytes_FromFormat("repeat(%s)", + PyBytes_AS_STRING(objrepr)); else - result = PyString_FromFormat("repeat(%s, %zd)", - PyString_AS_STRING(objrepr), ro->cnt); + result = PyBytes_FromFormat("repeat(%s, %zd)", + PyBytes_AS_STRING(objrepr), ro->cnt); Py_DECREF(objrepr); return result; } Modified: python/branches/tlee-ast-optimize/Modules/linuxaudiodev.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/linuxaudiodev.c (original) +++ python/branches/tlee-ast-optimize/Modules/linuxaudiodev.c Sun Jun 1 17:18:10 2008 @@ -162,17 +162,17 @@ if (!PyArg_ParseTuple(args, "i:read", &size)) return NULL; - rv = PyString_FromStringAndSize(NULL, size); + rv = PyBytes_FromStringAndSize(NULL, size); if (rv == NULL) return NULL; - cp = PyString_AS_STRING(rv); + cp = PyBytes_AS_STRING(rv); if ((count = read(self->x_fd, cp, size)) < 0) { PyErr_SetFromErrno(LinuxAudioError); Py_DECREF(rv); return NULL; } self->x_icount += count; - _PyString_Resize(&rv, count); + _PyBytes_Resize(&rv, count); return rv; } Modified: python/branches/tlee-ast-optimize/Modules/main.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/main.c (original) +++ python/branches/tlee-ast-optimize/Modules/main.c Sun Jun 1 17:18:10 2008 @@ -99,6 +99,7 @@ PYTHONHOME : alternate directory (or %c).\n\ The default module search path uses %s.\n\ PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\ +PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ "; @@ -195,7 +196,7 @@ { PyObject *argv0 = NULL, *importer = NULL; - if ((argv0 = PyString_FromString(filename)) && + if ((argv0 = PyBytes_FromString(filename)) && (importer = PyImport_GetImporter(argv0)) && (importer->ob_type != &PyNullImporter_Type)) { Modified: python/branches/tlee-ast-optimize/Modules/mathmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/mathmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/mathmodule.c Sun Jun 1 17:18:10 2008 @@ -318,14 +318,20 @@ value semantics across iterations (i.e. handling -Inf + Inf). Note 2: No provision is made for intermediate overflow handling; - therefore, sum([1e+308, 1e-308, 1e+308]) returns result 1e+308 while + therefore, sum([1e+308, 1e-308, 1e+308]) returns 1e+308 while sum([1e+308, 1e+308, 1e-308]) raises an OverflowError due to the overflow of the first partial sum. - Note 3: Aggressively optimizing compilers can potentially eliminate the - residual values needed for accurate summation. For instance, the statements - "hi = x + y; lo = y - (hi - x);" could be mis-transformed to - "hi = x + y; lo = 0.0;" which defeats the computation of residuals. + Note 3: The itermediate values lo, yr, and hi are declared volatile so + aggressive compilers won't algebraicly reduce lo to always be exactly 0.0. + Also, the volatile declaration forces the values to be stored in memory as + regular doubles instead of extended long precision (80-bit) values. This + prevents double rounding because any addition or substraction of two doubles + can be resolved exactly into double-sized hi and lo values. As long as the + hi value gets forced into a double before yr and lo are computed, the extra + bits in downstream extended precision operations (x87 for example) will be + exactly zero and therefore can be losslessly stored back into a double, + thereby preventing double rounding. Note 4: A similar implementation is in Modules/cmathmodule.c. Be sure to update both when making changes. @@ -402,7 +408,8 @@ { PyObject *item, *iter, *sum = NULL; Py_ssize_t i, j, n = 0, m = NUM_PARTIALS; - double x, y, hi, lo=0.0, ps[NUM_PARTIALS], *p = ps; + double x, y, t, ps[NUM_PARTIALS], *p = ps; + volatile double hi, yr, lo; iter = PyObject_GetIter(seq); if (iter == NULL) @@ -428,10 +435,12 @@ for (i = j = 0; j < n; j++) { /* for y in partials */ y = p[j]; + if (fabs(x) < fabs(y)) { + t = x; x = y; y = t; + } hi = x + y; - lo = fabs(x) < fabs(y) - ? x - (hi - y) - : y - (hi - x); + yr = hi - x; + lo = y - yr; if (lo != 0.0) p[i++] = lo; x = hi; @@ -451,38 +460,41 @@ } } + hi = 0.0; if (n > 0) { hi = p[--n]; if (Py_IS_FINITE(hi)) { /* sum_exact(ps, hi) from the top, stop when the sum becomes inexact. */ while (n > 0) { - x = p[--n]; - y = hi; + x = hi; + y = p[--n]; + assert(fabs(y) < fabs(x)); hi = x + y; - assert(fabs(x) < fabs(y)); - lo = x - (hi - y); + yr = hi - x; + lo = y - yr; if (lo != 0.0) break; } - /* Little dance to allow half-even rounding across multiple partials. - Needed so that sum([1e-16, 1, 1e16]) will round-up to two instead - of down to zero (the 1e16 makes the 1 slightly closer to two). */ + /* Make half-even rounding work across multiple partials. Needed + so that sum([1e-16, 1, 1e16]) will round-up the last digit to + two instead of down to zero (the 1e-16 makes the 1 slightly + closer to two). With a potential 1 ULP rounding error fixed-up, + math.sum() can guarantee commutativity. */ if (n > 0 && ((lo < 0.0 && p[n-1] < 0.0) || (lo > 0.0 && p[n-1] > 0.0))) { y = lo * 2.0; x = hi + y; - if (y == (x - hi)) + yr = x - hi; + if (y == yr) hi = x; } } - else { /* raise corresponding error */ + else { /* raise exception corresponding to a special value */ errno = Py_IS_NAN(hi) ? EDOM : ERANGE; if (is_error(hi)) goto _sum_error; } } - else /* default */ - hi = 0.0; sum = PyFloat_FromDouble(hi); _sum_error: Modified: python/branches/tlee-ast-optimize/Modules/md5module.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/md5module.c (original) +++ python/branches/tlee-ast-optimize/Modules/md5module.c Sun Jun 1 17:18:10 2008 @@ -80,7 +80,7 @@ mdContext = self->md5; md5_finish(&mdContext, aDigest); - return PyString_FromStringAndSize((char *)aDigest, 16); + return PyBytes_FromStringAndSize((char *)aDigest, 16); } PyDoc_STRVAR(digest_doc, @@ -113,7 +113,7 @@ c = (c>9) ? c+'a'-10 : c + '0'; hexdigest[j++] = c; } - return PyString_FromStringAndSize((char*)hexdigest, 32); + return PyBytes_FromStringAndSize((char*)hexdigest, 32); } @@ -165,7 +165,7 @@ static PyObject * md5_get_name(PyObject *self, void *closure) { - return PyString_FromStringAndSize("MD5", 3); + return PyBytes_FromStringAndSize("MD5", 3); } static PyGetSetDef md5_getseters[] = { Modified: python/branches/tlee-ast-optimize/Modules/mmapmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/mmapmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/mmapmodule.c Sun Jun 1 17:18:10 2008 @@ -222,7 +222,7 @@ else ++eol; /* we're interested in the position after the newline. */ - result = PyString_FromStringAndSize(start, (eol - start)); + result = PyBytes_FromStringAndSize(start, (eol - start)); self->pos += (eol - start); return result; } @@ -700,7 +700,7 @@ PyErr_SetString(PyExc_IndexError, "mmap index out of range"); return NULL; } - return PyString_FromStringAndSize(self->data + i, 1); + return PyBytes_FromStringAndSize(self->data + i, 1); } static PyObject * @@ -718,7 +718,7 @@ else if ((size_t)ihigh > self->size) ihigh = self->size; - return PyString_FromStringAndSize(self->data + ilow, ihigh-ilow); + return PyBytes_FromStringAndSize(self->data + ilow, ihigh-ilow); } static PyObject * @@ -736,7 +736,7 @@ "mmap index out of range"); return NULL; } - return PyString_FromStringAndSize(self->data + i, 1); + return PyBytes_FromStringAndSize(self->data + i, 1); } else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelen; @@ -747,9 +747,9 @@ } if (slicelen <= 0) - return PyString_FromStringAndSize("", 0); + return PyBytes_FromStringAndSize("", 0); else if (step == 1) - return PyString_FromStringAndSize(self->data + start, + return PyBytes_FromStringAndSize(self->data + start, slicelen); else { char *result_buf = (char *)PyMem_Malloc(slicelen); @@ -762,7 +762,7 @@ cur += step, i++) { result_buf[i] = self->data[cur]; } - result = PyString_FromStringAndSize(result_buf, + result = PyBytes_FromStringAndSize(result_buf, slicelen); PyMem_Free(result_buf); return result; @@ -815,19 +815,19 @@ "mmap object doesn't support slice deletion"); return -1; } - if (! (PyString_Check(v)) ) { + if (! (PyBytes_Check(v)) ) { PyErr_SetString(PyExc_IndexError, "mmap slice assignment must be a string"); return -1; } - if (PyString_Size(v) != (ihigh - ilow)) { + if (PyBytes_Size(v) != (ihigh - ilow)) { PyErr_SetString(PyExc_IndexError, "mmap slice assignment is wrong size"); return -1; } if (!is_writeable(self)) return -1; - buf = PyString_AsString(v); + buf = PyBytes_AsString(v); memcpy(self->data + ilow, buf, ihigh-ilow); return 0; } @@ -847,14 +847,14 @@ "mmap object doesn't support item deletion"); return -1; } - if (! (PyString_Check(v) && PyString_Size(v)==1) ) { + if (! (PyBytes_Check(v) && PyBytes_Size(v)==1) ) { PyErr_SetString(PyExc_IndexError, "mmap assignment must be single-character string"); return -1; } if (!is_writeable(self)) return -1; - buf = PyString_AsString(v); + buf = PyBytes_AsString(v); self->data[i] = buf[0]; return 0; } @@ -882,14 +882,14 @@ "mmap object doesn't support item deletion"); return -1; } - if (!PyString_Check(value) || PyString_Size(value) != 1) { + if (!PyBytes_Check(value) || PyBytes_Size(value) != 1) { PyErr_SetString(PyExc_IndexError, "mmap assignment must be single-character string"); return -1; } if (!is_writeable(self)) return -1; - buf = PyString_AsString(value); + buf = PyBytes_AsString(value); self->data[i] = buf[0]; return 0; } @@ -906,12 +906,12 @@ "mmap object doesn't support slice deletion"); return -1; } - if (!PyString_Check(value)) { + if (!PyBytes_Check(value)) { PyErr_SetString(PyExc_IndexError, "mmap slice assignment must be a string"); return -1; } - if (PyString_Size(value) != slicelen) { + if (PyBytes_Size(value) != slicelen) { PyErr_SetString(PyExc_IndexError, "mmap slice assignment is wrong size"); return -1; @@ -922,7 +922,7 @@ if (slicelen == 0) return 0; else if (step == 1) { - const char *buf = PyString_AsString(value); + const char *buf = PyBytes_AsString(value); if (buf == NULL) return -1; @@ -931,7 +931,7 @@ } else { Py_ssize_t cur, i; - const char *buf = PyString_AsString(value); + const char *buf = PyBytes_AsString(value); if (buf == NULL) return -1; Modified: python/branches/tlee-ast-optimize/Modules/nismodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/nismodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/nismodule.c Sun Jun 1 17:18:10 2008 @@ -115,8 +115,8 @@ if (invallen > 0 && inval[invallen-1] == '\0') invallen--; } - key = PyString_FromStringAndSize(inkey, inkeylen); - val = PyString_FromStringAndSize(inval, invallen); + key = PyBytes_FromStringAndSize(inkey, inkeylen); + val = PyBytes_FromStringAndSize(inval, invallen); if (key == NULL || val == NULL) { /* XXX error -- don't know how to handle */ PyErr_Clear(); @@ -146,7 +146,7 @@ if ((err = yp_get_default_domain(&domain)) != 0) return nis_error(err); - res = PyString_FromStringAndSize (domain, strlen(domain)); + res = PyBytes_FromStringAndSize (domain, strlen(domain)); return res; } @@ -178,7 +178,7 @@ len--; if (err != 0) return nis_error(err); - res = PyString_FromStringAndSize (match, len); + res = PyBytes_FromStringAndSize (match, len); free (match); return res; } @@ -398,7 +398,7 @@ if ((list = PyList_New(0)) == NULL) return NULL; for (maps = maps; maps; maps = maps->next) { - PyObject *str = PyString_FromString(maps->map); + PyObject *str = PyBytes_FromString(maps->map); if (!str || PyList_Append(list, str) < 0) { Py_DECREF(list); Modified: python/branches/tlee-ast-optimize/Modules/operator.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/operator.c (original) +++ python/branches/tlee-ast-optimize/Modules/operator.c Sun Jun 1 17:18:10 2008 @@ -508,19 +508,19 @@ } #endif - if (!PyString_Check(attr)) { + if (!PyBytes_Check(attr)) { PyErr_SetString(PyExc_TypeError, "attribute name must be a string"); return NULL; } - s = PyString_AS_STRING(attr); + s = PyBytes_AS_STRING(attr); Py_INCREF(obj); for (;;) { PyObject *newobj, *str; p = strchr(s, '.'); - str = p ? PyString_FromStringAndSize(s, (p-s)) : - PyString_FromString(s); + str = p ? PyBytes_FromStringAndSize(s, (p-s)) : + PyBytes_FromString(s); if (str == NULL) { Py_DECREF(obj); return NULL; Modified: python/branches/tlee-ast-optimize/Modules/ossaudiodev.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/ossaudiodev.c (original) +++ python/branches/tlee-ast-optimize/Modules/ossaudiodev.c Sun Jun 1 17:18:10 2008 @@ -366,10 +366,10 @@ if (!PyArg_ParseTuple(args, "i:read", &size)) return NULL; - rv = PyString_FromStringAndSize(NULL, size); + rv = PyBytes_FromStringAndSize(NULL, size); if (rv == NULL) return NULL; - cp = PyString_AS_STRING(rv); + cp = PyBytes_AS_STRING(rv); Py_BEGIN_ALLOW_THREADS count = read(self->fd, cp, size); @@ -381,7 +381,7 @@ return NULL; } self->icount += count; - _PyString_Resize(&rv, count); + _PyBytes_Resize(&rv, count); return rv; } @@ -811,20 +811,20 @@ Py_INCREF(rval); } else if (strcmp(name, "name") == 0) { - rval = PyString_FromString(self->devicename); + rval = PyBytes_FromString(self->devicename); } else if (strcmp(name, "mode") == 0) { /* No need for a "default" in this switch: from newossobject(), self->mode can only be one of these three values. */ switch(self->mode) { case O_RDONLY: - rval = PyString_FromString("r"); + rval = PyBytes_FromString("r"); break; case O_RDWR: - rval = PyString_FromString("rw"); + rval = PyBytes_FromString("rw"); break; case O_WRONLY: - rval = PyString_FromString("w"); + rval = PyBytes_FromString("w"); break; } } @@ -913,12 +913,12 @@ if (labels == NULL || names == NULL) goto error2; for (i = 0; i < num_controls; i++) { - s = PyString_FromString(control_labels[i]); + s = PyBytes_FromString(control_labels[i]); if (s == NULL) goto error2; PyList_SET_ITEM(labels, i, s); - s = PyString_FromString(control_names[i]); + s = PyBytes_FromString(control_names[i]); if (s == NULL) goto error2; PyList_SET_ITEM(names, i, s); Modified: python/branches/tlee-ast-optimize/Modules/parsermodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/parsermodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/parsermodule.c Sun Jun 1 17:18:10 2008 @@ -105,14 +105,14 @@ } if (TYPE(n) == encoding_decl) - (void) addelem(v, i+1, PyString_FromString(STR(n))); + (void) addelem(v, i+1, PyBytes_FromString(STR(n))); return (v); } else if (ISTERMINAL(TYPE(n))) { PyObject *result = mkseq(2 + lineno + col_offset); if (result != NULL) { (void) addelem(result, 0, PyInt_FromLong(TYPE(n))); - (void) addelem(result, 1, PyString_FromString(STR(n))); + (void) addelem(result, 1, PyBytes_FromString(STR(n))); if (lineno == 1) (void) addelem(result, 2, PyInt_FromLong(n->n_lineno)); if (col_offset == 1) @@ -689,7 +689,7 @@ temp = PySequence_GetItem(elem, 1); if (temp == NULL) return 0; - if (!PyString_Check(temp)) { + if (!PyBytes_Check(temp)) { PyErr_Format(parser_error, "second item in terminal node must be a string," " found %s", @@ -714,10 +714,10 @@ Py_DECREF(o); } } - len = PyString_GET_SIZE(temp) + 1; + len = PyBytes_GET_SIZE(temp) + 1; strn = (char *)PyObject_MALLOC(len); if (strn != NULL) - (void) memcpy(strn, PyString_AS_STRING(temp), len); + (void) memcpy(strn, PyBytes_AS_STRING(temp), len); Py_DECREF(temp); } else if (!ISNONTERMINAL(type)) { @@ -800,10 +800,10 @@ } if (res && encoding) { Py_ssize_t len; - len = PyString_GET_SIZE(encoding) + 1; + len = PyBytes_GET_SIZE(encoding) + 1; res->n_str = (char *)PyObject_MALLOC(len); if (res->n_str != NULL) - (void) memcpy(res->n_str, PyString_AS_STRING(encoding), len); + (void) memcpy(res->n_str, PyBytes_AS_STRING(encoding), len); Py_DECREF(encoding); Py_DECREF(tuple); } Modified: python/branches/tlee-ast-optimize/Modules/posixmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/posixmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/posixmodule.c Sun Jun 1 17:18:10 2008 @@ -375,12 +375,12 @@ char *p = strchr(*e, '='); if (p == NULL) continue; - k = PyString_FromStringAndSize(*e, (int)(p-*e)); + k = PyBytes_FromStringAndSize(*e, (int)(p-*e)); if (k == NULL) { PyErr_Clear(); continue; } - v = PyString_FromString(p+1); + v = PyBytes_FromString(p+1); if (v == NULL) { PyErr_Clear(); Py_DECREF(k); @@ -400,13 +400,13 @@ rc = DosQueryExtLIBPATH(buffer, BEGIN_LIBPATH); if (rc == NO_ERROR) { /* (not a type, envname is NOT 'BEGIN_LIBPATH') */ - PyObject *v = PyString_FromString(buffer); + PyObject *v = PyBytes_FromString(buffer); PyDict_SetItemString(d, "BEGINLIBPATH", v); Py_DECREF(v); } rc = DosQueryExtLIBPATH(buffer, END_LIBPATH); if (rc == NO_ERROR) { /* (not a typo, envname is NOT 'END_LIBPATH') */ - PyObject *v = PyString_FromString(buffer); + PyObject *v = PyBytes_FromString(buffer); PyDict_SetItemString(d, "ENDLIBPATH", v); Py_DECREF(v); } @@ -1598,7 +1598,7 @@ #endif if (ret == NULL) return posix_error(); - return PyString_FromString(ret); + return PyBytes_FromString(ret); } #endif @@ -1620,7 +1620,7 @@ #endif if (ret == NULL) return posix_error(); - return PyString_FromString(buffer); + return PyBytes_FromString(buffer); } #endif @@ -1968,7 +1968,7 @@ Py_END_ALLOW_THREADS if (res == NULL) return posix_error(); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } #ifdef Py_USING_UNICODE @@ -2174,7 +2174,7 @@ /* Skip over . and .. */ if (strcmp(FileData.cFileName, ".") != 0 && strcmp(FileData.cFileName, "..") != 0) { - v = PyString_FromString(FileData.cFileName); + v = PyBytes_FromString(FileData.cFileName); if (v == NULL) { Py_DECREF(d); d = NULL; @@ -2262,7 +2262,7 @@ /* Leave Case of Name Alone -- In Native Form */ /* (Removed Forced Lowercasing Code) */ - v = PyString_FromString(namebuf); + v = PyBytes_FromString(namebuf); if (v == NULL) { Py_DECREF(d); d = NULL; @@ -2312,7 +2312,7 @@ (NAMLEN(ep) == 1 || (ep->d_name[1] == '.' && NAMLEN(ep) == 2))) continue; - v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep)); + v = PyBytes_FromStringAndSize(ep->d_name, NAMLEN(ep)); if (v == NULL) { Py_DECREF(d); d = NULL; @@ -2397,7 +2397,7 @@ return PyUnicode_Decode(outbuf, strlen(outbuf), Py_FileSystemDefaultEncoding, NULL); } - return PyString_FromString(outbuf); + return PyBytes_FromString(outbuf); } /* end of posix__getfullpathname */ #endif /* MS_WINDOWS */ @@ -3062,7 +3062,7 @@ /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */ if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) { #endif - len = PyString_Size(key) + PyString_Size(val) + 2; + len = PyBytes_Size(key) + PyBytes_Size(val) + 2; p = PyMem_NEW(char, len); if (p == NULL) { PyErr_NoMemory(); @@ -3292,7 +3292,7 @@ { goto fail_2; } - len = PyString_Size(key) + PyString_Size(val) + 2; + len = PyBytes_Size(key) + PyBytes_Size(val) + 2; p = PyMem_NEW(char, len); if (p == NULL) { PyErr_NoMemory(); @@ -3525,7 +3525,7 @@ { goto fail_2; } - len = PyString_Size(key) + PyString_Size(val) + 2; + len = PyBytes_Size(key) + PyBytes_Size(val) + 2; p = PyMem_NEW(char, len); if (p == NULL) { PyErr_NoMemory(); @@ -3895,7 +3895,7 @@ "unable to determine login name"); } else - result = PyString_FromString(name); + result = PyBytes_FromString(name); errno = old_errno; return result; @@ -5884,7 +5884,7 @@ return posix_error_with_allocated_filename(path); PyMem_Free(path); - v = PyString_FromStringAndSize(buf, n); + v = PyBytes_FromStringAndSize(buf, n); #ifdef Py_USING_UNICODE if (arg_is_unicode) { PyObject *w; @@ -6289,18 +6289,18 @@ errno = EINVAL; return posix_error(); } - buffer = PyString_FromStringAndSize((char *)NULL, size); + buffer = PyBytes_FromStringAndSize((char *)NULL, size); if (buffer == NULL) return NULL; Py_BEGIN_ALLOW_THREADS - n = read(fd, PyString_AsString(buffer), size); + n = read(fd, PyBytes_AsString(buffer), size); Py_END_ALLOW_THREADS if (n < 0) { Py_DECREF(buffer); return posix_error(); } if (n != size) - _PyString_Resize(&buffer, n); + _PyBytes_Resize(&buffer, n); return buffer; } @@ -6647,11 +6647,11 @@ /* XXX This can leak memory -- not easy to fix :-( */ len = strlen(s1) + strlen(s2) + 2; /* len includes space for a trailing \0; the size arg to - PyString_FromStringAndSize does not count that */ - newstr = PyString_FromStringAndSize(NULL, (int)len - 1); + PyBytes_FromStringAndSize does not count that */ + newstr = PyBytes_FromStringAndSize(NULL, (int)len - 1); if (newstr == NULL) return PyErr_NoMemory(); - newenv = PyString_AS_STRING(newstr); + newenv = PyBytes_AS_STRING(newstr); PyOS_snprintf(newenv, len, "%s=%s", s1, s2); if (putenv(newenv)) { Py_DECREF(newstr); @@ -6727,7 +6727,7 @@ "strerror() argument out of range"); return NULL; } - return PyString_FromString(message); + return PyBytes_FromString(message); } @@ -7009,7 +7009,7 @@ #endif if (name == NULL) return PyErr_NoMemory(); - result = PyString_FromString(name); + result = PyBytes_FromString(name); free(name); return result; } @@ -7066,7 +7066,7 @@ Py_XDECREF(err); return NULL; } - return PyString_FromString(buffer); + return PyBytes_FromString(buffer); } #endif @@ -7095,13 +7095,13 @@ *valuep = PyInt_AS_LONG(arg); return 1; } - if (PyString_Check(arg)) { + if (PyBytes_Check(arg)) { /* look up the value in the table using a binary search */ size_t lo = 0; size_t mid; size_t hi = tablesize; int cmp; - char *confname = PyString_AS_STRING(arg); + char *confname = PyBytes_AS_STRING(arg); while (lo < hi) { mid = (lo + hi) / 2; cmp = strcmp(confname, table[mid].name); @@ -7431,12 +7431,12 @@ } else { if ((unsigned int)len >= sizeof(buffer)) { - result = PyString_FromStringAndSize(NULL, len-1); + result = PyBytes_FromStringAndSize(NULL, len-1); if (result != NULL) - confstr(name, PyString_AS_STRING(result), len); + confstr(name, PyBytes_AS_STRING(result), len); } else - result = PyString_FromStringAndSize(buffer, len-1); + result = PyBytes_FromStringAndSize(buffer, len-1); } } return result; @@ -8225,11 +8225,11 @@ } /* Allocate bytes */ - result = PyString_FromStringAndSize(NULL, howMany); + result = PyBytes_FromStringAndSize(NULL, howMany); if (result != NULL) { /* Get random data */ if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*) - PyString_AS_STRING(result))) { + PyBytes_AS_STRING(result))) { Py_DECREF(result); return win32_error("CryptGenRandom", NULL); } @@ -8259,11 +8259,11 @@ "negative argument not allowed"); /* Allocate bytes */ - result = PyString_FromStringAndSize(NULL, howMany); + result = PyBytes_FromStringAndSize(NULL, howMany); if (result != NULL) { /* Get random data */ if (RAND_pseudo_bytes((unsigned char*) - PyString_AS_STRING(result), + PyBytes_AS_STRING(result), howMany) < 0) { Py_DECREF(result); return PyErr_Format(PyExc_ValueError, Modified: python/branches/tlee-ast-optimize/Modules/pwdmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/pwdmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/pwdmodule.c Sun Jun 1 17:18:10 2008 @@ -49,7 +49,7 @@ sets(PyObject *v, int i, char* val) { if (val) - PyStructSequence_SET_ITEM(v, i, PyString_FromString(val)); + PyStructSequence_SET_ITEM(v, i, PyBytes_FromString(val)); else { PyStructSequence_SET_ITEM(v, i, Py_None); Py_INCREF(Py_None); Modified: python/branches/tlee-ast-optimize/Modules/pyexpat.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/pyexpat.c (original) +++ python/branches/tlee-ast-optimize/Modules/pyexpat.c Sun Jun 1 17:18:10 2008 @@ -153,7 +153,7 @@ { PyObject *name = hinfo->nameobj; if (name == NULL) { - name = PyString_FromString(hinfo->name); + name = PyBytes_FromString(hinfo->name); hinfo->nameobj = name; } Py_XINCREF(name); @@ -205,7 +205,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString(str); + return PyBytes_FromString(str); } static PyObject * @@ -218,7 +218,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromStringAndSize((const char *)str, len); + return PyBytes_FromStringAndSize((const char *)str, len); } /* Callback routines */ @@ -267,16 +267,16 @@ PyObject *filename = NULL; if (handler_info[slot].tb_code == NULL) { - code = PyString_FromString(""); + code = PyBytes_FromString(""); if (code == NULL) goto failed; - name = PyString_FromString(func_name); + name = PyBytes_FromString(func_name); if (name == NULL) goto failed; nulltuple = PyTuple_New(0); if (nulltuple == NULL) goto failed; - filename = PyString_FromString(__FILE__); + filename = PyBytes_FromString(__FILE__); handler_info[slot].tb_code = PyCode_New(0, /* argcount */ 0, /* nlocals */ @@ -971,13 +971,13 @@ goto finally; /* XXX what to do if it returns a Unicode string? */ - if (!PyString_Check(str)) { + if (!PyBytes_Check(str)) { PyErr_Format(PyExc_TypeError, "read() did not return a string object (type=%.400s)", Py_TYPE(str)->tp_name); goto finally; } - len = PyString_GET_SIZE(str); + len = PyBytes_GET_SIZE(str); if (len > buf_size) { PyErr_Format(PyExc_ValueError, "read() returned too much data: " @@ -985,7 +985,7 @@ buf_size, len); goto finally; } - memcpy(buf, PyString_AsString(str), len); + memcpy(buf, PyBytes_AsString(str), len); finally: Py_XDECREF(arg); Py_XDECREF(str); @@ -1094,7 +1094,7 @@ = XML_GetInputContext(self->itself, &offset, &size); if (buffer != NULL) - return PyString_FromStringAndSize(buffer + offset, + return PyBytes_FromStringAndSize(buffer + offset, size - offset); else Py_RETURN_NONE; @@ -1511,7 +1511,7 @@ #define APPEND(list, str) \ do { \ - PyObject *o = PyString_FromString(str); \ + PyObject *o = PyBytes_FromString(str); \ if (o != NULL) \ PyList_Append(list, o); \ Py_XDECREF(o); \ @@ -1862,7 +1862,7 @@ while (rev[i] != ' ' && rev[i] != '\0') ++i; - return PyString_FromStringAndSize(rev, i); + return PyBytes_FromStringAndSize(rev, i); } /* Initialization function for the module */ @@ -1889,7 +1889,7 @@ MODULE_INITFUNC(void) { PyObject *m, *d; - PyObject *errmod_name = PyString_FromString(MODULE_NAME ".errors"); + PyObject *errmod_name = PyBytes_FromString(MODULE_NAME ".errors"); PyObject *errors_module; PyObject *modelmod_name; PyObject *model_module; @@ -1899,7 +1899,7 @@ if (errmod_name == NULL) return; - modelmod_name = PyString_FromString(MODULE_NAME ".model"); + modelmod_name = PyBytes_FromString(MODULE_NAME ".model"); if (modelmod_name == NULL) return; Modified: python/branches/tlee-ast-optimize/Modules/readline.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/readline.c (original) +++ python/branches/tlee-ast-optimize/Modules/readline.c Sun Jun 1 17:18:10 2008 @@ -421,7 +421,7 @@ static PyObject * get_completer_delims(PyObject *self, PyObject *noarg) { - return PyString_FromString(rl_completer_word_break_characters); + return PyBytes_FromString(rl_completer_word_break_characters); } PyDoc_STRVAR(doc_get_completer_delims, @@ -471,7 +471,7 @@ if (!PyArg_ParseTuple(args, "i:index", &idx)) return NULL; if ((hist_ent = history_get(idx))) - return PyString_FromString(hist_ent->line); + return PyBytes_FromString(hist_ent->line); else { Py_RETURN_NONE; } @@ -503,7 +503,7 @@ static PyObject * get_line_buffer(PyObject *self, PyObject *noarg) { - return PyString_FromString(rl_line_buffer); + return PyBytes_FromString(rl_line_buffer); } PyDoc_STRVAR(doc_get_line_buffer, @@ -676,7 +676,7 @@ if (m == NULL) goto error; for (i = 0; i < num_matches; i++) { - s = PyString_FromString(matches[i+1]); + s = PyBytes_FromString(matches[i+1]); if (s == NULL) goto error; if (PyList_SetItem(m, i, s) == -1) @@ -725,7 +725,7 @@ result = NULL; } else { - char *s = PyString_AsString(r); + char *s = PyBytes_AsString(r); if (s == NULL) goto error; result = strdup(s); Modified: python/branches/tlee-ast-optimize/Modules/selectmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/selectmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/selectmodule.c Sun Jun 1 17:18:10 2008 @@ -1219,7 +1219,7 @@ "data=0x%lx udata=%p>", (unsigned long)(s->e.ident), s->e.filter, s->e.flags, s->e.fflags, (long)(s->e.data), s->e.udata); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int Modified: python/branches/tlee-ast-optimize/Modules/sha256module.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/sha256module.c (original) +++ python/branches/tlee-ast-optimize/Modules/sha256module.c Sun Jun 1 17:18:10 2008 @@ -432,7 +432,7 @@ SHAcopy(self, &temp); sha_final(digest, &temp); - return PyString_FromStringAndSize((const char *)digest, self->digestsize); + return PyBytes_FromStringAndSize((const char *)digest, self->digestsize); } PyDoc_STRVAR(SHA256_hexdigest__doc__, @@ -452,10 +452,10 @@ sha_final(digest, &temp); /* Create a new string */ - retval = PyString_FromStringAndSize(NULL, self->digestsize * 2); + retval = PyBytes_FromStringAndSize(NULL, self->digestsize * 2); if (!retval) return NULL; - hex_digest = PyString_AsString(retval); + hex_digest = PyBytes_AsString(retval); if (!hex_digest) { Py_DECREF(retval); return NULL; @@ -510,9 +510,9 @@ SHA256_get_name(PyObject *self, void *closure) { if (((SHAobject *)self)->digestsize == 32) - return PyString_FromStringAndSize("SHA256", 6); + return PyBytes_FromStringAndSize("SHA256", 6); else - return PyString_FromStringAndSize("SHA224", 6); + return PyBytes_FromStringAndSize("SHA224", 6); } static PyGetSetDef SHA_getseters[] = { Modified: python/branches/tlee-ast-optimize/Modules/sha512module.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/sha512module.c (original) +++ python/branches/tlee-ast-optimize/Modules/sha512module.c Sun Jun 1 17:18:10 2008 @@ -498,7 +498,7 @@ SHAcopy(self, &temp); sha512_final(digest, &temp); - return PyString_FromStringAndSize((const char *)digest, self->digestsize); + return PyBytes_FromStringAndSize((const char *)digest, self->digestsize); } PyDoc_STRVAR(SHA512_hexdigest__doc__, @@ -518,10 +518,10 @@ sha512_final(digest, &temp); /* Create a new string */ - retval = PyString_FromStringAndSize(NULL, self->digestsize * 2); + retval = PyBytes_FromStringAndSize(NULL, self->digestsize * 2); if (!retval) return NULL; - hex_digest = PyString_AsString(retval); + hex_digest = PyBytes_AsString(retval); if (!hex_digest) { Py_DECREF(retval); return NULL; @@ -576,9 +576,9 @@ SHA512_get_name(PyObject *self, void *closure) { if (((SHAobject *)self)->digestsize == 64) - return PyString_FromStringAndSize("SHA512", 6); + return PyBytes_FromStringAndSize("SHA512", 6); else - return PyString_FromStringAndSize("SHA384", 6); + return PyBytes_FromStringAndSize("SHA384", 6); } static PyGetSetDef SHA_getseters[] = { Modified: python/branches/tlee-ast-optimize/Modules/shamodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/shamodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/shamodule.c Sun Jun 1 17:18:10 2008 @@ -380,7 +380,7 @@ SHAcopy(self, &temp); sha_final(digest, &temp); - return PyString_FromStringAndSize((const char *)digest, sizeof(digest)); + return PyBytes_FromStringAndSize((const char *)digest, sizeof(digest)); } PyDoc_STRVAR(SHA_hexdigest__doc__, @@ -400,10 +400,10 @@ sha_final(digest, &temp); /* Create a new string */ - retval = PyString_FromStringAndSize(NULL, sizeof(digest) * 2); + retval = PyBytes_FromStringAndSize(NULL, sizeof(digest) * 2); if (!retval) return NULL; - hex_digest = PyString_AsString(retval); + hex_digest = PyBytes_AsString(retval); if (!hex_digest) { Py_DECREF(retval); return NULL; @@ -463,7 +463,7 @@ static PyObject * SHA_get_name(PyObject *self, void *closure) { - return PyString_FromStringAndSize("SHA1", 4); + return PyBytes_FromStringAndSize("SHA1", 4); } static PyGetSetDef SHA_getseters[] = { Modified: python/branches/tlee-ast-optimize/Modules/socketmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/socketmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/socketmodule.c Sun Jun 1 17:18:10 2008 @@ -911,7 +911,7 @@ set_gaierror(error); return NULL; } - return PyString_FromString(buf); + return PyBytes_FromString(buf); } @@ -955,7 +955,7 @@ sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", bdaddr->b[5], bdaddr->b[4], bdaddr->b[3], bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } #endif @@ -1002,14 +1002,14 @@ #ifdef linux if (a->sun_path[0] == 0) { /* Linux abstract namespace */ addrlen -= offsetof(struct sockaddr_un, sun_path); - return PyString_FromStringAndSize(a->sun_path, + return PyBytes_FromStringAndSize(a->sun_path, addrlen); } else #endif /* linux */ { /* regular NULL-terminated string */ - return PyString_FromString(a->sun_path); + return PyBytes_FromString(a->sun_path); } } #endif /* AF_UNIX */ @@ -1362,7 +1362,7 @@ addr = (struct sockaddr_sco *)addr_ret; _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH; - straddr = PyString_AsString(args); + straddr = PyBytes_AsString(args); if (straddr == NULL) { PyErr_SetString(socket_error, "getsockaddrarg: " "wrong format"); @@ -1854,16 +1854,16 @@ "getsockopt buflen out of range"); return NULL; } - buf = PyString_FromStringAndSize((char *)NULL, buflen); + buf = PyBytes_FromStringAndSize((char *)NULL, buflen); if (buf == NULL) return NULL; res = getsockopt(s->sock_fd, level, optname, - (void *)PyString_AS_STRING(buf), &buflen); + (void *)PyBytes_AS_STRING(buf), &buflen); if (res < 0) { Py_DECREF(buf); return s->errorhandler(); } - _PyString_Resize(&buf, buflen); + _PyBytes_Resize(&buf, buflen); return buf; #endif /* __BEOS__ */ } @@ -2386,12 +2386,12 @@ } /* Allocate a new string. */ - buf = PyString_FromStringAndSize((char *) 0, recvlen); + buf = PyBytes_FromStringAndSize((char *) 0, recvlen); if (buf == NULL) return NULL; /* Call the guts */ - outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags); + outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags); if (outlen < 0) { /* An error occurred, release the string and return an error. */ @@ -2401,7 +2401,7 @@ if (outlen != recvlen) { /* We did not read as many bytes as we anticipated, resize the string if possible and be succesful. */ - if (_PyString_Resize(&buf, outlen) < 0) + if (_PyBytes_Resize(&buf, outlen) < 0) /* Oopsy, not so succesful after all. */ return NULL; } @@ -2560,11 +2560,11 @@ return NULL; } - buf = PyString_FromStringAndSize((char *) 0, recvlen); + buf = PyBytes_FromStringAndSize((char *) 0, recvlen); if (buf == NULL) return NULL; - outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf), + outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf), recvlen, flags, &addr); if (outlen < 0) { goto finally; @@ -2573,7 +2573,7 @@ if (outlen != recvlen) { /* We did not read as many bytes as we anticipated, resize the string if possible and be succesful. */ - if (_PyString_Resize(&buf, outlen) < 0) + if (_PyBytes_Resize(&buf, outlen) < 0) /* Oopsy, not so succesful after all. */ goto finally; } @@ -2941,7 +2941,7 @@ (long)s->sock_fd, s->sock_family, s->sock_type, s->sock_proto); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } @@ -3057,7 +3057,7 @@ if (res < 0) return set_error(); buf[sizeof buf - 1] = '\0'; - return PyString_FromString(buf); + return PyBytes_FromString(buf); } PyDoc_STRVAR(gethostname_doc, @@ -3143,7 +3143,7 @@ if (h->h_aliases) { for (pch = h->h_aliases; *pch != NULL; pch++) { int status; - tmp = PyString_FromString(*pch); + tmp = PyBytes_FromString(*pch); if (tmp == NULL) goto err; @@ -3432,7 +3432,7 @@ PyErr_SetString(socket_error, "port/proto not found"); return NULL; } - return PyString_FromString(sp->s_name); + return PyBytes_FromString(sp->s_name); } PyDoc_STRVAR(getservbyport_doc, @@ -3734,7 +3734,7 @@ if (inet_aton != NULL) { #endif if (inet_aton(ip_addr, &buf)) - return PyString_FromStringAndSize((char *)(&buf), + return PyBytes_FromStringAndSize((char *)(&buf), sizeof(buf)); PyErr_SetString(socket_error, @@ -3763,7 +3763,7 @@ return NULL; } } - return PyString_FromStringAndSize((char *) &packed_addr, + return PyBytes_FromStringAndSize((char *) &packed_addr, sizeof(packed_addr)); #ifdef USE_INET_ATON_WEAKLINK @@ -3797,7 +3797,7 @@ memcpy(&packed_addr, packed_str, addr_len); - return PyString_FromString(inet_ntoa(packed_addr)); + return PyBytes_FromString(inet_ntoa(packed_addr)); } #ifdef HAVE_INET_PTON @@ -3840,11 +3840,11 @@ "illegal IP address string passed to inet_pton"); return NULL; } else if (af == AF_INET) { - return PyString_FromStringAndSize(packed, + return PyBytes_FromStringAndSize(packed, sizeof(struct in_addr)); #ifdef ENABLE_IPV6 } else if (af == AF_INET6) { - return PyString_FromStringAndSize(packed, + return PyBytes_FromStringAndSize(packed, sizeof(struct in6_addr)); #endif } else { @@ -3871,7 +3871,7 @@ char ip[INET_ADDRSTRLEN + 1]; #endif - /* Guarantee NUL-termination for PyString_FromString() below */ + /* Guarantee NUL-termination for PyBytes_FromString() below */ memset((void *) &ip[0], '\0', sizeof(ip)); if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) { @@ -3903,7 +3903,7 @@ PyErr_SetFromErrno(socket_error); return NULL; } else { - return PyString_FromString(retval); + return PyBytes_FromString(retval); } /* NOTREACHED */ @@ -3944,9 +3944,9 @@ idna = PyObject_CallMethod(hobj, "encode", "s", "idna"); if (!idna) return NULL; - hptr = PyString_AsString(idna); - } else if (PyString_Check(hobj)) { - hptr = PyString_AsString(hobj); + hptr = PyBytes_AsString(idna); + } else if (PyBytes_Check(hobj)) { + hptr = PyBytes_AsString(hobj); } else { PyErr_SetString(PyExc_TypeError, "getaddrinfo() argument 1 must be string or None"); @@ -3955,8 +3955,8 @@ if (PyInt_Check(pobj)) { PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj)); pptr = pbuf; - } else if (PyString_Check(pobj)) { - pptr = PyString_AsString(pobj); + } else if (PyBytes_Check(pobj)) { + pptr = PyBytes_AsString(pobj); } else if (pobj == Py_None) { pptr = (char *)NULL; } else { Modified: python/branches/tlee-ast-optimize/Modules/spwdmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/spwdmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/spwdmodule.c Sun Jun 1 17:18:10 2008 @@ -60,7 +60,7 @@ sets(PyObject *v, int i, char* val) { if (val) - PyStructSequence_SET_ITEM(v, i, PyString_FromString(val)); + PyStructSequence_SET_ITEM(v, i, PyBytes_FromString(val)); else { PyStructSequence_SET_ITEM(v, i, Py_None); Py_INCREF(Py_None); Modified: python/branches/tlee-ast-optimize/Modules/stropmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/stropmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/stropmodule.c Sun Jun 1 17:18:10 2008 @@ -47,7 +47,7 @@ i = i+1; } if (j < i) { - item = PyString_FromStringAndSize(s+j, i-j); + item = PyBytes_FromStringAndSize(s+j, i-j); if (item == NULL) goto finally; @@ -61,7 +61,7 @@ i = i+1; } if (maxsplit && (countsplit >= maxsplit) && i < len) { - item = PyString_FromStringAndSize( + item = PyBytes_FromStringAndSize( s+i, len - i); if (item == NULL) goto finally; @@ -122,7 +122,7 @@ i = j = 0; while (i+n <= len) { if (s[i] == sub[0] && (n == 1 || memcmp(s+i, sub, n) == 0)) { - item = PyString_FromStringAndSize(s+j, i-j); + item = PyBytes_FromStringAndSize(s+j, i-j); if (item == NULL) goto fail; err = PyList_Append(list, item); @@ -137,7 +137,7 @@ else i++; } - item = PyString_FromStringAndSize(s+j, len-j); + item = PyBytes_FromStringAndSize(s+j, len-j); if (item == NULL) goto fail; err = PyList_Append(list, item); @@ -189,7 +189,7 @@ if (seqlen == 1) { /* Optimization if there's only one item */ PyObject *item = PySequence_GetItem(seq, 0); - if (item && !PyString_Check(item)) { + if (item && !PyBytes_Check(item)) { PyErr_SetString(PyExc_TypeError, "first argument must be sequence of strings"); Py_DECREF(item); @@ -198,9 +198,9 @@ return item; } - if (!(res = PyString_FromStringAndSize((char*)NULL, sz))) + if (!(res = PyBytes_FromStringAndSize((char*)NULL, sz))) return NULL; - p = PyString_AsString(res); + p = PyBytes_AsString(res); /* optimize for lists, since it's the most common case. all others * (tuples and arbitrary sequences) just use the sequence abstract @@ -209,29 +209,29 @@ if (PyList_Check(seq)) { for (i = 0; i < seqlen; i++) { PyObject *item = PyList_GET_ITEM(seq, i); - if (!PyString_Check(item)) { + if (!PyBytes_Check(item)) { PyErr_SetString(PyExc_TypeError, "first argument must be sequence of strings"); Py_DECREF(res); return NULL; } - slen = PyString_GET_SIZE(item); + slen = PyBytes_GET_SIZE(item); while (reslen + slen + seplen >= sz) { - if (_PyString_Resize(&res, sz * 2) < 0) + if (_PyBytes_Resize(&res, sz * 2) < 0) return NULL; sz *= 2; - p = PyString_AsString(res) + reslen; + p = PyBytes_AsString(res) + reslen; } if (i > 0) { memcpy(p, sep, seplen); p += seplen; reslen += seplen; } - memcpy(p, PyString_AS_STRING(item), slen); + memcpy(p, PyBytes_AS_STRING(item), slen); p += slen; reslen += slen; } - _PyString_Resize(&res, reslen); + _PyBytes_Resize(&res, reslen); return res; } @@ -245,33 +245,33 @@ /* This is now type safe */ for (i = 0; i < seqlen; i++) { PyObject *item = getitemfunc(seq, i); - if (!item || !PyString_Check(item)) { + if (!item || !PyBytes_Check(item)) { PyErr_SetString(PyExc_TypeError, "first argument must be sequence of strings"); Py_DECREF(res); Py_XDECREF(item); return NULL; } - slen = PyString_GET_SIZE(item); + slen = PyBytes_GET_SIZE(item); while (reslen + slen + seplen >= sz) { - if (_PyString_Resize(&res, sz * 2) < 0) { + if (_PyBytes_Resize(&res, sz * 2) < 0) { Py_DECREF(item); return NULL; } sz *= 2; - p = PyString_AsString(res) + reslen; + p = PyBytes_AsString(res) + reslen; } if (i > 0) { memcpy(p, sep, seplen); p += seplen; reslen += seplen; } - memcpy(p, PyString_AS_STRING(item), slen); + memcpy(p, PyBytes_AS_STRING(item), slen); p += slen; reslen += slen; Py_DECREF(item); } - _PyString_Resize(&res, reslen); + _PyBytes_Resize(&res, reslen); return res; } @@ -369,7 +369,7 @@ Py_ssize_t len, i, j; - if (PyString_AsStringAndSize(args, &s, &len)) + if (PyBytes_AsStringAndSize(args, &s, &len)) return NULL; i = 0; @@ -392,7 +392,7 @@ return args; } else - return PyString_FromStringAndSize(s+i, j-i); + return PyBytes_FromStringAndSize(s+i, j-i); } @@ -450,12 +450,12 @@ int changed; WARN; - if (PyString_AsStringAndSize(args, &s, &n)) + if (PyBytes_AsStringAndSize(args, &s, &n)) return NULL; - newstr = PyString_FromStringAndSize(NULL, n); + newstr = PyBytes_FromStringAndSize(NULL, n); if (newstr == NULL) return NULL; - s_new = PyString_AsString(newstr); + s_new = PyBytes_AsString(newstr); changed = 0; for (i = 0; i < n; i++) { int c = Py_CHARMASK(*s++); @@ -489,12 +489,12 @@ int changed; WARN; - if (PyString_AsStringAndSize(args, &s, &n)) + if (PyBytes_AsStringAndSize(args, &s, &n)) return NULL; - newstr = PyString_FromStringAndSize(NULL, n); + newstr = PyBytes_FromStringAndSize(NULL, n); if (newstr == NULL) return NULL; - s_new = PyString_AsString(newstr); + s_new = PyBytes_AsString(newstr); changed = 0; for (i = 0; i < n; i++) { int c = Py_CHARMASK(*s++); @@ -529,12 +529,12 @@ int changed; WARN; - if (PyString_AsStringAndSize(args, &s, &n)) + if (PyBytes_AsStringAndSize(args, &s, &n)) return NULL; - newstr = PyString_FromStringAndSize(NULL, n); + newstr = PyBytes_FromStringAndSize(NULL, n); if (newstr == NULL) return NULL; - s_new = PyString_AsString(newstr); + s_new = PyBytes_AsString(newstr); changed = 0; if (0 < n) { int c = Py_CHARMASK(*s++); @@ -610,12 +610,12 @@ } /* Second pass: create output string and fill it */ - out = PyString_FromStringAndSize(NULL, i+j); + out = PyBytes_FromStringAndSize(NULL, i+j); if (out == NULL) return NULL; i = 0; - q = PyString_AS_STRING(out); + q = PyBytes_AS_STRING(out); for (p = string; p < e; p++) { if (*p == '\t') { @@ -695,12 +695,12 @@ int changed; WARN; - if (PyString_AsStringAndSize(args, &s, &n)) + if (PyBytes_AsStringAndSize(args, &s, &n)) return NULL; - newstr = PyString_FromStringAndSize(NULL, n); + newstr = PyBytes_FromStringAndSize(NULL, n); if (newstr == NULL) return NULL; - s_new = PyString_AsString(newstr); + s_new = PyBytes_AsString(newstr); changed = 0; for (i = 0; i < n; i++) { int c = Py_CHARMASK(*s++); @@ -898,10 +898,10 @@ return NULL; } - result = PyString_FromStringAndSize((char *)NULL, 256); + result = PyBytes_FromStringAndSize((char *)NULL, 256); if (result == NULL) return NULL; - c = (unsigned char *) PyString_AS_STRING((PyStringObject *)result); + c = (unsigned char *) PyBytes_AS_STRING((PyBytesObject *)result); for (i = 0; i < 256; i++) c[i]=(unsigned char)i; for (i = 0; i < fromlen; i++) @@ -942,12 +942,12 @@ } table = table1; - inlen = PyString_GET_SIZE(input_obj); - result = PyString_FromStringAndSize((char *)NULL, inlen); + inlen = PyBytes_GET_SIZE(input_obj); + result = PyBytes_FromStringAndSize((char *)NULL, inlen); if (result == NULL) return NULL; - output_start = output = PyString_AsString(result); - input = PyString_AsString(input_obj); + output_start = output = PyBytes_AsString(result); + input = PyBytes_AsString(input_obj); if (dellen == 0) { /* If no deletions are required, use faster code */ @@ -983,7 +983,7 @@ } /* Fix the size of the resulting string */ if (inlen > 0) - _PyString_Resize(&result, output - output_start); + _PyBytes_Resize(&result, output - output_start); return result; } @@ -1169,7 +1169,7 @@ Py_XINCREF(newstr); } else { - newstr = PyString_FromStringAndSize(new_s, out_len); + newstr = PyBytes_FromStringAndSize(new_s, out_len); PyMem_FREE(new_s); } return newstr; @@ -1222,7 +1222,7 @@ if (isspace(c)) buf[n++] = c; } - s = PyString_FromStringAndSize(buf, n); + s = PyBytes_FromStringAndSize(buf, n); if (s) PyModule_AddObject(m, "whitespace", s); @@ -1232,7 +1232,7 @@ if (islower(c)) buf[n++] = c; } - s = PyString_FromStringAndSize(buf, n); + s = PyBytes_FromStringAndSize(buf, n); if (s) PyModule_AddObject(m, "lowercase", s); @@ -1242,7 +1242,7 @@ if (isupper(c)) buf[n++] = c; } - s = PyString_FromStringAndSize(buf, n); + s = PyBytes_FromStringAndSize(buf, n); if (s) PyModule_AddObject(m, "uppercase", s); } Modified: python/branches/tlee-ast-optimize/Modules/sunaudiodev.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/sunaudiodev.c (original) +++ python/branches/tlee-ast-optimize/Modules/sunaudiodev.c Sun Jun 1 17:18:10 2008 @@ -135,11 +135,11 @@ if (!PyArg_ParseTuple(args, "i:read", &size)) return NULL; - rv = PyString_FromStringAndSize(NULL, size); + rv = PyBytes_FromStringAndSize(NULL, size); if (rv == NULL) return NULL; - if (!(cp = PyString_AsString(rv))) + if (!(cp = PyBytes_AsString(rv))) goto finally; count = read(self->x_fd, cp, size); Modified: python/branches/tlee-ast-optimize/Modules/svmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/svmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/svmodule.c Sun Jun 1 17:18:10 2008 @@ -47,13 +47,13 @@ if (!PyArg_Parse(args, "i", &invert)) return NULL; - if (!(output = PyString_FromStringAndSize( + if (!(output = PyBytes_FromStringAndSize( NULL, (int)(self->ob_info.width * self->ob_info.height * factor)))) { return NULL; } - if (!(outstr = PyString_AsString(output))) { + if (!(outstr = PyBytes_AsString(output))) { Py_DECREF(output); return NULL; } @@ -152,9 +152,9 @@ fieldsize = self->ob_info.width * self->ob_info.height / 2; obcapture = (char*)self->ob_capture; - if (!(f1 = PyString_FromStringAndSize(obcapture, fieldsize))) + if (!(f1 = PyBytes_FromStringAndSize(obcapture, fieldsize))) goto finally; - if (!(f2 = PyString_FromStringAndSize(obcapture + fieldsize, + if (!(f2 = PyBytes_FromStringAndSize(obcapture + fieldsize, fieldsize))) goto finally; ret = PyTuple_Pack(2, f1, f2); @@ -535,12 +535,12 @@ goto finally; } - if (!(videodata = PyString_FromStringAndSize(NULL, bytes))) + if (!(videodata = PyBytes_FromStringAndSize(NULL, bytes))) goto finally; /* XXX -- need to do something about the bitvector */ { - char* str = PyString_AsString(videodata); + char* str = PyBytes_AsString(videodata); if (!str) goto finally; @@ -615,10 +615,10 @@ if (svQueryCaptureBufferSize(self->ob_svideo, &info, &bytes)) return sv_error(); - if (!(videodata = PyString_FromStringAndSize(NULL, bytes))) + if (!(videodata = PyBytes_FromStringAndSize(NULL, bytes))) return NULL; - str = PyString_AsString(videodata); + str = PyBytes_AsString(videodata); if (!str) goto finally; @@ -849,11 +849,11 @@ return NULL; } - if (!(output = PyString_FromStringAndSize(NULL, + if (!(output = PyBytes_FromStringAndSize(NULL, (int)(width * height * factor)))) return NULL; - str = PyString_AsString(output); + str = PyBytes_AsString(output); if (!str) { Py_DECREF(output); return NULL; Modified: python/branches/tlee-ast-optimize/Modules/syslogmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/syslogmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/syslogmodule.c Sun Jun 1 17:18:10 2008 @@ -71,7 +71,7 @@ S_ident_o = new_S_ident_o; Py_INCREF(S_ident_o); - openlog(PyString_AsString(S_ident_o), logopt, facility); + openlog(PyBytes_AsString(S_ident_o), logopt, facility); Py_INCREF(Py_None); return Py_None; Modified: python/branches/tlee-ast-optimize/Modules/termios.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/termios.c (original) +++ python/branches/tlee-ast-optimize/Modules/termios.c Sun Jun 1 17:18:10 2008 @@ -91,7 +91,7 @@ return NULL; for (i = 0; i < NCCS; i++) { ch = (char)mode.c_cc[i]; - v = PyString_FromStringAndSize(&ch, 1); + v = PyBytes_FromStringAndSize(&ch, 1); if (v == NULL) goto err; PyList_SetItem(cc, i, v); @@ -183,8 +183,8 @@ for (i = 0; i < NCCS; i++) { v = PyList_GetItem(cc, i); - if (PyString_Check(v) && PyString_Size(v) == 1) - mode.c_cc[i] = (cc_t) * PyString_AsString(v); + if (PyBytes_Check(v) && PyBytes_Size(v) == 1) + mode.c_cc[i] = (cc_t) * PyBytes_AsString(v); else if (PyInt_Check(v)) mode.c_cc[i] = (cc_t) PyInt_AsLong(v); else { Modified: python/branches/tlee-ast-optimize/Modules/threadmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/threadmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/threadmodule.c Sun Jun 1 17:18:10 2008 @@ -190,7 +190,7 @@ Py_XINCREF(kw); self->kw = kw; self->dict = NULL; /* making sure */ - self->key = PyString_FromFormat("thread.local.%p", self); + self->key = PyBytes_FromFormat("thread.local.%p", self); if (self->key == NULL) goto err; Modified: python/branches/tlee-ast-optimize/Modules/timemodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/timemodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/timemodule.c Sun Jun 1 17:18:10 2008 @@ -488,7 +488,7 @@ e.g. an empty format, or %Z when the timezone is unknown. */ PyObject *ret; - ret = PyString_FromStringAndSize(outbuf, buflen); + ret = PyBytes_FromStringAndSize(outbuf, buflen); free(outbuf); return ret; } @@ -548,7 +548,7 @@ p = asctime(&buf); if (p[24] == '\n') p[24] = '\0'; - return PyString_FromString(p); + return PyBytes_FromString(p); } PyDoc_STRVAR(asctime_doc, @@ -584,7 +584,7 @@ } if (p[24] == '\n') p[24] = '\0'; - return PyString_FromString(p); + return PyBytes_FromString(p); } PyDoc_STRVAR(ctime_doc, Modified: python/branches/tlee-ast-optimize/Modules/unicodedata.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/unicodedata.c (original) +++ python/branches/tlee-ast-optimize/Modules/unicodedata.c Sun Jun 1 17:18:10 2008 @@ -258,7 +258,7 @@ if (old->category_changed != 0xFF) index = old->category_changed; } - return PyString_FromString(_PyUnicode_CategoryNames[index]); + return PyBytes_FromString(_PyUnicode_CategoryNames[index]); } PyDoc_STRVAR(unicodedata_bidirectional__doc__, @@ -290,7 +290,7 @@ else if (old->bidir_changed != 0xFF) index = old->bidir_changed; } - return PyString_FromString(_PyUnicode_BidirectionalNames[index]); + return PyBytes_FromString(_PyUnicode_BidirectionalNames[index]); } PyDoc_STRVAR(unicodedata_combining__doc__, @@ -379,7 +379,7 @@ if (old->category_changed == 0) index = 0; /* unassigned */ } - return PyString_FromString(_PyUnicode_EastAsianWidthNames[index]); + return PyBytes_FromString(_PyUnicode_EastAsianWidthNames[index]); } PyDoc_STRVAR(unicodedata_decomposition__doc__, @@ -411,7 +411,7 @@ if (self) { const change_record *old = get_old_record(self, *PyUnicode_AS_UNICODE(v)); if (old->category_changed == 0) - return PyString_FromString(""); /* unassigned */ + return PyBytes_FromString(""); /* unassigned */ } if (code < 0 || code >= 0x110000) @@ -450,7 +450,7 @@ decomp[i] = '\0'; - return PyString_FromString(decomp); + return PyBytes_FromString(decomp); } static void @@ -515,7 +515,7 @@ /* Hangul Decomposition adds three characters in a single step, so we need atleast that much room. */ if (space < 3) { - Py_ssize_t newsize = PyString_GET_SIZE(result) + 10; + Py_ssize_t newsize = PyBytes_GET_SIZE(result) + 10; space += 10; if (PyUnicode_Resize(&result, newsize) == -1) return NULL; Modified: python/branches/tlee-ast-optimize/Modules/zipimport.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/zipimport.c (original) +++ python/branches/tlee-ast-optimize/Modules/zipimport.c Sun Jun 1 17:18:10 2008 @@ -154,11 +154,11 @@ } } - self->archive = PyString_FromString(buf); + self->archive = PyBytes_FromString(buf); if (self->archive == NULL) return -1; - self->prefix = PyString_FromString(prefix); + self->prefix = PyBytes_FromString(prefix); if (self->prefix == NULL) return -1; @@ -191,10 +191,10 @@ char *archive = "???"; char *prefix = ""; - if (self->archive != NULL && PyString_Check(self->archive)) - archive = PyString_AsString(self->archive); - if (self->prefix != NULL && PyString_Check(self->prefix)) - prefix = PyString_AsString(self->prefix); + if (self->archive != NULL && PyBytes_Check(self->archive)) + archive = PyBytes_AsString(self->archive); + if (self->prefix != NULL && PyBytes_Check(self->prefix)) + prefix = PyBytes_AsString(self->prefix); if (prefix != NULL && *prefix) PyOS_snprintf(buf, sizeof(buf), "", @@ -203,7 +203,7 @@ PyOS_snprintf(buf, sizeof(buf), "", archive); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } /* return fullname.split(".")[-1] */ @@ -263,7 +263,7 @@ subname = get_subname(fullname); - len = make_filename(PyString_AsString(self->prefix), subname, path); + len = make_filename(PyBytes_AsString(self->prefix), subname, path); if (len < 0) return MI_ERROR; @@ -336,12 +336,12 @@ /* add __path__ to the module *before* the code gets executed */ PyObject *pkgpath, *fullpath; - char *prefix = PyString_AsString(self->prefix); + char *prefix = PyBytes_AsString(self->prefix); char *subname = get_subname(fullname); int err; - fullpath = PyString_FromFormat("%s%c%s%s", - PyString_AsString(self->archive), + fullpath = PyBytes_FromFormat("%s%c%s%s", + PyBytes_AsString(self->archive), SEP, *prefix ? prefix : "", subname); @@ -418,9 +418,9 @@ } path = buf; #endif - len = PyString_Size(self->archive); + len = PyBytes_Size(self->archive); if ((size_t)len < strlen(path) && - strncmp(path, PyString_AsString(self->archive), len) == 0 && + strncmp(path, PyBytes_AsString(self->archive), len) == 0 && path[len] == SEP) { path = path + len + 1; } @@ -430,7 +430,7 @@ PyErr_SetFromErrnoWithFilename(PyExc_IOError, path); return NULL; } - return get_data(PyString_AsString(self->archive), toc_entry); + return get_data(PyBytes_AsString(self->archive), toc_entry); } static PyObject * @@ -467,7 +467,7 @@ } subname = get_subname(fullname); - len = make_filename(PyString_AsString(self->prefix), subname, path); + len = make_filename(PyBytes_AsString(self->prefix), subname, path); if (len < 0) return NULL; @@ -480,7 +480,7 @@ toc_entry = PyDict_GetItemString(self->files, path); if (toc_entry != NULL) - return get_data(PyString_AsString(self->archive), toc_entry); + return get_data(PyBytes_AsString(self->archive), toc_entry); /* we have the module, but no source */ Py_INCREF(Py_None); @@ -843,13 +843,13 @@ PyMarshal_ReadShortFromFile(fp); /* local header size */ file_offset += l; /* Start of file data */ - raw_data = PyString_FromStringAndSize((char *)NULL, compress == 0 ? + raw_data = PyBytes_FromStringAndSize((char *)NULL, compress == 0 ? data_size : data_size + 1); if (raw_data == NULL) { fclose(fp); return NULL; } - buf = PyString_AsString(raw_data); + buf = PyBytes_AsString(raw_data); err = fseek(fp, file_offset, 0); if (err == 0) @@ -907,8 +907,8 @@ unmarshal_code(char *pathname, PyObject *data, time_t mtime) { PyObject *code; - char *buf = PyString_AsString(data); - Py_ssize_t size = PyString_Size(data); + char *buf = PyBytes_AsString(data); + Py_ssize_t size = PyBytes_Size(data); if (size <= 9) { PyErr_SetString(ZipImportError, @@ -953,14 +953,14 @@ static PyObject * normalize_line_endings(PyObject *source) { - char *buf, *q, *p = PyString_AsString(source); + char *buf, *q, *p = PyBytes_AsString(source); PyObject *fixed_source; if (!p) return NULL; /* one char extra for trailing \n and one for terminating \0 */ - buf = (char *)PyMem_Malloc(PyString_Size(source) + 2); + buf = (char *)PyMem_Malloc(PyBytes_Size(source) + 2); if (buf == NULL) { PyErr_SetString(PyExc_MemoryError, "zipimport: no memory to allocate " @@ -979,7 +979,7 @@ } *q++ = '\n'; /* add trailing \n */ *q = '\0'; - fixed_source = PyString_FromString(buf); + fixed_source = PyBytes_FromString(buf); PyMem_Free(buf); return fixed_source; } @@ -995,7 +995,7 @@ if (fixed_source == NULL) return NULL; - code = Py_CompileString(PyString_AsString(fixed_source), pathname, + code = Py_CompileString(PyBytes_AsString(fixed_source), pathname, Py_file_input); Py_DECREF(fixed_source); return code; @@ -1054,7 +1054,7 @@ { PyObject *data, *code; char *modpath; - char *archive = PyString_AsString(self->archive); + char *archive = PyBytes_AsString(self->archive); if (archive == NULL) return NULL; @@ -1063,7 +1063,7 @@ if (data == NULL) return NULL; - modpath = PyString_AsString(PyTuple_GetItem(toc_entry, 0)); + modpath = PyBytes_AsString(PyTuple_GetItem(toc_entry, 0)); if (isbytecode) { code = unmarshal_code(modpath, data, mtime); @@ -1088,7 +1088,7 @@ subname = get_subname(fullname); - len = make_filename(PyString_AsString(self->prefix), subname, path); + len = make_filename(PyBytes_AsString(self->prefix), subname, path); if (len < 0) return NULL; @@ -1098,7 +1098,7 @@ strcpy(path + len, zso->suffix); if (Py_VerboseFlag > 1) PySys_WriteStderr("# trying %s%c%s\n", - PyString_AsString(self->archive), + PyBytes_AsString(self->archive), SEP, path); toc_entry = PyDict_GetItemString(self->files, path); if (toc_entry != NULL) { @@ -1120,7 +1120,7 @@ continue; } if (code != NULL && p_modpath != NULL) - *p_modpath = PyString_AsString( + *p_modpath = PyBytes_AsString( PyTuple_GetItem(toc_entry, 0)); return code; } Modified: python/branches/tlee-ast-optimize/Modules/zlibmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Modules/zlibmodule.c (original) +++ python/branches/tlee-ast-optimize/Modules/zlibmodule.c Sun Jun 1 17:18:10 2008 @@ -96,12 +96,12 @@ if (self == NULL) return NULL; self->is_initialised = 0; - self->unused_data = PyString_FromString(""); + self->unused_data = PyBytes_FromString(""); if (self->unused_data == NULL) { Py_DECREF(self); return NULL; } - self->unconsumed_tail = PyString_FromString(""); + self->unconsumed_tail = PyBytes_FromString(""); if (self->unconsumed_tail == NULL) { Py_DECREF(self); return NULL; @@ -174,7 +174,7 @@ err=deflateEnd(&zst); if (err == Z_OK) - ReturnVal = PyString_FromStringAndSize((char *)output, + ReturnVal = PyBytes_FromStringAndSize((char *)output, zst.total_out); else zlib_error(zst, err, "while finishing compression"); @@ -211,12 +211,12 @@ zst.avail_in = length; zst.avail_out = r_strlen; - if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen))) + if (!(result_str = PyBytes_FromStringAndSize(NULL, r_strlen))) return NULL; zst.zalloc = (alloc_func)NULL; zst.zfree = (free_func)Z_NULL; - zst.next_out = (Byte *)PyString_AS_STRING(result_str); + zst.next_out = (Byte *)PyBytes_AS_STRING(result_str); zst.next_in = (Byte *)input; err = inflateInit2(&zst, wsize); @@ -256,11 +256,11 @@ /* fall through */ case(Z_OK): /* need more memory */ - if (_PyString_Resize(&result_str, r_strlen << 1) < 0) { + if (_PyBytes_Resize(&result_str, r_strlen << 1) < 0) { inflateEnd(&zst); goto error; } - zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \ + zst.next_out = (unsigned char *)PyBytes_AS_STRING(result_str) \ + r_strlen; zst.avail_out = r_strlen; r_strlen = r_strlen << 1; @@ -278,7 +278,7 @@ goto error; } - _PyString_Resize(&result_str, zst.total_out); + _PyBytes_Resize(&result_str, zst.total_out); return result_str; error: @@ -400,7 +400,7 @@ if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen)) return NULL; - if (!(RetVal = PyString_FromStringAndSize(NULL, length))) + if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) return NULL; ENTER_ZLIB @@ -409,7 +409,7 @@ self->zst.avail_in = inplen; self->zst.next_in = input; self->zst.avail_out = length; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal); Py_BEGIN_ALLOW_THREADS err = deflate(&(self->zst), Z_NO_FLUSH); @@ -418,9 +418,9 @@ /* while Z_OK and the output buffer is full, there might be more output, so extend the output buffer and try again */ while (err == Z_OK && self->zst.avail_out == 0) { - if (_PyString_Resize(&RetVal, length << 1) < 0) + if (_PyBytes_Resize(&RetVal, length << 1) < 0) goto error; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal) \ + length; self->zst.avail_out = length; length = length << 1; @@ -440,7 +440,7 @@ RetVal = NULL; goto error; } - _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); + _PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out); error: LEAVE_ZLIB @@ -479,7 +479,7 @@ /* limit amount of data allocated to max_length */ if (max_length && length > max_length) length = max_length; - if (!(RetVal = PyString_FromStringAndSize(NULL, length))) + if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) return NULL; ENTER_ZLIB @@ -488,7 +488,7 @@ self->zst.avail_in = inplen; self->zst.next_in = input; self->zst.avail_out = length; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal); Py_BEGIN_ALLOW_THREADS err = inflate(&(self->zst), Z_SYNC_FLUSH); @@ -510,9 +510,9 @@ if (max_length && length > max_length) length = max_length; - if (_PyString_Resize(&RetVal, length) < 0) + if (_PyBytes_Resize(&RetVal, length) < 0) goto error; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal) \ + old_length; self->zst.avail_out = length - old_length; @@ -525,7 +525,7 @@ of specified size. Return the unconsumed tail in an attribute.*/ if(max_length) { Py_DECREF(self->unconsumed_tail); - self->unconsumed_tail = PyString_FromStringAndSize((char *)self->zst.next_in, + self->unconsumed_tail = PyBytes_FromStringAndSize((char *)self->zst.next_in, self->zst.avail_in); if(!self->unconsumed_tail) { Py_DECREF(RetVal); @@ -542,7 +542,7 @@ */ if (err == Z_STREAM_END) { Py_XDECREF(self->unused_data); /* Free original empty string */ - self->unused_data = PyString_FromStringAndSize( + self->unused_data = PyBytes_FromStringAndSize( (char *)self->zst.next_in, self->zst.avail_in); if (self->unused_data == NULL) { Py_DECREF(RetVal); @@ -559,7 +559,7 @@ goto error; } - _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); + _PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out); error: LEAVE_ZLIB @@ -589,10 +589,10 @@ /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in doing any work at all; just return an empty string. */ if (flushmode == Z_NO_FLUSH) { - return PyString_FromStringAndSize(NULL, 0); + return PyBytes_FromStringAndSize(NULL, 0); } - if (!(RetVal = PyString_FromStringAndSize(NULL, length))) + if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) return NULL; ENTER_ZLIB @@ -600,7 +600,7 @@ start_total_out = self->zst.total_out; self->zst.avail_in = 0; self->zst.avail_out = length; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal); + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal); Py_BEGIN_ALLOW_THREADS err = deflate(&(self->zst), flushmode); @@ -609,9 +609,9 @@ /* while Z_OK and the output buffer is full, there might be more output, so extend the output buffer and try again */ while (err == Z_OK && self->zst.avail_out == 0) { - if (_PyString_Resize(&RetVal, length << 1) < 0) + if (_PyBytes_Resize(&RetVal, length << 1) < 0) goto error; - self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \ + self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal) \ + length; self->zst.avail_out = length; length = length << 1; @@ -646,7 +646,7 @@ goto error; } - _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); + _PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out); error: LEAVE_ZLIB @@ -778,7 +778,7 @@ PyErr_SetString(PyExc_ValueError, "length must be greater than zero"); return NULL; } - if (!(retval = PyString_FromStringAndSize(NULL, length))) + if (!(retval = PyBytes_FromStringAndSize(NULL, length))) return NULL; @@ -786,7 +786,7 @@ start_total_out = self->zst.total_out; self->zst.avail_out = length; - self->zst.next_out = (Byte *)PyString_AS_STRING(retval); + self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval); Py_BEGIN_ALLOW_THREADS err = inflate(&(self->zst), Z_FINISH); @@ -795,9 +795,9 @@ /* while Z_OK and the output buffer is full, there might be more output, so extend the output buffer and try again */ while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) { - if (_PyString_Resize(&retval, length << 1) < 0) + if (_PyBytes_Resize(&retval, length << 1) < 0) goto error; - self->zst.next_out = (Byte *)PyString_AS_STRING(retval) + length; + self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length; self->zst.avail_out = length; length = length << 1; @@ -819,7 +819,7 @@ goto error; } } - _PyString_Resize(&retval, self->zst.total_out - start_total_out); + _PyBytes_Resize(&retval, self->zst.total_out - start_total_out); error: @@ -1027,7 +1027,7 @@ PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH); PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH); - ver = PyString_FromString(ZLIB_VERSION); + ver = PyBytes_FromString(ZLIB_VERSION); if (ver != NULL) PyModule_AddObject(m, "ZLIB_VERSION", ver); Modified: python/branches/tlee-ast-optimize/Objects/abstract.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/abstract.c (original) +++ python/branches/tlee-ast-optimize/Objects/abstract.c Sun Jun 1 17:18:10 2008 @@ -105,7 +105,7 @@ /* cache a hashed version of the attribute string */ if (hintstrobj == NULL) { - hintstrobj = PyString_InternFromString("__length_hint__"); + hintstrobj = PyBytes_InternFromString("__length_hint__"); if (hintstrobj == NULL) goto defaultcase; } @@ -227,7 +227,7 @@ null_error(); return -1; } - okey = PyString_FromString(key); + okey = PyBytes_FromString(key); if (okey == NULL) return -1; ret = PyObject_DelItem(o, okey); @@ -729,21 +729,21 @@ /* Initialize cached value */ if (str__format__ == NULL) { /* Initialize static variable needed by _PyType_Lookup */ - str__format__ = PyString_InternFromString("__format__"); + str__format__ = PyBytes_InternFromString("__format__"); if (str__format__ == NULL) goto done; } /* If no format_spec is provided, use an empty string */ if (format_spec == NULL) { - empty = PyString_FromStringAndSize(NULL, 0); + empty = PyBytes_FromStringAndSize(NULL, 0); format_spec = empty; } /* Check the format_spec type, and make sure it's str or unicode */ if (PyUnicode_Check(format_spec)) spec_is_unicode = 1; - else if (PyString_Check(format_spec)) + else if (PyBytes_Check(format_spec)) spec_is_unicode = 0; else { PyErr_Format(PyExc_TypeError, @@ -823,7 +823,7 @@ /* Check the result type, and make sure it's str or unicode */ if (PyUnicode_Check(result)) result_is_unicode = 1; - else if (PyString_Check(result)) + else if (PyBytes_Check(result)) result_is_unicode = 0; else { PyErr_Format(PyExc_TypeError, @@ -1541,7 +1541,7 @@ const char *type_name; static PyObject *int_name = NULL; if (int_name == NULL) { - int_name = PyString_InternFromString("__int__"); + int_name = PyBytes_InternFromString("__int__"); if (int_name == NULL) return NULL; } @@ -1567,7 +1567,7 @@ non_integral_error: if (PyInstance_Check(integral)) { - type_name = PyString_AS_STRING(((PyInstanceObject *)integral) + type_name = PyBytes_AS_STRING(((PyInstanceObject *)integral) ->in_class->cl_name); } else { @@ -1589,7 +1589,7 @@ Py_ssize_t buffer_len; if (trunc_name == NULL) { - trunc_name = PyString_InternFromString("__trunc__"); + trunc_name = PyBytes_InternFromString("__trunc__"); if (trunc_name == NULL) return NULL; } @@ -1629,9 +1629,9 @@ } PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */ - if (PyString_Check(o)) - return int_from_string(PyString_AS_STRING(o), - PyString_GET_SIZE(o)); + if (PyBytes_Check(o)) + return int_from_string(PyBytes_AS_STRING(o), + PyBytes_GET_SIZE(o)); #ifdef Py_USING_UNICODE if (PyUnicode_Check(o)) return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o), @@ -1674,7 +1674,7 @@ Py_ssize_t buffer_len; if (trunc_name == NULL) { - trunc_name = PyString_InternFromString("__trunc__"); + trunc_name = PyBytes_InternFromString("__trunc__"); if (trunc_name == NULL) return NULL; } @@ -1716,13 +1716,13 @@ } PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */ - if (PyString_Check(o)) + if (PyBytes_Check(o)) /* need to do extra error checking that PyLong_FromString() * doesn't do. In particular long('9.5') must raise an * exception, not truncate the float. */ - return long_from_string(PyString_AS_STRING(o), - PyString_GET_SIZE(o)); + return long_from_string(PyBytes_AS_STRING(o), + PyBytes_GET_SIZE(o)); #ifdef Py_USING_UNICODE if (PyUnicode_Check(o)) /* The above check is done in PyLong_FromUnicode(). */ @@ -2413,7 +2413,7 @@ if (key == NULL) return null_error(); - okey = PyString_FromString(key); + okey = PyBytes_FromString(key); if (okey == NULL) return NULL; r = PyObject_GetItem(o, okey); @@ -2432,7 +2432,7 @@ return -1; } - okey = PyString_FromString(key); + okey = PyBytes_FromString(key); if (okey == NULL) return -1; r = PyObject_SetItem(o, okey, value); @@ -2760,7 +2760,7 @@ PyObject *bases; if (__bases__ == NULL) { - __bases__ = PyString_InternFromString("__bases__"); + __bases__ = PyBytes_InternFromString("__bases__"); if (__bases__ == NULL) return NULL; } @@ -2838,7 +2838,7 @@ int retval = 0; if (__class__ == NULL) { - __class__ = PyString_InternFromString("__class__"); + __class__ = PyBytes_InternFromString("__class__"); if (__class__ == NULL) return -1; } @@ -2914,7 +2914,7 @@ return 1; if (name == NULL) { - name = PyString_InternFromString("__instancecheck__"); + name = PyBytes_InternFromString("__instancecheck__"); if (name == NULL) return -1; } @@ -2998,7 +2998,7 @@ PyErr_Fetch(&t, &v, &tb); if (name == NULL) { - name = PyString_InternFromString("__subclasscheck__"); + name = PyBytes_InternFromString("__subclasscheck__"); if (name == NULL) return -1; } Modified: python/branches/tlee-ast-optimize/Objects/boolobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/boolobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/boolobject.c Sun Jun 1 17:18:10 2008 @@ -25,10 +25,10 @@ if (self->ob_ival) s = true_str ? true_str : - (true_str = PyString_InternFromString("True")); + (true_str = PyBytes_InternFromString("True")); else s = false_str ? false_str : - (false_str = PyString_InternFromString("False")); + (false_str = PyBytes_InternFromString("False")); Py_XINCREF(s); return s; } Modified: python/branches/tlee-ast-optimize/Objects/bufferobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/bufferobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/bufferobject.c Sun Jun 1 17:18:10 2008 @@ -287,13 +287,13 @@ const char *status = self->b_readonly ? "read-only" : "read-write"; if ( self->b_base == NULL ) - return PyString_FromFormat("<%s buffer ptr %p, size %zd at %p>", + return PyBytes_FromFormat("<%s buffer ptr %p, size %zd at %p>", status, self->b_ptr, self->b_size, self); else - return PyString_FromFormat( + return PyBytes_FromFormat( "<%s buffer for %p, size %zd, offset %zd at %p>", status, self->b_base, @@ -318,7 +318,7 @@ * underlying memory is immutable. b_readonly is a necessary but not * sufficient condition for a buffer to be hashable. Perhaps it would * be better to only allow hashing if the underlying object is known to - * be immutable (e.g. PyString_Check() is true). Another idea would + * be immutable (e.g. PyBytes_Check() is true). Another idea would * be to call tp_hash on the underlying object and see if it raises * an error. */ if ( !self->b_readonly ) @@ -349,7 +349,7 @@ Py_ssize_t size; if (!get_buf(self, &ptr, &size, ANY_BUFFER)) return NULL; - return PyString_FromStringAndSize((const char *)ptr, size); + return PyBytes_FromStringAndSize((const char *)ptr, size); } /* Sequence methods */ @@ -401,10 +401,10 @@ if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 ) return NULL; - ob = PyString_FromStringAndSize(NULL, size + count); + ob = PyBytes_FromStringAndSize(NULL, size + count); if ( ob == NULL ) return NULL; - p = PyString_AS_STRING(ob); + p = PyBytes_AS_STRING(ob); memcpy(p, ptr1, size); memcpy(p + size, ptr2, count); @@ -426,11 +426,11 @@ count = 0; if (!get_buf(self, &ptr, &size, ANY_BUFFER)) return NULL; - ob = PyString_FromStringAndSize(NULL, size * count); + ob = PyBytes_FromStringAndSize(NULL, size * count); if ( ob == NULL ) return NULL; - p = PyString_AS_STRING(ob); + p = PyBytes_AS_STRING(ob); while ( count-- ) { memcpy(p, ptr, size); @@ -454,7 +454,7 @@ PyErr_SetString(PyExc_IndexError, "buffer index out of range"); return NULL; } - return PyString_FromStringAndSize((char *)ptr + idx, 1); + return PyBytes_FromStringAndSize((char *)ptr + idx, 1); } static PyObject * @@ -472,7 +472,7 @@ right = size; if ( right < left ) right = left; - return PyString_FromStringAndSize((char *)ptr + left, + return PyBytes_FromStringAndSize((char *)ptr + left, right - left); } @@ -501,9 +501,9 @@ } if (slicelength <= 0) - return PyString_FromStringAndSize("", 0); + return PyBytes_FromStringAndSize("", 0); else if (step == 1) - return PyString_FromStringAndSize((char *)p + start, + return PyBytes_FromStringAndSize((char *)p + start, stop - start); else { PyObject *result; @@ -518,7 +518,7 @@ result_buf[i] = source_buf[cur]; } - result = PyString_FromStringAndSize(result_buf, + result = PyBytes_FromStringAndSize(result_buf, slicelength); PyMem_Free(result_buf); return result; Modified: python/branches/tlee-ast-optimize/Objects/bytes_methods.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/bytes_methods.c (original) +++ python/branches/tlee-ast-optimize/Objects/bytes_methods.c Sun Jun 1 17:18:10 2008 @@ -462,11 +462,11 @@ Py_ssize_t i; /* - newobj = PyString_FromStringAndSize(NULL, len); + newobj = PyBytes_FromStringAndSize(NULL, len); if (!newobj) return NULL; - s = PyString_AS_STRING(newobj); + s = PyBytes_AS_STRING(newobj); */ Py_MEMCPY(result, cptr, len); @@ -490,11 +490,11 @@ Py_ssize_t i; /* - newobj = PyString_FromStringAndSize(NULL, len); + newobj = PyBytes_FromStringAndSize(NULL, len); if (!newobj) return NULL; - s = PyString_AS_STRING(newobj); + s = PyBytes_AS_STRING(newobj); */ Py_MEMCPY(result, cptr, len); @@ -520,10 +520,10 @@ int previous_is_cased = 0; /* - newobj = PyString_FromStringAndSize(NULL, len); + newobj = PyBytes_FromStringAndSize(NULL, len); if (newobj == NULL) return NULL; - s_new = PyString_AsString(newobj); + s_new = PyBytes_AsString(newobj); */ for (i = 0; i < len; i++) { int c = Py_CHARMASK(*s++); @@ -553,10 +553,10 @@ Py_ssize_t i; /* - newobj = PyString_FromStringAndSize(NULL, len); + newobj = PyBytes_FromStringAndSize(NULL, len); if (newobj == NULL) return NULL; - s_new = PyString_AsString(newobj); + s_new = PyBytes_AsString(newobj); */ if (0 < len) { int c = Py_CHARMASK(*s++); @@ -589,10 +589,10 @@ Py_ssize_t i; /* - newobj = PyString_FromStringAndSize(NULL, len); + newobj = PyBytes_FromStringAndSize(NULL, len); if (newobj == NULL) return NULL; - s_new = PyString_AsString(newobj); + s_new = PyBytes_AsString(newobj); */ for (i = 0; i < len; i++) { int c = Py_CHARMASK(*s++); Modified: python/branches/tlee-ast-optimize/Objects/cellobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/cellobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/cellobject.c Sun Jun 1 17:18:10 2008 @@ -73,9 +73,9 @@ cell_repr(PyCellObject *op) { if (op->ob_ref == NULL) - return PyString_FromFormat("", op); + return PyBytes_FromFormat("", op); - return PyString_FromFormat("", + return PyBytes_FromFormat("", op, op->ob_ref->ob_type->tp_name, op->ob_ref); } Modified: python/branches/tlee-ast-optimize/Objects/classobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/classobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/classobject.c Sun Jun 1 17:18:10 2008 @@ -32,21 +32,21 @@ PyClassObject *op, *dummy; static PyObject *docstr, *modstr, *namestr; if (docstr == NULL) { - docstr= PyString_InternFromString("__doc__"); + docstr= PyBytes_InternFromString("__doc__"); if (docstr == NULL) return NULL; } if (modstr == NULL) { - modstr= PyString_InternFromString("__module__"); + modstr= PyBytes_InternFromString("__module__"); if (modstr == NULL) return NULL; } if (namestr == NULL) { - namestr= PyString_InternFromString("__name__"); + namestr= PyBytes_InternFromString("__name__"); if (namestr == NULL) return NULL; } - if (name == NULL || !PyString_Check(name)) { + if (name == NULL || !PyBytes_Check(name)) { PyErr_SetString(PyExc_TypeError, "PyClass_New: name must be a string"); return NULL; @@ -101,13 +101,13 @@ } if (getattrstr == NULL) { - getattrstr = PyString_InternFromString("__getattr__"); + getattrstr = PyBytes_InternFromString("__getattr__"); if (getattrstr == NULL) goto alloc_error; - setattrstr = PyString_InternFromString("__setattr__"); + setattrstr = PyBytes_InternFromString("__setattr__"); if (setattrstr == NULL) goto alloc_error; - delattrstr = PyString_InternFromString("__delattr__"); + delattrstr = PyBytes_InternFromString("__delattr__"); if (delattrstr == NULL) goto alloc_error; } @@ -222,7 +222,7 @@ class_getattr(register PyClassObject *op, PyObject *name) { register PyObject *v; - register char *sname = PyString_AsString(name); + register char *sname = PyBytes_AsString(name); PyClassObject *klass; descrgetfunc f; @@ -253,7 +253,7 @@ if (v == NULL) { PyErr_Format(PyExc_AttributeError, "class %.50s has no attribute '%.400s'", - PyString_AS_STRING(op->cl_name), sname); + PyBytes_AS_STRING(op->cl_name), sname); return NULL; } f = TP_DESCR_GET(v->ob_type); @@ -316,9 +316,9 @@ static char * set_name(PyClassObject *c, PyObject *v) { - if (v == NULL || !PyString_Check(v)) + if (v == NULL || !PyBytes_Check(v)) return "__name__ must be a string object"; - if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v)) + if (strlen(PyBytes_AS_STRING(v)) != (size_t)PyBytes_GET_SIZE(v)) return "__name__ must not contain null bytes"; set_slot(&c->cl_name, v); return ""; @@ -333,9 +333,9 @@ "classes are read-only in restricted mode"); return -1; } - sname = PyString_AsString(name); + sname = PyBytes_AsString(name); if (sname[0] == '_' && sname[1] == '_') { - Py_ssize_t n = PyString_Size(name); + Py_ssize_t n = PyBytes_Size(name); if (sname[n-1] == '_' && sname[n-2] == '_') { char *err = NULL; if (strcmp(sname, "__dict__") == 0) @@ -365,7 +365,7 @@ if (rv < 0) PyErr_Format(PyExc_AttributeError, "class %.50s has no attribute '%.400s'", - PyString_AS_STRING(op->cl_name), sname); + PyBytes_AS_STRING(op->cl_name), sname); return rv; } else @@ -377,15 +377,15 @@ { PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__"); char *name; - if (op->cl_name == NULL || !PyString_Check(op->cl_name)) + if (op->cl_name == NULL || !PyBytes_Check(op->cl_name)) name = "?"; else - name = PyString_AsString(op->cl_name); - if (mod == NULL || !PyString_Check(mod)) - return PyString_FromFormat("", name, op); + name = PyBytes_AsString(op->cl_name); + if (mod == NULL || !PyBytes_Check(mod)) + return PyBytes_FromFormat("", name, op); else - return PyString_FromFormat("", - PyString_AsString(mod), + return PyBytes_FromFormat("", + PyBytes_AsString(mod), name, op); } @@ -397,21 +397,21 @@ PyObject *res; Py_ssize_t m, n; - if (name == NULL || !PyString_Check(name)) + if (name == NULL || !PyBytes_Check(name)) return class_repr(op); - if (mod == NULL || !PyString_Check(mod)) { + if (mod == NULL || !PyBytes_Check(mod)) { Py_INCREF(name); return name; } - m = PyString_GET_SIZE(mod); - n = PyString_GET_SIZE(name); - res = PyString_FromStringAndSize((char *)NULL, m+1+n); + m = PyBytes_GET_SIZE(mod); + n = PyBytes_GET_SIZE(name); + res = PyBytes_FromStringAndSize((char *)NULL, m+1+n); if (res != NULL) { - char *s = PyString_AS_STRING(res); - memcpy(s, PyString_AS_STRING(mod), m); + char *s = PyBytes_AS_STRING(res); + memcpy(s, PyBytes_AS_STRING(mod), m); s += m; *s++ = '.'; - memcpy(s, PyString_AS_STRING(name), n); + memcpy(s, PyBytes_AS_STRING(name), n); } return res; } @@ -541,7 +541,7 @@ static PyObject *initstr; if (initstr == NULL) { - initstr = PyString_InternFromString("__init__"); + initstr = PyBytes_InternFromString("__init__"); if (initstr == NULL) return NULL; } @@ -634,7 +634,7 @@ PyErr_Fetch(&error_type, &error_value, &error_traceback); /* Execute __del__ method, if any. */ if (delstr == NULL) { - delstr = PyString_InternFromString("__del__"); + delstr = PyBytes_InternFromString("__del__"); if (delstr == NULL) PyErr_WriteUnraisable((PyObject*)inst); } @@ -696,7 +696,7 @@ instance_getattr1(register PyInstanceObject *inst, PyObject *name) { register PyObject *v; - register char *sname = PyString_AsString(name); + register char *sname = PyBytes_AsString(name); if (sname[0] == '_' && sname[1] == '_') { if (strcmp(sname, "__dict__") == 0) { if (PyEval_GetRestricted()) { @@ -716,7 +716,7 @@ if (v == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "%.50s instance has no attribute '%.400s'", - PyString_AS_STRING(inst->in_class->cl_name), sname); + PyBytes_AS_STRING(inst->in_class->cl_name), sname); } return v; } @@ -779,7 +779,7 @@ assert(PyInstance_Check(pinst)); inst = (PyInstanceObject *)pinst; - assert(PyString_Check(name)); + assert(PyBytes_Check(name)); v = PyDict_GetItem(inst->in_dict, name); if (v == NULL) @@ -795,8 +795,8 @@ if (rv < 0) PyErr_Format(PyExc_AttributeError, "%.50s instance has no attribute '%.400s'", - PyString_AS_STRING(inst->in_class->cl_name), - PyString_AS_STRING(name)); + PyBytes_AS_STRING(inst->in_class->cl_name), + PyBytes_AS_STRING(name)); return rv; } else @@ -807,9 +807,9 @@ instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v) { PyObject *func, *args, *res, *tmp; - char *sname = PyString_AsString(name); + char *sname = PyBytes_AsString(name); if (sname[0] == '_' && sname[1] == '_') { - Py_ssize_t n = PyString_Size(name); + Py_ssize_t n = PyBytes_Size(name); if (sname[n-1] == '_' && sname[n-2] == '_') { if (strcmp(sname, "__dict__") == 0) { if (PyEval_GetRestricted()) { @@ -875,7 +875,7 @@ static PyObject *reprstr; if (reprstr == NULL) { - reprstr = PyString_InternFromString("__repr__"); + reprstr = PyBytes_InternFromString("__repr__"); if (reprstr == NULL) return NULL; } @@ -889,16 +889,16 @@ classname = inst->in_class->cl_name; mod = PyDict_GetItemString(inst->in_class->cl_dict, "__module__"); - if (classname != NULL && PyString_Check(classname)) - cname = PyString_AsString(classname); + if (classname != NULL && PyBytes_Check(classname)) + cname = PyBytes_AsString(classname); else cname = "?"; - if (mod == NULL || !PyString_Check(mod)) - return PyString_FromFormat("", + if (mod == NULL || !PyBytes_Check(mod)) + return PyBytes_FromFormat("", cname, inst); else - return PyString_FromFormat("<%s.%s instance at %p>", - PyString_AsString(mod), + return PyBytes_FromFormat("<%s.%s instance at %p>", + PyBytes_AsString(mod), cname, inst); } res = PyEval_CallObject(func, (PyObject *)NULL); @@ -914,7 +914,7 @@ static PyObject *strstr; if (strstr == NULL) { - strstr = PyString_InternFromString("__str__"); + strstr = PyBytes_InternFromString("__str__"); if (strstr == NULL) return NULL; } @@ -939,7 +939,7 @@ static PyObject *hashstr, *eqstr, *cmpstr; if (hashstr == NULL) { - hashstr = PyString_InternFromString("__hash__"); + hashstr = PyBytes_InternFromString("__hash__"); if (hashstr == NULL) return -1; } @@ -952,7 +952,7 @@ address. If an __eq__ or __cmp__ method exists, there must be a __hash__. */ if (eqstr == NULL) { - eqstr = PyString_InternFromString("__eq__"); + eqstr = PyBytes_InternFromString("__eq__"); if (eqstr == NULL) return -1; } @@ -962,7 +962,7 @@ return -1; PyErr_Clear(); if (cmpstr == NULL) { - cmpstr = PyString_InternFromString("__cmp__"); + cmpstr = PyBytes_InternFromString("__cmp__"); if (cmpstr == NULL) return -1; } @@ -1014,7 +1014,7 @@ Py_ssize_t outcome; if (lenstr == NULL) { - lenstr = PyString_InternFromString("__len__"); + lenstr = PyBytes_InternFromString("__len__"); if (lenstr == NULL) return -1; } @@ -1063,7 +1063,7 @@ PyObject *res; if (getitemstr == NULL) { - getitemstr = PyString_InternFromString("__getitem__"); + getitemstr = PyBytes_InternFromString("__getitem__"); if (getitemstr == NULL) return NULL; } @@ -1090,7 +1090,7 @@ if (value == NULL) { if (delitemstr == NULL) { - delitemstr = PyString_InternFromString("__delitem__"); + delitemstr = PyBytes_InternFromString("__delitem__"); if (delitemstr == NULL) return -1; } @@ -1098,7 +1098,7 @@ } else { if (setitemstr == NULL) { - setitemstr = PyString_InternFromString("__setitem__"); + setitemstr = PyBytes_InternFromString("__setitem__"); if (setitemstr == NULL) return -1; } @@ -1135,7 +1135,7 @@ PyObject *func, *res; if (getitemstr == NULL) { - getitemstr = PyString_InternFromString("__getitem__"); + getitemstr = PyBytes_InternFromString("__getitem__"); if (getitemstr == NULL) return NULL; } @@ -1154,7 +1154,7 @@ static PyObject *getslicestr; if (getslicestr == NULL) { - getslicestr = PyString_InternFromString("__getslice__"); + getslicestr = PyBytes_InternFromString("__getslice__"); if (getslicestr == NULL) return NULL; } @@ -1166,7 +1166,7 @@ PyErr_Clear(); if (getitemstr == NULL) { - getitemstr = PyString_InternFromString("__getitem__"); + getitemstr = PyBytes_InternFromString("__getitem__"); if (getitemstr == NULL) return NULL; } @@ -1194,7 +1194,7 @@ if (item == NULL) { if (delitemstr == NULL) { - delitemstr = PyString_InternFromString("__delitem__"); + delitemstr = PyBytes_InternFromString("__delitem__"); if (delitemstr == NULL) return -1; } @@ -1202,7 +1202,7 @@ } else { if (setitemstr == NULL) { - setitemstr = PyString_InternFromString("__setitem__"); + setitemstr = PyBytes_InternFromString("__setitem__"); if (setitemstr == NULL) return -1; } @@ -1236,7 +1236,7 @@ if (value == NULL) { if (delslicestr == NULL) { delslicestr = - PyString_InternFromString("__delslice__"); + PyBytes_InternFromString("__delslice__"); if (delslicestr == NULL) return -1; } @@ -1247,7 +1247,7 @@ PyErr_Clear(); if (delitemstr == NULL) { delitemstr = - PyString_InternFromString("__delitem__"); + PyBytes_InternFromString("__delitem__"); if (delitemstr == NULL) return -1; } @@ -1263,7 +1263,7 @@ else { if (setslicestr == NULL) { setslicestr = - PyString_InternFromString("__setslice__"); + PyBytes_InternFromString("__setslice__"); if (setslicestr == NULL) return -1; } @@ -1274,7 +1274,7 @@ PyErr_Clear(); if (setitemstr == NULL) { setitemstr = - PyString_InternFromString("__setitem__"); + PyBytes_InternFromString("__setitem__"); if (setitemstr == NULL) return -1; } @@ -1311,7 +1311,7 @@ */ if(__contains__ == NULL) { - __contains__ = PyString_InternFromString("__contains__"); + __contains__ = PyBytes_InternFromString("__contains__"); if(__contains__ == NULL) return -1; } @@ -1417,7 +1417,7 @@ } if (coerce_obj == NULL) { - coerce_obj = PyString_InternFromString("__coerce__"); + coerce_obj = PyBytes_InternFromString("__coerce__"); if (coerce_obj == NULL) return NULL; } @@ -1504,7 +1504,7 @@ PyObject *coerced; if (coerce_obj == NULL) { - coerce_obj = PyString_InternFromString("__coerce__"); + coerce_obj = PyBytes_InternFromString("__coerce__"); if (coerce_obj == NULL) return -1; } @@ -1552,7 +1552,7 @@ #define UNARY(funcname, methodname) \ static PyObject *funcname(PyInstanceObject *self) { \ static PyObject *o; \ - if (o == NULL) { o = PyString_InternFromString(methodname); \ + if (o == NULL) { o = PyBytes_InternFromString(methodname); \ if (o == NULL) return NULL; } \ return generic_unary_op(self, o); \ } @@ -1561,7 +1561,7 @@ #define UNARY_FB(funcname, methodname, funcname_fb) \ static PyObject *funcname(PyInstanceObject *self) { \ static PyObject *o; \ - if (o == NULL) { o = PyString_InternFromString(methodname); \ + if (o == NULL) { o = PyBytes_InternFromString(methodname); \ if (o == NULL) return NULL; } \ if (PyObject_HasAttr((PyObject*)self, o)) \ return generic_unary_op(self, o); \ @@ -1630,7 +1630,7 @@ assert(PyInstance_Check(v)); if (cmp_obj == NULL) { - cmp_obj = PyString_InternFromString("__cmp__"); + cmp_obj = PyBytes_InternFromString("__cmp__"); if (cmp_obj == NULL) return -2; } @@ -1738,7 +1738,7 @@ static PyObject *nonzerostr; if (nonzerostr == NULL) { - nonzerostr = PyString_InternFromString("__nonzero__"); + nonzerostr = PyBytes_InternFromString("__nonzero__"); if (nonzerostr == NULL) return -1; } @@ -1747,7 +1747,7 @@ return -1; PyErr_Clear(); if (lenstr == NULL) { - lenstr = PyString_InternFromString("__len__"); + lenstr = PyBytes_InternFromString("__len__"); if (lenstr == NULL) return -1; } @@ -1787,7 +1787,7 @@ static PyObject *indexstr = NULL; if (indexstr == NULL) { - indexstr = PyString_InternFromString("__index__"); + indexstr = PyBytes_InternFromString("__index__"); if (indexstr == NULL) return NULL; } @@ -1814,7 +1814,7 @@ PyObject *truncated; static PyObject *int_name; if (int_name == NULL) { - int_name = PyString_InternFromString("__int__"); + int_name = PyBytes_InternFromString("__int__"); if (int_name == NULL) return NULL; } @@ -1929,7 +1929,7 @@ if (name_op == NULL) return -1; for (i = 0; i < NAME_OPS; ++i) { - name_op[i] = PyString_InternFromString(_name_op[i]); + name_op[i] = PyBytes_InternFromString(_name_op[i]); if (name_op[i] == NULL) return -1; } @@ -2012,12 +2012,12 @@ PyObject *func; if (iterstr == NULL) { - iterstr = PyString_InternFromString("__iter__"); + iterstr = PyBytes_InternFromString("__iter__"); if (iterstr == NULL) return NULL; } if (getitemstr == NULL) { - getitemstr = PyString_InternFromString("__getitem__"); + getitemstr = PyBytes_InternFromString("__getitem__"); if (getitemstr == NULL) return NULL; } @@ -2055,7 +2055,7 @@ PyObject *func; if (nextstr == NULL) { - nextstr = PyString_InternFromString("next"); + nextstr = PyBytes_InternFromString("next"); if (nextstr == NULL) return NULL; } @@ -2087,7 +2087,7 @@ PyErr_Clear(); PyErr_Format(PyExc_AttributeError, "%.200s instance has no __call__ method", - PyString_AsString(inst->in_class->cl_name)); + PyBytes_AsString(inst->in_class->cl_name)); return NULL; } /* We must check and increment the recursion depth here. Scenario: @@ -2261,7 +2261,7 @@ { static PyObject *docstr; if (docstr == NULL) { - docstr= PyString_InternFromString("__doc__"); + docstr= PyBytes_InternFromString("__doc__"); if (docstr == NULL) return NULL; } @@ -2384,12 +2384,12 @@ return NULL; PyErr_Clear(); } - else if (!PyString_Check(funcname)) { + else if (!PyBytes_Check(funcname)) { Py_DECREF(funcname); funcname = NULL; } else - sfuncname = PyString_AS_STRING(funcname); + sfuncname = PyBytes_AS_STRING(funcname); if (klass == NULL) klassname = NULL; else { @@ -2399,28 +2399,28 @@ return NULL; PyErr_Clear(); } - else if (!PyString_Check(klassname)) { + else if (!PyBytes_Check(klassname)) { Py_DECREF(klassname); klassname = NULL; } else - sklassname = PyString_AS_STRING(klassname); + sklassname = PyBytes_AS_STRING(klassname); } if (self == NULL) - result = PyString_FromFormat("", + result = PyBytes_FromFormat("", sklassname, sfuncname); else { /* XXX Shouldn't use repr() here! */ PyObject *selfrepr = PyObject_Repr(self); if (selfrepr == NULL) goto fail; - if (!PyString_Check(selfrepr)) { + if (!PyBytes_Check(selfrepr)) { Py_DECREF(selfrepr); goto fail; } - result = PyString_FromFormat("", + result = PyBytes_FromFormat("", sklassname, sfuncname, - PyString_AS_STRING(selfrepr)); + PyBytes_AS_STRING(selfrepr)); Py_DECREF(selfrepr); } fail: @@ -2472,8 +2472,8 @@ PyErr_Clear(); return; } - if (PyString_Check(name)) { - strncpy(buf, PyString_AS_STRING(name), bufsize); + if (PyBytes_Check(name)) { + strncpy(buf, PyBytes_AS_STRING(name), bufsize); buf[bufsize-1] = '\0'; } Py_DECREF(name); Modified: python/branches/tlee-ast-optimize/Objects/codeobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/codeobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/codeobject.c Sun Jun 1 17:18:10 2008 @@ -32,10 +32,10 @@ for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { PyObject *v = PyTuple_GET_ITEM(tuple, i); - if (v == NULL || !PyString_CheckExact(v)) { + if (v == NULL || !PyBytes_CheckExact(v)) { Py_FatalError("non-string found in code slot"); } - PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i)); + PyBytes_InternInPlace(&PyTuple_GET_ITEM(tuple, i)); } } @@ -57,9 +57,9 @@ varnames == NULL || !PyTuple_Check(varnames) || freevars == NULL || !PyTuple_Check(freevars) || cellvars == NULL || !PyTuple_Check(cellvars) || - name == NULL || !PyString_Check(name) || - filename == NULL || !PyString_Check(filename) || - lnotab == NULL || !PyString_Check(lnotab) || + name == NULL || !PyBytes_Check(name) || + filename == NULL || !PyBytes_Check(filename) || + lnotab == NULL || !PyBytes_Check(lnotab) || !PyObject_CheckReadBuffer(code)) { PyErr_BadInternalCall(); return NULL; @@ -71,11 +71,11 @@ /* Intern selected string constants */ for (i = PyTuple_Size(consts); --i >= 0; ) { PyObject *v = PyTuple_GetItem(consts, i); - if (!PyString_Check(v)) + if (!PyBytes_Check(v)) continue; - if (!all_name_chars((unsigned char *)PyString_AS_STRING(v))) + if (!all_name_chars((unsigned char *)PyBytes_AS_STRING(v))) continue; - PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i)); + PyBytes_InternInPlace(&PyTuple_GET_ITEM(consts, i)); } co = PyObject_NEW(PyCodeObject, &PyCode_Type); if (co != NULL) { @@ -145,10 +145,10 @@ for (i = 0; i < len; i++) { item = PyTuple_GET_ITEM(tup, i); - if (PyString_CheckExact(item)) { + if (PyBytes_CheckExact(item)) { Py_INCREF(item); } - else if (!PyString_Check(item)) { + else if (!PyBytes_Check(item)) { PyErr_Format( PyExc_TypeError, "name tuples must contain only " @@ -158,9 +158,9 @@ return NULL; } else { - item = PyString_FromStringAndSize( - PyString_AS_STRING(item), - PyString_GET_SIZE(item)); + item = PyBytes_FromStringAndSize( + PyBytes_AS_STRING(item), + PyBytes_GET_SIZE(item)); if (item == NULL) { Py_DECREF(newtuple); return NULL; @@ -281,14 +281,14 @@ if (co->co_firstlineno != 0) lineno = co->co_firstlineno; - if (co->co_filename && PyString_Check(co->co_filename)) - filename = PyString_AS_STRING(co->co_filename); - if (co->co_name && PyString_Check(co->co_name)) - name = PyString_AS_STRING(co->co_name); + if (co->co_filename && PyBytes_Check(co->co_filename)) + filename = PyBytes_AS_STRING(co->co_filename); + if (co->co_name && PyBytes_Check(co->co_name)) + name = PyBytes_AS_STRING(co->co_name); PyOS_snprintf(buf, sizeof(buf), "", name, co, filename, lineno); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static int @@ -508,8 +508,8 @@ int PyCode_Addr2Line(PyCodeObject *co, int addrq) { - int size = PyString_Size(co->co_lnotab) / 2; - unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab); + int size = PyBytes_Size(co->co_lnotab) / 2; + unsigned char *p = (unsigned char*)PyBytes_AsString(co->co_lnotab); int line = co->co_firstlineno; int addr = 0; while (--size >= 0) { @@ -604,8 +604,8 @@ int size, addr, line; unsigned char* p; - p = (unsigned char*)PyString_AS_STRING(co->co_lnotab); - size = PyString_GET_SIZE(co->co_lnotab) / 2; + p = (unsigned char*)PyBytes_AS_STRING(co->co_lnotab); + size = PyBytes_GET_SIZE(co->co_lnotab) / 2; addr = 0; line = co->co_firstlineno; Modified: python/branches/tlee-ast-optimize/Objects/complexobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/complexobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/complexobject.c Sun Jun 1 17:18:10 2008 @@ -303,7 +303,7 @@ cv.imag = 0.; if (complex_str == NULL) { - if (!(complex_str = PyString_InternFromString("__complex__"))) + if (!(complex_str = PyBytes_InternFromString("__complex__"))) return cv; } @@ -421,7 +421,7 @@ { char buf[100]; complex_to_buf(buf, sizeof(buf), v, PREC_REPR); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static PyObject * @@ -429,7 +429,7 @@ { char buf[100]; complex_to_buf(buf, sizeof(buf), v, PREC_STR); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static long @@ -876,9 +876,9 @@ #endif Py_ssize_t len; - if (PyString_Check(v)) { - s = PyString_AS_STRING(v); - len = PyString_GET_SIZE(v); + if (PyBytes_Check(v)) { + s = PyBytes_AS_STRING(v); + len = PyBytes_GET_SIZE(v); } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(v)) { @@ -1064,7 +1064,7 @@ Py_INCREF(r); return r; } - if (PyString_Check(r) || PyUnicode_Check(r)) { + if (PyBytes_Check(r) || PyUnicode_Check(r)) { if (i != NULL) { PyErr_SetString(PyExc_TypeError, "complex() can't take second arg" @@ -1073,7 +1073,7 @@ } return complex_subtype_from_string(type, r); } - if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) { + if (i != NULL && (PyBytes_Check(i) || PyUnicode_Check(i))) { PyErr_SetString(PyExc_TypeError, "complex() second arg can't be a string"); return NULL; @@ -1081,7 +1081,7 @@ /* XXX Hack to support classes with __complex__ method */ if (complexstr == NULL) { - complexstr = PyString_InternFromString("__complex__"); + complexstr = PyBytes_InternFromString("__complex__"); if (complexstr == NULL) return NULL; } Modified: python/branches/tlee-ast-optimize/Objects/descrobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/descrobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/descrobject.c Sun Jun 1 17:18:10 2008 @@ -15,8 +15,8 @@ static char * descr_name(PyDescrObject *descr) { - if (descr->d_name != NULL && PyString_Check(descr->d_name)) - return PyString_AS_STRING(descr->d_name); + if (descr->d_name != NULL && PyBytes_Check(descr->d_name)) + return PyBytes_AS_STRING(descr->d_name); else return "?"; } @@ -24,7 +24,7 @@ static PyObject * descr_repr(PyDescrObject *descr, char *format) { - return PyString_FromFormat(format, descr_name(descr), + return PyBytes_FromFormat(format, descr_name(descr), descr->d_type->tp_name); } @@ -314,7 +314,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString(descr->d_method->ml_doc); + return PyBytes_FromString(descr->d_method->ml_doc); } static PyMemberDef descr_members[] = { @@ -335,7 +335,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString(descr->d_member->doc); + return PyBytes_FromString(descr->d_member->doc); } static PyGetSetDef member_getset[] = { @@ -350,7 +350,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString(descr->d_getset->doc); + return PyBytes_FromString(descr->d_getset->doc); } static PyGetSetDef getset_getset[] = { @@ -365,7 +365,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromString(descr->d_base->doc); + return PyBytes_FromString(descr->d_base->doc); } static PyGetSetDef wrapperdescr_getset[] = { @@ -576,7 +576,7 @@ if (descr != NULL) { Py_XINCREF(type); descr->d_type = type; - descr->d_name = PyString_InternFromString(name); + descr->d_name = PyBytes_InternFromString(name); if (descr->d_name == NULL) { Py_DECREF(descr); descr = NULL; @@ -922,7 +922,7 @@ static PyObject * wrapper_repr(wrapperobject *wp) { - return PyString_FromFormat("", + return PyBytes_FromFormat("", wp->descr->d_base->name, wp->self->ob_type->tp_name, wp->self); @@ -947,7 +947,7 @@ { char *s = wp->descr->d_base->name; - return PyString_FromString(s); + return PyBytes_FromString(s); } static PyObject * @@ -960,7 +960,7 @@ return Py_None; } else { - return PyString_FromString(s); + return PyBytes_FromString(s); } } Modified: python/branches/tlee-ast-optimize/Objects/dictobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/dictobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/dictobject.c Sun Jun 1 17:18:10 2008 @@ -224,7 +224,7 @@ { register PyDictObject *mp; if (dummy == NULL) { /* Auto-initialize dummy */ - dummy = PyString_FromString(""); + dummy = PyBytes_FromString(""); if (dummy == NULL) return NULL; #ifdef SHOW_CONVERSION_COUNTS @@ -373,7 +373,7 @@ * this assumption allows testing for errors during PyObject_RichCompareBool() * to be dropped; string-string comparisons never raise exceptions. This also * means we don't need to go through PyObject_RichCompareBool(); we can always - * use _PyString_Eq() directly. + * use _PyBytes_Eq() directly. * * This is valuable because dicts with only string keys are very common. */ @@ -391,7 +391,7 @@ including subclasses of str; e.g., one reason to subclass strings is to override __eq__, and for speed we don't cater to that here. */ - if (!PyString_CheckExact(key)) { + if (!PyBytes_CheckExact(key)) { #ifdef SHOW_CONVERSION_COUNTS ++converted; #endif @@ -405,7 +405,7 @@ if (ep->me_key == dummy) freeslot = ep; else { - if (ep->me_hash == hash && _PyString_Eq(ep->me_key, key)) + if (ep->me_hash == hash && _PyBytes_Eq(ep->me_key, key)) return ep; freeslot = NULL; } @@ -420,7 +420,7 @@ if (ep->me_key == key || (ep->me_hash == hash && ep->me_key != dummy - && _PyString_Eq(ep->me_key, key))) + && _PyBytes_Eq(ep->me_key, key))) return ep; if (ep->me_key == dummy && freeslot == NULL) freeslot = ep; @@ -626,8 +626,8 @@ PyThreadState *tstate; if (!PyDict_Check(op)) return NULL; - if (!PyString_CheckExact(key) || - (hash = ((PyStringObject *) key)->ob_shash) == -1) + if (!PyBytes_CheckExact(key) || + (hash = ((PyBytesObject *) key)->ob_shash) == -1) { hash = PyObject_Hash(key); if (hash == -1) { @@ -680,8 +680,8 @@ assert(key); assert(value); mp = (PyDictObject *)op; - if (PyString_CheckExact(key)) { - hash = ((PyStringObject *)key)->ob_shash; + if (PyBytes_CheckExact(key)) { + hash = ((PyBytesObject *)key)->ob_shash; if (hash == -1) hash = PyObject_Hash(key); } @@ -728,8 +728,8 @@ return -1; } assert(key); - if (!PyString_CheckExact(key) || - (hash = ((PyStringObject *) key)->ob_shash) == -1) { + if (!PyBytes_CheckExact(key) || + (hash = ((PyBytesObject *) key)->ob_shash) == -1) { hash = PyObject_Hash(key); if (hash == -1) return -1; @@ -982,11 +982,11 @@ i = Py_ReprEnter((PyObject *)mp); if (i != 0) { - return i > 0 ? PyString_FromString("{...}") : NULL; + return i > 0 ? PyBytes_FromString("{...}") : NULL; } if (mp->ma_used == 0) { - result = PyString_FromString("{}"); + result = PyBytes_FromString("{}"); goto Done; } @@ -994,7 +994,7 @@ if (pieces == NULL) goto Done; - colon = PyString_FromString(": "); + colon = PyBytes_FromString(": "); if (colon == NULL) goto Done; @@ -1006,8 +1006,8 @@ /* Prevent repr from deleting value during key format. */ Py_INCREF(value); s = PyObject_Repr(key); - PyString_Concat(&s, colon); - PyString_ConcatAndDel(&s, PyObject_Repr(value)); + PyBytes_Concat(&s, colon); + PyBytes_ConcatAndDel(&s, PyObject_Repr(value)); Py_DECREF(value); if (s == NULL) goto Done; @@ -1019,29 +1019,29 @@ /* Add "{}" decorations to the first and last items. */ assert(PyList_GET_SIZE(pieces) > 0); - s = PyString_FromString("{"); + s = PyBytes_FromString("{"); if (s == NULL) goto Done; temp = PyList_GET_ITEM(pieces, 0); - PyString_ConcatAndDel(&s, temp); + PyBytes_ConcatAndDel(&s, temp); PyList_SET_ITEM(pieces, 0, s); if (s == NULL) goto Done; - s = PyString_FromString("}"); + s = PyBytes_FromString("}"); if (s == NULL) goto Done; temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1); - PyString_ConcatAndDel(&temp, s); + PyBytes_ConcatAndDel(&temp, s); PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp); if (temp == NULL) goto Done; /* Paste them all together with ", " between. */ - s = PyString_FromString(", "); + s = PyBytes_FromString(", "); if (s == NULL) goto Done; - result = _PyString_Join(s, pieces); + result = _PyBytes_Join(s, pieces); Py_DECREF(s); Done: @@ -1064,8 +1064,8 @@ long hash; PyDictEntry *ep; assert(mp->ma_table != NULL); - if (!PyString_CheckExact(key) || - (hash = ((PyStringObject *) key)->ob_shash) == -1) { + if (!PyBytes_CheckExact(key) || + (hash = ((PyBytesObject *) key)->ob_shash) == -1) { hash = PyObject_Hash(key); if (hash == -1) return NULL; @@ -1081,7 +1081,7 @@ static PyObject *missing_str = NULL; if (missing_str == NULL) missing_str = - PyString_InternFromString("__missing__"); + PyBytes_InternFromString("__missing__"); missing = _PyType_Lookup(Py_TYPE(mp), missing_str); if (missing != NULL) return PyObject_CallFunctionObjArgs(missing, @@ -1794,8 +1794,8 @@ long hash; PyDictEntry *ep; - if (!PyString_CheckExact(key) || - (hash = ((PyStringObject *) key)->ob_shash) == -1) { + if (!PyBytes_CheckExact(key) || + (hash = ((PyBytesObject *) key)->ob_shash) == -1) { hash = PyObject_Hash(key); if (hash == -1) return NULL; @@ -1827,8 +1827,8 @@ if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj)) return NULL; - if (!PyString_CheckExact(key) || - (hash = ((PyStringObject *) key)->ob_shash) == -1) { + if (!PyBytes_CheckExact(key) || + (hash = ((PyBytesObject *) key)->ob_shash) == -1) { hash = PyObject_Hash(key); if (hash == -1) return NULL; @@ -1856,8 +1856,8 @@ if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &key, &failobj)) return NULL; - if (!PyString_CheckExact(key) || - (hash = ((PyStringObject *) key)->ob_shash) == -1) { + if (!PyBytes_CheckExact(key) || + (hash = ((PyBytesObject *) key)->ob_shash) == -1) { hash = PyObject_Hash(key); if (hash == -1) return NULL; @@ -1902,8 +1902,8 @@ "pop(): dictionary is empty"); return NULL; } - if (!PyString_CheckExact(key) || - (hash = ((PyStringObject *) key)->ob_shash) == -1) { + if (!PyBytes_CheckExact(key) || + (hash = ((PyBytesObject *) key)->ob_shash) == -1) { hash = PyObject_Hash(key); if (hash == -1) return NULL; @@ -2133,8 +2133,8 @@ PyDictObject *mp = (PyDictObject *)op; PyDictEntry *ep; - if (!PyString_CheckExact(key) || - (hash = ((PyStringObject *) key)->ob_shash) == -1) { + if (!PyBytes_CheckExact(key) || + (hash = ((PyBytesObject *) key)->ob_shash) == -1) { hash = PyObject_Hash(key); if (hash == -1) return -1; @@ -2260,7 +2260,7 @@ PyDict_GetItemString(PyObject *v, const char *key) { PyObject *kv, *rv; - kv = PyString_FromString(key); + kv = PyBytes_FromString(key); if (kv == NULL) return NULL; rv = PyDict_GetItem(v, kv); @@ -2273,10 +2273,10 @@ { PyObject *kv; int err; - kv = PyString_FromString(key); + kv = PyBytes_FromString(key); if (kv == NULL) return -1; - PyString_InternInPlace(&kv); /* XXX Should we really? */ + PyBytes_InternInPlace(&kv); /* XXX Should we really? */ err = PyDict_SetItem(v, kv, item); Py_DECREF(kv); return err; @@ -2287,7 +2287,7 @@ { PyObject *kv; int err; - kv = PyString_FromString(key); + kv = PyBytes_FromString(key); if (kv == NULL) return -1; err = PyDict_DelItem(v, kv); Modified: python/branches/tlee-ast-optimize/Objects/exceptions.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/exceptions.c (original) +++ python/branches/tlee-ast-optimize/Objects/exceptions.c Sun Jun 1 17:18:10 2008 @@ -44,7 +44,7 @@ return NULL; } - self->message = PyString_FromString(""); + self->message = PyBytes_FromString(""); if (!self->message) { Py_DECREF(self); return NULL; @@ -104,7 +104,7 @@ switch (PyTuple_GET_SIZE(self->args)) { case 0: - out = PyString_FromString(""); + out = PyBytes_FromString(""); break; case 1: out = PyObject_Str(PyTuple_GET_ITEM(self->args, 0)); @@ -133,13 +133,13 @@ dot = strrchr(name, '.'); if (dot != NULL) name = dot+1; - repr = PyString_FromString(name); + repr = PyBytes_FromString(name); if (!repr) { Py_DECREF(repr_suffix); return NULL; } - PyString_ConcatAndDel(&repr, repr_suffix); + PyBytes_ConcatAndDel(&repr, repr_suffix); return repr; } @@ -610,7 +610,7 @@ PyObject *repr; PyObject *tuple; - fmt = PyString_FromString("[Errno %s] %s: %s"); + fmt = PyBytes_FromString("[Errno %s] %s: %s"); if (!fmt) return NULL; @@ -645,7 +645,7 @@ PyTuple_SET_ITEM(tuple, 2, repr); - rtnval = PyString_Format(fmt, tuple); + rtnval = PyBytes_Format(fmt, tuple); Py_DECREF(fmt); Py_DECREF(tuple); @@ -654,7 +654,7 @@ PyObject *fmt; PyObject *tuple; - fmt = PyString_FromString("[Errno %s] %s"); + fmt = PyBytes_FromString("[Errno %s] %s"); if (!fmt) return NULL; @@ -681,7 +681,7 @@ PyTuple_SET_ITEM(tuple, 1, Py_None); } - rtnval = PyString_Format(fmt, tuple); + rtnval = PyBytes_Format(fmt, tuple); Py_DECREF(fmt); Py_DECREF(tuple); @@ -841,7 +841,7 @@ PyObject *repr; PyObject *tuple; - fmt = PyString_FromString("[Error %s] %s: %s"); + fmt = PyBytes_FromString("[Error %s] %s: %s"); if (!fmt) return NULL; @@ -876,7 +876,7 @@ PyTuple_SET_ITEM(tuple, 2, repr); - rtnval = PyString_Format(fmt, tuple); + rtnval = PyBytes_Format(fmt, tuple); Py_DECREF(fmt); Py_DECREF(tuple); @@ -885,7 +885,7 @@ PyObject *fmt; PyObject *tuple; - fmt = PyString_FromString("[Error %s] %s"); + fmt = PyBytes_FromString("[Error %s] %s"); if (!fmt) return NULL; @@ -912,7 +912,7 @@ PyTuple_SET_ITEM(tuple, 1, Py_None); } - rtnval = PyString_Format(fmt, tuple); + rtnval = PyBytes_Format(fmt, tuple); Py_DECREF(fmt); Py_DECREF(tuple); @@ -1109,21 +1109,21 @@ str = PyObject_Str(Py_None); if (!str) return NULL; /* Don't fiddle with non-string return (shouldn't happen anyway) */ - if (!PyString_Check(str)) return str; + if (!PyBytes_Check(str)) return str; /* XXX -- do all the additional formatting with filename and lineno here */ have_filename = (self->filename != NULL) && - PyString_Check(self->filename); + PyBytes_Check(self->filename); have_lineno = (self->lineno != NULL) && PyInt_Check(self->lineno); if (!have_filename && !have_lineno) return str; - bufsize = PyString_GET_SIZE(str) + 64; + bufsize = PyBytes_GET_SIZE(str) + 64; if (have_filename) - bufsize += PyString_GET_SIZE(self->filename); + bufsize += PyBytes_GET_SIZE(self->filename); buffer = PyMem_MALLOC(bufsize); if (buffer == NULL) @@ -1131,19 +1131,19 @@ if (have_filename && have_lineno) PyOS_snprintf(buffer, bufsize, "%s (%s, line %ld)", - PyString_AS_STRING(str), - my_basename(PyString_AS_STRING(self->filename)), + PyBytes_AS_STRING(str), + my_basename(PyBytes_AS_STRING(self->filename)), PyInt_AsLong(self->lineno)); else if (have_filename) PyOS_snprintf(buffer, bufsize, "%s (%s)", - PyString_AS_STRING(str), - my_basename(PyString_AS_STRING(self->filename))); + PyBytes_AS_STRING(str), + my_basename(PyBytes_AS_STRING(self->filename))); else /* only have_lineno */ PyOS_snprintf(buffer, bufsize, "%s (line %ld)", - PyString_AS_STRING(str), + PyBytes_AS_STRING(str), PyInt_AsLong(self->lineno)); - result = PyString_FromString(buffer); + result = PyBytes_FromString(buffer); PyMem_FREE(buffer); if (result == NULL) @@ -1250,7 +1250,7 @@ return NULL; } - if (!PyString_Check(attr)) { + if (!PyBytes_Check(attr)) { PyErr_Format(PyExc_TypeError, "%.200s attribute must be str", name); return NULL; } @@ -1262,7 +1262,7 @@ static int set_string(PyObject **attr, const char *value) { - PyObject *obj = PyString_FromString(value); + PyObject *obj = PyBytes_FromString(value); if (!obj) return -1; Py_CLEAR(*attr); @@ -1345,7 +1345,7 @@ "object"); if (!obj) return -1; - size = PyString_GET_SIZE(obj); + size = PyBytes_GET_SIZE(obj); *start = ((PyUnicodeErrorObject *)exc)->start; if (*start<0) *start = 0; @@ -1415,7 +1415,7 @@ if (!obj) return -1; *end = ((PyUnicodeErrorObject *)exc)->end; - size = PyString_GET_SIZE(obj); + size = PyBytes_GET_SIZE(obj); if (*end<1) *end = 1; if (*end>size) @@ -1506,11 +1506,11 @@ Py_CLEAR(self->reason); if (!PyArg_ParseTuple(args, "O!O!nnO!", - &PyString_Type, &self->encoding, + &PyBytes_Type, &self->encoding, objecttype, &self->object, &self->start, &self->end, - &PyString_Type, &self->reason)) { + &PyBytes_Type, &self->reason)) { self->encoding = self->object = self->reason = NULL; return -1; } @@ -1590,20 +1590,20 @@ PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar); else PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar); - return PyString_FromFormat( + return PyBytes_FromFormat( "'%.400s' codec can't encode character u'\\%s' in position %zd: %.400s", - PyString_AS_STRING(uself->encoding), + PyBytes_AS_STRING(uself->encoding), badchar_str, uself->start, - PyString_AS_STRING(uself->reason) + PyBytes_AS_STRING(uself->reason) ); } - return PyString_FromFormat( + return PyBytes_FromFormat( "'%.400s' codec can't encode characters in position %zd-%zd: %.400s", - PyString_AS_STRING(uself->encoding), + PyBytes_AS_STRING(uself->encoding), uself->start, uself->end-1, - PyString_AS_STRING(uself->reason) + PyBytes_AS_STRING(uself->reason) ); } @@ -1642,7 +1642,7 @@ if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1) return -1; return UnicodeError_init((PyUnicodeErrorObject *)self, args, - kwds, &PyString_Type); + kwds, &PyBytes_Type); } static PyObject * @@ -1654,21 +1654,21 @@ /* FromFormat does not support %02x, so format that separately */ char byte[4]; PyOS_snprintf(byte, sizeof(byte), "%02x", - ((int)PyString_AS_STRING(uself->object)[uself->start])&0xff); - return PyString_FromFormat( + ((int)PyBytes_AS_STRING(uself->object)[uself->start])&0xff); + return PyBytes_FromFormat( "'%.400s' codec can't decode byte 0x%s in position %zd: %.400s", - PyString_AS_STRING(uself->encoding), + PyBytes_AS_STRING(uself->encoding), byte, uself->start, - PyString_AS_STRING(uself->reason) + PyBytes_AS_STRING(uself->reason) ); } - return PyString_FromFormat( + return PyBytes_FromFormat( "'%.400s' codec can't decode bytes in position %zd-%zd: %.400s", - PyString_AS_STRING(uself->encoding), + PyBytes_AS_STRING(uself->encoding), uself->start, uself->end-1, - PyString_AS_STRING(uself->reason) + PyBytes_AS_STRING(uself->reason) ); } @@ -1718,7 +1718,7 @@ &PyUnicode_Type, &self->object, &self->start, &self->end, - &PyString_Type, &self->reason)) { + &PyBytes_Type, &self->reason)) { self->object = self->reason = NULL; return -1; } @@ -1744,18 +1744,18 @@ PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar); else PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar); - return PyString_FromFormat( + return PyBytes_FromFormat( "can't translate character u'\\%s' in position %zd: %.400s", badchar_str, uself->start, - PyString_AS_STRING(uself->reason) + PyBytes_AS_STRING(uself->reason) ); } - return PyString_FromFormat( + return PyBytes_FromFormat( "can't translate characters in position %zd-%zd: %.400s", uself->start, uself->end-1, - PyString_AS_STRING(uself->reason) + PyBytes_AS_STRING(uself->reason) ); } @@ -2111,7 +2111,7 @@ (PyBaseExceptionObject *)PyExc_RecursionErrorInst; PyObject *args_tuple; PyObject *exc_message; - exc_message = PyString_FromString("maximum recursion depth exceeded"); + exc_message = PyBytes_FromString("maximum recursion depth exceeded"); if (!exc_message) Py_FatalError("cannot allocate argument for RuntimeError " "pre-allocation"); Modified: python/branches/tlee-ast-optimize/Objects/fileobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/fileobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/fileobject.c Sun Jun 1 17:18:10 2008 @@ -26,7 +26,7 @@ #include #endif -#define BUF(v) PyString_AS_STRING((PyStringObject *)v) +#define BUF(v) PyBytes_AS_STRING((PyBytesObject *)v) #ifndef DONT_HAVE_ERRNO_H #include @@ -155,11 +155,12 @@ Py_DECREF(f->f_name); Py_DECREF(f->f_mode); Py_DECREF(f->f_encoding); + Py_DECREF(f->f_errors); Py_INCREF(name); f->f_name = name; - f->f_mode = PyString_FromString(mode); + f->f_mode = PyBytes_FromString(mode); f->f_close = close; f->f_softspace = 0; @@ -170,6 +171,8 @@ f->f_skipnextlf = 0; Py_INCREF(Py_None); f->f_encoding = Py_None; + Py_INCREF(Py_None); + f->f_errors = Py_None; if (f->f_mode == NULL) return NULL; @@ -367,7 +370,7 @@ PyFileObject *f = (PyFileObject *)PyFile_Type.tp_new(&PyFile_Type, NULL, NULL); if (f != NULL) { - PyObject *o_name = PyString_FromString(name); + PyObject *o_name = PyBytes_FromString(name); if (o_name == NULL) return NULL; if (fill_file_fields(f, fp, o_name, mode, close) == NULL) { @@ -435,19 +438,38 @@ } /* Set the encoding used to output Unicode strings. - Returh 1 on success, 0 on failure. */ + Return 1 on success, 0 on failure. */ int PyFile_SetEncoding(PyObject *f, const char *enc) { + return PyFile_SetEncodingAndErrors(f, enc, NULL); +} + +int +PyFile_SetEncodingAndErrors(PyObject *f, const char *enc, char* errors) +{ PyFileObject *file = (PyFileObject*)f; - PyObject *str = PyString_FromString(enc); + PyObject *str, *oerrors; assert(PyFile_Check(f)); + str = PyBytes_FromString(enc); if (!str) return 0; + if (errors) { + oerrors = PyString_FromString(errors); + if (!oerrors) { + Py_DECREF(str); + return 0; + } + } else { + oerrors = Py_None; + Py_INCREF(Py_None); + } Py_DECREF(file->f_encoding); file->f_encoding = str; + Py_DECREF(file->f_errors); + file->f_errors = oerrors; return 1; } @@ -491,6 +513,7 @@ Py_XDECREF(f->f_name); Py_XDECREF(f->f_mode); Py_XDECREF(f->f_encoding); + Py_XDECREF(f->f_errors); drop_readahead(f); Py_TYPE(f)->tp_free((PyObject *)f); } @@ -502,20 +525,20 @@ #ifdef Py_USING_UNICODE PyObject *ret = NULL; PyObject *name = PyUnicode_AsUnicodeEscapeString(f->f_name); - const char *name_str = name ? PyString_AsString(name) : "?"; - ret = PyString_FromFormat("<%s file u'%s', mode '%s' at %p>", + const char *name_str = name ? PyBytes_AsString(name) : "?"; + ret = PyBytes_FromFormat("<%s file u'%s', mode '%s' at %p>", f->f_fp == NULL ? "closed" : "open", name_str, - PyString_AsString(f->f_mode), + PyBytes_AsString(f->f_mode), f); Py_XDECREF(name); return ret; #endif } else { - return PyString_FromFormat("<%s file '%s', mode '%s' at %p>", + return PyBytes_FromFormat("<%s file '%s', mode '%s' at %p>", f->f_fp == NULL ? "closed" : "open", - PyString_AsString(f->f_name), - PyString_AsString(f->f_mode), + PyBytes_AsString(f->f_name), + PyBytes_AsString(f->f_mode), f); } } @@ -935,7 +958,7 @@ "requested number of bytes is more than a Python string can hold"); return NULL; } - v = PyString_FromStringAndSize((char *)NULL, buffersize); + v = PyBytes_FromStringAndSize((char *)NULL, buffersize); if (v == NULL) return NULL; bytesread = 0; @@ -966,7 +989,7 @@ } if (bytesrequested < 0) { buffersize = new_buffersize(f, buffersize); - if (_PyString_Resize(&v, buffersize) < 0) + if (_PyBytes_Resize(&v, buffersize) < 0) return NULL; } else { /* Got what was requested. */ @@ -974,7 +997,7 @@ } } if (bytesread != buffersize) - _PyString_Resize(&v, bytesread); + _PyBytes_Resize(&v, bytesread); return v; } @@ -1092,7 +1115,7 @@ size_t increment; /* amount to increment the buffer */ size_t prev_v_size; - /* Optimize for normal case: avoid _PyString_Resize if at all + /* Optimize for normal case: avoid _PyBytes_Resize if at all * possible via first reading into stack buffer "buf". */ total_v_size = INITBUFSIZE; /* start small and pray */ @@ -1110,7 +1133,7 @@ clearerr(fp); if (PyErr_CheckSignals()) return NULL; - v = PyString_FromStringAndSize(buf, pvfree - buf); + v = PyBytes_FromStringAndSize(buf, pvfree - buf); return v; } /* fgets read *something* */ @@ -1139,7 +1162,7 @@ assert(p > pvfree && *(p-1) == '\0'); --p; /* don't include \0 from fgets */ } - v = PyString_FromStringAndSize(buf, p - buf); + v = PyBytes_FromStringAndSize(buf, p - buf); return v; } /* yuck: fgets overwrote all the newlines, i.e. the entire @@ -1160,7 +1183,7 @@ * into its buffer. */ total_v_size = MAXBUFSIZE << 1; - v = PyString_FromStringAndSize((char*)NULL, (int)total_v_size); + v = PyBytes_FromStringAndSize((char*)NULL, (int)total_v_size); if (v == NULL) return v; /* copy over everything except the last null byte */ @@ -1215,13 +1238,13 @@ Py_DECREF(v); return NULL; } - if (_PyString_Resize(&v, (int)total_v_size) < 0) + if (_PyBytes_Resize(&v, (int)total_v_size) < 0) return NULL; /* overwrite the trailing null byte */ pvfree = BUF(v) + (prev_v_size - 1); } if (BUF(v) + total_v_size != p) - _PyString_Resize(&v, p - BUF(v)); + _PyBytes_Resize(&v, p - BUF(v)); return v; #undef INITBUFSIZE #undef MAXBUFSIZE @@ -1253,7 +1276,7 @@ return getline_via_fgets(f, fp); #endif total_v_size = n > 0 ? n : 100; - v = PyString_FromStringAndSize((char *)NULL, total_v_size); + v = PyBytes_FromStringAndSize((char *)NULL, total_v_size); if (v == NULL) return NULL; buf = BUF(v); @@ -1326,7 +1349,7 @@ Py_DECREF(v); return NULL; } - if (_PyString_Resize(&v, total_v_size) < 0) + if (_PyBytes_Resize(&v, total_v_size) < 0) return NULL; buf = BUF(v) + used_v_size; end = BUF(v) + total_v_size; @@ -1334,7 +1357,7 @@ used_v_size = buf - BUF(v); if (used_v_size != total_v_size) - _PyString_Resize(&v, used_v_size); + _PyBytes_Resize(&v, used_v_size); return v; } @@ -1379,7 +1402,7 @@ result = PyEval_CallObject(reader, args); Py_DECREF(reader); Py_DECREF(args); - if (result != NULL && !PyString_Check(result) && + if (result != NULL && !PyBytes_Check(result) && !PyUnicode_Check(result)) { Py_DECREF(result); result = NULL; @@ -1388,9 +1411,9 @@ } } - if (n < 0 && result != NULL && PyString_Check(result)) { - char *s = PyString_AS_STRING(result); - Py_ssize_t len = PyString_GET_SIZE(result); + if (n < 0 && result != NULL && PyBytes_Check(result)) { + char *s = PyBytes_AS_STRING(result); + Py_ssize_t len = PyBytes_GET_SIZE(result); if (len == 0) { Py_DECREF(result); result = NULL; @@ -1399,10 +1422,10 @@ } else if (s[len-1] == '\n') { if (result->ob_refcnt == 1) - _PyString_Resize(&result, len-1); + _PyBytes_Resize(&result, len-1); else { PyObject *v; - v = PyString_FromStringAndSize(s, len-1); + v = PyBytes_FromStringAndSize(s, len-1); Py_DECREF(result); result = v; } @@ -1450,7 +1473,7 @@ if (!PyArg_ParseTuple(args, "|i:readline", &n)) return NULL; if (n == 0) - return PyString_FromString(""); + return PyBytes_FromString(""); if (n < 0) n = 0; return get_line(f, n); @@ -1516,18 +1539,18 @@ } if (big_buffer == NULL) { /* Create the big buffer */ - big_buffer = PyString_FromStringAndSize( + big_buffer = PyBytes_FromStringAndSize( NULL, buffersize); if (big_buffer == NULL) goto error; - buffer = PyString_AS_STRING(big_buffer); + buffer = PyBytes_AS_STRING(big_buffer); memcpy(buffer, small_buffer, nfilled); } else { /* Grow the big buffer */ - if ( _PyString_Resize(&big_buffer, buffersize) < 0 ) + if ( _PyBytes_Resize(&big_buffer, buffersize) < 0 ) goto error; - buffer = PyString_AS_STRING(big_buffer); + buffer = PyBytes_AS_STRING(big_buffer); } continue; } @@ -1536,7 +1559,7 @@ do { /* Process complete lines */ p++; - line = PyString_FromStringAndSize(q, p-q); + line = PyBytes_FromStringAndSize(q, p-q); if (line == NULL) goto error; err = PyList_Append(list, line); @@ -1555,7 +1578,7 @@ } if (nfilled != 0) { /* Partial last line */ - line = PyString_FromStringAndSize(buffer, nfilled); + line = PyBytes_FromStringAndSize(buffer, nfilled); if (line == NULL) goto error; if (sizehint > 0) { @@ -1565,7 +1588,7 @@ Py_DECREF(line); goto error; } - PyString_Concat(&line, rest); + PyBytes_Concat(&line, rest); Py_DECREF(rest); if (line == NULL) goto error; @@ -1672,7 +1695,7 @@ could potentially execute Python code. */ for (i = 0; i < j; i++) { PyObject *v = PyList_GET_ITEM(list, i); - if (!PyString_Check(v)) { + if (!PyBytes_Check(v)) { const char *buffer; if (((f->f_binary && PyObject_AsReadBuffer(v, @@ -1685,7 +1708,7 @@ "writelines() argument must be a sequence of strings"); goto error; } - line = PyString_FromStringAndSize(buffer, + line = PyBytes_FromStringAndSize(buffer, len); if (line == NULL) goto error; @@ -1701,8 +1724,8 @@ errno = 0; for (i = 0; i < j; i++) { line = PyList_GET_ITEM(list, i); - len = PyString_GET_SIZE(line); - nwritten = fwrite(PyString_AS_STRING(line), + len = PyBytes_GET_SIZE(line); + nwritten = fwrite(PyBytes_AS_STRING(line), 1, len, f->f_fp); if (nwritten != len) { FILE_ABORT_ALLOW_THREADS(f) @@ -1879,6 +1902,8 @@ "file name"}, {"encoding", T_OBJECT, OFF(f_encoding), RO, "file encoding"}, + {"errors", T_OBJECT, OFF(f_errors), RO, + "Unicode error handler"}, /* getattr(f, "closed") is implemented without this table */ {NULL} /* Sentinel */ }; @@ -1896,13 +1921,13 @@ Py_INCREF(Py_None); return Py_None; case NEWLINE_CR: - return PyString_FromString("\r"); + return PyBytes_FromString("\r"); case NEWLINE_LF: - return PyString_FromString("\n"); + return PyBytes_FromString("\n"); case NEWLINE_CR|NEWLINE_LF: return Py_BuildValue("(ss)", "\r", "\n"); case NEWLINE_CRLF: - return PyString_FromString("\r\n"); + return PyBytes_FromString("\r\n"); case NEWLINE_CR|NEWLINE_CRLF: return Py_BuildValue("(ss)", "\r", "\r\n"); case NEWLINE_LF|NEWLINE_CRLF: @@ -2004,10 +2029,10 @@ horrified by the recursive call: maximum recursion depth is limited by logarithmic buffer growth to about 50 even when reading a 1gb line. */ -static PyStringObject * +static PyBytesObject * readahead_get_line_skip(PyFileObject *f, int skip, int bufsize) { - PyStringObject* s; + PyBytesObject* s; char *bufptr; char *buf; Py_ssize_t len; @@ -2018,17 +2043,17 @@ len = f->f_bufend - f->f_bufptr; if (len == 0) - return (PyStringObject *) - PyString_FromStringAndSize(NULL, skip); + return (PyBytesObject *) + PyBytes_FromStringAndSize(NULL, skip); bufptr = (char *)memchr(f->f_bufptr, '\n', len); if (bufptr != NULL) { bufptr++; /* Count the '\n' */ len = bufptr - f->f_bufptr; - s = (PyStringObject *) - PyString_FromStringAndSize(NULL, skip+len); + s = (PyBytesObject *) + PyBytes_FromStringAndSize(NULL, skip+len); if (s == NULL) return NULL; - memcpy(PyString_AS_STRING(s)+skip, f->f_bufptr, len); + memcpy(PyBytes_AS_STRING(s)+skip, f->f_bufptr, len); f->f_bufptr = bufptr; if (bufptr == f->f_bufend) drop_readahead(f); @@ -2043,7 +2068,7 @@ PyMem_Free(buf); return NULL; } - memcpy(PyString_AS_STRING(s)+skip, bufptr, len); + memcpy(PyBytes_AS_STRING(s)+skip, bufptr, len); PyMem_Free(buf); } return s; @@ -2055,13 +2080,13 @@ static PyObject * file_iternext(PyFileObject *f) { - PyStringObject* l; + PyBytesObject* l; if (f->f_fp == NULL) return err_closed(); l = readahead_get_line_skip(f, 0, READAHEAD_BUFSIZE); - if (l == NULL || PyString_GET_SIZE(l) == 0) { + if (l == NULL || PyBytes_GET_SIZE(l) == 0) { Py_XDECREF(l); return NULL; } @@ -2078,7 +2103,7 @@ assert(type != NULL && type->tp_alloc != NULL); if (not_yet_string == NULL) { - not_yet_string = PyString_InternFromString(""); + not_yet_string = PyBytes_InternFromString(""); if (not_yet_string == NULL) return NULL; } @@ -2093,6 +2118,8 @@ ((PyFileObject *)self)->f_mode = not_yet_string; Py_INCREF(Py_None); ((PyFileObject *)self)->f_encoding = Py_None; + Py_INCREF(Py_None); + ((PyFileObject *)self)->f_errors = Py_None; ((PyFileObject *)self)->weakreflist = NULL; ((PyFileObject *)self)->unlocked_count = 0; } @@ -2294,8 +2321,10 @@ #ifdef Py_USING_UNICODE if ((flags & Py_PRINT_RAW) && PyUnicode_Check(v) && enc != Py_None) { - char *cenc = PyString_AS_STRING(enc); - value = PyUnicode_AsEncodedString(v, cenc, "strict"); + char *cenc = PyBytes_AS_STRING(enc); + char *errors = fobj->f_errors == Py_None ? + "strict" : PyBytes_AS_STRING(fobj->f_errors); + value = PyUnicode_AsEncodedString(v, cenc, errors); if (value == NULL) return -1; } else { @@ -2365,7 +2394,7 @@ return 0; } else if (!PyErr_Occurred()) { - PyObject *v = PyString_FromString(s); + PyObject *v = PyBytes_FromString(s); int err; if (v == NULL) return -1; Modified: python/branches/tlee-ast-optimize/Objects/floatobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/floatobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/floatobject.c Sun Jun 1 17:18:10 2008 @@ -14,9 +14,6 @@ #include #endif -#include "formatter_string.h" - - #ifdef _OSF_SOURCE /* OSF1 5.1 doesn't make this available with XOPEN_SOURCE_EXTENDED defined */ extern int finite(double); @@ -185,9 +182,9 @@ if (pend) *pend = NULL; - if (PyString_Check(v)) { - s = PyString_AS_STRING(v); - len = PyString_GET_SIZE(v); + if (PyBytes_Check(v)) { + s = PyBytes_AS_STRING(v); + len = PyBytes_GET_SIZE(v); } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(v)) { @@ -488,7 +485,7 @@ char buf[100]; format_float(buf, sizeof(buf), v, PREC_REPR); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static PyObject * @@ -496,7 +493,7 @@ { char buf[100]; format_float(buf, sizeof(buf), v, PREC_STR); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } /* Comparison is pretty much a nightmare. When comparing float to float, @@ -1221,7 +1218,7 @@ return float_subtype_new(type, args, kwds); /* Wimp out */ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:float", kwlist, &x)) return NULL; - if (PyString_Check(x)) + if (PyBytes_Check(x)) return PyFloat_FromString(x, NULL); return PyNumber_Float(x); } @@ -1272,13 +1269,13 @@ char* s; float_format_type r; - if (!PyString_Check(arg)) { + if (!PyBytes_Check(arg)) { PyErr_Format(PyExc_TypeError, "__getformat__() argument must be string, not %.500s", Py_TYPE(arg)->tp_name); return NULL; } - s = PyString_AS_STRING(arg); + s = PyBytes_AS_STRING(arg); if (strcmp(s, "double") == 0) { r = double_format; } @@ -1294,11 +1291,11 @@ switch (r) { case unknown_format: - return PyString_FromString("unknown"); + return PyBytes_FromString("unknown"); case ieee_little_endian_format: - return PyString_FromString("IEEE, little-endian"); + return PyBytes_FromString("IEEE, little-endian"); case ieee_big_endian_format: - return PyString_FromString("IEEE, big-endian"); + return PyBytes_FromString("IEEE, big-endian"); default: Py_FatalError("insane float_format or double_format"); return NULL; @@ -1397,27 +1394,23 @@ if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) return NULL; - if (PyString_Check(format_spec)) - return string_float__format__(self, args); + if (PyBytes_Check(format_spec)) + return _PyFloat_FormatAdvanced(self, + PyBytes_AS_STRING(format_spec), + PyBytes_GET_SIZE(format_spec)); if (PyUnicode_Check(format_spec)) { /* Convert format_spec to a str */ - PyObject *result = NULL; - PyObject *newargs = NULL; - PyObject *string_format_spec = NULL; - - string_format_spec = PyObject_Str(format_spec); - if (string_format_spec == NULL) - goto done; - - newargs = Py_BuildValue("(O)", string_format_spec); - if (newargs == NULL) - goto done; - - result = string_float__format__(self, newargs); - - done: - Py_XDECREF(string_format_spec); - Py_XDECREF(newargs); + PyObject *result; + PyObject *str_spec = PyObject_Str(format_spec); + + if (str_spec == NULL) + return NULL; + + result = _PyFloat_FormatAdvanced(self, + PyBytes_AS_STRING(str_spec), + PyBytes_GET_SIZE(str_spec)); + + Py_DECREF(str_spec); return result; } PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode"); Modified: python/branches/tlee-ast-optimize/Objects/frameobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/frameobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/frameobject.c Sun Jun 1 17:18:10 2008 @@ -114,7 +114,7 @@ /* Find the bytecode offset for the start of the given line, or the * first code-owning line after it. */ - PyString_AsStringAndSize(f->f_code->co_lnotab, &lnotab, &lnotab_len); + PyBytes_AsStringAndSize(f->f_code->co_lnotab, &lnotab, &lnotab_len); addr = 0; line = f->f_code->co_firstlineno; new_lasti = -1; @@ -137,7 +137,7 @@ } /* We're now ready to look at the bytecode. */ - PyString_AsStringAndSize(f->f_code->co_code, (char **)&code, &code_len); + PyBytes_AsStringAndSize(f->f_code->co_code, (char **)&code, &code_len); min_addr = MIN(new_lasti, f->f_lasti); max_addr = MAX(new_lasti, f->f_lasti); @@ -548,7 +548,7 @@ int _PyFrame_Init() { - builtin_object = PyString_InternFromString("__builtins__"); + builtin_object = PyBytes_InternFromString("__builtins__"); return (builtin_object != NULL); } @@ -728,7 +728,7 @@ for (j = nmap; --j >= 0; ) { PyObject *key = PyTuple_GET_ITEM(map, j); PyObject *value = values[j]; - assert(PyString_Check(key)); + assert(PyBytes_Check(key)); if (deref) { assert(PyCell_Check(value)); value = PyCell_GET(value); @@ -776,7 +776,7 @@ for (j = nmap; --j >= 0; ) { PyObject *key = PyTuple_GET_ITEM(map, j); PyObject *value = PyObject_GetItem(dict, key); - assert(PyString_Check(key)); + assert(PyBytes_Check(key)); /* We only care about NULLs if clear is true. */ if (value == NULL) { PyErr_Clear(); Modified: python/branches/tlee-ast-optimize/Objects/funcobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/funcobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/funcobject.c Sun Jun 1 17:18:10 2008 @@ -28,7 +28,7 @@ consts = ((PyCodeObject *)code)->co_consts; if (PyTuple_Size(consts) >= 1) { doc = PyTuple_GetItem(consts, 0); - if (!PyString_Check(doc) && !PyUnicode_Check(doc)) + if (!PyBytes_Check(doc) && !PyUnicode_Check(doc)) doc = Py_None; } else @@ -42,7 +42,7 @@ Otherwise, use None. */ if (!__name__) { - __name__ = PyString_InternFromString("__name__"); + __name__ = PyBytes_InternFromString("__name__"); if (!__name__) { Py_DECREF(op); return NULL; @@ -254,7 +254,7 @@ PyErr_Format(PyExc_ValueError, "%s() requires a code object with %zd free vars," " not %zd", - PyString_AsString(op->func_name), + PyBytes_AsString(op->func_name), nclosure, nfree); return -1; } @@ -281,7 +281,7 @@ return -1; /* Not legal to del f.func_name or to set it to anything * other than a string object. */ - if (value == NULL || !PyString_Check(value)) { + if (value == NULL || !PyBytes_Check(value)) { PyErr_SetString(PyExc_TypeError, "__name__ must be set to a string object"); return -1; @@ -380,7 +380,7 @@ &PyDict_Type, &globals, &name, &defaults, &closure)) return NULL; - if (name != Py_None && !PyString_Check(name)) { + if (name != Py_None && !PyBytes_Check(name)) { PyErr_SetString(PyExc_TypeError, "arg 3 (name) must be None or string"); return NULL; @@ -409,7 +409,7 @@ if (nfree != nclosure) return PyErr_Format(PyExc_ValueError, "%s requires closure of length %zd, not %zd", - PyString_AS_STRING(code->co_name), + PyBytes_AS_STRING(code->co_name), nfree, nclosure); if (nclosure) { Py_ssize_t i; @@ -465,8 +465,8 @@ static PyObject* func_repr(PyFunctionObject *op) { - return PyString_FromFormat("", - PyString_AsString(op->func_name), + return PyBytes_FromFormat("", + PyBytes_AsString(op->func_name), op); } Modified: python/branches/tlee-ast-optimize/Objects/genobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/genobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/genobject.c Sun Jun 1 17:18:10 2008 @@ -285,10 +285,10 @@ gen_repr(PyGenObject *gen) { char *code_name; - code_name = PyString_AsString(((PyCodeObject *)gen->gi_code)->co_name); + code_name = PyBytes_AsString(((PyCodeObject *)gen->gi_code)->co_name); if (code_name == NULL) return NULL; - return PyString_FromFormat("", + return PyBytes_FromFormat("", code_name, gen); } Modified: python/branches/tlee-ast-optimize/Objects/intobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/intobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/intobject.c Sun Jun 1 17:18:10 2008 @@ -3,7 +3,6 @@ #include "Python.h" #include -#include "formatter_string.h" static PyObject *int_int(PyIntObject *v); @@ -368,7 +367,7 @@ if (*end != '\0') { bad: slen = strlen(s) < 200 ? strlen(s) : 200; - sobj = PyString_FromStringAndSize(s, slen); + sobj = PyBytes_FromStringAndSize(s, slen); if (sobj == NULL) return NULL; srepr = PyObject_Repr(sobj); @@ -377,7 +376,7 @@ return NULL; PyErr_Format(PyExc_ValueError, "invalid literal for int() with base %d: %s", - base, PyString_AS_STRING(srepr)); + base, PyBytes_AS_STRING(srepr)); Py_DECREF(srepr); return NULL; } @@ -965,11 +964,11 @@ return PyInt_FromLong(0L); if (base == -909) return PyNumber_Int(x); - if (PyString_Check(x)) { + if (PyBytes_Check(x)) { /* Since PyInt_FromString doesn't have a length parameter, * check here for possible NULs in the string. */ - char *string = PyString_AS_STRING(x); - if (strlen(string) != PyString_Size(x)) { + char *string = PyBytes_AS_STRING(x); + if (strlen(string) != PyBytes_Size(x)) { /* create a repr() of the input string, * just like PyInt_FromString does */ PyObject *srepr; @@ -978,7 +977,7 @@ return NULL; PyErr_Format(PyExc_ValueError, "invalid literal for int() with base %d: %s", - base, PyString_AS_STRING(srepr)); + base, PyBytes_AS_STRING(srepr)); Py_DECREF(srepr); return NULL; } @@ -1106,7 +1105,7 @@ if (negative) *--p = '-'; - return PyString_FromStringAndSize(p, &buf[sizeof(buf)] - p); + return PyBytes_FromStringAndSize(p, &buf[sizeof(buf)] - p); } static PyObject * @@ -1116,27 +1115,23 @@ if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) return NULL; - if (PyString_Check(format_spec)) - return string_int__format__(self, args); + if (PyBytes_Check(format_spec)) + return _PyInt_FormatAdvanced(self, + PyBytes_AS_STRING(format_spec), + PyBytes_GET_SIZE(format_spec)); if (PyUnicode_Check(format_spec)) { /* Convert format_spec to a str */ - PyObject *result = NULL; - PyObject *newargs = NULL; - PyObject *string_format_spec = NULL; - - string_format_spec = PyObject_Str(format_spec); - if (string_format_spec == NULL) - goto done; - - newargs = Py_BuildValue("(O)", string_format_spec); - if (newargs == NULL) - goto done; - - result = string_int__format__(self, newargs); - - done: - Py_XDECREF(string_format_spec); - Py_XDECREF(newargs); + PyObject *result; + PyObject *str_spec = PyObject_Str(format_spec); + + if (str_spec == NULL) + return NULL; + + result = _PyInt_FormatAdvanced(self, + PyBytes_AS_STRING(str_spec), + PyBytes_GET_SIZE(str_spec)); + + Py_DECREF(str_spec); return result; } PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode"); Modified: python/branches/tlee-ast-optimize/Objects/listobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/listobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/listobject.c Sun Jun 1 17:18:10 2008 @@ -174,7 +174,7 @@ } if (i < 0 || i >= Py_SIZE(op)) { if (indexerr == NULL) - indexerr = PyString_FromString( + indexerr = PyBytes_FromString( "list index out of range"); PyErr_SetObject(PyExc_IndexError, indexerr); return NULL; @@ -349,11 +349,11 @@ i = Py_ReprEnter((PyObject*)v); if (i != 0) { - return i > 0 ? PyString_FromString("[...]") : NULL; + return i > 0 ? PyBytes_FromString("[...]") : NULL; } if (Py_SIZE(v) == 0) { - result = PyString_FromString("[]"); + result = PyBytes_FromString("[]"); goto Done; } @@ -379,29 +379,29 @@ /* Add "[]" decorations to the first and last items. */ assert(PyList_GET_SIZE(pieces) > 0); - s = PyString_FromString("["); + s = PyBytes_FromString("["); if (s == NULL) goto Done; temp = PyList_GET_ITEM(pieces, 0); - PyString_ConcatAndDel(&s, temp); + PyBytes_ConcatAndDel(&s, temp); PyList_SET_ITEM(pieces, 0, s); if (s == NULL) goto Done; - s = PyString_FromString("]"); + s = PyBytes_FromString("]"); if (s == NULL) goto Done; temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1); - PyString_ConcatAndDel(&temp, s); + PyBytes_ConcatAndDel(&temp, s); PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp); if (temp == NULL) goto Done; /* Paste them all together with ", " between. */ - s = PyString_FromString(", "); + s = PyBytes_FromString(", "); if (s == NULL) goto Done; - result = _PyString_Join(s, pieces); + result = _PyBytes_Join(s, pieces); Py_DECREF(s); Done: @@ -433,7 +433,7 @@ { if (i < 0 || i >= Py_SIZE(a)) { if (indexerr == NULL) - indexerr = PyString_FromString( + indexerr = PyBytes_FromString( "list index out of range"); PyErr_SetObject(PyExc_IndexError, indexerr); return NULL; Modified: python/branches/tlee-ast-optimize/Objects/longobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/longobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/longobject.c Sun Jun 1 17:18:10 2008 @@ -6,7 +6,6 @@ #include "Python.h" #include "longintrepr.h" -#include "formatter_string.h" #include @@ -1200,7 +1199,7 @@ _PyLong_Format(PyObject *aa, int base, int addL, int newstyle) { register PyLongObject *a = (PyLongObject *)aa; - PyStringObject *str; + PyBytesObject *str; Py_ssize_t i, j, sz; Py_ssize_t size_a; char *p; @@ -1229,10 +1228,10 @@ "long is too large to format"); return NULL; } - str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz); + str = (PyBytesObject *) PyBytes_FromStringAndSize((char *)0, sz); if (str == NULL) return NULL; - p = PyString_AS_STRING(str) + sz; + p = PyBytes_AS_STRING(str) + sz; *p = '\0'; if (addL) *--p = 'L'; @@ -1258,7 +1257,7 @@ do { char cdigit = (char)(accum & (base - 1)); cdigit += (cdigit < 10) ? '0' : 'a'-10; - assert(p > PyString_AS_STRING(str)); + assert(p > PyBytes_AS_STRING(str)); *--p = cdigit; accumbits -= basebits; accum >>= basebits; @@ -1310,7 +1309,7 @@ do { digit nextrem = (digit)(rem / base); char c = (char)(rem - nextrem * base); - assert(p > PyString_AS_STRING(str)); + assert(p > PyBytes_AS_STRING(str)); c += (c < 10) ? '0' : 'a'-10; *--p = c; rem = nextrem; @@ -1348,14 +1347,14 @@ } if (sign) *--p = sign; - if (p != PyString_AS_STRING(str)) { - char *q = PyString_AS_STRING(str); + if (p != PyBytes_AS_STRING(str)) { + char *q = PyBytes_AS_STRING(str); assert(p > q); do { } while ((*q++ = *p++) != '\0'); q--; - _PyString_Resize((PyObject **)&str, - (Py_ssize_t) (q - PyString_AS_STRING(str))); + _PyBytes_Resize((PyObject **)&str, + (Py_ssize_t) (q - PyBytes_AS_STRING(str))); } return (PyObject *)str; } @@ -1719,7 +1718,7 @@ onError: Py_XDECREF(z); slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200; - strobj = PyString_FromStringAndSize(orig_str, slen); + strobj = PyBytes_FromStringAndSize(orig_str, slen); if (strobj == NULL) return NULL; strrepr = PyObject_Repr(strobj); @@ -1728,7 +1727,7 @@ return NULL; PyErr_Format(PyExc_ValueError, "invalid literal for long() with base %d: %s", - base, PyString_AS_STRING(strrepr)); + base, PyBytes_AS_STRING(strrepr)); Py_DECREF(strrepr); return NULL; } @@ -3332,11 +3331,11 @@ return PyLong_FromLong(0L); if (base == -909) return PyNumber_Long(x); - else if (PyString_Check(x)) { + else if (PyBytes_Check(x)) { /* Since PyLong_FromString doesn't have a length parameter, * check here for possible NULs in the string. */ - char *string = PyString_AS_STRING(x); - if (strlen(string) != PyString_Size(x)) { + char *string = PyBytes_AS_STRING(x); + if (strlen(string) != PyBytes_Size(x)) { /* create a repr() of the input string, * just like PyLong_FromString does. */ PyObject *srepr; @@ -3345,11 +3344,11 @@ return NULL; PyErr_Format(PyExc_ValueError, "invalid literal for long() with base %d: %s", - base, PyString_AS_STRING(srepr)); + base, PyBytes_AS_STRING(srepr)); Py_DECREF(srepr); return NULL; } - return PyLong_FromString(PyString_AS_STRING(x), NULL, base); + return PyLong_FromString(PyBytes_AS_STRING(x), NULL, base); } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(x)) @@ -3414,27 +3413,23 @@ if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) return NULL; - if (PyString_Check(format_spec)) - return string_long__format__(self, args); + if (PyBytes_Check(format_spec)) + return _PyLong_FormatAdvanced(self, + PyBytes_AS_STRING(format_spec), + PyBytes_GET_SIZE(format_spec)); if (PyUnicode_Check(format_spec)) { /* Convert format_spec to a str */ - PyObject *result = NULL; - PyObject *newargs = NULL; - PyObject *string_format_spec = NULL; - - string_format_spec = PyObject_Str(format_spec); - if (string_format_spec == NULL) - goto done; - - newargs = Py_BuildValue("(O)", string_format_spec); - if (newargs == NULL) - goto done; - - result = string_long__format__(self, newargs); - - done: - Py_XDECREF(string_format_spec); - Py_XDECREF(newargs); + PyObject *result; + PyObject *str_spec = PyObject_Str(format_spec); + + if (str_spec == NULL) + return NULL; + + result = _PyLong_FormatAdvanced(self, + PyBytes_AS_STRING(str_spec), + PyBytes_GET_SIZE(str_spec)); + + Py_DECREF(str_spec); return result; } PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode"); Modified: python/branches/tlee-ast-optimize/Objects/methodobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/methodobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/methodobject.c Sun Jun 1 17:18:10 2008 @@ -149,7 +149,7 @@ const char *doc = m->m_ml->ml_doc; if (doc != NULL) - return PyString_FromString(doc); + return PyBytes_FromString(doc); Py_INCREF(Py_None); return Py_None; } @@ -157,7 +157,7 @@ static PyObject * meth_get__name__(PyCFunctionObject *m, void *closure) { - return PyString_FromString(m->m_ml->ml_name); + return PyBytes_FromString(m->m_ml->ml_name); } static int @@ -202,9 +202,9 @@ meth_repr(PyCFunctionObject *m) { if (m->m_self == NULL) - return PyString_FromFormat("", + return PyBytes_FromFormat("", m->m_ml->ml_name); - return PyString_FromFormat("", + return PyBytes_FromFormat("", m->m_ml->ml_name, m->m_self->ob_type->tp_name, m->m_self); @@ -333,7 +333,7 @@ i = 0; for (c = chain; c != NULL; c = c->link) { for (ml = c->methods; ml->ml_name != NULL; ml++) { - PyList_SetItem(v, i, PyString_FromString(ml->ml_name)); + PyList_SetItem(v, i, PyBytes_FromString(ml->ml_name)); i++; } } @@ -360,7 +360,7 @@ if (strcmp(name, "__doc__") == 0) { const char *doc = self->ob_type->tp_doc; if (doc != NULL) - return PyString_FromString(doc); + return PyBytes_FromString(doc); } } while (chain != NULL) { Modified: python/branches/tlee-ast-optimize/Objects/moduleobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/moduleobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/moduleobject.c Sun Jun 1 17:18:10 2008 @@ -22,7 +22,7 @@ m = PyObject_GC_New(PyModuleObject, &PyModule_Type); if (m == NULL) return NULL; - nameobj = PyString_FromString(name); + nameobj = PyBytes_FromString(name); m->md_dict = PyDict_New(); if (m->md_dict == NULL || nameobj == NULL) goto fail; @@ -68,12 +68,12 @@ d = ((PyModuleObject *)m)->md_dict; if (d == NULL || (nameobj = PyDict_GetItemString(d, "__name__")) == NULL || - !PyString_Check(nameobj)) + !PyBytes_Check(nameobj)) { PyErr_SetString(PyExc_SystemError, "nameless module"); return NULL; } - return PyString_AsString(nameobj); + return PyBytes_AsString(nameobj); } char * @@ -88,12 +88,12 @@ d = ((PyModuleObject *)m)->md_dict; if (d == NULL || (fileobj = PyDict_GetItemString(d, "__file__")) == NULL || - !PyString_Check(fileobj)) + !PyBytes_Check(fileobj)) { PyErr_SetString(PyExc_SystemError, "module filename missing"); return NULL; } - return PyString_AsString(fileobj); + return PyBytes_AsString(fileobj); } void @@ -117,8 +117,8 @@ /* First, clear only names starting with a single underscore */ pos = 0; while (PyDict_Next(d, &pos, &key, &value)) { - if (value != Py_None && PyString_Check(key)) { - char *s = PyString_AsString(key); + if (value != Py_None && PyBytes_Check(key)) { + char *s = PyBytes_AsString(key); if (s[0] == '_' && s[1] != '_') { if (Py_VerboseFlag > 1) PySys_WriteStderr("# clear[1] %s\n", s); @@ -130,8 +130,8 @@ /* Next, clear all names except for __builtins__ */ pos = 0; while (PyDict_Next(d, &pos, &key, &value)) { - if (value != Py_None && PyString_Check(key)) { - char *s = PyString_AsString(key); + if (value != Py_None && PyBytes_Check(key)) { + char *s = PyBytes_AsString(key); if (s[0] != '_' || strcmp(s, "__builtins__") != 0) { if (Py_VerboseFlag > 1) PySys_WriteStderr("# clear[2] %s\n", s); @@ -195,9 +195,9 @@ filename = PyModule_GetFilename((PyObject *)m); if (filename == NULL) { PyErr_Clear(); - return PyString_FromFormat("", name); + return PyBytes_FromFormat("", name); } - return PyString_FromFormat("", name, filename); + return PyBytes_FromFormat("", name, filename); } /* We only need a traverse function, no clear function: If the module Modified: python/branches/tlee-ast-optimize/Objects/object.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/object.c (original) +++ python/branches/tlee-ast-optimize/Objects/object.c Sun Jun 1 17:18:10 2008 @@ -357,9 +357,9 @@ } #endif if (v == NULL) - return PyString_FromString(""); + return PyBytes_FromString(""); else if (Py_TYPE(v)->tp_repr == NULL) - return PyString_FromFormat("<%s object at %p>", + return PyBytes_FromFormat("<%s object at %p>", Py_TYPE(v)->tp_name, v); else { PyObject *res; @@ -377,7 +377,7 @@ return NULL; } #endif - if (!PyString_Check(res)) { + if (!PyBytes_Check(res)) { PyErr_Format(PyExc_TypeError, "__repr__ returned non-string (type %.200s)", Py_TYPE(res)->tp_name); @@ -394,8 +394,8 @@ PyObject *res; int type_ok; if (v == NULL) - return PyString_FromString(""); - if (PyString_CheckExact(v)) { + return PyBytes_FromString(""); + if (PyBytes_CheckExact(v)) { Py_INCREF(v); return v; } @@ -416,7 +416,7 @@ Py_LeaveRecursiveCall(); if (res == NULL) return NULL; - type_ok = PyString_Check(res); + type_ok = PyBytes_Check(res); #ifdef Py_USING_UNICODE type_ok = type_ok || PyUnicode_Check(res); #endif @@ -447,7 +447,7 @@ return NULL; } #endif - assert(PyString_Check(res)); + assert(PyBytes_Check(res)); return res; } @@ -461,7 +461,7 @@ static PyObject *unicodestr; if (v == NULL) { - res = PyString_FromString(""); + res = PyBytes_FromString(""); if (res == NULL) return NULL; str = PyUnicode_FromEncodedObject(res, NULL, "strict"); @@ -475,7 +475,7 @@ check this before trying the __unicode__ method. */ if (unicodestr == NULL) { - unicodestr= PyString_InternFromString("__unicode__"); + unicodestr= PyBytes_InternFromString("__unicode__"); if (unicodestr == NULL) return NULL; } @@ -492,7 +492,7 @@ return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(v), PyUnicode_GET_SIZE(v)); } - if (PyString_CheckExact(v)) { + if (PyBytes_CheckExact(v)) { Py_INCREF(v); res = v; } @@ -1084,7 +1084,7 @@ if (Py_TYPE(v)->tp_getattr != NULL) return (*Py_TYPE(v)->tp_getattr)(v, (char*)name); - w = PyString_InternFromString(name); + w = PyBytes_InternFromString(name); if (w == NULL) return NULL; res = PyObject_GetAttr(v, w); @@ -1112,7 +1112,7 @@ if (Py_TYPE(v)->tp_setattr != NULL) return (*Py_TYPE(v)->tp_setattr)(v, (char*)name, w); - s = PyString_InternFromString(name); + s = PyBytes_InternFromString(name); if (s == NULL) return -1; res = PyObject_SetAttr(v, s, w); @@ -1125,7 +1125,7 @@ { PyTypeObject *tp = Py_TYPE(v); - if (!PyString_Check(name)) { + if (!PyBytes_Check(name)) { #ifdef Py_USING_UNICODE /* The Unicode to string conversion is done here because the existing tp_getattro slots expect a string object as name @@ -1147,10 +1147,10 @@ if (tp->tp_getattro != NULL) return (*tp->tp_getattro)(v, name); if (tp->tp_getattr != NULL) - return (*tp->tp_getattr)(v, PyString_AS_STRING(name)); + return (*tp->tp_getattr)(v, PyBytes_AS_STRING(name)); PyErr_Format(PyExc_AttributeError, "'%.50s' object has no attribute '%.400s'", - tp->tp_name, PyString_AS_STRING(name)); + tp->tp_name, PyBytes_AS_STRING(name)); return NULL; } @@ -1172,7 +1172,7 @@ PyTypeObject *tp = Py_TYPE(v); int err; - if (!PyString_Check(name)){ + if (!PyBytes_Check(name)){ #ifdef Py_USING_UNICODE /* The Unicode to string conversion is done here because the existing tp_setattro slots expect a string object as name @@ -1194,14 +1194,14 @@ else Py_INCREF(name); - PyString_InternInPlace(&name); + PyBytes_InternInPlace(&name); if (tp->tp_setattro != NULL) { err = (*tp->tp_setattro)(v, name, value); Py_DECREF(name); return err; } if (tp->tp_setattr != NULL) { - err = (*tp->tp_setattr)(v, PyString_AS_STRING(name), value); + err = (*tp->tp_setattr)(v, PyBytes_AS_STRING(name), value); Py_DECREF(name); return err; } @@ -1212,14 +1212,14 @@ "(%s .%.100s)", tp->tp_name, value==NULL ? "del" : "assign to", - PyString_AS_STRING(name)); + PyBytes_AS_STRING(name)); else PyErr_Format(PyExc_TypeError, "'%.100s' object has only read-only attributes " "(%s .%.100s)", tp->tp_name, value==NULL ? "del" : "assign to", - PyString_AS_STRING(name)); + PyBytes_AS_STRING(name)); return -1; } @@ -1271,7 +1271,7 @@ Py_ssize_t dictoffset; PyObject **dictptr; - if (!PyString_Check(name)){ + if (!PyBytes_Check(name)){ #ifdef Py_USING_UNICODE /* The Unicode to string conversion is done here because the existing tp_setattro slots expect a string object as name @@ -1386,7 +1386,7 @@ PyErr_Format(PyExc_AttributeError, "'%.50s' object has no attribute '%.400s'", - tp->tp_name, PyString_AS_STRING(name)); + tp->tp_name, PyBytes_AS_STRING(name)); done: Py_DECREF(name); return res; @@ -1401,7 +1401,7 @@ PyObject **dictptr; int res = -1; - if (!PyString_Check(name)){ + if (!PyBytes_Check(name)){ #ifdef Py_USING_UNICODE /* The Unicode to string conversion is done here because the existing tp_setattro slots expect a string object as name @@ -1469,13 +1469,13 @@ if (descr == NULL) { PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", - tp->tp_name, PyString_AS_STRING(name)); + tp->tp_name, PyBytes_AS_STRING(name)); goto done; } PyErr_Format(PyExc_AttributeError, "'%.50s' object attribute '%.400s' is read-only", - tp->tp_name, PyString_AS_STRING(name)); + tp->tp_name, PyBytes_AS_STRING(name)); done: Py_DECREF(name); return res; @@ -1682,7 +1682,7 @@ int i; for (i = 0; i < PyList_GET_SIZE(list); ++i) { PyObject *item = PyList_GET_ITEM(list, i); - if (PyString_Check(item)) { + if (PyBytes_Check(item)) { result = PyDict_SetItem(dict, item, Py_None); if (result < 0) break; @@ -1904,7 +1904,7 @@ static PyObject * none_repr(PyObject *op) { - return PyString_FromString("None"); + return PyBytes_FromString("None"); } /* ARGUSED */ @@ -1946,7 +1946,7 @@ static PyObject * NotImplemented_repr(PyObject *op) { - return PyString_FromString("NotImplemented"); + return PyBytes_FromString("NotImplemented"); } static PyTypeObject PyNotImplemented_Type = { @@ -1983,10 +1983,10 @@ if (PyType_Ready(&PyBool_Type) < 0) Py_FatalError("Can't initialize 'bool'"); - if (PyType_Ready(&PyString_Type) < 0) + if (PyType_Ready(&PyBytes_Type) < 0) Py_FatalError("Can't initialize 'str'"); - if (PyType_Ready(&PyBytes_Type) < 0) + if (PyType_Ready(&PyByteArray_Type) < 0) Py_FatalError("Can't initialize 'bytes'"); if (PyType_Ready(&PyList_Type) < 0) Modified: python/branches/tlee-ast-optimize/Objects/rangeobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/rangeobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/rangeobject.c Sun Jun 1 17:18:10 2008 @@ -113,16 +113,16 @@ PyObject *rtn; if (r->start == 0 && r->step == 1) - rtn = PyString_FromFormat("xrange(%ld)", + rtn = PyBytes_FromFormat("xrange(%ld)", r->start + r->len * r->step); else if (r->step == 1) - rtn = PyString_FromFormat("xrange(%ld, %ld)", + rtn = PyBytes_FromFormat("xrange(%ld, %ld)", r->start, r->start + r->len * r->step); else - rtn = PyString_FromFormat("xrange(%ld, %ld, %ld)", + rtn = PyBytes_FromFormat("xrange(%ld, %ld, %ld)", r->start, r->start + r->len * r->step, r->step); Modified: python/branches/tlee-ast-optimize/Objects/setobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/setobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/setobject.c Sun Jun 1 17:18:10 2008 @@ -94,7 +94,9 @@ else { if (entry->hash == hash) { startkey = entry->key; + Py_INCREF(startkey); cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); + Py_DECREF(startkey); if (cmp < 0) return NULL; if (table == so->table && entry->key == startkey) { @@ -125,7 +127,9 @@ break; if (entry->hash == hash && entry->key != dummy) { startkey = entry->key; + Py_INCREF(startkey); cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); + Py_DECREF(startkey); if (cmp < 0) return NULL; if (table == so->table && entry->key == startkey) { @@ -147,7 +151,7 @@ /* * Hacked up version of set_lookkey which can assume keys are always strings; - * This means we can always use _PyString_Eq directly and not have to check to + * This means we can always use _PyBytes_Eq directly and not have to check to * see if the comparison altered the table. */ static setentry * @@ -164,7 +168,7 @@ including subclasses of str; e.g., one reason to subclass strings is to override __eq__, and for speed we don't cater to that here. */ - if (!PyString_CheckExact(key)) { + if (!PyBytes_CheckExact(key)) { so->lookup = set_lookkey; return set_lookkey(so, key, hash); } @@ -175,7 +179,7 @@ if (entry->key == dummy) freeslot = entry; else { - if (entry->hash == hash && _PyString_Eq(entry->key, key)) + if (entry->hash == hash && _PyBytes_Eq(entry->key, key)) return entry; freeslot = NULL; } @@ -190,7 +194,7 @@ if (entry->key == key || (entry->hash == hash && entry->key != dummy - && _PyString_Eq(entry->key, key))) + && _PyBytes_Eq(entry->key, key))) return entry; if (entry->key == dummy && freeslot == NULL) freeslot = entry; @@ -377,8 +381,8 @@ register long hash; register Py_ssize_t n_used; - if (!PyString_CheckExact(key) || - (hash = ((PyStringObject *) key)->ob_shash) == -1) { + if (!PyBytes_CheckExact(key) || + (hash = ((PyBytesObject *) key)->ob_shash) == -1) { hash = PyObject_Hash(key); if (hash == -1) return -1; @@ -424,8 +428,8 @@ PyObject *old_key; assert (PyAnySet_Check(so)); - if (!PyString_CheckExact(key) || - (hash = ((PyStringObject *) key)->ob_shash) == -1) { + if (!PyBytes_CheckExact(key) || + (hash = ((PyBytesObject *) key)->ob_shash) == -1) { hash = PyObject_Hash(key); if (hash == -1) return -1; @@ -614,7 +618,7 @@ if (status != 0) { if (status < 0) return NULL; - return PyString_FromFormat("%s(...)", so->ob_type->tp_name); + return PyBytes_FromFormat("%s(...)", so->ob_type->tp_name); } keys = PySequence_List((PyObject *)so); @@ -625,8 +629,8 @@ if (listrepr == NULL) goto done; - result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name, - PyString_AS_STRING(listrepr)); + result = PyBytes_FromFormat("%s(%s)", so->ob_type->tp_name, + PyBytes_AS_STRING(listrepr)); Py_DECREF(listrepr); done: Py_ReprLeave((PyObject*)so); @@ -681,8 +685,8 @@ long hash; setentry *entry; - if (!PyString_CheckExact(key) || - (hash = ((PyStringObject *) key)->ob_shash) == -1) { + if (!PyBytes_CheckExact(key) || + (hash = ((PyBytesObject *) key)->ob_shash) == -1) { hash = PyObject_Hash(key); if (hash == -1) return -1; @@ -979,7 +983,7 @@ register PySetObject *so = NULL; if (dummy == NULL) { /* Auto-initialize dummy */ - dummy = PyString_FromString(""); + dummy = PyBytes_FromString(""); if (dummy == NULL) return NULL; } @@ -2318,7 +2322,7 @@ /* Exercise direct iteration */ i = 0, count = 0; while (_PySet_Next((PyObject *)dup, &i, &x)) { - s = PyString_AsString(x); + s = PyBytes_AsString(x); assert(s && (s[0] == 'a' || s[0] == 'b' || s[0] == 'c')); count++; } Modified: python/branches/tlee-ast-optimize/Objects/sliceobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/sliceobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/sliceobject.c Sun Jun 1 17:18:10 2008 @@ -19,7 +19,7 @@ static PyObject * ellipsis_repr(PyObject *op) { - return PyString_FromString("Ellipsis"); + return PyBytes_FromString("Ellipsis"); } static PyTypeObject PyEllipsis_Type = { @@ -228,14 +228,14 @@ { PyObject *s, *comma; - s = PyString_FromString("slice("); - comma = PyString_FromString(", "); - PyString_ConcatAndDel(&s, PyObject_Repr(r->start)); - PyString_Concat(&s, comma); - PyString_ConcatAndDel(&s, PyObject_Repr(r->stop)); - PyString_Concat(&s, comma); - PyString_ConcatAndDel(&s, PyObject_Repr(r->step)); - PyString_ConcatAndDel(&s, PyString_FromString(")")); + s = PyBytes_FromString("slice("); + comma = PyBytes_FromString(", "); + PyBytes_ConcatAndDel(&s, PyObject_Repr(r->start)); + PyBytes_Concat(&s, comma); + PyBytes_ConcatAndDel(&s, PyObject_Repr(r->stop)); + PyBytes_Concat(&s, comma); + PyBytes_ConcatAndDel(&s, PyObject_Repr(r->step)); + PyBytes_ConcatAndDel(&s, PyBytes_FromString(")")); Py_DECREF(comma); return s; } Modified: python/branches/tlee-ast-optimize/Objects/stringlib/formatter.h ============================================================================== --- python/branches/tlee-ast-optimize/Objects/stringlib/formatter.h (original) +++ python/branches/tlee-ast-optimize/Objects/stringlib/formatter.h Sun Jun 1 17:18:10 2008 @@ -102,12 +102,13 @@ if failure, sets the exception */ static int -parse_internal_render_format_spec(PyObject *format_spec, +parse_internal_render_format_spec(STRINGLIB_CHAR *format_spec, + Py_ssize_t format_spec_len, InternalFormatSpec *format, char default_type) { - STRINGLIB_CHAR *ptr = STRINGLIB_STR(format_spec); - STRINGLIB_CHAR *end = ptr + STRINGLIB_LEN(format_spec); + STRINGLIB_CHAR *ptr = format_spec; + STRINGLIB_CHAR *end = format_spec + format_spec_len; /* end-ptr is used throughout this code to specify the length of the input string */ @@ -756,56 +757,31 @@ /************************************************************************/ /*********** built in formatters ****************************************/ /************************************************************************/ -#ifdef FORMAT_STRING PyObject * -FORMAT_STRING(PyObject* value, PyObject* args) +FORMAT_STRING(PyObject *obj, + STRINGLIB_CHAR *format_spec, + Py_ssize_t format_spec_len) { - PyObject *format_spec; - PyObject *result = NULL; -#if PY_VERSION_HEX < 0x03000000 - PyObject *tmp = NULL; -#endif InternalFormatSpec format; - - /* If 2.x, we accept either str or unicode, and try to convert it - to the right type. In 3.x, we insist on only unicode */ -#if PY_VERSION_HEX >= 0x03000000 - if (!PyArg_ParseTuple(args, STRINGLIB_PARSE_CODE ":__format__", - &format_spec)) - goto done; -#else - /* If 2.x, convert format_spec to the same type as value */ - /* This is to allow things like u''.format('') */ - if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) - goto done; - if (!(PyString_Check(format_spec) || PyUnicode_Check(format_spec))) { - PyErr_Format(PyExc_TypeError, "__format__ arg must be str " - "or unicode, not %s", Py_TYPE(format_spec)->tp_name); - goto done; - } - tmp = STRINGLIB_TOSTR(format_spec); - if (tmp == NULL) - goto done; - format_spec = tmp; -#endif + PyObject *result = NULL; /* check for the special case of zero length format spec, make - it equivalent to str(value) */ - if (STRINGLIB_LEN(format_spec) == 0) { - result = STRINGLIB_TOSTR(value); + it equivalent to str(obj) */ + if (format_spec_len == 0) { + result = STRINGLIB_TOSTR(obj); goto done; } - /* parse the format_spec */ - if (!parse_internal_render_format_spec(format_spec, &format, 's')) + if (!parse_internal_render_format_spec(format_spec, format_spec_len, + &format, 's')) goto done; /* type conversion? */ switch (format.type) { case 's': /* no type conversion needed, already a string. do the formatting */ - result = format_string_internal(value, &format); + result = format_string_internal(obj, &format); break; default: /* unknown */ @@ -826,35 +802,31 @@ } done: -#if PY_VERSION_HEX < 0x03000000 - Py_XDECREF(tmp); -#endif return result; } -#endif /* FORMAT_STRING */ #if defined FORMAT_LONG || defined FORMAT_INT static PyObject* -format_int_or_long(PyObject* value, PyObject* args, IntOrLongToString tostring) +format_int_or_long(PyObject* obj, + STRINGLIB_CHAR *format_spec, + Py_ssize_t format_spec_len, + IntOrLongToString tostring) { - PyObject *format_spec; PyObject *result = NULL; PyObject *tmp = NULL; InternalFormatSpec format; - if (!PyArg_ParseTuple(args, STRINGLIB_PARSE_CODE ":__format__", - &format_spec)) - goto done; - /* check for the special case of zero length format spec, make - it equivalent to str(value) */ - if (STRINGLIB_LEN(format_spec) == 0) { - result = STRINGLIB_TOSTR(value); + it equivalent to str(obj) */ + if (format_spec_len == 0) { + result = STRINGLIB_TOSTR(obj); goto done; } /* parse the format_spec */ - if (!parse_internal_render_format_spec(format_spec, &format, 'd')) + if (!parse_internal_render_format_spec(format_spec, + format_spec_len, + &format, 'd')) goto done; /* type conversion? */ @@ -868,7 +840,7 @@ case 'n': /* no type conversion needed, already an int (or long). do the formatting */ - result = format_int_or_long_internal(value, &format, tostring); + result = format_int_or_long_internal(obj, &format, tostring); break; case 'e': @@ -879,10 +851,10 @@ case 'G': case '%': /* convert to float */ - tmp = PyNumber_Float(value); + tmp = PyNumber_Float(obj); if (tmp == NULL) goto done; - result = format_float_internal(value, &format); + result = format_float_internal(obj, &format); break; default: @@ -917,9 +889,12 @@ #endif PyObject * -FORMAT_LONG(PyObject* value, PyObject* args) +FORMAT_LONG(PyObject *obj, + STRINGLIB_CHAR *format_spec, + Py_ssize_t format_spec_len) { - return format_int_or_long(value, args, long_format); + return format_int_or_long(obj, format_spec, format_spec_len, + long_format); } #endif /* FORMAT_LONG */ @@ -935,32 +910,35 @@ } PyObject * -FORMAT_INT(PyObject* value, PyObject* args) +FORMAT_INT(PyObject *obj, + STRINGLIB_CHAR *format_spec, + Py_ssize_t format_spec_len) { - return format_int_or_long(value, args, int_format); + return format_int_or_long(obj, format_spec, format_spec_len, + int_format); } #endif /* FORMAT_INT */ #ifdef FORMAT_FLOAT PyObject * -FORMAT_FLOAT(PyObject *value, PyObject *args) +FORMAT_FLOAT(PyObject *obj, + STRINGLIB_CHAR *format_spec, + Py_ssize_t format_spec_len) { - PyObject *format_spec; PyObject *result = NULL; InternalFormatSpec format; - if (!PyArg_ParseTuple(args, STRINGLIB_PARSE_CODE ":__format__", &format_spec)) - goto done; - /* check for the special case of zero length format spec, make - it equivalent to str(value) */ - if (STRINGLIB_LEN(format_spec) == 0) { - result = STRINGLIB_TOSTR(value); + it equivalent to str(obj) */ + if (format_spec_len == 0) { + result = STRINGLIB_TOSTR(obj); goto done; } /* parse the format_spec */ - if (!parse_internal_render_format_spec(format_spec, &format, '\0')) + if (!parse_internal_render_format_spec(format_spec, + format_spec_len, + &format, '\0')) goto done; /* type conversion? */ @@ -979,7 +957,7 @@ case 'n': case '%': /* no conversion, already a float. do the formatting */ - result = format_float_internal(value, &format); + result = format_float_internal(obj, &format); break; default: Modified: python/branches/tlee-ast-optimize/Objects/stringlib/string_format.h ============================================================================== --- python/branches/tlee-ast-optimize/Objects/stringlib/string_format.h (original) +++ python/branches/tlee-ast-optimize/Objects/stringlib/string_format.h Sun Jun 1 17:18:10 2008 @@ -496,7 +496,7 @@ #if PY_VERSION_HEX >= 0x03000000 assert(PyUnicode_Check(result)); #else - assert(PyString_Check(result) || PyUnicode_Check(result)); + assert(PyBytes_Check(result) || PyUnicode_Check(result)); /* Convert result to our type. We could be str, and result could be unicode */ Modified: python/branches/tlee-ast-optimize/Objects/stringlib/stringdefs.h ============================================================================== --- python/branches/tlee-ast-optimize/Objects/stringlib/stringdefs.h (original) +++ python/branches/tlee-ast-optimize/Objects/stringlib/stringdefs.h Sun Jun 1 17:18:10 2008 @@ -6,7 +6,7 @@ compiled as unicode. */ #define STRINGLIB_IS_UNICODE 0 -#define STRINGLIB_OBJECT PyStringObject +#define STRINGLIB_OBJECT PyBytesObject #define STRINGLIB_CHAR char #define STRINGLIB_TYPE_NAME "string" #define STRINGLIB_PARSE_CODE "S" @@ -16,13 +16,13 @@ #define STRINGLIB_TOUPPER toupper #define STRINGLIB_TOLOWER tolower #define STRINGLIB_FILL memset -#define STRINGLIB_STR PyString_AS_STRING -#define STRINGLIB_LEN PyString_GET_SIZE -#define STRINGLIB_NEW PyString_FromStringAndSize -#define STRINGLIB_RESIZE _PyString_Resize -#define STRINGLIB_CHECK PyString_Check +#define STRINGLIB_STR PyBytes_AS_STRING +#define STRINGLIB_LEN PyBytes_GET_SIZE +#define STRINGLIB_NEW PyBytes_FromStringAndSize +#define STRINGLIB_RESIZE _PyBytes_Resize +#define STRINGLIB_CHECK PyBytes_Check #define STRINGLIB_CMP memcmp #define STRINGLIB_TOSTR PyObject_Str -#define STRINGLIB_GROUPING _PyString_InsertThousandsGrouping +#define STRINGLIB_GROUPING _PyBytes_InsertThousandsGrouping #endif /* !STRINGLIB_STRINGDEFS_H */ Deleted: python/branches/tlee-ast-optimize/Objects/stringobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/stringobject.c Sun Jun 1 17:18:10 2008 +++ (empty file) @@ -1,5176 +0,0 @@ -/* String object implementation */ - -#define PY_SSIZE_T_CLEAN - -#include "Python.h" - -#include "formatter_string.h" - -#include - -#ifdef COUNT_ALLOCS -int null_strings, one_strings; -#endif - -static PyStringObject *characters[UCHAR_MAX + 1]; -static PyStringObject *nullstring; - -/* This dictionary holds all interned strings. Note that references to - strings in this dictionary are *not* counted in the string's ob_refcnt. - When the interned string reaches a refcnt of 0 the string deallocation - function will delete the reference from this dictionary. - - Another way to look at this is that to say that the actual reference - count of a string is: s->ob_refcnt + (s->ob_sstate?2:0) -*/ -static PyObject *interned; - -/* - For both PyString_FromString() and PyString_FromStringAndSize(), the - parameter `size' denotes number of characters to allocate, not counting any - null terminating character. - - For PyString_FromString(), the parameter `str' points to a null-terminated - string containing exactly `size' bytes. - - For PyString_FromStringAndSize(), the parameter the parameter `str' is - either NULL or else points to a string containing at least `size' bytes. - For PyString_FromStringAndSize(), the string in the `str' parameter does - not have to be null-terminated. (Therefore it is safe to construct a - substring by calling `PyString_FromStringAndSize(origstring, substrlen)'.) - If `str' is NULL then PyString_FromStringAndSize() will allocate `size+1' - bytes (setting the last byte to the null terminating character) and you can - fill in the data yourself. If `str' is non-NULL then the resulting - PyString object must be treated as immutable and you must not fill in nor - alter the data yourself, since the strings may be shared. - - The PyObject member `op->ob_size', which denotes the number of "extra - items" in a variable-size object, will contain the number of bytes - allocated for string data, not counting the null terminating character. It - is therefore equal to the equal to the `size' parameter (for - PyString_FromStringAndSize()) or the length of the string in the `str' - parameter (for PyString_FromString()). -*/ -PyObject * -PyString_FromStringAndSize(const char *str, Py_ssize_t size) -{ - register PyStringObject *op; - if (size < 0) { - PyErr_SetString(PyExc_SystemError, - "Negative size passed to PyString_FromStringAndSize"); - return NULL; - } - if (size == 0 && (op = nullstring) != NULL) { -#ifdef COUNT_ALLOCS - null_strings++; -#endif - Py_INCREF(op); - return (PyObject *)op; - } - if (size == 1 && str != NULL && - (op = characters[*str & UCHAR_MAX]) != NULL) - { -#ifdef COUNT_ALLOCS - one_strings++; -#endif - Py_INCREF(op); - return (PyObject *)op; - } - - /* Inline PyObject_NewVar */ - op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size); - if (op == NULL) - return PyErr_NoMemory(); - PyObject_INIT_VAR(op, &PyString_Type, size); - op->ob_shash = -1; - op->ob_sstate = SSTATE_NOT_INTERNED; - if (str != NULL) - Py_MEMCPY(op->ob_sval, str, size); - op->ob_sval[size] = '\0'; - /* share short strings */ - if (size == 0) { - PyObject *t = (PyObject *)op; - PyString_InternInPlace(&t); - op = (PyStringObject *)t; - nullstring = op; - Py_INCREF(op); - } else if (size == 1 && str != NULL) { - PyObject *t = (PyObject *)op; - PyString_InternInPlace(&t); - op = (PyStringObject *)t; - characters[*str & UCHAR_MAX] = op; - Py_INCREF(op); - } - return (PyObject *) op; -} - -PyObject * -PyString_FromString(const char *str) -{ - register size_t size; - register PyStringObject *op; - - assert(str != NULL); - size = strlen(str); - if (size > PY_SSIZE_T_MAX) { - PyErr_SetString(PyExc_OverflowError, - "string is too long for a Python string"); - return NULL; - } - if (size == 0 && (op = nullstring) != NULL) { -#ifdef COUNT_ALLOCS - null_strings++; -#endif - Py_INCREF(op); - return (PyObject *)op; - } - if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) { -#ifdef COUNT_ALLOCS - one_strings++; -#endif - Py_INCREF(op); - return (PyObject *)op; - } - - /* Inline PyObject_NewVar */ - op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size); - if (op == NULL) - return PyErr_NoMemory(); - PyObject_INIT_VAR(op, &PyString_Type, size); - op->ob_shash = -1; - op->ob_sstate = SSTATE_NOT_INTERNED; - Py_MEMCPY(op->ob_sval, str, size+1); - /* share short strings */ - if (size == 0) { - PyObject *t = (PyObject *)op; - PyString_InternInPlace(&t); - op = (PyStringObject *)t; - nullstring = op; - Py_INCREF(op); - } else if (size == 1) { - PyObject *t = (PyObject *)op; - PyString_InternInPlace(&t); - op = (PyStringObject *)t; - characters[*str & UCHAR_MAX] = op; - Py_INCREF(op); - } - return (PyObject *) op; -} - -PyObject * -PyString_FromFormatV(const char *format, va_list vargs) -{ - va_list count; - Py_ssize_t n = 0; - const char* f; - char *s; - PyObject* string; - -#ifdef VA_LIST_IS_ARRAY - Py_MEMCPY(count, vargs, sizeof(va_list)); -#else -#ifdef __va_copy - __va_copy(count, vargs); -#else - count = vargs; -#endif -#endif - /* step 1: figure out how large a buffer we need */ - for (f = format; *f; f++) { - if (*f == '%') { - const char* p = f; - while (*++f && *f != '%' && !isalpha(Py_CHARMASK(*f))) - ; - - /* skip the 'l' or 'z' in {%ld, %zd, %lu, %zu} since - * they don't affect the amount of space we reserve. - */ - if ((*f == 'l' || *f == 'z') && - (f[1] == 'd' || f[1] == 'u')) - ++f; - - switch (*f) { - case 'c': - (void)va_arg(count, int); - /* fall through... */ - case '%': - n++; - break; - case 'd': case 'u': case 'i': case 'x': - (void) va_arg(count, int); - /* 20 bytes is enough to hold a 64-bit - integer. Decimal takes the most space. - This isn't enough for octal. */ - n += 20; - break; - case 's': - s = va_arg(count, char*); - n += strlen(s); - break; - case 'p': - (void) va_arg(count, int); - /* maximum 64-bit pointer representation: - * 0xffffffffffffffff - * so 19 characters is enough. - * XXX I count 18 -- what's the extra for? - */ - n += 19; - break; - default: - /* if we stumble upon an unknown - formatting code, copy the rest of - the format string to the output - string. (we cannot just skip the - code, since there's no way to know - what's in the argument list) */ - n += strlen(p); - goto expand; - } - } else - n++; - } - expand: - /* step 2: fill the buffer */ - /* Since we've analyzed how much space we need for the worst case, - use sprintf directly instead of the slower PyOS_snprintf. */ - string = PyString_FromStringAndSize(NULL, n); - if (!string) - return NULL; - - s = PyString_AsString(string); - - for (f = format; *f; f++) { - if (*f == '%') { - const char* p = f++; - Py_ssize_t i; - int longflag = 0; - int size_tflag = 0; - /* parse the width.precision part (we're only - interested in the precision value, if any) */ - n = 0; - while (isdigit(Py_CHARMASK(*f))) - n = (n*10) + *f++ - '0'; - if (*f == '.') { - f++; - n = 0; - while (isdigit(Py_CHARMASK(*f))) - n = (n*10) + *f++ - '0'; - } - while (*f && *f != '%' && !isalpha(Py_CHARMASK(*f))) - f++; - /* handle the long flag, but only for %ld and %lu. - others can be added when necessary. */ - if (*f == 'l' && (f[1] == 'd' || f[1] == 'u')) { - longflag = 1; - ++f; - } - /* handle the size_t flag. */ - if (*f == 'z' && (f[1] == 'd' || f[1] == 'u')) { - size_tflag = 1; - ++f; - } - - switch (*f) { - case 'c': - *s++ = va_arg(vargs, int); - break; - case 'd': - if (longflag) - sprintf(s, "%ld", va_arg(vargs, long)); - else if (size_tflag) - sprintf(s, "%" PY_FORMAT_SIZE_T "d", - va_arg(vargs, Py_ssize_t)); - else - sprintf(s, "%d", va_arg(vargs, int)); - s += strlen(s); - break; - case 'u': - if (longflag) - sprintf(s, "%lu", - va_arg(vargs, unsigned long)); - else if (size_tflag) - sprintf(s, "%" PY_FORMAT_SIZE_T "u", - va_arg(vargs, size_t)); - else - sprintf(s, "%u", - va_arg(vargs, unsigned int)); - s += strlen(s); - break; - case 'i': - sprintf(s, "%i", va_arg(vargs, int)); - s += strlen(s); - break; - case 'x': - sprintf(s, "%x", va_arg(vargs, int)); - s += strlen(s); - break; - case 's': - p = va_arg(vargs, char*); - i = strlen(p); - if (n > 0 && i > n) - i = n; - Py_MEMCPY(s, p, i); - s += i; - break; - case 'p': - sprintf(s, "%p", va_arg(vargs, void*)); - /* %p is ill-defined: ensure leading 0x. */ - if (s[1] == 'X') - s[1] = 'x'; - else if (s[1] != 'x') { - memmove(s+2, s, strlen(s)+1); - s[0] = '0'; - s[1] = 'x'; - } - s += strlen(s); - break; - case '%': - *s++ = '%'; - break; - default: - strcpy(s, p); - s += strlen(s); - goto end; - } - } else - *s++ = *f; - } - - end: - _PyString_Resize(&string, s - PyString_AS_STRING(string)); - return string; -} - -PyObject * -PyString_FromFormat(const char *format, ...) -{ - PyObject* ret; - va_list vargs; - -#ifdef HAVE_STDARG_PROTOTYPES - va_start(vargs, format); -#else - va_start(vargs); -#endif - ret = PyString_FromFormatV(format, vargs); - va_end(vargs); - return ret; -} - - -PyObject *PyString_Decode(const char *s, - Py_ssize_t size, - const char *encoding, - const char *errors) -{ - PyObject *v, *str; - - str = PyString_FromStringAndSize(s, size); - if (str == NULL) - return NULL; - v = PyString_AsDecodedString(str, encoding, errors); - Py_DECREF(str); - return v; -} - -PyObject *PyString_AsDecodedObject(PyObject *str, - const char *encoding, - const char *errors) -{ - PyObject *v; - - if (!PyString_Check(str)) { - PyErr_BadArgument(); - goto onError; - } - - if (encoding == NULL) { -#ifdef Py_USING_UNICODE - encoding = PyUnicode_GetDefaultEncoding(); -#else - PyErr_SetString(PyExc_ValueError, "no encoding specified"); - goto onError; -#endif - } - - /* Decode via the codec registry */ - v = PyCodec_Decode(str, encoding, errors); - if (v == NULL) - goto onError; - - return v; - - onError: - return NULL; -} - -PyObject *PyString_AsDecodedString(PyObject *str, - const char *encoding, - const char *errors) -{ - PyObject *v; - - v = PyString_AsDecodedObject(str, encoding, errors); - if (v == NULL) - goto onError; - -#ifdef Py_USING_UNICODE - /* Convert Unicode to a string using the default encoding */ - if (PyUnicode_Check(v)) { - PyObject *temp = v; - v = PyUnicode_AsEncodedString(v, NULL, NULL); - Py_DECREF(temp); - if (v == NULL) - goto onError; - } -#endif - if (!PyString_Check(v)) { - PyErr_Format(PyExc_TypeError, - "decoder did not return a string object (type=%.400s)", - Py_TYPE(v)->tp_name); - Py_DECREF(v); - goto onError; - } - - return v; - - onError: - return NULL; -} - -PyObject *PyString_Encode(const char *s, - Py_ssize_t size, - const char *encoding, - const char *errors) -{ - PyObject *v, *str; - - str = PyString_FromStringAndSize(s, size); - if (str == NULL) - return NULL; - v = PyString_AsEncodedString(str, encoding, errors); - Py_DECREF(str); - return v; -} - -PyObject *PyString_AsEncodedObject(PyObject *str, - const char *encoding, - const char *errors) -{ - PyObject *v; - - if (!PyString_Check(str)) { - PyErr_BadArgument(); - goto onError; - } - - if (encoding == NULL) { -#ifdef Py_USING_UNICODE - encoding = PyUnicode_GetDefaultEncoding(); -#else - PyErr_SetString(PyExc_ValueError, "no encoding specified"); - goto onError; -#endif - } - - /* Encode via the codec registry */ - v = PyCodec_Encode(str, encoding, errors); - if (v == NULL) - goto onError; - - return v; - - onError: - return NULL; -} - -PyObject *PyString_AsEncodedString(PyObject *str, - const char *encoding, - const char *errors) -{ - PyObject *v; - - v = PyString_AsEncodedObject(str, encoding, errors); - if (v == NULL) - goto onError; - -#ifdef Py_USING_UNICODE - /* Convert Unicode to a string using the default encoding */ - if (PyUnicode_Check(v)) { - PyObject *temp = v; - v = PyUnicode_AsEncodedString(v, NULL, NULL); - Py_DECREF(temp); - if (v == NULL) - goto onError; - } -#endif - if (!PyString_Check(v)) { - PyErr_Format(PyExc_TypeError, - "encoder did not return a string object (type=%.400s)", - Py_TYPE(v)->tp_name); - Py_DECREF(v); - goto onError; - } - - return v; - - onError: - return NULL; -} - -static void -string_dealloc(PyObject *op) -{ - switch (PyString_CHECK_INTERNED(op)) { - case SSTATE_NOT_INTERNED: - break; - - case SSTATE_INTERNED_MORTAL: - /* revive dead object temporarily for DelItem */ - Py_REFCNT(op) = 3; - if (PyDict_DelItem(interned, op) != 0) - Py_FatalError( - "deletion of interned string failed"); - break; - - case SSTATE_INTERNED_IMMORTAL: - Py_FatalError("Immortal interned string died."); - - default: - Py_FatalError("Inconsistent interned string state."); - } - Py_TYPE(op)->tp_free(op); -} - -/* Unescape a backslash-escaped string. If unicode is non-zero, - the string is a u-literal. If recode_encoding is non-zero, - the string is UTF-8 encoded and should be re-encoded in the - specified encoding. */ - -PyObject *PyString_DecodeEscape(const char *s, - Py_ssize_t len, - const char *errors, - Py_ssize_t unicode, - const char *recode_encoding) -{ - int c; - char *p, *buf; - const char *end; - PyObject *v; - Py_ssize_t newlen = recode_encoding ? 4*len:len; - v = PyString_FromStringAndSize((char *)NULL, newlen); - if (v == NULL) - return NULL; - p = buf = PyString_AsString(v); - end = s + len; - while (s < end) { - if (*s != '\\') { - non_esc: -#ifdef Py_USING_UNICODE - if (recode_encoding && (*s & 0x80)) { - PyObject *u, *w; - char *r; - const char* t; - Py_ssize_t rn; - t = s; - /* Decode non-ASCII bytes as UTF-8. */ - while (t < end && (*t & 0x80)) t++; - u = PyUnicode_DecodeUTF8(s, t - s, errors); - if(!u) goto failed; - - /* Recode them in target encoding. */ - w = PyUnicode_AsEncodedString( - u, recode_encoding, errors); - Py_DECREF(u); - if (!w) goto failed; - - /* Append bytes to output buffer. */ - assert(PyString_Check(w)); - r = PyString_AS_STRING(w); - rn = PyString_GET_SIZE(w); - Py_MEMCPY(p, r, rn); - p += rn; - Py_DECREF(w); - s = t; - } else { - *p++ = *s++; - } -#else - *p++ = *s++; -#endif - continue; - } - s++; - if (s==end) { - PyErr_SetString(PyExc_ValueError, - "Trailing \\ in string"); - goto failed; - } - switch (*s++) { - /* XXX This assumes ASCII! */ - case '\n': break; - case '\\': *p++ = '\\'; break; - case '\'': *p++ = '\''; break; - case '\"': *p++ = '\"'; break; - case 'b': *p++ = '\b'; break; - case 'f': *p++ = '\014'; break; /* FF */ - case 't': *p++ = '\t'; break; - case 'n': *p++ = '\n'; break; - case 'r': *p++ = '\r'; break; - case 'v': *p++ = '\013'; break; /* VT */ - case 'a': *p++ = '\007'; break; /* BEL, not classic C */ - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - c = s[-1] - '0'; - if (s < end && '0' <= *s && *s <= '7') { - c = (c<<3) + *s++ - '0'; - if (s < end && '0' <= *s && *s <= '7') - c = (c<<3) + *s++ - '0'; - } - *p++ = c; - break; - case 'x': - if (s+1 < end && - isxdigit(Py_CHARMASK(s[0])) && - isxdigit(Py_CHARMASK(s[1]))) - { - unsigned int x = 0; - c = Py_CHARMASK(*s); - s++; - if (isdigit(c)) - x = c - '0'; - else if (islower(c)) - x = 10 + c - 'a'; - else - x = 10 + c - 'A'; - x = x << 4; - c = Py_CHARMASK(*s); - s++; - if (isdigit(c)) - x += c - '0'; - else if (islower(c)) - x += 10 + c - 'a'; - else - x += 10 + c - 'A'; - *p++ = x; - break; - } - if (!errors || strcmp(errors, "strict") == 0) { - PyErr_SetString(PyExc_ValueError, - "invalid \\x escape"); - goto failed; - } - if (strcmp(errors, "replace") == 0) { - *p++ = '?'; - } else if (strcmp(errors, "ignore") == 0) - /* do nothing */; - else { - PyErr_Format(PyExc_ValueError, - "decoding error; " - "unknown error handling code: %.400s", - errors); - goto failed; - } -#ifndef Py_USING_UNICODE - case 'u': - case 'U': - case 'N': - if (unicode) { - PyErr_SetString(PyExc_ValueError, - "Unicode escapes not legal " - "when Unicode disabled"); - goto failed; - } -#endif - default: - *p++ = '\\'; - s--; - goto non_esc; /* an arbitry number of unescaped - UTF-8 bytes may follow. */ - } - } - if (p-buf < newlen) - _PyString_Resize(&v, p - buf); - return v; - failed: - Py_DECREF(v); - return NULL; -} - -/* -------------------------------------------------------------------- */ -/* object api */ - -static Py_ssize_t -string_getsize(register PyObject *op) -{ - char *s; - Py_ssize_t len; - if (PyString_AsStringAndSize(op, &s, &len)) - return -1; - return len; -} - -static /*const*/ char * -string_getbuffer(register PyObject *op) -{ - char *s; - Py_ssize_t len; - if (PyString_AsStringAndSize(op, &s, &len)) - return NULL; - return s; -} - -Py_ssize_t -PyString_Size(register PyObject *op) -{ - if (!PyString_Check(op)) - return string_getsize(op); - return Py_SIZE(op); -} - -/*const*/ char * -PyString_AsString(register PyObject *op) -{ - if (!PyString_Check(op)) - return string_getbuffer(op); - return ((PyStringObject *)op) -> ob_sval; -} - -int -PyString_AsStringAndSize(register PyObject *obj, - register char **s, - register Py_ssize_t *len) -{ - if (s == NULL) { - PyErr_BadInternalCall(); - return -1; - } - - if (!PyString_Check(obj)) { -#ifdef Py_USING_UNICODE - if (PyUnicode_Check(obj)) { - obj = _PyUnicode_AsDefaultEncodedString(obj, NULL); - if (obj == NULL) - return -1; - } - else -#endif - { - PyErr_Format(PyExc_TypeError, - "expected string or Unicode object, " - "%.200s found", Py_TYPE(obj)->tp_name); - return -1; - } - } - - *s = PyString_AS_STRING(obj); - if (len != NULL) - *len = PyString_GET_SIZE(obj); - else if (strlen(*s) != (size_t)PyString_GET_SIZE(obj)) { - PyErr_SetString(PyExc_TypeError, - "expected string without null bytes"); - return -1; - } - return 0; -} - -/* -------------------------------------------------------------------- */ -/* Methods */ - -#include "stringlib/stringdefs.h" -#include "stringlib/fastsearch.h" - -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/partition.h" - -#define _Py_InsertThousandsGrouping _PyString_InsertThousandsGrouping -#include "stringlib/localeutil.h" - - - -static int -string_print(PyStringObject *op, FILE *fp, int flags) -{ - Py_ssize_t i, str_len; - char c; - int quote; - - /* XXX Ought to check for interrupts when writing long strings */ - if (! PyString_CheckExact(op)) { - int ret; - /* A str subclass may have its own __str__ method. */ - op = (PyStringObject *) PyObject_Str((PyObject *)op); - if (op == NULL) - return -1; - ret = string_print(op, fp, flags); - Py_DECREF(op); - return ret; - } - if (flags & Py_PRINT_RAW) { - char *data = op->ob_sval; - Py_ssize_t size = Py_SIZE(op); - Py_BEGIN_ALLOW_THREADS - while (size > INT_MAX) { - /* Very long strings cannot be written atomically. - * But don't write exactly INT_MAX bytes at a time - * to avoid memory aligment issues. - */ - const int chunk_size = INT_MAX & ~0x3FFF; - fwrite(data, 1, chunk_size, fp); - data += chunk_size; - size -= chunk_size; - } -#ifdef __VMS - if (size) fwrite(data, (int)size, 1, fp); -#else - fwrite(data, 1, (int)size, fp); -#endif - Py_END_ALLOW_THREADS - return 0; - } - - /* figure out which quote to use; single is preferred */ - quote = '\''; - if (memchr(op->ob_sval, '\'', Py_SIZE(op)) && - !memchr(op->ob_sval, '"', Py_SIZE(op))) - quote = '"'; - - str_len = Py_SIZE(op); - Py_BEGIN_ALLOW_THREADS - fputc(quote, fp); - for (i = 0; i < str_len; i++) { - /* Since strings are immutable and the caller should have a - reference, accessing the interal buffer should not be an issue - with the GIL released. */ - c = op->ob_sval[i]; - if (c == quote || c == '\\') - fprintf(fp, "\\%c", c); - else if (c == '\t') - fprintf(fp, "\\t"); - else if (c == '\n') - fprintf(fp, "\\n"); - else if (c == '\r') - fprintf(fp, "\\r"); - else if (c < ' ' || c >= 0x7f) - fprintf(fp, "\\x%02x", c & 0xff); - else - fputc(c, fp); - } - fputc(quote, fp); - Py_END_ALLOW_THREADS - return 0; -} - -PyObject * -PyString_Repr(PyObject *obj, int smartquotes) -{ - register PyStringObject* op = (PyStringObject*) obj; - size_t newsize = 2 + 4 * Py_SIZE(op); - PyObject *v; - if (newsize > PY_SSIZE_T_MAX || newsize / 4 != Py_SIZE(op)) { - PyErr_SetString(PyExc_OverflowError, - "string is too large to make repr"); - return NULL; - } - v = PyString_FromStringAndSize((char *)NULL, newsize); - if (v == NULL) { - return NULL; - } - else { - register Py_ssize_t i; - register char c; - register char *p; - int quote; - - /* figure out which quote to use; single is preferred */ - quote = '\''; - if (smartquotes && - memchr(op->ob_sval, '\'', Py_SIZE(op)) && - !memchr(op->ob_sval, '"', Py_SIZE(op))) - quote = '"'; - - p = PyString_AS_STRING(v); - *p++ = quote; - for (i = 0; i < Py_SIZE(op); i++) { - /* There's at least enough room for a hex escape - and a closing quote. */ - assert(newsize - (p - PyString_AS_STRING(v)) >= 5); - c = op->ob_sval[i]; - if (c == quote || c == '\\') - *p++ = '\\', *p++ = c; - else if (c == '\t') - *p++ = '\\', *p++ = 't'; - else if (c == '\n') - *p++ = '\\', *p++ = 'n'; - else if (c == '\r') - *p++ = '\\', *p++ = 'r'; - else if (c < ' ' || c >= 0x7f) { - /* For performance, we don't want to call - PyOS_snprintf here (extra layers of - function call). */ - sprintf(p, "\\x%02x", c & 0xff); - p += 4; - } - else - *p++ = c; - } - assert(newsize - (p - PyString_AS_STRING(v)) >= 1); - *p++ = quote; - *p = '\0'; - _PyString_Resize( - &v, (p - PyString_AS_STRING(v))); - return v; - } -} - -static PyObject * -string_repr(PyObject *op) -{ - return PyString_Repr(op, 1); -} - -static PyObject * -string_str(PyObject *s) -{ - assert(PyString_Check(s)); - if (PyString_CheckExact(s)) { - Py_INCREF(s); - return s; - } - else { - /* Subtype -- return genuine string with the same value. */ - PyStringObject *t = (PyStringObject *) s; - return PyString_FromStringAndSize(t->ob_sval, Py_SIZE(t)); - } -} - -static Py_ssize_t -string_length(PyStringObject *a) -{ - return Py_SIZE(a); -} - -static PyObject * -string_concat(register PyStringObject *a, register PyObject *bb) -{ - register Py_ssize_t size; - register PyStringObject *op; - if (!PyString_Check(bb)) { -#ifdef Py_USING_UNICODE - if (PyUnicode_Check(bb)) - return PyUnicode_Concat((PyObject *)a, bb); -#endif - if (PyBytes_Check(bb)) - return PyBytes_Concat((PyObject *)a, bb); - PyErr_Format(PyExc_TypeError, - "cannot concatenate 'str' and '%.200s' objects", - Py_TYPE(bb)->tp_name); - return NULL; - } -#define b ((PyStringObject *)bb) - /* Optimize cases with empty left or right operand */ - if ((Py_SIZE(a) == 0 || Py_SIZE(b) == 0) && - PyString_CheckExact(a) && PyString_CheckExact(b)) { - if (Py_SIZE(a) == 0) { - Py_INCREF(bb); - return bb; - } - Py_INCREF(a); - return (PyObject *)a; - } - size = Py_SIZE(a) + Py_SIZE(b); - if (size < 0) { - PyErr_SetString(PyExc_OverflowError, - "strings are too large to concat"); - return NULL; - } - - /* Inline PyObject_NewVar */ - op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) + size); - if (op == NULL) - return PyErr_NoMemory(); - PyObject_INIT_VAR(op, &PyString_Type, size); - op->ob_shash = -1; - op->ob_sstate = SSTATE_NOT_INTERNED; - Py_MEMCPY(op->ob_sval, a->ob_sval, Py_SIZE(a)); - Py_MEMCPY(op->ob_sval + Py_SIZE(a), b->ob_sval, Py_SIZE(b)); - op->ob_sval[size] = '\0'; - return (PyObject *) op; -#undef b -} - -static PyObject * -string_repeat(register PyStringObject *a, register Py_ssize_t n) -{ - register Py_ssize_t i; - register Py_ssize_t j; - register Py_ssize_t size; - register PyStringObject *op; - size_t nbytes; - if (n < 0) - n = 0; - /* watch out for overflows: the size can overflow int, - * and the # of bytes needed can overflow size_t - */ - size = Py_SIZE(a) * n; - if (n && size / n != Py_SIZE(a)) { - PyErr_SetString(PyExc_OverflowError, - "repeated string is too long"); - return NULL; - } - if (size == Py_SIZE(a) && PyString_CheckExact(a)) { - Py_INCREF(a); - return (PyObject *)a; - } - nbytes = (size_t)size; - if (nbytes + sizeof(PyStringObject) <= nbytes) { - PyErr_SetString(PyExc_OverflowError, - "repeated string is too long"); - return NULL; - } - op = (PyStringObject *) - PyObject_MALLOC(sizeof(PyStringObject) + nbytes); - if (op == NULL) - return PyErr_NoMemory(); - PyObject_INIT_VAR(op, &PyString_Type, size); - op->ob_shash = -1; - op->ob_sstate = SSTATE_NOT_INTERNED; - op->ob_sval[size] = '\0'; - if (Py_SIZE(a) == 1 && n > 0) { - memset(op->ob_sval, a->ob_sval[0] , n); - return (PyObject *) op; - } - i = 0; - if (i < size) { - Py_MEMCPY(op->ob_sval, a->ob_sval, Py_SIZE(a)); - i = Py_SIZE(a); - } - while (i < size) { - j = (i <= size-i) ? i : size-i; - Py_MEMCPY(op->ob_sval+i, op->ob_sval, j); - i += j; - } - return (PyObject *) op; -} - -/* String slice a[i:j] consists of characters a[i] ... a[j-1] */ - -static PyObject * -string_slice(register PyStringObject *a, register Py_ssize_t i, - register Py_ssize_t j) - /* j -- may be negative! */ -{ - if (i < 0) - i = 0; - if (j < 0) - j = 0; /* Avoid signed/unsigned bug in next line */ - if (j > Py_SIZE(a)) - j = Py_SIZE(a); - if (i == 0 && j == Py_SIZE(a) && PyString_CheckExact(a)) { - /* It's the same as a */ - Py_INCREF(a); - return (PyObject *)a; - } - if (j < i) - j = i; - return PyString_FromStringAndSize(a->ob_sval + i, j-i); -} - -static int -string_contains(PyObject *str_obj, PyObject *sub_obj) -{ - if (!PyString_CheckExact(sub_obj)) { -#ifdef Py_USING_UNICODE - if (PyUnicode_Check(sub_obj)) - return PyUnicode_Contains(str_obj, sub_obj); -#endif - if (!PyString_Check(sub_obj)) { - PyErr_Format(PyExc_TypeError, - "'in ' requires string as left operand, " - "not %.200s", Py_TYPE(sub_obj)->tp_name); - return -1; - } - } - - return stringlib_contains_obj(str_obj, sub_obj); -} - -static PyObject * -string_item(PyStringObject *a, register Py_ssize_t i) -{ - char pchar; - PyObject *v; - if (i < 0 || i >= Py_SIZE(a)) { - PyErr_SetString(PyExc_IndexError, "string index out of range"); - return NULL; - } - pchar = a->ob_sval[i]; - v = (PyObject *)characters[pchar & UCHAR_MAX]; - if (v == NULL) - v = PyString_FromStringAndSize(&pchar, 1); - else { -#ifdef COUNT_ALLOCS - one_strings++; -#endif - Py_INCREF(v); - } - return v; -} - -static PyObject* -string_richcompare(PyStringObject *a, PyStringObject *b, int op) -{ - int c; - Py_ssize_t len_a, len_b; - Py_ssize_t min_len; - PyObject *result; - - /* Make sure both arguments are strings. */ - if (!(PyString_Check(a) && PyString_Check(b))) { - result = Py_NotImplemented; - goto out; - } - if (a == b) { - switch (op) { - case Py_EQ:case Py_LE:case Py_GE: - result = Py_True; - goto out; - case Py_NE:case Py_LT:case Py_GT: - result = Py_False; - goto out; - } - } - if (op == Py_EQ) { - /* Supporting Py_NE here as well does not save - much time, since Py_NE is rarely used. */ - if (Py_SIZE(a) == Py_SIZE(b) - && (a->ob_sval[0] == b->ob_sval[0] - && memcmp(a->ob_sval, b->ob_sval, Py_SIZE(a)) == 0)) { - result = Py_True; - } else { - result = Py_False; - } - goto out; - } - len_a = Py_SIZE(a); len_b = Py_SIZE(b); - min_len = (len_a < len_b) ? len_a : len_b; - if (min_len > 0) { - c = Py_CHARMASK(*a->ob_sval) - Py_CHARMASK(*b->ob_sval); - if (c==0) - c = memcmp(a->ob_sval, b->ob_sval, min_len); - } else - c = 0; - if (c == 0) - c = (len_a < len_b) ? -1 : (len_a > len_b) ? 1 : 0; - switch (op) { - case Py_LT: c = c < 0; break; - case Py_LE: c = c <= 0; break; - case Py_EQ: assert(0); break; /* unreachable */ - case Py_NE: c = c != 0; break; - case Py_GT: c = c > 0; break; - case Py_GE: c = c >= 0; break; - default: - result = Py_NotImplemented; - goto out; - } - result = c ? Py_True : Py_False; - out: - Py_INCREF(result); - return result; -} - -int -_PyString_Eq(PyObject *o1, PyObject *o2) -{ - PyStringObject *a = (PyStringObject*) o1; - PyStringObject *b = (PyStringObject*) o2; - return Py_SIZE(a) == Py_SIZE(b) - && *a->ob_sval == *b->ob_sval - && memcmp(a->ob_sval, b->ob_sval, Py_SIZE(a)) == 0; -} - -static long -string_hash(PyStringObject *a) -{ - register Py_ssize_t len; - register unsigned char *p; - register long x; - - if (a->ob_shash != -1) - return a->ob_shash; - len = Py_SIZE(a); - p = (unsigned char *) a->ob_sval; - x = *p << 7; - while (--len >= 0) - x = (1000003*x) ^ *p++; - x ^= Py_SIZE(a); - if (x == -1) - x = -2; - a->ob_shash = x; - return x; -} - -static PyObject* -string_subscript(PyStringObject* self, PyObject* item) -{ - if (PyIndex_Check(item)) { - Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); - if (i == -1 && PyErr_Occurred()) - return NULL; - if (i < 0) - i += PyString_GET_SIZE(self); - return string_item(self, i); - } - else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; - char* source_buf; - char* result_buf; - PyObject* result; - - if (PySlice_GetIndicesEx((PySliceObject*)item, - PyString_GET_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { - return NULL; - } - - if (slicelength <= 0) { - return PyString_FromStringAndSize("", 0); - } - else if (start == 0 && step == 1 && - slicelength == PyString_GET_SIZE(self) && - PyString_CheckExact(self)) { - Py_INCREF(self); - return (PyObject *)self; - } - else if (step == 1) { - return PyString_FromStringAndSize( - PyString_AS_STRING(self) + start, - slicelength); - } - else { - source_buf = PyString_AsString((PyObject*)self); - result_buf = (char *)PyMem_Malloc(slicelength); - if (result_buf == NULL) - return PyErr_NoMemory(); - - for (cur = start, i = 0; i < slicelength; - cur += step, i++) { - result_buf[i] = source_buf[cur]; - } - - result = PyString_FromStringAndSize(result_buf, - slicelength); - PyMem_Free(result_buf); - return result; - } - } - else { - PyErr_Format(PyExc_TypeError, - "string indices must be integers, not %.200s", - Py_TYPE(item)->tp_name); - return NULL; - } -} - -static Py_ssize_t -string_buffer_getreadbuf(PyStringObject *self, Py_ssize_t index, const void **ptr) -{ - if ( index != 0 ) { - PyErr_SetString(PyExc_SystemError, - "accessing non-existent string segment"); - return -1; - } - *ptr = (void *)self->ob_sval; - return Py_SIZE(self); -} - -static Py_ssize_t -string_buffer_getwritebuf(PyStringObject *self, Py_ssize_t index, const void **ptr) -{ - PyErr_SetString(PyExc_TypeError, - "Cannot use string as modifiable buffer"); - return -1; -} - -static Py_ssize_t -string_buffer_getsegcount(PyStringObject *self, Py_ssize_t *lenp) -{ - if ( lenp ) - *lenp = Py_SIZE(self); - return 1; -} - -static Py_ssize_t -string_buffer_getcharbuf(PyStringObject *self, Py_ssize_t index, const char **ptr) -{ - if ( index != 0 ) { - PyErr_SetString(PyExc_SystemError, - "accessing non-existent string segment"); - return -1; - } - *ptr = self->ob_sval; - return Py_SIZE(self); -} - -static int -string_buffer_getbuffer(PyStringObject *self, Py_buffer *view, int flags) -{ - return PyBuffer_FillInfo(view, (void *)self->ob_sval, Py_SIZE(self), - 0, flags); -} - -static PySequenceMethods string_as_sequence = { - (lenfunc)string_length, /*sq_length*/ - (binaryfunc)string_concat, /*sq_concat*/ - (ssizeargfunc)string_repeat, /*sq_repeat*/ - (ssizeargfunc)string_item, /*sq_item*/ - (ssizessizeargfunc)string_slice, /*sq_slice*/ - 0, /*sq_ass_item*/ - 0, /*sq_ass_slice*/ - (objobjproc)string_contains /*sq_contains*/ -}; - -static PyMappingMethods string_as_mapping = { - (lenfunc)string_length, - (binaryfunc)string_subscript, - 0, -}; - -static PyBufferProcs string_as_buffer = { - (readbufferproc)string_buffer_getreadbuf, - (writebufferproc)string_buffer_getwritebuf, - (segcountproc)string_buffer_getsegcount, - (charbufferproc)string_buffer_getcharbuf, - (getbufferproc)string_buffer_getbuffer, - 0, /* XXX */ -}; - - - -#define LEFTSTRIP 0 -#define RIGHTSTRIP 1 -#define BOTHSTRIP 2 - -/* Arrays indexed by above */ -static const char *stripformat[] = {"|O:lstrip", "|O:rstrip", "|O:strip"}; - -#define STRIPNAME(i) (stripformat[i]+3) - - -/* Don't call if length < 2 */ -#define Py_STRING_MATCH(target, offset, pattern, length) \ - (target[offset] == pattern[0] && \ - target[offset+length-1] == pattern[length-1] && \ - !memcmp(target+offset+1, pattern+1, length-2) ) - - -/* Overallocate the initial list to reduce the number of reallocs for small - split sizes. Eg, "A A A A A A A A A A".split() (10 elements) has three - resizes, to sizes 4, 8, then 16. Most observed string splits are for human - text (roughly 11 words per line) and field delimited data (usually 1-10 - fields). For large strings the split algorithms are bandwidth limited - so increasing the preallocation likely will not improve things.*/ - -#define MAX_PREALLOC 12 - -/* 5 splits gives 6 elements */ -#define PREALLOC_SIZE(maxsplit) \ - (maxsplit >= MAX_PREALLOC ? MAX_PREALLOC : maxsplit+1) - -#define SPLIT_APPEND(data, left, right) \ - str = PyString_FromStringAndSize((data) + (left), \ - (right) - (left)); \ - if (str == NULL) \ - goto onError; \ - if (PyList_Append(list, str)) { \ - Py_DECREF(str); \ - goto onError; \ - } \ - else \ - Py_DECREF(str); - -#define SPLIT_ADD(data, left, right) { \ - str = PyString_FromStringAndSize((data) + (left), \ - (right) - (left)); \ - if (str == NULL) \ - goto onError; \ - if (count < MAX_PREALLOC) { \ - PyList_SET_ITEM(list, count, str); \ - } else { \ - if (PyList_Append(list, str)) { \ - Py_DECREF(str); \ - goto onError; \ - } \ - else \ - Py_DECREF(str); \ - } \ - count++; } - -/* Always force the list to the expected size. */ -#define FIX_PREALLOC_SIZE(list) Py_SIZE(list) = count - -#define SKIP_SPACE(s, i, len) { while (i=0 && isspace(Py_CHARMASK(s[i]))) i--; } -#define RSKIP_NONSPACE(s, i) { while (i>=0 && !isspace(Py_CHARMASK(s[i]))) i--; } - -Py_LOCAL_INLINE(PyObject *) -split_whitespace(PyStringObject *self, Py_ssize_t len, Py_ssize_t maxsplit) -{ - const char *s = PyString_AS_STRING(self); - Py_ssize_t i, j, count=0; - PyObject *str; - PyObject *list = PyList_New(PREALLOC_SIZE(maxsplit)); - - if (list == NULL) - return NULL; - - i = j = 0; - - while (maxsplit-- > 0) { - SKIP_SPACE(s, i, len); - if (i==len) break; - j = i; i++; - SKIP_NONSPACE(s, i, len); - if (j == 0 && i == len && PyString_CheckExact(self)) { - /* No whitespace in self, so just use it as list[0] */ - Py_INCREF(self); - PyList_SET_ITEM(list, 0, (PyObject *)self); - count++; - break; - } - SPLIT_ADD(s, j, i); - } - - if (i < len) { - /* Only occurs when maxsplit was reached */ - /* Skip any remaining whitespace and copy to end of string */ - SKIP_SPACE(s, i, len); - if (i != len) - SPLIT_ADD(s, i, len); - } - FIX_PREALLOC_SIZE(list); - return list; - onError: - Py_DECREF(list); - return NULL; -} - -Py_LOCAL_INLINE(PyObject *) -split_char(PyStringObject *self, Py_ssize_t len, char ch, Py_ssize_t maxcount) -{ - const char *s = PyString_AS_STRING(self); - register Py_ssize_t i, j, count=0; - PyObject *str; - PyObject *list = PyList_New(PREALLOC_SIZE(maxcount)); - - if (list == NULL) - return NULL; - - i = j = 0; - while ((j < len) && (maxcount-- > 0)) { - for(; j list of strings\n\ -\n\ -Return a list of the words in the string S, using sep as the\n\ -delimiter string. If maxsplit is given, at most maxsplit\n\ -splits are done. If sep is not specified or is None, any\n\ -whitespace string is a separator and empty strings are removed\n\ -from the result."); - -static PyObject * -string_split(PyStringObject *self, PyObject *args) -{ - Py_ssize_t len = PyString_GET_SIZE(self), n, i, j; - Py_ssize_t maxsplit = -1, count=0; - const char *s = PyString_AS_STRING(self), *sub; - PyObject *list, *str, *subobj = Py_None; -#ifdef USE_FAST - Py_ssize_t pos; -#endif - - if (!PyArg_ParseTuple(args, "|On:split", &subobj, &maxsplit)) - return NULL; - if (maxsplit < 0) - maxsplit = PY_SSIZE_T_MAX; - if (subobj == Py_None) - return split_whitespace(self, len, maxsplit); - if (PyString_Check(subobj)) { - sub = PyString_AS_STRING(subobj); - n = PyString_GET_SIZE(subobj); - } -#ifdef Py_USING_UNICODE - else if (PyUnicode_Check(subobj)) - return PyUnicode_Split((PyObject *)self, subobj, maxsplit); -#endif - else if (PyObject_AsCharBuffer(subobj, &sub, &n)) - return NULL; - - if (n == 0) { - PyErr_SetString(PyExc_ValueError, "empty separator"); - return NULL; - } - else if (n == 1) - return split_char(self, len, sub[0], maxsplit); - - list = PyList_New(PREALLOC_SIZE(maxsplit)); - if (list == NULL) - return NULL; - -#ifdef USE_FAST - i = j = 0; - while (maxsplit-- > 0) { - pos = fastsearch(s+i, len-i, sub, n, FAST_SEARCH); - if (pos < 0) - break; - j = i+pos; - SPLIT_ADD(s, i, j); - i = j + n; - } -#else - i = j = 0; - while ((j+n <= len) && (maxsplit-- > 0)) { - for (; j+n <= len; j++) { - if (Py_STRING_MATCH(s, j, sub, n)) { - SPLIT_ADD(s, i, j); - i = j = j + n; - break; - } - } - } -#endif - SPLIT_ADD(s, i, len); - FIX_PREALLOC_SIZE(list); - return list; - - onError: - Py_DECREF(list); - return NULL; -} - -PyDoc_STRVAR(partition__doc__, -"S.partition(sep) -> (head, sep, tail)\n\ -\n\ -Searches for the separator sep in S, and returns the part before it,\n\ -the separator itself, and the part after it. If the separator is not\n\ -found, returns S and two empty strings."); - -static PyObject * -string_partition(PyStringObject *self, PyObject *sep_obj) -{ - const char *sep; - Py_ssize_t sep_len; - - if (PyString_Check(sep_obj)) { - sep = PyString_AS_STRING(sep_obj); - sep_len = PyString_GET_SIZE(sep_obj); - } -#ifdef Py_USING_UNICODE - else if (PyUnicode_Check(sep_obj)) - return PyUnicode_Partition((PyObject *) self, sep_obj); -#endif - else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len)) - return NULL; - - return stringlib_partition( - (PyObject*) self, - PyString_AS_STRING(self), PyString_GET_SIZE(self), - sep_obj, sep, sep_len - ); -} - -PyDoc_STRVAR(rpartition__doc__, -"S.rpartition(sep) -> (tail, sep, head)\n\ -\n\ -Searches for the separator sep in S, starting at the end of S, and returns\n\ -the part before it, the separator itself, and the part after it. If the\n\ -separator is not found, returns two empty strings and S."); - -static PyObject * -string_rpartition(PyStringObject *self, PyObject *sep_obj) -{ - const char *sep; - Py_ssize_t sep_len; - - if (PyString_Check(sep_obj)) { - sep = PyString_AS_STRING(sep_obj); - sep_len = PyString_GET_SIZE(sep_obj); - } -#ifdef Py_USING_UNICODE - else if (PyUnicode_Check(sep_obj)) - return PyUnicode_Partition((PyObject *) self, sep_obj); -#endif - else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len)) - return NULL; - - return stringlib_rpartition( - (PyObject*) self, - PyString_AS_STRING(self), PyString_GET_SIZE(self), - sep_obj, sep, sep_len - ); -} - -Py_LOCAL_INLINE(PyObject *) -rsplit_whitespace(PyStringObject *self, Py_ssize_t len, Py_ssize_t maxsplit) -{ - const char *s = PyString_AS_STRING(self); - Py_ssize_t i, j, count=0; - PyObject *str; - PyObject *list = PyList_New(PREALLOC_SIZE(maxsplit)); - - if (list == NULL) - return NULL; - - i = j = len-1; - - while (maxsplit-- > 0) { - RSKIP_SPACE(s, i); - if (i<0) break; - j = i; i--; - RSKIP_NONSPACE(s, i); - if (j == len-1 && i < 0 && PyString_CheckExact(self)) { - /* No whitespace in self, so just use it as list[0] */ - Py_INCREF(self); - PyList_SET_ITEM(list, 0, (PyObject *)self); - count++; - break; - } - SPLIT_ADD(s, i + 1, j + 1); - } - if (i >= 0) { - /* Only occurs when maxsplit was reached */ - /* Skip any remaining whitespace and copy to beginning of string */ - RSKIP_SPACE(s, i); - if (i >= 0) - SPLIT_ADD(s, 0, i + 1); - - } - FIX_PREALLOC_SIZE(list); - if (PyList_Reverse(list) < 0) - goto onError; - return list; - onError: - Py_DECREF(list); - return NULL; -} - -Py_LOCAL_INLINE(PyObject *) -rsplit_char(PyStringObject *self, Py_ssize_t len, char ch, Py_ssize_t maxcount) -{ - const char *s = PyString_AS_STRING(self); - register Py_ssize_t i, j, count=0; - PyObject *str; - PyObject *list = PyList_New(PREALLOC_SIZE(maxcount)); - - if (list == NULL) - return NULL; - - i = j = len - 1; - while ((i >= 0) && (maxcount-- > 0)) { - for (; i >= 0; i--) { - if (s[i] == ch) { - SPLIT_ADD(s, i + 1, j + 1); - j = i = i - 1; - break; - } - } - } - if (i < 0 && count == 0 && PyString_CheckExact(self)) { - /* ch not in self, so just use self as list[0] */ - Py_INCREF(self); - PyList_SET_ITEM(list, 0, (PyObject *)self); - count++; - } - else if (j >= -1) { - SPLIT_ADD(s, 0, j + 1); - } - FIX_PREALLOC_SIZE(list); - if (PyList_Reverse(list) < 0) - goto onError; - return list; - - onError: - Py_DECREF(list); - return NULL; -} - -PyDoc_STRVAR(rsplit__doc__, -"S.rsplit([sep [,maxsplit]]) -> list of strings\n\ -\n\ -Return a list of the words in the string S, using sep as the\n\ -delimiter string, starting at the end of the string and working\n\ -to the front. If maxsplit is given, at most maxsplit splits are\n\ -done. If sep is not specified or is None, any whitespace string\n\ -is a separator."); - -static PyObject * -string_rsplit(PyStringObject *self, PyObject *args) -{ - Py_ssize_t len = PyString_GET_SIZE(self), n, i, j; - Py_ssize_t maxsplit = -1, count=0; - const char *s, *sub; - PyObject *list, *str, *subobj = Py_None; - - if (!PyArg_ParseTuple(args, "|On:rsplit", &subobj, &maxsplit)) - return NULL; - if (maxsplit < 0) - maxsplit = PY_SSIZE_T_MAX; - if (subobj == Py_None) - return rsplit_whitespace(self, len, maxsplit); - if (PyString_Check(subobj)) { - sub = PyString_AS_STRING(subobj); - n = PyString_GET_SIZE(subobj); - } -#ifdef Py_USING_UNICODE - else if (PyUnicode_Check(subobj)) - return PyUnicode_RSplit((PyObject *)self, subobj, maxsplit); -#endif - else if (PyObject_AsCharBuffer(subobj, &sub, &n)) - return NULL; - - if (n == 0) { - PyErr_SetString(PyExc_ValueError, "empty separator"); - return NULL; - } - else if (n == 1) - return rsplit_char(self, len, sub[0], maxsplit); - - list = PyList_New(PREALLOC_SIZE(maxsplit)); - if (list == NULL) - return NULL; - - j = len; - i = j - n; - - s = PyString_AS_STRING(self); - while ( (i >= 0) && (maxsplit-- > 0) ) { - for (; i>=0; i--) { - if (Py_STRING_MATCH(s, i, sub, n)) { - SPLIT_ADD(s, i + n, j); - j = i; - i -= n; - break; - } - } - } - SPLIT_ADD(s, 0, j); - FIX_PREALLOC_SIZE(list); - if (PyList_Reverse(list) < 0) - goto onError; - return list; - -onError: - Py_DECREF(list); - return NULL; -} - - -PyDoc_STRVAR(join__doc__, -"S.join(sequence) -> string\n\ -\n\ -Return a string which is the concatenation of the strings in the\n\ -sequence. The separator between elements is S."); - -static PyObject * -string_join(PyStringObject *self, PyObject *orig) -{ - char *sep = PyString_AS_STRING(self); - const Py_ssize_t seplen = PyString_GET_SIZE(self); - PyObject *res = NULL; - char *p; - Py_ssize_t seqlen = 0; - size_t sz = 0; - Py_ssize_t i; - PyObject *seq, *item; - - seq = PySequence_Fast(orig, ""); - if (seq == NULL) { - return NULL; - } - - seqlen = PySequence_Size(seq); - if (seqlen == 0) { - Py_DECREF(seq); - return PyString_FromString(""); - } - if (seqlen == 1) { - item = PySequence_Fast_GET_ITEM(seq, 0); - if (PyString_CheckExact(item) || PyUnicode_CheckExact(item)) { - Py_INCREF(item); - Py_DECREF(seq); - return item; - } - } - - /* There are at least two things to join, or else we have a subclass - * of the builtin types in the sequence. - * Do a pre-pass to figure out the total amount of space we'll - * need (sz), see whether any argument is absurd, and defer to - * the Unicode join if appropriate. - */ - for (i = 0; i < seqlen; i++) { - const size_t old_sz = sz; - item = PySequence_Fast_GET_ITEM(seq, i); - if (!PyString_Check(item)){ -#ifdef Py_USING_UNICODE - if (PyUnicode_Check(item)) { - /* Defer to Unicode join. - * CAUTION: There's no gurantee that the - * original sequence can be iterated over - * again, so we must pass seq here. - */ - PyObject *result; - result = PyUnicode_Join((PyObject *)self, seq); - Py_DECREF(seq); - return result; - } -#endif - PyErr_Format(PyExc_TypeError, - "sequence item %zd: expected string," - " %.80s found", - i, Py_TYPE(item)->tp_name); - Py_DECREF(seq); - return NULL; - } - sz += PyString_GET_SIZE(item); - if (i != 0) - sz += seplen; - if (sz < old_sz || sz > PY_SSIZE_T_MAX) { - PyErr_SetString(PyExc_OverflowError, - "join() result is too long for a Python string"); - Py_DECREF(seq); - return NULL; - } - } - - /* Allocate result space. */ - res = PyString_FromStringAndSize((char*)NULL, sz); - if (res == NULL) { - Py_DECREF(seq); - return NULL; - } - - /* Catenate everything. */ - p = PyString_AS_STRING(res); - for (i = 0; i < seqlen; ++i) { - size_t n; - item = PySequence_Fast_GET_ITEM(seq, i); - n = PyString_GET_SIZE(item); - Py_MEMCPY(p, PyString_AS_STRING(item), n); - p += n; - if (i < seqlen - 1) { - Py_MEMCPY(p, sep, seplen); - p += seplen; - } - } - - Py_DECREF(seq); - return res; -} - -PyObject * -_PyString_Join(PyObject *sep, PyObject *x) -{ - assert(sep != NULL && PyString_Check(sep)); - assert(x != NULL); - return string_join((PyStringObject *)sep, x); -} - -Py_LOCAL_INLINE(void) -string_adjust_indices(Py_ssize_t *start, Py_ssize_t *end, Py_ssize_t len) -{ - if (*end > len) - *end = len; - else if (*end < 0) - *end += len; - if (*end < 0) - *end = 0; - if (*start < 0) - *start += len; - if (*start < 0) - *start = 0; -} - -Py_LOCAL_INLINE(Py_ssize_t) -string_find_internal(PyStringObject *self, PyObject *args, int dir) -{ - PyObject *subobj; - const char *sub; - Py_ssize_t sub_len; - Py_ssize_t start=0, end=PY_SSIZE_T_MAX; - PyObject *obj_start=Py_None, *obj_end=Py_None; - - if (!PyArg_ParseTuple(args, "O|OO:find/rfind/index/rindex", &subobj, - &obj_start, &obj_end)) - return -2; - /* To support None in "start" and "end" arguments, meaning - the same as if they were not passed. - */ - if (obj_start != Py_None) - if (!_PyEval_SliceIndex(obj_start, &start)) - return -2; - if (obj_end != Py_None) - if (!_PyEval_SliceIndex(obj_end, &end)) - return -2; - - if (PyString_Check(subobj)) { - sub = PyString_AS_STRING(subobj); - sub_len = PyString_GET_SIZE(subobj); - } -#ifdef Py_USING_UNICODE - else if (PyUnicode_Check(subobj)) - return PyUnicode_Find( - (PyObject *)self, subobj, start, end, dir); -#endif - else if (PyObject_AsCharBuffer(subobj, &sub, &sub_len)) - /* XXX - the "expected a character buffer object" is pretty - confusing for a non-expert. remap to something else ? */ - return -2; - - if (dir > 0) - return stringlib_find_slice( - PyString_AS_STRING(self), PyString_GET_SIZE(self), - sub, sub_len, start, end); - else - return stringlib_rfind_slice( - PyString_AS_STRING(self), PyString_GET_SIZE(self), - sub, sub_len, start, end); -} - - -PyDoc_STRVAR(find__doc__, -"S.find(sub [,start [,end]]) -> int\n\ -\n\ -Return the lowest index in S where substring sub is found,\n\ -such that sub is contained within s[start:end]. Optional\n\ -arguments start and end are interpreted as in slice notation.\n\ -\n\ -Return -1 on failure."); - -static PyObject * -string_find(PyStringObject *self, PyObject *args) -{ - Py_ssize_t result = string_find_internal(self, args, +1); - if (result == -2) - return NULL; - return PyInt_FromSsize_t(result); -} - - -PyDoc_STRVAR(index__doc__, -"S.index(sub [,start [,end]]) -> int\n\ -\n\ -Like S.find() but raise ValueError when the substring is not found."); - -static PyObject * -string_index(PyStringObject *self, PyObject *args) -{ - Py_ssize_t result = string_find_internal(self, args, +1); - if (result == -2) - return NULL; - if (result == -1) { - PyErr_SetString(PyExc_ValueError, - "substring not found"); - return NULL; - } - return PyInt_FromSsize_t(result); -} - - -PyDoc_STRVAR(rfind__doc__, -"S.rfind(sub [,start [,end]]) -> int\n\ -\n\ -Return the highest index in S where substring sub is found,\n\ -such that sub is contained within s[start:end]. Optional\n\ -arguments start and end are interpreted as in slice notation.\n\ -\n\ -Return -1 on failure."); - -static PyObject * -string_rfind(PyStringObject *self, PyObject *args) -{ - Py_ssize_t result = string_find_internal(self, args, -1); - if (result == -2) - return NULL; - return PyInt_FromSsize_t(result); -} - - -PyDoc_STRVAR(rindex__doc__, -"S.rindex(sub [,start [,end]]) -> int\n\ -\n\ -Like S.rfind() but raise ValueError when the substring is not found."); - -static PyObject * -string_rindex(PyStringObject *self, PyObject *args) -{ - Py_ssize_t result = string_find_internal(self, args, -1); - if (result == -2) - return NULL; - if (result == -1) { - PyErr_SetString(PyExc_ValueError, - "substring not found"); - return NULL; - } - return PyInt_FromSsize_t(result); -} - - -Py_LOCAL_INLINE(PyObject *) -do_xstrip(PyStringObject *self, int striptype, PyObject *sepobj) -{ - char *s = PyString_AS_STRING(self); - Py_ssize_t len = PyString_GET_SIZE(self); - char *sep = PyString_AS_STRING(sepobj); - Py_ssize_t seplen = PyString_GET_SIZE(sepobj); - Py_ssize_t i, j; - - i = 0; - if (striptype != RIGHTSTRIP) { - while (i < len && memchr(sep, Py_CHARMASK(s[i]), seplen)) { - i++; - } - } - - j = len; - if (striptype != LEFTSTRIP) { - do { - j--; - } while (j >= i && memchr(sep, Py_CHARMASK(s[j]), seplen)); - j++; - } - - if (i == 0 && j == len && PyString_CheckExact(self)) { - Py_INCREF(self); - return (PyObject*)self; - } - else - return PyString_FromStringAndSize(s+i, j-i); -} - - -Py_LOCAL_INLINE(PyObject *) -do_strip(PyStringObject *self, int striptype) -{ - char *s = PyString_AS_STRING(self); - Py_ssize_t len = PyString_GET_SIZE(self), i, j; - - i = 0; - if (striptype != RIGHTSTRIP) { - while (i < len && isspace(Py_CHARMASK(s[i]))) { - i++; - } - } - - j = len; - if (striptype != LEFTSTRIP) { - do { - j--; - } while (j >= i && isspace(Py_CHARMASK(s[j]))); - j++; - } - - if (i == 0 && j == len && PyString_CheckExact(self)) { - Py_INCREF(self); - return (PyObject*)self; - } - else - return PyString_FromStringAndSize(s+i, j-i); -} - - -Py_LOCAL_INLINE(PyObject *) -do_argstrip(PyStringObject *self, int striptype, PyObject *args) -{ - PyObject *sep = NULL; - - if (!PyArg_ParseTuple(args, (char *)stripformat[striptype], &sep)) - return NULL; - - if (sep != NULL && sep != Py_None) { - if (PyString_Check(sep)) - return do_xstrip(self, striptype, sep); -#ifdef Py_USING_UNICODE - else if (PyUnicode_Check(sep)) { - PyObject *uniself = PyUnicode_FromObject((PyObject *)self); - PyObject *res; - if (uniself==NULL) - return NULL; - res = _PyUnicode_XStrip((PyUnicodeObject *)uniself, - striptype, sep); - Py_DECREF(uniself); - return res; - } -#endif - PyErr_Format(PyExc_TypeError, -#ifdef Py_USING_UNICODE - "%s arg must be None, str or unicode", -#else - "%s arg must be None or str", -#endif - STRIPNAME(striptype)); - return NULL; - } - - return do_strip(self, striptype); -} - - -PyDoc_STRVAR(strip__doc__, -"S.strip([chars]) -> string or unicode\n\ -\n\ -Return a copy of the string S with leading and trailing\n\ -whitespace removed.\n\ -If chars is given and not None, remove characters in chars instead.\n\ -If chars is unicode, S will be converted to unicode before stripping"); - -static PyObject * -string_strip(PyStringObject *self, PyObject *args) -{ - if (PyTuple_GET_SIZE(args) == 0) - return do_strip(self, BOTHSTRIP); /* Common case */ - else - return do_argstrip(self, BOTHSTRIP, args); -} - - -PyDoc_STRVAR(lstrip__doc__, -"S.lstrip([chars]) -> string or unicode\n\ -\n\ -Return a copy of the string S with leading whitespace removed.\n\ -If chars is given and not None, remove characters in chars instead.\n\ -If chars is unicode, S will be converted to unicode before stripping"); - -static PyObject * -string_lstrip(PyStringObject *self, PyObject *args) -{ - if (PyTuple_GET_SIZE(args) == 0) - return do_strip(self, LEFTSTRIP); /* Common case */ - else - return do_argstrip(self, LEFTSTRIP, args); -} - - -PyDoc_STRVAR(rstrip__doc__, -"S.rstrip([chars]) -> string or unicode\n\ -\n\ -Return a copy of the string S with trailing whitespace removed.\n\ -If chars is given and not None, remove characters in chars instead.\n\ -If chars is unicode, S will be converted to unicode before stripping"); - -static PyObject * -string_rstrip(PyStringObject *self, PyObject *args) -{ - if (PyTuple_GET_SIZE(args) == 0) - return do_strip(self, RIGHTSTRIP); /* Common case */ - else - return do_argstrip(self, RIGHTSTRIP, args); -} - - -PyDoc_STRVAR(lower__doc__, -"S.lower() -> string\n\ -\n\ -Return a copy of the string S converted to lowercase."); - -/* _tolower and _toupper are defined by SUSv2, but they're not ISO C */ -#ifndef _tolower -#define _tolower tolower -#endif - -static PyObject * -string_lower(PyStringObject *self) -{ - char *s; - Py_ssize_t i, n = PyString_GET_SIZE(self); - PyObject *newobj; - - newobj = PyString_FromStringAndSize(NULL, n); - if (!newobj) - return NULL; - - s = PyString_AS_STRING(newobj); - - Py_MEMCPY(s, PyString_AS_STRING(self), n); - - for (i = 0; i < n; i++) { - int c = Py_CHARMASK(s[i]); - if (isupper(c)) - s[i] = _tolower(c); - } - - return newobj; -} - -PyDoc_STRVAR(upper__doc__, -"S.upper() -> string\n\ -\n\ -Return a copy of the string S converted to uppercase."); - -#ifndef _toupper -#define _toupper toupper -#endif - -static PyObject * -string_upper(PyStringObject *self) -{ - char *s; - Py_ssize_t i, n = PyString_GET_SIZE(self); - PyObject *newobj; - - newobj = PyString_FromStringAndSize(NULL, n); - if (!newobj) - return NULL; - - s = PyString_AS_STRING(newobj); - - Py_MEMCPY(s, PyString_AS_STRING(self), n); - - for (i = 0; i < n; i++) { - int c = Py_CHARMASK(s[i]); - if (islower(c)) - s[i] = _toupper(c); - } - - return newobj; -} - -PyDoc_STRVAR(title__doc__, -"S.title() -> string\n\ -\n\ -Return a titlecased version of S, i.e. words start with uppercase\n\ -characters, all remaining cased characters have lowercase."); - -static PyObject* -string_title(PyStringObject *self) -{ - char *s = PyString_AS_STRING(self), *s_new; - Py_ssize_t i, n = PyString_GET_SIZE(self); - int previous_is_cased = 0; - PyObject *newobj; - - newobj = PyString_FromStringAndSize(NULL, n); - if (newobj == NULL) - return NULL; - s_new = PyString_AsString(newobj); - for (i = 0; i < n; i++) { - int c = Py_CHARMASK(*s++); - if (islower(c)) { - if (!previous_is_cased) - c = toupper(c); - previous_is_cased = 1; - } else if (isupper(c)) { - if (previous_is_cased) - c = tolower(c); - previous_is_cased = 1; - } else - previous_is_cased = 0; - *s_new++ = c; - } - return newobj; -} - -PyDoc_STRVAR(capitalize__doc__, -"S.capitalize() -> string\n\ -\n\ -Return a copy of the string S with only its first character\n\ -capitalized."); - -static PyObject * -string_capitalize(PyStringObject *self) -{ - char *s = PyString_AS_STRING(self), *s_new; - Py_ssize_t i, n = PyString_GET_SIZE(self); - PyObject *newobj; - - newobj = PyString_FromStringAndSize(NULL, n); - if (newobj == NULL) - return NULL; - s_new = PyString_AsString(newobj); - if (0 < n) { - int c = Py_CHARMASK(*s++); - if (islower(c)) - *s_new = toupper(c); - else - *s_new = c; - s_new++; - } - for (i = 1; i < n; i++) { - int c = Py_CHARMASK(*s++); - if (isupper(c)) - *s_new = tolower(c); - else - *s_new = c; - s_new++; - } - return newobj; -} - - -PyDoc_STRVAR(count__doc__, -"S.count(sub[, start[, end]]) -> int\n\ -\n\ -Return the number of non-overlapping occurrences of substring sub in\n\ -string S[start:end]. Optional arguments start and end are interpreted\n\ -as in slice notation."); - -static PyObject * -string_count(PyStringObject *self, PyObject *args) -{ - PyObject *sub_obj; - const char *str = PyString_AS_STRING(self), *sub; - Py_ssize_t sub_len; - Py_ssize_t start = 0, end = PY_SSIZE_T_MAX; - - if (!PyArg_ParseTuple(args, "O|O&O&:count", &sub_obj, - _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) - return NULL; - - if (PyString_Check(sub_obj)) { - sub = PyString_AS_STRING(sub_obj); - sub_len = PyString_GET_SIZE(sub_obj); - } -#ifdef Py_USING_UNICODE - else if (PyUnicode_Check(sub_obj)) { - Py_ssize_t count; - count = PyUnicode_Count((PyObject *)self, sub_obj, start, end); - if (count == -1) - return NULL; - else - return PyInt_FromSsize_t(count); - } -#endif - else if (PyObject_AsCharBuffer(sub_obj, &sub, &sub_len)) - return NULL; - - string_adjust_indices(&start, &end, PyString_GET_SIZE(self)); - - return PyInt_FromSsize_t( - stringlib_count(str + start, end - start, sub, sub_len) - ); -} - -PyDoc_STRVAR(swapcase__doc__, -"S.swapcase() -> string\n\ -\n\ -Return a copy of the string S with uppercase characters\n\ -converted to lowercase and vice versa."); - -static PyObject * -string_swapcase(PyStringObject *self) -{ - char *s = PyString_AS_STRING(self), *s_new; - Py_ssize_t i, n = PyString_GET_SIZE(self); - PyObject *newobj; - - newobj = PyString_FromStringAndSize(NULL, n); - if (newobj == NULL) - return NULL; - s_new = PyString_AsString(newobj); - for (i = 0; i < n; i++) { - int c = Py_CHARMASK(*s++); - if (islower(c)) { - *s_new = toupper(c); - } - else if (isupper(c)) { - *s_new = tolower(c); - } - else - *s_new = c; - s_new++; - } - return newobj; -} - - -PyDoc_STRVAR(translate__doc__, -"S.translate(table [,deletechars]) -> string\n\ -\n\ -Return a copy of the string S, where all characters occurring\n\ -in the optional argument deletechars are removed, and the\n\ -remaining characters have been mapped through the given\n\ -translation table, which must be a string of length 256."); - -static PyObject * -string_translate(PyStringObject *self, PyObject *args) -{ - register char *input, *output; - const char *table; - register Py_ssize_t i, c, changed = 0; - PyObject *input_obj = (PyObject*)self; - const char *output_start, *del_table=NULL; - Py_ssize_t inlen, tablen, dellen = 0; - PyObject *result; - int trans_table[256]; - PyObject *tableobj, *delobj = NULL; - - if (!PyArg_UnpackTuple(args, "translate", 1, 2, - &tableobj, &delobj)) - return NULL; - - if (PyString_Check(tableobj)) { - table = PyString_AS_STRING(tableobj); - tablen = PyString_GET_SIZE(tableobj); - } - else if (tableobj == Py_None) { - table = NULL; - tablen = 256; - } -#ifdef Py_USING_UNICODE - else if (PyUnicode_Check(tableobj)) { - /* Unicode .translate() does not support the deletechars - parameter; instead a mapping to None will cause characters - to be deleted. */ - if (delobj != NULL) { - PyErr_SetString(PyExc_TypeError, - "deletions are implemented differently for unicode"); - return NULL; - } - return PyUnicode_Translate((PyObject *)self, tableobj, NULL); - } -#endif - else if (PyObject_AsCharBuffer(tableobj, &table, &tablen)) - return NULL; - - if (tablen != 256) { - PyErr_SetString(PyExc_ValueError, - "translation table must be 256 characters long"); - return NULL; - } - - if (delobj != NULL) { - if (PyString_Check(delobj)) { - del_table = PyString_AS_STRING(delobj); - dellen = PyString_GET_SIZE(delobj); - } -#ifdef Py_USING_UNICODE - else if (PyUnicode_Check(delobj)) { - PyErr_SetString(PyExc_TypeError, - "deletions are implemented differently for unicode"); - return NULL; - } -#endif - else if (PyObject_AsCharBuffer(delobj, &del_table, &dellen)) - return NULL; - } - else { - del_table = NULL; - dellen = 0; - } - - inlen = PyString_GET_SIZE(input_obj); - result = PyString_FromStringAndSize((char *)NULL, inlen); - if (result == NULL) - return NULL; - output_start = output = PyString_AsString(result); - input = PyString_AS_STRING(input_obj); - - if (dellen == 0 && table != NULL) { - /* If no deletions are required, use faster code */ - for (i = inlen; --i >= 0; ) { - c = Py_CHARMASK(*input++); - if (Py_CHARMASK((*output++ = table[c])) != c) - changed = 1; - } - if (changed || !PyString_CheckExact(input_obj)) - return result; - Py_DECREF(result); - Py_INCREF(input_obj); - return input_obj; - } - - if (table == NULL) { - for (i = 0; i < 256; i++) - trans_table[i] = Py_CHARMASK(i); - } else { - for (i = 0; i < 256; i++) - trans_table[i] = Py_CHARMASK(table[i]); - } - - for (i = 0; i < dellen; i++) - trans_table[(int) Py_CHARMASK(del_table[i])] = -1; - - for (i = inlen; --i >= 0; ) { - c = Py_CHARMASK(*input++); - if (trans_table[c] != -1) - if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c) - continue; - changed = 1; - } - if (!changed && PyString_CheckExact(input_obj)) { - Py_DECREF(result); - Py_INCREF(input_obj); - return input_obj; - } - /* Fix the size of the resulting string */ - if (inlen > 0) - _PyString_Resize(&result, output - output_start); - return result; -} - - -#define FORWARD 1 -#define REVERSE -1 - -/* find and count characters and substrings */ - -#define findchar(target, target_len, c) \ - ((char *)memchr((const void *)(target), c, target_len)) - -/* String ops must return a string. */ -/* If the object is subclass of string, create a copy */ -Py_LOCAL(PyStringObject *) -return_self(PyStringObject *self) -{ - if (PyString_CheckExact(self)) { - Py_INCREF(self); - return self; - } - return (PyStringObject *)PyString_FromStringAndSize( - PyString_AS_STRING(self), - PyString_GET_SIZE(self)); -} - -Py_LOCAL_INLINE(Py_ssize_t) -countchar(const char *target, int target_len, char c, Py_ssize_t maxcount) -{ - Py_ssize_t count=0; - const char *start=target; - const char *end=target+target_len; - - while ( (start=findchar(start, end-start, c)) != NULL ) { - count++; - if (count >= maxcount) - break; - start += 1; - } - return count; -} - -Py_LOCAL(Py_ssize_t) -findstring(const char *target, Py_ssize_t target_len, - const char *pattern, Py_ssize_t pattern_len, - Py_ssize_t start, - Py_ssize_t end, - int direction) -{ - if (start < 0) { - start += target_len; - if (start < 0) - start = 0; - } - if (end > target_len) { - end = target_len; - } else if (end < 0) { - end += target_len; - if (end < 0) - end = 0; - } - - /* zero-length substrings always match at the first attempt */ - if (pattern_len == 0) - return (direction > 0) ? start : end; - - end -= pattern_len; - - if (direction < 0) { - for (; end >= start; end--) - if (Py_STRING_MATCH(target, end, pattern, pattern_len)) - return end; - } else { - for (; start <= end; start++) - if (Py_STRING_MATCH(target, start, pattern, pattern_len)) - return start; - } - return -1; -} - -Py_LOCAL_INLINE(Py_ssize_t) -countstring(const char *target, Py_ssize_t target_len, - const char *pattern, Py_ssize_t pattern_len, - Py_ssize_t start, - Py_ssize_t end, - int direction, Py_ssize_t maxcount) -{ - Py_ssize_t count=0; - - if (start < 0) { - start += target_len; - if (start < 0) - start = 0; - } - if (end > target_len) { - end = target_len; - } else if (end < 0) { - end += target_len; - if (end < 0) - end = 0; - } - - /* zero-length substrings match everywhere */ - if (pattern_len == 0 || maxcount == 0) { - if (target_len+1 < maxcount) - return target_len+1; - return maxcount; - } - - end -= pattern_len; - if (direction < 0) { - for (; (end >= start); end--) - if (Py_STRING_MATCH(target, end, pattern, pattern_len)) { - count++; - if (--maxcount <= 0) break; - end -= pattern_len-1; - } - } else { - for (; (start <= end); start++) - if (Py_STRING_MATCH(target, start, pattern, pattern_len)) { - count++; - if (--maxcount <= 0) - break; - start += pattern_len-1; - } - } - return count; -} - - -/* Algorithms for different cases of string replacement */ - -/* len(self)>=1, from="", len(to)>=1, maxcount>=1 */ -Py_LOCAL(PyStringObject *) -replace_interleave(PyStringObject *self, - const char *to_s, Py_ssize_t to_len, - Py_ssize_t maxcount) -{ - char *self_s, *result_s; - Py_ssize_t self_len, result_len; - Py_ssize_t count, i, product; - PyStringObject *result; - - self_len = PyString_GET_SIZE(self); - - /* 1 at the end plus 1 after every character */ - count = self_len+1; - if (maxcount < count) - count = maxcount; - - /* Check for overflow */ - /* result_len = count * to_len + self_len; */ - product = count * to_len; - if (product / to_len != count) { - PyErr_SetString(PyExc_OverflowError, - "replace string is too long"); - return NULL; - } - result_len = product + self_len; - if (result_len < 0) { - PyErr_SetString(PyExc_OverflowError, - "replace string is too long"); - return NULL; - } - - if (! (result = (PyStringObject *) - PyString_FromStringAndSize(NULL, result_len)) ) - return NULL; - - self_s = PyString_AS_STRING(self); - result_s = PyString_AS_STRING(result); - - /* TODO: special case single character, which doesn't need memcpy */ - - /* Lay the first one down (guaranteed this will occur) */ - Py_MEMCPY(result_s, to_s, to_len); - result_s += to_len; - count -= 1; - - for (i=0; i=1, len(from)==1, to="", maxcount>=1 */ -Py_LOCAL(PyStringObject *) -replace_delete_single_character(PyStringObject *self, - char from_c, Py_ssize_t maxcount) -{ - char *self_s, *result_s; - char *start, *next, *end; - Py_ssize_t self_len, result_len; - Py_ssize_t count; - PyStringObject *result; - - self_len = PyString_GET_SIZE(self); - self_s = PyString_AS_STRING(self); - - count = countchar(self_s, self_len, from_c, maxcount); - if (count == 0) { - return return_self(self); - } - - result_len = self_len - count; /* from_len == 1 */ - assert(result_len>=0); - - if ( (result = (PyStringObject *) - PyString_FromStringAndSize(NULL, result_len)) == NULL) - return NULL; - result_s = PyString_AS_STRING(result); - - start = self_s; - end = self_s + self_len; - while (count-- > 0) { - next = findchar(start, end-start, from_c); - if (next == NULL) - break; - Py_MEMCPY(result_s, start, next-start); - result_s += (next-start); - start = next+1; - } - Py_MEMCPY(result_s, start, end-start); - - return result; -} - -/* len(self)>=1, len(from)>=2, to="", maxcount>=1 */ - -Py_LOCAL(PyStringObject *) -replace_delete_substring(PyStringObject *self, - const char *from_s, Py_ssize_t from_len, - Py_ssize_t maxcount) { - char *self_s, *result_s; - char *start, *next, *end; - Py_ssize_t self_len, result_len; - Py_ssize_t count, offset; - PyStringObject *result; - - self_len = PyString_GET_SIZE(self); - self_s = PyString_AS_STRING(self); - - count = countstring(self_s, self_len, - from_s, from_len, - 0, self_len, 1, - maxcount); - - if (count == 0) { - /* no matches */ - return return_self(self); - } - - result_len = self_len - (count * from_len); - assert (result_len>=0); - - if ( (result = (PyStringObject *) - PyString_FromStringAndSize(NULL, result_len)) == NULL ) - return NULL; - - result_s = PyString_AS_STRING(result); - - start = self_s; - end = self_s + self_len; - while (count-- > 0) { - offset = findstring(start, end-start, - from_s, from_len, - 0, end-start, FORWARD); - if (offset == -1) - break; - next = start + offset; - - Py_MEMCPY(result_s, start, next-start); - - result_s += (next-start); - start = next+from_len; - } - Py_MEMCPY(result_s, start, end-start); - return result; -} - -/* len(self)>=1, len(from)==len(to)==1, maxcount>=1 */ -Py_LOCAL(PyStringObject *) -replace_single_character_in_place(PyStringObject *self, - char from_c, char to_c, - Py_ssize_t maxcount) -{ - char *self_s, *result_s, *start, *end, *next; - Py_ssize_t self_len; - PyStringObject *result; - - /* The result string will be the same size */ - self_s = PyString_AS_STRING(self); - self_len = PyString_GET_SIZE(self); - - next = findchar(self_s, self_len, from_c); - - if (next == NULL) { - /* No matches; return the original string */ - return return_self(self); - } - - /* Need to make a new string */ - result = (PyStringObject *) PyString_FromStringAndSize(NULL, self_len); - if (result == NULL) - return NULL; - result_s = PyString_AS_STRING(result); - Py_MEMCPY(result_s, self_s, self_len); - - /* change everything in-place, starting with this one */ - start = result_s + (next-self_s); - *start = to_c; - start++; - end = result_s + self_len; - - while (--maxcount > 0) { - next = findchar(start, end-start, from_c); - if (next == NULL) - break; - *next = to_c; - start = next+1; - } - - return result; -} - -/* len(self)>=1, len(from)==len(to)>=2, maxcount>=1 */ -Py_LOCAL(PyStringObject *) -replace_substring_in_place(PyStringObject *self, - const char *from_s, Py_ssize_t from_len, - const char *to_s, Py_ssize_t to_len, - Py_ssize_t maxcount) -{ - char *result_s, *start, *end; - char *self_s; - Py_ssize_t self_len, offset; - PyStringObject *result; - - /* The result string will be the same size */ - - self_s = PyString_AS_STRING(self); - self_len = PyString_GET_SIZE(self); - - offset = findstring(self_s, self_len, - from_s, from_len, - 0, self_len, FORWARD); - if (offset == -1) { - /* No matches; return the original string */ - return return_self(self); - } - - /* Need to make a new string */ - result = (PyStringObject *) PyString_FromStringAndSize(NULL, self_len); - if (result == NULL) - return NULL; - result_s = PyString_AS_STRING(result); - Py_MEMCPY(result_s, self_s, self_len); - - /* change everything in-place, starting with this one */ - start = result_s + offset; - Py_MEMCPY(start, to_s, from_len); - start += from_len; - end = result_s + self_len; - - while ( --maxcount > 0) { - offset = findstring(start, end-start, - from_s, from_len, - 0, end-start, FORWARD); - if (offset==-1) - break; - Py_MEMCPY(start+offset, to_s, from_len); - start += offset+from_len; - } - - return result; -} - -/* len(self)>=1, len(from)==1, len(to)>=2, maxcount>=1 */ -Py_LOCAL(PyStringObject *) -replace_single_character(PyStringObject *self, - char from_c, - const char *to_s, Py_ssize_t to_len, - Py_ssize_t maxcount) -{ - char *self_s, *result_s; - char *start, *next, *end; - Py_ssize_t self_len, result_len; - Py_ssize_t count, product; - PyStringObject *result; - - self_s = PyString_AS_STRING(self); - self_len = PyString_GET_SIZE(self); - - count = countchar(self_s, self_len, from_c, maxcount); - if (count == 0) { - /* no matches, return unchanged */ - return return_self(self); - } - - /* use the difference between current and new, hence the "-1" */ - /* result_len = self_len + count * (to_len-1) */ - product = count * (to_len-1); - if (product / (to_len-1) != count) { - PyErr_SetString(PyExc_OverflowError, "replace string is too long"); - return NULL; - } - result_len = self_len + product; - if (result_len < 0) { - PyErr_SetString(PyExc_OverflowError, "replace string is too long"); - return NULL; - } - - if ( (result = (PyStringObject *) - PyString_FromStringAndSize(NULL, result_len)) == NULL) - return NULL; - result_s = PyString_AS_STRING(result); - - start = self_s; - end = self_s + self_len; - while (count-- > 0) { - next = findchar(start, end-start, from_c); - if (next == NULL) - break; - - if (next == start) { - /* replace with the 'to' */ - Py_MEMCPY(result_s, to_s, to_len); - result_s += to_len; - start += 1; - } else { - /* copy the unchanged old then the 'to' */ - Py_MEMCPY(result_s, start, next-start); - result_s += (next-start); - Py_MEMCPY(result_s, to_s, to_len); - result_s += to_len; - start = next+1; - } - } - /* Copy the remainder of the remaining string */ - Py_MEMCPY(result_s, start, end-start); - - return result; -} - -/* len(self)>=1, len(from)>=2, len(to)>=2, maxcount>=1 */ -Py_LOCAL(PyStringObject *) -replace_substring(PyStringObject *self, - const char *from_s, Py_ssize_t from_len, - const char *to_s, Py_ssize_t to_len, - Py_ssize_t maxcount) { - char *self_s, *result_s; - char *start, *next, *end; - Py_ssize_t self_len, result_len; - Py_ssize_t count, offset, product; - PyStringObject *result; - - self_s = PyString_AS_STRING(self); - self_len = PyString_GET_SIZE(self); - - count = countstring(self_s, self_len, - from_s, from_len, - 0, self_len, FORWARD, maxcount); - if (count == 0) { - /* no matches, return unchanged */ - return return_self(self); - } - - /* Check for overflow */ - /* result_len = self_len + count * (to_len-from_len) */ - product = count * (to_len-from_len); - if (product / (to_len-from_len) != count) { - PyErr_SetString(PyExc_OverflowError, "replace string is too long"); - return NULL; - } - result_len = self_len + product; - if (result_len < 0) { - PyErr_SetString(PyExc_OverflowError, "replace string is too long"); - return NULL; - } - - if ( (result = (PyStringObject *) - PyString_FromStringAndSize(NULL, result_len)) == NULL) - return NULL; - result_s = PyString_AS_STRING(result); - - start = self_s; - end = self_s + self_len; - while (count-- > 0) { - offset = findstring(start, end-start, - from_s, from_len, - 0, end-start, FORWARD); - if (offset == -1) - break; - next = start+offset; - if (next == start) { - /* replace with the 'to' */ - Py_MEMCPY(result_s, to_s, to_len); - result_s += to_len; - start += from_len; - } else { - /* copy the unchanged old then the 'to' */ - Py_MEMCPY(result_s, start, next-start); - result_s += (next-start); - Py_MEMCPY(result_s, to_s, to_len); - result_s += to_len; - start = next+from_len; - } - } - /* Copy the remainder of the remaining string */ - Py_MEMCPY(result_s, start, end-start); - - return result; -} - - -Py_LOCAL(PyStringObject *) -replace(PyStringObject *self, - const char *from_s, Py_ssize_t from_len, - const char *to_s, Py_ssize_t to_len, - Py_ssize_t maxcount) -{ - if (maxcount < 0) { - maxcount = PY_SSIZE_T_MAX; - } else if (maxcount == 0 || PyString_GET_SIZE(self) == 0) { - /* nothing to do; return the original string */ - return return_self(self); - } - - if (maxcount == 0 || - (from_len == 0 && to_len == 0)) { - /* nothing to do; return the original string */ - return return_self(self); - } - - /* Handle zero-length special cases */ - - if (from_len == 0) { - /* insert the 'to' string everywhere. */ - /* >>> "Python".replace("", ".") */ - /* '.P.y.t.h.o.n.' */ - return replace_interleave(self, to_s, to_len, maxcount); - } - - /* Except for "".replace("", "A") == "A" there is no way beyond this */ - /* point for an empty self string to generate a non-empty string */ - /* Special case so the remaining code always gets a non-empty string */ - if (PyString_GET_SIZE(self) == 0) { - return return_self(self); - } - - if (to_len == 0) { - /* delete all occurances of 'from' string */ - if (from_len == 1) { - return replace_delete_single_character( - self, from_s[0], maxcount); - } else { - return replace_delete_substring(self, from_s, from_len, maxcount); - } - } - - /* Handle special case where both strings have the same length */ - - if (from_len == to_len) { - if (from_len == 1) { - return replace_single_character_in_place( - self, - from_s[0], - to_s[0], - maxcount); - } else { - return replace_substring_in_place( - self, from_s, from_len, to_s, to_len, maxcount); - } - } - - /* Otherwise use the more generic algorithms */ - if (from_len == 1) { - return replace_single_character(self, from_s[0], - to_s, to_len, maxcount); - } else { - /* len('from')>=2, len('to')>=1 */ - return replace_substring(self, from_s, from_len, to_s, to_len, maxcount); - } -} - -PyDoc_STRVAR(replace__doc__, -"S.replace (old, new[, count]) -> string\n\ -\n\ -Return a copy of string S with all occurrences of substring\n\ -old replaced by new. If the optional argument count is\n\ -given, only the first count occurrences are replaced."); - -static PyObject * -string_replace(PyStringObject *self, PyObject *args) -{ - Py_ssize_t count = -1; - PyObject *from, *to; - const char *from_s, *to_s; - Py_ssize_t from_len, to_len; - - if (!PyArg_ParseTuple(args, "OO|n:replace", &from, &to, &count)) - return NULL; - - if (PyString_Check(from)) { - from_s = PyString_AS_STRING(from); - from_len = PyString_GET_SIZE(from); - } -#ifdef Py_USING_UNICODE - if (PyUnicode_Check(from)) - return PyUnicode_Replace((PyObject *)self, - from, to, count); -#endif - else if (PyObject_AsCharBuffer(from, &from_s, &from_len)) - return NULL; - - if (PyString_Check(to)) { - to_s = PyString_AS_STRING(to); - to_len = PyString_GET_SIZE(to); - } -#ifdef Py_USING_UNICODE - else if (PyUnicode_Check(to)) - return PyUnicode_Replace((PyObject *)self, - from, to, count); -#endif - else if (PyObject_AsCharBuffer(to, &to_s, &to_len)) - return NULL; - - return (PyObject *)replace((PyStringObject *) self, - from_s, from_len, - to_s, to_len, count); -} - -/** End DALKE **/ - -/* Matches the end (direction >= 0) or start (direction < 0) of self - * against substr, using the start and end arguments. Returns - * -1 on error, 0 if not found and 1 if found. - */ -Py_LOCAL(int) -_string_tailmatch(PyStringObject *self, PyObject *substr, Py_ssize_t start, - Py_ssize_t end, int direction) -{ - Py_ssize_t len = PyString_GET_SIZE(self); - Py_ssize_t slen; - const char* sub; - const char* str; - - if (PyString_Check(substr)) { - sub = PyString_AS_STRING(substr); - slen = PyString_GET_SIZE(substr); - } -#ifdef Py_USING_UNICODE - else if (PyUnicode_Check(substr)) - return PyUnicode_Tailmatch((PyObject *)self, - substr, start, end, direction); -#endif - else if (PyObject_AsCharBuffer(substr, &sub, &slen)) - return -1; - str = PyString_AS_STRING(self); - - string_adjust_indices(&start, &end, len); - - if (direction < 0) { - /* startswith */ - if (start+slen > len) - return 0; - } else { - /* endswith */ - if (end-start < slen || start > len) - return 0; - - if (end-slen > start) - start = end - slen; - } - if (end-start >= slen) - return ! memcmp(str+start, sub, slen); - return 0; -} - - -PyDoc_STRVAR(startswith__doc__, -"S.startswith(prefix[, start[, end]]) -> bool\n\ -\n\ -Return True if S starts with the specified prefix, False otherwise.\n\ -With optional start, test S beginning at that position.\n\ -With optional end, stop comparing S at that position.\n\ -prefix can also be a tuple of strings to try."); - -static PyObject * -string_startswith(PyStringObject *self, PyObject *args) -{ - Py_ssize_t start = 0; - Py_ssize_t end = PY_SSIZE_T_MAX; - PyObject *subobj; - int result; - - if (!PyArg_ParseTuple(args, "O|O&O&:startswith", &subobj, - _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) - return NULL; - if (PyTuple_Check(subobj)) { - Py_ssize_t i; - for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) { - result = _string_tailmatch(self, - PyTuple_GET_ITEM(subobj, i), - start, end, -1); - if (result == -1) - return NULL; - else if (result) { - Py_RETURN_TRUE; - } - } - Py_RETURN_FALSE; - } - result = _string_tailmatch(self, subobj, start, end, -1); - if (result == -1) - return NULL; - else - return PyBool_FromLong(result); -} - - -PyDoc_STRVAR(endswith__doc__, -"S.endswith(suffix[, start[, end]]) -> bool\n\ -\n\ -Return True if S ends with the specified suffix, False otherwise.\n\ -With optional start, test S beginning at that position.\n\ -With optional end, stop comparing S at that position.\n\ -suffix can also be a tuple of strings to try."); - -static PyObject * -string_endswith(PyStringObject *self, PyObject *args) -{ - Py_ssize_t start = 0; - Py_ssize_t end = PY_SSIZE_T_MAX; - PyObject *subobj; - int result; - - if (!PyArg_ParseTuple(args, "O|O&O&:endswith", &subobj, - _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) - return NULL; - if (PyTuple_Check(subobj)) { - Py_ssize_t i; - for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) { - result = _string_tailmatch(self, - PyTuple_GET_ITEM(subobj, i), - start, end, +1); - if (result == -1) - return NULL; - else if (result) { - Py_RETURN_TRUE; - } - } - Py_RETURN_FALSE; - } - result = _string_tailmatch(self, subobj, start, end, +1); - if (result == -1) - return NULL; - else - return PyBool_FromLong(result); -} - - -PyDoc_STRVAR(encode__doc__, -"S.encode([encoding[,errors]]) -> object\n\ -\n\ -Encodes S using the codec registered for encoding. encoding defaults\n\ -to the default encoding. errors may be given to set a different error\n\ -handling scheme. Default is 'strict' meaning that encoding errors raise\n\ -a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and\n\ -'xmlcharrefreplace' as well as any other name registered with\n\ -codecs.register_error that is able to handle UnicodeEncodeErrors."); - -static PyObject * -string_encode(PyStringObject *self, PyObject *args) -{ - char *encoding = NULL; - char *errors = NULL; - PyObject *v; - - if (!PyArg_ParseTuple(args, "|ss:encode", &encoding, &errors)) - return NULL; - v = PyString_AsEncodedObject((PyObject *)self, encoding, errors); - if (v == NULL) - goto onError; - if (!PyString_Check(v) && !PyUnicode_Check(v)) { - PyErr_Format(PyExc_TypeError, - "encoder did not return a string/unicode object " - "(type=%.400s)", - Py_TYPE(v)->tp_name); - Py_DECREF(v); - return NULL; - } - return v; - - onError: - return NULL; -} - - -PyDoc_STRVAR(decode__doc__, -"S.decode([encoding[,errors]]) -> object\n\ -\n\ -Decodes S using the codec registered for encoding. encoding defaults\n\ -to the default encoding. errors may be given to set a different error\n\ -handling scheme. Default is 'strict' meaning that encoding errors raise\n\ -a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n\ -as well as any other name registerd with codecs.register_error that is\n\ -able to handle UnicodeDecodeErrors."); - -static PyObject * -string_decode(PyStringObject *self, PyObject *args) -{ - char *encoding = NULL; - char *errors = NULL; - PyObject *v; - - if (!PyArg_ParseTuple(args, "|ss:decode", &encoding, &errors)) - return NULL; - v = PyString_AsDecodedObject((PyObject *)self, encoding, errors); - if (v == NULL) - goto onError; - if (!PyString_Check(v) && !PyUnicode_Check(v)) { - PyErr_Format(PyExc_TypeError, - "decoder did not return a string/unicode object " - "(type=%.400s)", - Py_TYPE(v)->tp_name); - Py_DECREF(v); - return NULL; - } - return v; - - onError: - return NULL; -} - - -PyDoc_STRVAR(expandtabs__doc__, -"S.expandtabs([tabsize]) -> string\n\ -\n\ -Return a copy of S where all tab characters are expanded using spaces.\n\ -If tabsize is not given, a tab size of 8 characters is assumed."); - -static PyObject* -string_expandtabs(PyStringObject *self, PyObject *args) -{ - const char *e, *p, *qe; - char *q; - Py_ssize_t i, j, incr; - PyObject *u; - int tabsize = 8; - - if (!PyArg_ParseTuple(args, "|i:expandtabs", &tabsize)) - return NULL; - - /* First pass: determine size of output string */ - i = 0; /* chars up to and including most recent \n or \r */ - j = 0; /* chars since most recent \n or \r (use in tab calculations) */ - e = PyString_AS_STRING(self) + PyString_GET_SIZE(self); /* end of input */ - for (p = PyString_AS_STRING(self); p < e; p++) - if (*p == '\t') { - if (tabsize > 0) { - incr = tabsize - (j % tabsize); - if (j > PY_SSIZE_T_MAX - incr) - goto overflow1; - j += incr; - } - } - else { - if (j > PY_SSIZE_T_MAX - 1) - goto overflow1; - j++; - if (*p == '\n' || *p == '\r') { - if (i > PY_SSIZE_T_MAX - j) - goto overflow1; - i += j; - j = 0; - } - } - - if (i > PY_SSIZE_T_MAX - j) - goto overflow1; - - /* Second pass: create output string and fill it */ - u = PyString_FromStringAndSize(NULL, i + j); - if (!u) - return NULL; - - j = 0; /* same as in first pass */ - q = PyString_AS_STRING(u); /* next output char */ - qe = PyString_AS_STRING(u) + PyString_GET_SIZE(u); /* end of output */ - - for (p = PyString_AS_STRING(self); p < e; p++) - if (*p == '\t') { - if (tabsize > 0) { - i = tabsize - (j % tabsize); - j += i; - while (i--) { - if (q >= qe) - goto overflow2; - *q++ = ' '; - } - } - } - else { - if (q >= qe) - goto overflow2; - *q++ = *p; - j++; - if (*p == '\n' || *p == '\r') - j = 0; - } - - return u; - - overflow2: - Py_DECREF(u); - overflow1: - PyErr_SetString(PyExc_OverflowError, "new string is too long"); - return NULL; -} - -Py_LOCAL_INLINE(PyObject *) -pad(PyStringObject *self, Py_ssize_t left, Py_ssize_t right, char fill) -{ - PyObject *u; - - if (left < 0) - left = 0; - if (right < 0) - right = 0; - - if (left == 0 && right == 0 && PyString_CheckExact(self)) { - Py_INCREF(self); - return (PyObject *)self; - } - - u = PyString_FromStringAndSize(NULL, - left + PyString_GET_SIZE(self) + right); - if (u) { - if (left) - memset(PyString_AS_STRING(u), fill, left); - Py_MEMCPY(PyString_AS_STRING(u) + left, - PyString_AS_STRING(self), - PyString_GET_SIZE(self)); - if (right) - memset(PyString_AS_STRING(u) + left + PyString_GET_SIZE(self), - fill, right); - } - - return u; -} - -PyDoc_STRVAR(ljust__doc__, -"S.ljust(width[, fillchar]) -> string\n" -"\n" -"Return S left justified in a string of length width. Padding is\n" -"done using the specified fill character (default is a space)."); - -static PyObject * -string_ljust(PyStringObject *self, PyObject *args) -{ - Py_ssize_t width; - char fillchar = ' '; - - if (!PyArg_ParseTuple(args, "n|c:ljust", &width, &fillchar)) - return NULL; - - if (PyString_GET_SIZE(self) >= width && PyString_CheckExact(self)) { - Py_INCREF(self); - return (PyObject*) self; - } - - return pad(self, 0, width - PyString_GET_SIZE(self), fillchar); -} - - -PyDoc_STRVAR(rjust__doc__, -"S.rjust(width[, fillchar]) -> string\n" -"\n" -"Return S right justified in a string of length width. Padding is\n" -"done using the specified fill character (default is a space)"); - -static PyObject * -string_rjust(PyStringObject *self, PyObject *args) -{ - Py_ssize_t width; - char fillchar = ' '; - - if (!PyArg_ParseTuple(args, "n|c:rjust", &width, &fillchar)) - return NULL; - - if (PyString_GET_SIZE(self) >= width && PyString_CheckExact(self)) { - Py_INCREF(self); - return (PyObject*) self; - } - - return pad(self, width - PyString_GET_SIZE(self), 0, fillchar); -} - - -PyDoc_STRVAR(center__doc__, -"S.center(width[, fillchar]) -> string\n" -"\n" -"Return S centered in a string of length width. Padding is\n" -"done using the specified fill character (default is a space)"); - -static PyObject * -string_center(PyStringObject *self, PyObject *args) -{ - Py_ssize_t marg, left; - Py_ssize_t width; - char fillchar = ' '; - - if (!PyArg_ParseTuple(args, "n|c:center", &width, &fillchar)) - return NULL; - - if (PyString_GET_SIZE(self) >= width && PyString_CheckExact(self)) { - Py_INCREF(self); - return (PyObject*) self; - } - - marg = width - PyString_GET_SIZE(self); - left = marg / 2 + (marg & width & 1); - - return pad(self, left, marg - left, fillchar); -} - -PyDoc_STRVAR(zfill__doc__, -"S.zfill(width) -> string\n" -"\n" -"Pad a numeric string S with zeros on the left, to fill a field\n" -"of the specified width. The string S is never truncated."); - -static PyObject * -string_zfill(PyStringObject *self, PyObject *args) -{ - Py_ssize_t fill; - PyObject *s; - char *p; - Py_ssize_t width; - - if (!PyArg_ParseTuple(args, "n:zfill", &width)) - return NULL; - - if (PyString_GET_SIZE(self) >= width) { - if (PyString_CheckExact(self)) { - Py_INCREF(self); - return (PyObject*) self; - } - else - return PyString_FromStringAndSize( - PyString_AS_STRING(self), - PyString_GET_SIZE(self) - ); - } - - fill = width - PyString_GET_SIZE(self); - - s = pad(self, fill, 0, '0'); - - if (s == NULL) - return NULL; - - p = PyString_AS_STRING(s); - if (p[fill] == '+' || p[fill] == '-') { - /* move sign to beginning of string */ - p[0] = p[fill]; - p[fill] = '0'; - } - - return (PyObject*) s; -} - -PyDoc_STRVAR(isspace__doc__, -"S.isspace() -> bool\n\ -\n\ -Return True if all characters in S are whitespace\n\ -and there is at least one character in S, False otherwise."); - -static PyObject* -string_isspace(PyStringObject *self) -{ - register const unsigned char *p - = (unsigned char *) PyString_AS_STRING(self); - register const unsigned char *e; - - /* Shortcut for single character strings */ - if (PyString_GET_SIZE(self) == 1 && - isspace(*p)) - return PyBool_FromLong(1); - - /* Special case for empty strings */ - if (PyString_GET_SIZE(self) == 0) - return PyBool_FromLong(0); - - e = p + PyString_GET_SIZE(self); - for (; p < e; p++) { - if (!isspace(*p)) - return PyBool_FromLong(0); - } - return PyBool_FromLong(1); -} - - -PyDoc_STRVAR(isalpha__doc__, -"S.isalpha() -> bool\n\ -\n\ -Return True if all characters in S are alphabetic\n\ -and there is at least one character in S, False otherwise."); - -static PyObject* -string_isalpha(PyStringObject *self) -{ - register const unsigned char *p - = (unsigned char *) PyString_AS_STRING(self); - register const unsigned char *e; - - /* Shortcut for single character strings */ - if (PyString_GET_SIZE(self) == 1 && - isalpha(*p)) - return PyBool_FromLong(1); - - /* Special case for empty strings */ - if (PyString_GET_SIZE(self) == 0) - return PyBool_FromLong(0); - - e = p + PyString_GET_SIZE(self); - for (; p < e; p++) { - if (!isalpha(*p)) - return PyBool_FromLong(0); - } - return PyBool_FromLong(1); -} - - -PyDoc_STRVAR(isalnum__doc__, -"S.isalnum() -> bool\n\ -\n\ -Return True if all characters in S are alphanumeric\n\ -and there is at least one character in S, False otherwise."); - -static PyObject* -string_isalnum(PyStringObject *self) -{ - register const unsigned char *p - = (unsigned char *) PyString_AS_STRING(self); - register const unsigned char *e; - - /* Shortcut for single character strings */ - if (PyString_GET_SIZE(self) == 1 && - isalnum(*p)) - return PyBool_FromLong(1); - - /* Special case for empty strings */ - if (PyString_GET_SIZE(self) == 0) - return PyBool_FromLong(0); - - e = p + PyString_GET_SIZE(self); - for (; p < e; p++) { - if (!isalnum(*p)) - return PyBool_FromLong(0); - } - return PyBool_FromLong(1); -} - - -PyDoc_STRVAR(isdigit__doc__, -"S.isdigit() -> bool\n\ -\n\ -Return True if all characters in S are digits\n\ -and there is at least one character in S, False otherwise."); - -static PyObject* -string_isdigit(PyStringObject *self) -{ - register const unsigned char *p - = (unsigned char *) PyString_AS_STRING(self); - register const unsigned char *e; - - /* Shortcut for single character strings */ - if (PyString_GET_SIZE(self) == 1 && - isdigit(*p)) - return PyBool_FromLong(1); - - /* Special case for empty strings */ - if (PyString_GET_SIZE(self) == 0) - return PyBool_FromLong(0); - - e = p + PyString_GET_SIZE(self); - for (; p < e; p++) { - if (!isdigit(*p)) - return PyBool_FromLong(0); - } - return PyBool_FromLong(1); -} - - -PyDoc_STRVAR(islower__doc__, -"S.islower() -> bool\n\ -\n\ -Return True if all cased characters in S are lowercase and there is\n\ -at least one cased character in S, False otherwise."); - -static PyObject* -string_islower(PyStringObject *self) -{ - register const unsigned char *p - = (unsigned char *) PyString_AS_STRING(self); - register const unsigned char *e; - int cased; - - /* Shortcut for single character strings */ - if (PyString_GET_SIZE(self) == 1) - return PyBool_FromLong(islower(*p) != 0); - - /* Special case for empty strings */ - if (PyString_GET_SIZE(self) == 0) - return PyBool_FromLong(0); - - e = p + PyString_GET_SIZE(self); - cased = 0; - for (; p < e; p++) { - if (isupper(*p)) - return PyBool_FromLong(0); - else if (!cased && islower(*p)) - cased = 1; - } - return PyBool_FromLong(cased); -} - - -PyDoc_STRVAR(isupper__doc__, -"S.isupper() -> bool\n\ -\n\ -Return True if all cased characters in S are uppercase and there is\n\ -at least one cased character in S, False otherwise."); - -static PyObject* -string_isupper(PyStringObject *self) -{ - register const unsigned char *p - = (unsigned char *) PyString_AS_STRING(self); - register const unsigned char *e; - int cased; - - /* Shortcut for single character strings */ - if (PyString_GET_SIZE(self) == 1) - return PyBool_FromLong(isupper(*p) != 0); - - /* Special case for empty strings */ - if (PyString_GET_SIZE(self) == 0) - return PyBool_FromLong(0); - - e = p + PyString_GET_SIZE(self); - cased = 0; - for (; p < e; p++) { - if (islower(*p)) - return PyBool_FromLong(0); - else if (!cased && isupper(*p)) - cased = 1; - } - return PyBool_FromLong(cased); -} - - -PyDoc_STRVAR(istitle__doc__, -"S.istitle() -> bool\n\ -\n\ -Return True if S is a titlecased string and there is at least one\n\ -character in S, i.e. uppercase characters may only follow uncased\n\ -characters and lowercase characters only cased ones. Return False\n\ -otherwise."); - -static PyObject* -string_istitle(PyStringObject *self, PyObject *uncased) -{ - register const unsigned char *p - = (unsigned char *) PyString_AS_STRING(self); - register const unsigned char *e; - int cased, previous_is_cased; - - /* Shortcut for single character strings */ - if (PyString_GET_SIZE(self) == 1) - return PyBool_FromLong(isupper(*p) != 0); - - /* Special case for empty strings */ - if (PyString_GET_SIZE(self) == 0) - return PyBool_FromLong(0); - - e = p + PyString_GET_SIZE(self); - cased = 0; - previous_is_cased = 0; - for (; p < e; p++) { - register const unsigned char ch = *p; - - if (isupper(ch)) { - if (previous_is_cased) - return PyBool_FromLong(0); - previous_is_cased = 1; - cased = 1; - } - else if (islower(ch)) { - if (!previous_is_cased) - return PyBool_FromLong(0); - previous_is_cased = 1; - cased = 1; - } - else - previous_is_cased = 0; - } - return PyBool_FromLong(cased); -} - - -PyDoc_STRVAR(splitlines__doc__, -"S.splitlines([keepends]) -> list of strings\n\ -\n\ -Return a list of the lines in S, breaking at line boundaries.\n\ -Line breaks are not included in the resulting list unless keepends\n\ -is given and true."); - -static PyObject* -string_splitlines(PyStringObject *self, PyObject *args) -{ - register Py_ssize_t i; - register Py_ssize_t j; - Py_ssize_t len; - int keepends = 0; - PyObject *list; - PyObject *str; - char *data; - - if (!PyArg_ParseTuple(args, "|i:splitlines", &keepends)) - return NULL; - - data = PyString_AS_STRING(self); - len = PyString_GET_SIZE(self); - - /* This does not use the preallocated list because splitlines is - usually run with hundreds of newlines. The overhead of - switching between PyList_SET_ITEM and append causes about a - 2-3% slowdown for that common case. A smarter implementation - could move the if check out, so the SET_ITEMs are done first - and the appends only done when the prealloc buffer is full. - That's too much work for little gain.*/ - - list = PyList_New(0); - if (!list) - goto onError; - - for (i = j = 0; i < len; ) { - Py_ssize_t eol; - - /* Find a line and append it */ - while (i < len && data[i] != '\n' && data[i] != '\r') - i++; - - /* Skip the line break reading CRLF as one line break */ - eol = i; - if (i < len) { - if (data[i] == '\r' && i + 1 < len && - data[i+1] == '\n') - i += 2; - else - i++; - if (keepends) - eol = i; - } - SPLIT_APPEND(data, j, eol); - j = i; - } - if (j < len) { - SPLIT_APPEND(data, j, len); - } - - return list; - - onError: - Py_XDECREF(list); - return NULL; -} - -#undef SPLIT_APPEND -#undef SPLIT_ADD -#undef MAX_PREALLOC -#undef PREALLOC_SIZE - -static PyObject * -string_getnewargs(PyStringObject *v) -{ - return Py_BuildValue("(s#)", v->ob_sval, Py_SIZE(v)); -} - - -#include "stringlib/string_format.h" - -PyDoc_STRVAR(format__doc__, -"S.format(*args, **kwargs) -> unicode\n\ -\n\ -"); - -PyDoc_STRVAR(p_format__doc__, -"S.__format__(format_spec) -> unicode\n\ -\n\ -"); - - -static PyMethodDef -string_methods[] = { - /* Counterparts of the obsolete stropmodule functions; except - string.maketrans(). */ - {"join", (PyCFunction)string_join, METH_O, join__doc__}, - {"split", (PyCFunction)string_split, METH_VARARGS, split__doc__}, - {"rsplit", (PyCFunction)string_rsplit, METH_VARARGS, rsplit__doc__}, - {"lower", (PyCFunction)string_lower, METH_NOARGS, lower__doc__}, - {"upper", (PyCFunction)string_upper, METH_NOARGS, upper__doc__}, - {"islower", (PyCFunction)string_islower, METH_NOARGS, islower__doc__}, - {"isupper", (PyCFunction)string_isupper, METH_NOARGS, isupper__doc__}, - {"isspace", (PyCFunction)string_isspace, METH_NOARGS, isspace__doc__}, - {"isdigit", (PyCFunction)string_isdigit, METH_NOARGS, isdigit__doc__}, - {"istitle", (PyCFunction)string_istitle, METH_NOARGS, istitle__doc__}, - {"isalpha", (PyCFunction)string_isalpha, METH_NOARGS, isalpha__doc__}, - {"isalnum", (PyCFunction)string_isalnum, METH_NOARGS, isalnum__doc__}, - {"capitalize", (PyCFunction)string_capitalize, METH_NOARGS, - capitalize__doc__}, - {"count", (PyCFunction)string_count, METH_VARARGS, count__doc__}, - {"endswith", (PyCFunction)string_endswith, METH_VARARGS, - endswith__doc__}, - {"partition", (PyCFunction)string_partition, METH_O, partition__doc__}, - {"find", (PyCFunction)string_find, METH_VARARGS, find__doc__}, - {"index", (PyCFunction)string_index, METH_VARARGS, index__doc__}, - {"lstrip", (PyCFunction)string_lstrip, METH_VARARGS, lstrip__doc__}, - {"replace", (PyCFunction)string_replace, METH_VARARGS, replace__doc__}, - {"rfind", (PyCFunction)string_rfind, METH_VARARGS, rfind__doc__}, - {"rindex", (PyCFunction)string_rindex, METH_VARARGS, rindex__doc__}, - {"rstrip", (PyCFunction)string_rstrip, METH_VARARGS, rstrip__doc__}, - {"rpartition", (PyCFunction)string_rpartition, METH_O, - rpartition__doc__}, - {"startswith", (PyCFunction)string_startswith, METH_VARARGS, - startswith__doc__}, - {"strip", (PyCFunction)string_strip, METH_VARARGS, strip__doc__}, - {"swapcase", (PyCFunction)string_swapcase, METH_NOARGS, - swapcase__doc__}, - {"translate", (PyCFunction)string_translate, METH_VARARGS, - translate__doc__}, - {"title", (PyCFunction)string_title, METH_NOARGS, title__doc__}, - {"ljust", (PyCFunction)string_ljust, METH_VARARGS, ljust__doc__}, - {"rjust", (PyCFunction)string_rjust, METH_VARARGS, rjust__doc__}, - {"center", (PyCFunction)string_center, METH_VARARGS, center__doc__}, - {"zfill", (PyCFunction)string_zfill, METH_VARARGS, zfill__doc__}, - {"format", (PyCFunction) do_string_format, METH_VARARGS | METH_KEYWORDS, format__doc__}, - {"__format__", (PyCFunction) string__format__, METH_VARARGS, p_format__doc__}, - {"_formatter_field_name_split", (PyCFunction) formatter_field_name_split, METH_NOARGS}, - {"_formatter_parser", (PyCFunction) formatter_parser, METH_NOARGS}, - {"encode", (PyCFunction)string_encode, METH_VARARGS, encode__doc__}, - {"decode", (PyCFunction)string_decode, METH_VARARGS, decode__doc__}, - {"expandtabs", (PyCFunction)string_expandtabs, METH_VARARGS, - expandtabs__doc__}, - {"splitlines", (PyCFunction)string_splitlines, METH_VARARGS, - splitlines__doc__}, - {"__getnewargs__", (PyCFunction)string_getnewargs, METH_NOARGS}, - {NULL, NULL} /* sentinel */ -}; - -static PyObject * -str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds); - -static PyObject * -string_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *x = NULL; - static char *kwlist[] = {"object", 0}; - - if (type != &PyString_Type) - return str_subtype_new(type, args, kwds); - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:str", kwlist, &x)) - return NULL; - if (x == NULL) - return PyString_FromString(""); - return PyObject_Str(x); -} - -static PyObject * -str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *tmp, *pnew; - Py_ssize_t n; - - assert(PyType_IsSubtype(type, &PyString_Type)); - tmp = string_new(&PyString_Type, args, kwds); - if (tmp == NULL) - return NULL; - assert(PyString_CheckExact(tmp)); - n = PyString_GET_SIZE(tmp); - pnew = type->tp_alloc(type, n); - if (pnew != NULL) { - Py_MEMCPY(PyString_AS_STRING(pnew), PyString_AS_STRING(tmp), n+1); - ((PyStringObject *)pnew)->ob_shash = - ((PyStringObject *)tmp)->ob_shash; - ((PyStringObject *)pnew)->ob_sstate = SSTATE_NOT_INTERNED; - } - Py_DECREF(tmp); - return pnew; -} - -static PyObject * -basestring_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyErr_SetString(PyExc_TypeError, - "The basestring type cannot be instantiated"); - return NULL; -} - -static PyObject * -string_mod(PyObject *v, PyObject *w) -{ - if (!PyString_Check(v)) { - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; - } - return PyString_Format(v, w); -} - -PyDoc_STRVAR(basestring_doc, -"Type basestring cannot be instantiated; it is the base for str and unicode."); - -static PyNumberMethods string_as_number = { - 0, /*nb_add*/ - 0, /*nb_subtract*/ - 0, /*nb_multiply*/ - 0, /*nb_divide*/ - string_mod, /*nb_remainder*/ -}; - - -PyTypeObject PyBaseString_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "basestring", - 0, - 0, - 0, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - basestring_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - &PyBaseObject_Type, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - basestring_new, /* tp_new */ - 0, /* tp_free */ -}; - -PyDoc_STRVAR(string_doc, -"str(object) -> string\n\ -\n\ -Return a nice string representation of the object.\n\ -If the argument is a string, the return value is the same object."); - -PyTypeObject PyString_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "str", - sizeof(PyStringObject), - sizeof(char), - string_dealloc, /* tp_dealloc */ - (printfunc)string_print, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - string_repr, /* tp_repr */ - &string_as_number, /* tp_as_number */ - &string_as_sequence, /* tp_as_sequence */ - &string_as_mapping, /* tp_as_mapping */ - (hashfunc)string_hash, /* tp_hash */ - 0, /* tp_call */ - string_str, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - &string_as_buffer, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES | - Py_TPFLAGS_BASETYPE | Py_TPFLAGS_STRING_SUBCLASS | - Py_TPFLAGS_HAVE_NEWBUFFER, /* tp_flags */ - string_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - (richcmpfunc)string_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - string_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - &PyBaseString_Type, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - string_new, /* tp_new */ - PyObject_Del, /* tp_free */ -}; - -void -PyString_Concat(register PyObject **pv, register PyObject *w) -{ - register PyObject *v; - if (*pv == NULL) - return; - if (w == NULL || !PyString_Check(*pv)) { - Py_DECREF(*pv); - *pv = NULL; - return; - } - v = string_concat((PyStringObject *) *pv, w); - Py_DECREF(*pv); - *pv = v; -} - -void -PyString_ConcatAndDel(register PyObject **pv, register PyObject *w) -{ - PyString_Concat(pv, w); - Py_XDECREF(w); -} - - -/* The following function breaks the notion that strings are immutable: - it changes the size of a string. We get away with this only if there - is only one module referencing the object. You can also think of it - as creating a new string object and destroying the old one, only - more efficiently. In any case, don't use this if the string may - already be known to some other part of the code... - Note that if there's not enough memory to resize the string, the original - string object at *pv is deallocated, *pv is set to NULL, an "out of - memory" exception is set, and -1 is returned. Else (on success) 0 is - returned, and the value in *pv may or may not be the same as on input. - As always, an extra byte is allocated for a trailing \0 byte (newsize - does *not* include that), and a trailing \0 byte is stored. -*/ - -int -_PyString_Resize(PyObject **pv, Py_ssize_t newsize) -{ - register PyObject *v; - register PyStringObject *sv; - v = *pv; - if (!PyString_Check(v) || Py_REFCNT(v) != 1 || newsize < 0 || - PyString_CHECK_INTERNED(v)) { - *pv = 0; - Py_DECREF(v); - PyErr_BadInternalCall(); - return -1; - } - /* XXX UNREF/NEWREF interface should be more symmetrical */ - _Py_DEC_REFTOTAL; - _Py_ForgetReference(v); - *pv = (PyObject *) - PyObject_REALLOC((char *)v, sizeof(PyStringObject) + newsize); - if (*pv == NULL) { - PyObject_Del(v); - PyErr_NoMemory(); - return -1; - } - _Py_NewReference(*pv); - sv = (PyStringObject *) *pv; - Py_SIZE(sv) = newsize; - sv->ob_sval[newsize] = '\0'; - sv->ob_shash = -1; /* invalidate cached hash value */ - return 0; -} - -/* Helpers for formatstring */ - -Py_LOCAL_INLINE(PyObject *) -getnextarg(PyObject *args, Py_ssize_t arglen, Py_ssize_t *p_argidx) -{ - Py_ssize_t argidx = *p_argidx; - if (argidx < arglen) { - (*p_argidx)++; - if (arglen < 0) - return args; - else - return PyTuple_GetItem(args, argidx); - } - PyErr_SetString(PyExc_TypeError, - "not enough arguments for format string"); - return NULL; -} - -/* Format codes - * F_LJUST '-' - * F_SIGN '+' - * F_BLANK ' ' - * F_ALT '#' - * F_ZERO '0' - */ -#define F_LJUST (1<<0) -#define F_SIGN (1<<1) -#define F_BLANK (1<<2) -#define F_ALT (1<<3) -#define F_ZERO (1<<4) - -Py_LOCAL_INLINE(int) -formatfloat(char *buf, size_t buflen, int flags, - int prec, int type, PyObject *v) -{ - /* fmt = '%#.' + `prec` + `type` - worst case length = 3 + 10 (len of INT_MAX) + 1 = 14 (use 20)*/ - char fmt[20]; - double x; - x = PyFloat_AsDouble(v); - if (x == -1.0 && PyErr_Occurred()) { - PyErr_Format(PyExc_TypeError, "float argument required, " - "not %.200s", Py_TYPE(v)->tp_name); - return -1; - } - if (prec < 0) - prec = 6; - if (type == 'f' && fabs(x)/1e25 >= 1e25) - type = 'g'; - /* Worst case length calc to ensure no buffer overrun: - - 'g' formats: - fmt = %#.g - buf = '-' + [0-9]*prec + '.' + 'e+' + (longest exp - for any double rep.) - len = 1 + prec + 1 + 2 + 5 = 9 + prec - - 'f' formats: - buf = '-' + [0-9]*x + '.' + [0-9]*prec (with x < 50) - len = 1 + 50 + 1 + prec = 52 + prec - - If prec=0 the effective precision is 1 (the leading digit is - always given), therefore increase the length by one. - - */ - if (((type == 'g' || type == 'G') && - buflen <= (size_t)10 + (size_t)prec) || - (type == 'f' && buflen <= (size_t)53 + (size_t)prec)) { - PyErr_SetString(PyExc_OverflowError, - "formatted float is too long (precision too large?)"); - return -1; - } - PyOS_snprintf(fmt, sizeof(fmt), "%%%s.%d%c", - (flags&F_ALT) ? "#" : "", - prec, type); - PyOS_ascii_formatd(buf, buflen, fmt, x); - return (int)strlen(buf); -} - -/* _PyString_FormatLong emulates the format codes d, u, o, x and X, and - * the F_ALT flag, for Python's long (unbounded) ints. It's not used for - * Python's regular ints. - * Return value: a new PyString*, or NULL if error. - * . *pbuf is set to point into it, - * *plen set to the # of chars following that. - * Caller must decref it when done using pbuf. - * The string starting at *pbuf is of the form - * "-"? ("0x" | "0X")? digit+ - * "0x"/"0X" are present only for x and X conversions, with F_ALT - * set in flags. The case of hex digits will be correct, - * There will be at least prec digits, zero-filled on the left if - * necessary to get that many. - * val object to be converted - * flags bitmask of format flags; only F_ALT is looked at - * prec minimum number of digits; 0-fill on left if needed - * type a character in [duoxX]; u acts the same as d - * - * CAUTION: o, x and X conversions on regular ints can never - * produce a '-' sign, but can for Python's unbounded ints. - */ -PyObject* -_PyString_FormatLong(PyObject *val, int flags, int prec, int type, - char **pbuf, int *plen) -{ - PyObject *result = NULL; - char *buf; - Py_ssize_t i; - int sign; /* 1 if '-', else 0 */ - int len; /* number of characters */ - Py_ssize_t llen; - int numdigits; /* len == numnondigits + numdigits */ - int numnondigits = 0; - - switch (type) { - case 'd': - case 'u': - result = Py_TYPE(val)->tp_str(val); - break; - case 'o': - result = Py_TYPE(val)->tp_as_number->nb_oct(val); - break; - case 'x': - case 'X': - numnondigits = 2; - result = Py_TYPE(val)->tp_as_number->nb_hex(val); - break; - default: - assert(!"'type' not in [duoxX]"); - } - if (!result) - return NULL; - - buf = PyString_AsString(result); - if (!buf) { - Py_DECREF(result); - return NULL; - } - - /* To modify the string in-place, there can only be one reference. */ - if (Py_REFCNT(result) != 1) { - PyErr_BadInternalCall(); - return NULL; - } - llen = PyString_Size(result); - if (llen > INT_MAX) { - PyErr_SetString(PyExc_ValueError, "string too large in _PyString_FormatLong"); - return NULL; - } - len = (int)llen; - if (buf[len-1] == 'L') { - --len; - buf[len] = '\0'; - } - sign = buf[0] == '-'; - numnondigits += sign; - numdigits = len - numnondigits; - assert(numdigits > 0); - - /* Get rid of base marker unless F_ALT */ - if ((flags & F_ALT) == 0) { - /* Need to skip 0x, 0X or 0. */ - int skipped = 0; - switch (type) { - case 'o': - assert(buf[sign] == '0'); - /* If 0 is only digit, leave it alone. */ - if (numdigits > 1) { - skipped = 1; - --numdigits; - } - break; - case 'x': - case 'X': - assert(buf[sign] == '0'); - assert(buf[sign + 1] == 'x'); - skipped = 2; - numnondigits -= 2; - break; - } - if (skipped) { - buf += skipped; - len -= skipped; - if (sign) - buf[0] = '-'; - } - assert(len == numnondigits + numdigits); - assert(numdigits > 0); - } - - /* Fill with leading zeroes to meet minimum width. */ - if (prec > numdigits) { - PyObject *r1 = PyString_FromStringAndSize(NULL, - numnondigits + prec); - char *b1; - if (!r1) { - Py_DECREF(result); - return NULL; - } - b1 = PyString_AS_STRING(r1); - for (i = 0; i < numnondigits; ++i) - *b1++ = *buf++; - for (i = 0; i < prec - numdigits; i++) - *b1++ = '0'; - for (i = 0; i < numdigits; i++) - *b1++ = *buf++; - *b1 = '\0'; - Py_DECREF(result); - result = r1; - buf = PyString_AS_STRING(result); - len = numnondigits + prec; - } - - /* Fix up case for hex conversions. */ - if (type == 'X') { - /* Need to convert all lower case letters to upper case. - and need to convert 0x to 0X (and -0x to -0X). */ - for (i = 0; i < len; i++) - if (buf[i] >= 'a' && buf[i] <= 'x') - buf[i] -= 'a'-'A'; - } - *pbuf = buf; - *plen = len; - return result; -} - -Py_LOCAL_INLINE(int) -formatint(char *buf, size_t buflen, int flags, - int prec, int type, PyObject *v) -{ - /* fmt = '%#.' + `prec` + 'l' + `type` - worst case length = 3 + 19 (worst len of INT_MAX on 64-bit machine) - + 1 + 1 = 24 */ - char fmt[64]; /* plenty big enough! */ - char *sign; - long x; - - x = PyInt_AsLong(v); - if (x == -1 && PyErr_Occurred()) { - PyErr_Format(PyExc_TypeError, "int argument required, not %.200s", - Py_TYPE(v)->tp_name); - return -1; - } - if (x < 0 && type == 'u') { - type = 'd'; - } - if (x < 0 && (type == 'x' || type == 'X' || type == 'o')) - sign = "-"; - else - sign = ""; - if (prec < 0) - prec = 1; - - if ((flags & F_ALT) && - (type == 'x' || type == 'X')) { - /* When converting under %#x or %#X, there are a number - * of issues that cause pain: - * - when 0 is being converted, the C standard leaves off - * the '0x' or '0X', which is inconsistent with other - * %#x/%#X conversions and inconsistent with Python's - * hex() function - * - there are platforms that violate the standard and - * convert 0 with the '0x' or '0X' - * (Metrowerks, Compaq Tru64) - * - there are platforms that give '0x' when converting - * under %#X, but convert 0 in accordance with the - * standard (OS/2 EMX) - * - * We can achieve the desired consistency by inserting our - * own '0x' or '0X' prefix, and substituting %x/%X in place - * of %#x/%#X. - * - * Note that this is the same approach as used in - * formatint() in unicodeobject.c - */ - PyOS_snprintf(fmt, sizeof(fmt), "%s0%c%%.%dl%c", - sign, type, prec, type); - } - else { - PyOS_snprintf(fmt, sizeof(fmt), "%s%%%s.%dl%c", - sign, (flags&F_ALT) ? "#" : "", - prec, type); - } - - /* buf = '+'/'-'/'' + '0'/'0x'/'' + '[0-9]'*max(prec, len(x in octal)) - * worst case buf = '-0x' + [0-9]*prec, where prec >= 11 - */ - if (buflen <= 14 || buflen <= (size_t)3 + (size_t)prec) { - PyErr_SetString(PyExc_OverflowError, - "formatted integer is too long (precision too large?)"); - return -1; - } - if (sign[0]) - PyOS_snprintf(buf, buflen, fmt, -x); - else - PyOS_snprintf(buf, buflen, fmt, x); - return (int)strlen(buf); -} - -Py_LOCAL_INLINE(int) -formatchar(char *buf, size_t buflen, PyObject *v) -{ - /* presume that the buffer is at least 2 characters long */ - if (PyString_Check(v)) { - if (!PyArg_Parse(v, "c;%c requires int or char", &buf[0])) - return -1; - } - else { - if (!PyArg_Parse(v, "b;%c requires int or char", &buf[0])) - return -1; - } - buf[1] = '\0'; - return 1; -} - -/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) - - FORMATBUFLEN is the length of the buffer in which the floats, ints, & - chars are formatted. XXX This is a magic number. Each formatting - routine does bounds checking to ensure no overflow, but a better - solution may be to malloc a buffer of appropriate size for each - format. For now, the current solution is sufficient. -*/ -#define FORMATBUFLEN (size_t)120 - -PyObject * -PyString_Format(PyObject *format, PyObject *args) -{ - char *fmt, *res; - Py_ssize_t arglen, argidx; - Py_ssize_t reslen, rescnt, fmtcnt; - int args_owned = 0; - PyObject *result, *orig_args; -#ifdef Py_USING_UNICODE - PyObject *v, *w; -#endif - PyObject *dict = NULL; - if (format == NULL || !PyString_Check(format) || args == NULL) { - PyErr_BadInternalCall(); - return NULL; - } - orig_args = args; - fmt = PyString_AS_STRING(format); - fmtcnt = PyString_GET_SIZE(format); - reslen = rescnt = fmtcnt + 100; - result = PyString_FromStringAndSize((char *)NULL, reslen); - if (result == NULL) - return NULL; - res = PyString_AsString(result); - if (PyTuple_Check(args)) { - arglen = PyTuple_GET_SIZE(args); - argidx = 0; - } - else { - arglen = -1; - argidx = -2; - } - if (Py_TYPE(args)->tp_as_mapping && !PyTuple_Check(args) && - !PyObject_TypeCheck(args, &PyBaseString_Type)) - dict = args; - while (--fmtcnt >= 0) { - if (*fmt != '%') { - if (--rescnt < 0) { - rescnt = fmtcnt + 100; - reslen += rescnt; - if (_PyString_Resize(&result, reslen) < 0) - return NULL; - res = PyString_AS_STRING(result) - + reslen - rescnt; - --rescnt; - } - *res++ = *fmt++; - } - else { - /* Got a format specifier */ - int flags = 0; - Py_ssize_t width = -1; - int prec = -1; - int c = '\0'; - int fill; - int isnumok; - PyObject *v = NULL; - PyObject *temp = NULL; - char *pbuf; - int sign; - Py_ssize_t len; - char formatbuf[FORMATBUFLEN]; - /* For format{float,int,char}() */ -#ifdef Py_USING_UNICODE - char *fmt_start = fmt; - Py_ssize_t argidx_start = argidx; -#endif - - fmt++; - if (*fmt == '(') { - char *keystart; - Py_ssize_t keylen; - PyObject *key; - int pcount = 1; - - if (dict == NULL) { - PyErr_SetString(PyExc_TypeError, - "format requires a mapping"); - goto error; - } - ++fmt; - --fmtcnt; - keystart = fmt; - /* Skip over balanced parentheses */ - while (pcount > 0 && --fmtcnt >= 0) { - if (*fmt == ')') - --pcount; - else if (*fmt == '(') - ++pcount; - fmt++; - } - keylen = fmt - keystart - 1; - if (fmtcnt < 0 || pcount > 0) { - PyErr_SetString(PyExc_ValueError, - "incomplete format key"); - goto error; - } - key = PyString_FromStringAndSize(keystart, - keylen); - if (key == NULL) - goto error; - if (args_owned) { - Py_DECREF(args); - args_owned = 0; - } - args = PyObject_GetItem(dict, key); - Py_DECREF(key); - if (args == NULL) { - goto error; - } - args_owned = 1; - arglen = -1; - argidx = -2; - } - while (--fmtcnt >= 0) { - switch (c = *fmt++) { - case '-': flags |= F_LJUST; continue; - case '+': flags |= F_SIGN; continue; - case ' ': flags |= F_BLANK; continue; - case '#': flags |= F_ALT; continue; - case '0': flags |= F_ZERO; continue; - } - break; - } - if (c == '*') { - v = getnextarg(args, arglen, &argidx); - if (v == NULL) - goto error; - if (!PyInt_Check(v)) { - PyErr_SetString(PyExc_TypeError, - "* wants int"); - goto error; - } - width = PyInt_AsLong(v); - if (width < 0) { - flags |= F_LJUST; - width = -width; - } - if (--fmtcnt >= 0) - c = *fmt++; - } - else if (c >= 0 && isdigit(c)) { - width = c - '0'; - while (--fmtcnt >= 0) { - c = Py_CHARMASK(*fmt++); - if (!isdigit(c)) - break; - if ((width*10) / 10 != width) { - PyErr_SetString( - PyExc_ValueError, - "width too big"); - goto error; - } - width = width*10 + (c - '0'); - } - } - if (c == '.') { - prec = 0; - if (--fmtcnt >= 0) - c = *fmt++; - if (c == '*') { - v = getnextarg(args, arglen, &argidx); - if (v == NULL) - goto error; - if (!PyInt_Check(v)) { - PyErr_SetString( - PyExc_TypeError, - "* wants int"); - goto error; - } - prec = PyInt_AsLong(v); - if (prec < 0) - prec = 0; - if (--fmtcnt >= 0) - c = *fmt++; - } - else if (c >= 0 && isdigit(c)) { - prec = c - '0'; - while (--fmtcnt >= 0) { - c = Py_CHARMASK(*fmt++); - if (!isdigit(c)) - break; - if ((prec*10) / 10 != prec) { - PyErr_SetString( - PyExc_ValueError, - "prec too big"); - goto error; - } - prec = prec*10 + (c - '0'); - } - } - } /* prec */ - if (fmtcnt >= 0) { - if (c == 'h' || c == 'l' || c == 'L') { - if (--fmtcnt >= 0) - c = *fmt++; - } - } - if (fmtcnt < 0) { - PyErr_SetString(PyExc_ValueError, - "incomplete format"); - goto error; - } - if (c != '%') { - v = getnextarg(args, arglen, &argidx); - if (v == NULL) - goto error; - } - sign = 0; - fill = ' '; - switch (c) { - case '%': - pbuf = "%"; - len = 1; - break; - case 's': -#ifdef Py_USING_UNICODE - if (PyUnicode_Check(v)) { - fmt = fmt_start; - argidx = argidx_start; - goto unicode; - } -#endif - temp = _PyObject_Str(v); -#ifdef Py_USING_UNICODE - if (temp != NULL && PyUnicode_Check(temp)) { - Py_DECREF(temp); - fmt = fmt_start; - argidx = argidx_start; - goto unicode; - } -#endif - /* Fall through */ - case 'r': - if (c == 'r') - temp = PyObject_Repr(v); - if (temp == NULL) - goto error; - if (!PyString_Check(temp)) { - PyErr_SetString(PyExc_TypeError, - "%s argument has non-string str()"); - Py_DECREF(temp); - goto error; - } - pbuf = PyString_AS_STRING(temp); - len = PyString_GET_SIZE(temp); - if (prec >= 0 && len > prec) - len = prec; - break; - case 'i': - case 'd': - case 'u': - case 'o': - case 'x': - case 'X': - if (c == 'i') - c = 'd'; - isnumok = 0; - if (PyNumber_Check(v)) { - PyObject *iobj=NULL; - - if (PyInt_Check(v) || (PyLong_Check(v))) { - iobj = v; - Py_INCREF(iobj); - } - else { - iobj = PyNumber_Int(v); - if (iobj==NULL) iobj = PyNumber_Long(v); - } - if (iobj!=NULL) { - if (PyInt_Check(iobj)) { - isnumok = 1; - pbuf = formatbuf; - len = formatint(pbuf, - sizeof(formatbuf), - flags, prec, c, iobj); - Py_DECREF(iobj); - if (len < 0) - goto error; - sign = 1; - } - else if (PyLong_Check(iobj)) { - int ilen; - - isnumok = 1; - temp = _PyString_FormatLong(iobj, flags, - prec, c, &pbuf, &ilen); - Py_DECREF(iobj); - len = ilen; - if (!temp) - goto error; - sign = 1; - } - else { - Py_DECREF(iobj); - } - } - } - if (!isnumok) { - PyErr_Format(PyExc_TypeError, - "%%%c format: a number is required, " - "not %.200s", c, Py_TYPE(v)->tp_name); - goto error; - } - if (flags & F_ZERO) - fill = '0'; - break; - case 'e': - case 'E': - case 'f': - case 'F': - case 'g': - case 'G': - if (c == 'F') - c = 'f'; - pbuf = formatbuf; - len = formatfloat(pbuf, sizeof(formatbuf), - flags, prec, c, v); - if (len < 0) - goto error; - sign = 1; - if (flags & F_ZERO) - fill = '0'; - break; - case 'c': -#ifdef Py_USING_UNICODE - if (PyUnicode_Check(v)) { - fmt = fmt_start; - argidx = argidx_start; - goto unicode; - } -#endif - pbuf = formatbuf; - len = formatchar(pbuf, sizeof(formatbuf), v); - if (len < 0) - goto error; - break; - default: - PyErr_Format(PyExc_ValueError, - "unsupported format character '%c' (0x%x) " - "at index %zd", - c, c, - (Py_ssize_t)(fmt - 1 - - PyString_AsString(format))); - goto error; - } - if (sign) { - if (*pbuf == '-' || *pbuf == '+') { - sign = *pbuf++; - len--; - } - else if (flags & F_SIGN) - sign = '+'; - else if (flags & F_BLANK) - sign = ' '; - else - sign = 0; - } - if (width < len) - width = len; - if (rescnt - (sign != 0) < width) { - reslen -= rescnt; - rescnt = width + fmtcnt + 100; - reslen += rescnt; - if (reslen < 0) { - Py_DECREF(result); - Py_XDECREF(temp); - return PyErr_NoMemory(); - } - if (_PyString_Resize(&result, reslen) < 0) { - Py_XDECREF(temp); - return NULL; - } - res = PyString_AS_STRING(result) - + reslen - rescnt; - } - if (sign) { - if (fill != ' ') - *res++ = sign; - rescnt--; - if (width > len) - width--; - } - if ((flags & F_ALT) && (c == 'x' || c == 'X')) { - assert(pbuf[0] == '0'); - assert(pbuf[1] == c); - if (fill != ' ') { - *res++ = *pbuf++; - *res++ = *pbuf++; - } - rescnt -= 2; - width -= 2; - if (width < 0) - width = 0; - len -= 2; - } - if (width > len && !(flags & F_LJUST)) { - do { - --rescnt; - *res++ = fill; - } while (--width > len); - } - if (fill == ' ') { - if (sign) - *res++ = sign; - if ((flags & F_ALT) && - (c == 'x' || c == 'X')) { - assert(pbuf[0] == '0'); - assert(pbuf[1] == c); - *res++ = *pbuf++; - *res++ = *pbuf++; - } - } - Py_MEMCPY(res, pbuf, len); - res += len; - rescnt -= len; - while (--width >= len) { - --rescnt; - *res++ = ' '; - } - if (dict && (argidx < arglen) && c != '%') { - PyErr_SetString(PyExc_TypeError, - "not all arguments converted during string formatting"); - Py_XDECREF(temp); - goto error; - } - Py_XDECREF(temp); - } /* '%' */ - } /* until end */ - if (argidx < arglen && !dict) { - PyErr_SetString(PyExc_TypeError, - "not all arguments converted during string formatting"); - goto error; - } - if (args_owned) { - Py_DECREF(args); - } - _PyString_Resize(&result, reslen - rescnt); - return result; - -#ifdef Py_USING_UNICODE - unicode: - if (args_owned) { - Py_DECREF(args); - args_owned = 0; - } - /* Fiddle args right (remove the first argidx arguments) */ - if (PyTuple_Check(orig_args) && argidx > 0) { - PyObject *v; - Py_ssize_t n = PyTuple_GET_SIZE(orig_args) - argidx; - v = PyTuple_New(n); - if (v == NULL) - goto error; - while (--n >= 0) { - PyObject *w = PyTuple_GET_ITEM(orig_args, n + argidx); - Py_INCREF(w); - PyTuple_SET_ITEM(v, n, w); - } - args = v; - } else { - Py_INCREF(orig_args); - args = orig_args; - } - args_owned = 1; - /* Take what we have of the result and let the Unicode formatting - function format the rest of the input. */ - rescnt = res - PyString_AS_STRING(result); - if (_PyString_Resize(&result, rescnt)) - goto error; - fmtcnt = PyString_GET_SIZE(format) - \ - (fmt - PyString_AS_STRING(format)); - format = PyUnicode_Decode(fmt, fmtcnt, NULL, NULL); - if (format == NULL) - goto error; - v = PyUnicode_Format(format, args); - Py_DECREF(format); - if (v == NULL) - goto error; - /* Paste what we have (result) to what the Unicode formatting - function returned (v) and return the result (or error) */ - w = PyUnicode_Concat(result, v); - Py_DECREF(result); - Py_DECREF(v); - Py_DECREF(args); - return w; -#endif /* Py_USING_UNICODE */ - - error: - Py_DECREF(result); - if (args_owned) { - Py_DECREF(args); - } - return NULL; -} - -void -PyString_InternInPlace(PyObject **p) -{ - register PyStringObject *s = (PyStringObject *)(*p); - PyObject *t; - if (s == NULL || !PyString_Check(s)) - Py_FatalError("PyString_InternInPlace: strings only please!"); - /* If it's a string subclass, we don't really know what putting - it in the interned dict might do. */ - if (!PyString_CheckExact(s)) - return; - if (PyString_CHECK_INTERNED(s)) - return; - if (interned == NULL) { - interned = PyDict_New(); - if (interned == NULL) { - PyErr_Clear(); /* Don't leave an exception */ - return; - } - } - t = PyDict_GetItem(interned, (PyObject *)s); - if (t) { - Py_INCREF(t); - Py_DECREF(*p); - *p = t; - return; - } - - if (PyDict_SetItem(interned, (PyObject *)s, (PyObject *)s) < 0) { - PyErr_Clear(); - return; - } - /* The two references in interned are not counted by refcnt. - The string deallocator will take care of this */ - Py_REFCNT(s) -= 2; - PyString_CHECK_INTERNED(s) = SSTATE_INTERNED_MORTAL; -} - -void -PyString_InternImmortal(PyObject **p) -{ - PyString_InternInPlace(p); - if (PyString_CHECK_INTERNED(*p) != SSTATE_INTERNED_IMMORTAL) { - PyString_CHECK_INTERNED(*p) = SSTATE_INTERNED_IMMORTAL; - Py_INCREF(*p); - } -} - - -PyObject * -PyString_InternFromString(const char *cp) -{ - PyObject *s = PyString_FromString(cp); - if (s == NULL) - return NULL; - PyString_InternInPlace(&s); - return s; -} - -void -PyString_Fini(void) -{ - int i; - for (i = 0; i < UCHAR_MAX + 1; i++) { - Py_XDECREF(characters[i]); - characters[i] = NULL; - } - Py_XDECREF(nullstring); - nullstring = NULL; -} - -void _Py_ReleaseInternedStrings(void) -{ - PyObject *keys; - PyStringObject *s; - Py_ssize_t i, n; - Py_ssize_t immortal_size = 0, mortal_size = 0; - - if (interned == NULL || !PyDict_Check(interned)) - return; - keys = PyDict_Keys(interned); - if (keys == NULL || !PyList_Check(keys)) { - PyErr_Clear(); - return; - } - - /* Since _Py_ReleaseInternedStrings() is intended to help a leak - detector, interned strings are not forcibly deallocated; rather, we - give them their stolen references back, and then clear and DECREF - the interned dict. */ - - n = PyList_GET_SIZE(keys); - fprintf(stderr, "releasing %" PY_FORMAT_SIZE_T "d interned strings\n", - n); - for (i = 0; i < n; i++) { - s = (PyStringObject *) PyList_GET_ITEM(keys, i); - switch (s->ob_sstate) { - case SSTATE_NOT_INTERNED: - /* XXX Shouldn't happen */ - break; - case SSTATE_INTERNED_IMMORTAL: - Py_REFCNT(s) += 1; - immortal_size += Py_SIZE(s); - break; - case SSTATE_INTERNED_MORTAL: - Py_REFCNT(s) += 2; - mortal_size += Py_SIZE(s); - break; - default: - Py_FatalError("Inconsistent interned string state."); - } - s->ob_sstate = SSTATE_NOT_INTERNED; - } - fprintf(stderr, "total size of all interned strings: " - "%" PY_FORMAT_SIZE_T "d/%" PY_FORMAT_SIZE_T "d " - "mortal/immortal\n", mortal_size, immortal_size); - Py_DECREF(keys); - PyDict_Clear(interned); - Py_DECREF(interned); - interned = NULL; -} Modified: python/branches/tlee-ast-optimize/Objects/structseq.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/structseq.c (original) +++ python/branches/tlee-ast-optimize/Objects/structseq.c Sun Jun 1 17:18:10 2008 @@ -270,7 +270,7 @@ Py_DECREF(tup); return NULL; } - crepr = PyString_AsString(repr); + crepr = PyBytes_AsString(repr); if (crepr == NULL) { Py_DECREF(tup); Py_DECREF(repr); @@ -306,7 +306,7 @@ *pbuf++ = ')'; *pbuf = '\0'; - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static PyObject * Modified: python/branches/tlee-ast-optimize/Objects/tupleobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/tupleobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/tupleobject.c Sun Jun 1 17:18:10 2008 @@ -218,7 +218,7 @@ n = Py_SIZE(v); if (n == 0) - return PyString_FromString("()"); + return PyBytes_FromString("()"); /* While not mutable, it is still possible to end up with a cycle in a tuple through an object that stores itself within a tuple (and thus @@ -226,7 +226,7 @@ possible within a type. */ i = Py_ReprEnter((PyObject *)v); if (i != 0) { - return i > 0 ? PyString_FromString("(...)") : NULL; + return i > 0 ? PyBytes_FromString("(...)") : NULL; } pieces = PyTuple_New(n); @@ -246,29 +246,29 @@ /* Add "()" decorations to the first and last items. */ assert(n > 0); - s = PyString_FromString("("); + s = PyBytes_FromString("("); if (s == NULL) goto Done; temp = PyTuple_GET_ITEM(pieces, 0); - PyString_ConcatAndDel(&s, temp); + PyBytes_ConcatAndDel(&s, temp); PyTuple_SET_ITEM(pieces, 0, s); if (s == NULL) goto Done; - s = PyString_FromString(n == 1 ? ",)" : ")"); + s = PyBytes_FromString(n == 1 ? ",)" : ")"); if (s == NULL) goto Done; temp = PyTuple_GET_ITEM(pieces, n-1); - PyString_ConcatAndDel(&temp, s); + PyBytes_ConcatAndDel(&temp, s); PyTuple_SET_ITEM(pieces, n-1, temp); if (temp == NULL) goto Done; /* Paste them all together with ", " between. */ - s = PyString_FromString(", "); + s = PyBytes_FromString(", "); if (s == NULL) goto Done; - result = _PyString_Join(s, pieces); + result = _PyBytes_Join(s, pieces); Py_DECREF(s); Done: Modified: python/branches/tlee-ast-optimize/Objects/typeobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/typeobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/typeobject.c Sun Jun 1 17:18:10 2008 @@ -19,10 +19,10 @@ >> (8*sizeof(unsigned int) - MCACHE_SIZE_EXP)) #define MCACHE_HASH_METHOD(type, name) \ MCACHE_HASH((type)->tp_version_tag, \ - ((PyStringObject *)(name))->ob_shash) + ((PyBytesObject *)(name))->ob_shash) #define MCACHE_CACHEABLE_NAME(name) \ - PyString_CheckExact(name) && \ - PyString_GET_SIZE(name) <= MCACHE_MAX_ATTR_SIZE + PyBytes_CheckExact(name) && \ + PyBytes_GET_SIZE(name) <= MCACHE_MAX_ATTR_SIZE struct method_cache_entry { unsigned int version; @@ -32,7 +32,6 @@ static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP]; static unsigned int next_version_tag = 0; -static void type_modified(PyTypeObject *); unsigned int PyType_ClearCache(void) @@ -47,12 +46,12 @@ } next_version_tag = 0; /* mark all version tags as invalid */ - type_modified(&PyBaseObject_Type); + PyType_Modified(&PyBaseObject_Type); return cur_version_tag; } -static void -type_modified(PyTypeObject *type) +void +PyType_Modified(PyTypeObject *type) { /* Invalidate any cached data for the specified type and all subclasses. This function is called after the base @@ -86,7 +85,7 @@ ref = PyList_GET_ITEM(raw, i); ref = PyWeakref_GET_OBJECT(ref); if (ref != Py_None) { - type_modified((PyTypeObject *)ref); + PyType_Modified((PyTypeObject *)ref); } } } @@ -172,7 +171,7 @@ Py_INCREF(Py_None); } /* mark all version tags as invalid */ - type_modified(&PyBaseObject_Type); + PyType_Modified(&PyBaseObject_Type); return 1; } bases = type->tp_bases; @@ -218,7 +217,7 @@ s = type->tp_name; else s++; - return PyString_FromString(s); + return PyBytes_FromString(s); } } @@ -237,14 +236,14 @@ "can't delete %s.__name__", type->tp_name); return -1; } - if (!PyString_Check(value)) { + if (!PyBytes_Check(value)) { PyErr_Format(PyExc_TypeError, "can only assign string to %s.__name__, not '%s'", type->tp_name, Py_TYPE(value)->tp_name); return -1; } - if (strlen(PyString_AS_STRING(value)) - != (size_t)PyString_GET_SIZE(value)) { + if (strlen(PyBytes_AS_STRING(value)) + != (size_t)PyBytes_GET_SIZE(value)) { PyErr_Format(PyExc_ValueError, "__name__ must not contain null bytes"); return -1; @@ -257,7 +256,7 @@ Py_DECREF(et->ht_name); et->ht_name = value; - type->tp_name = PyString_AS_STRING(value); + type->tp_name = PyBytes_AS_STRING(value); return 0; } @@ -280,9 +279,9 @@ else { s = strrchr(type->tp_name, '.'); if (s != NULL) - return PyString_FromStringAndSize( + return PyBytes_FromStringAndSize( type->tp_name, (Py_ssize_t)(s - type->tp_name)); - return PyString_FromString("__builtin__"); + return PyBytes_FromString("__builtin__"); } } @@ -300,7 +299,7 @@ return -1; } - type_modified(type); + PyType_Modified(type); return PyDict_SetItemString(type->tp_dict, "__module__", value); } @@ -328,7 +327,7 @@ int res = PyDict_SetItemString(type->tp_dict, "__abstractmethods__", value); if (res == 0) { - type_modified(type); + PyType_Modified(type); if (value && PyObject_IsTrue(value)) { type->tp_flags |= Py_TPFLAGS_IS_ABSTRACT; } @@ -556,7 +555,7 @@ { PyObject *result; if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL) - return PyString_FromString(type->tp_doc); + return PyBytes_FromString(type->tp_doc); result = PyDict_GetItemString(type->tp_dict, "__doc__"); if (result == NULL) { result = Py_None; @@ -645,7 +644,7 @@ mod = type_module(type, NULL); if (mod == NULL) PyErr_Clear(); - else if (!PyString_Check(mod)) { + else if (!PyBytes_Check(mod)) { Py_DECREF(mod); mod = NULL; } @@ -658,14 +657,14 @@ else kind = "type"; - if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__")) { - rtn = PyString_FromFormat("<%s '%s.%s'>", + if (mod != NULL && strcmp(PyBytes_AS_STRING(mod), "__builtin__")) { + rtn = PyBytes_FromFormat("<%s '%s.%s'>", kind, - PyString_AS_STRING(mod), - PyString_AS_STRING(name)); + PyBytes_AS_STRING(mod), + PyBytes_AS_STRING(name)); } else - rtn = PyString_FromFormat("<%s '%s'>", kind, type->tp_name); + rtn = PyBytes_FromFormat("<%s '%s'>", kind, type->tp_name); Py_XDECREF(mod); Py_DECREF(name); @@ -1137,7 +1136,7 @@ PyObject *res; if (*attrobj == NULL) { - *attrobj = PyString_InternFromString(attrstr); + *attrobj = PyBytes_InternFromString(attrstr); if (*attrobj == NULL) return NULL; } @@ -1329,7 +1328,7 @@ } if (name == NULL) return NULL; - if (!PyString_Check(name)) { + if (!PyBytes_Check(name)) { Py_DECREF(name); return NULL; } @@ -1351,7 +1350,7 @@ o = class_name(o); PyErr_Format(PyExc_TypeError, "duplicate base class %s", - o ? PyString_AS_STRING(o) : "?"); + o ? PyBytes_AS_STRING(o) : "?"); Py_XDECREF(o); return -1; } @@ -1397,7 +1396,7 @@ while (PyDict_Next(set, &i, &k, &v) && (size_t)off < sizeof(buf)) { PyObject *name = class_name(k); off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s", - name ? PyString_AS_STRING(name) : "?"); + name ? PyBytes_AS_STRING(name) : "?"); Py_XDECREF(name); if (--n && (size_t)(off+1) < sizeof(buf)) { buf[off++] = ','; @@ -1621,7 +1620,7 @@ from the custom MRO */ type_mro_modified(type, type->tp_bases); - type_modified(type); + PyType_Modified(type); return 0; } @@ -1750,7 +1749,7 @@ PyObject *descr; if (dict_str == NULL) { - dict_str = PyString_InternFromString("__dict__"); + dict_str = PyBytes_InternFromString("__dict__"); if (dict_str == NULL) return NULL; } @@ -1899,14 +1898,14 @@ unsigned char *p; Py_ssize_t i, n; - if (!PyString_Check(s)) { + if (!PyBytes_Check(s)) { PyErr_Format(PyExc_TypeError, "__slots__ items must be strings, not '%.200s'", Py_TYPE(s)->tp_name); return 0; } - p = (unsigned char *) PyString_AS_STRING(s); - n = PyString_GET_SIZE(s); + p = (unsigned char *) PyBytes_AS_STRING(s); + n = PyBytes_GET_SIZE(s); /* We must reject an empty name. As a hack, we bump the length to 1 so that the loop will balk on the trailing \0. */ if (n == 0) @@ -2108,7 +2107,7 @@ /* Have slots */ /* Make it into a tuple */ - if (PyString_Check(slots) || PyUnicode_Check(slots)) + if (PyBytes_Check(slots) || PyUnicode_Check(slots)) slots = PyTuple_Pack(1, slots); else slots = PySequence_Tuple(slots); @@ -2146,8 +2145,8 @@ char *s; if (!valid_identifier(tmp)) goto bad_slots; - assert(PyString_Check(tmp)); - s = PyString_AS_STRING(tmp); + assert(PyBytes_Check(tmp)); + s = PyBytes_AS_STRING(tmp); if (strcmp(s, "__dict__") == 0) { if (!may_add_dict || add_dict) { PyErr_SetString(PyExc_TypeError, @@ -2179,7 +2178,7 @@ for (i = j = 0; i < nslots; i++) { char *s; tmp = PyTuple_GET_ITEM(slots, i); - s = PyString_AS_STRING(tmp); + s = PyBytes_AS_STRING(tmp); if ((add_dict && strcmp(s, "__dict__") == 0) || (add_weak && strcmp(s, "__weakref__") == 0)) continue; @@ -2272,7 +2271,7 @@ type->tp_as_sequence = &et->as_sequence; type->tp_as_mapping = &et->as_mapping; type->tp_as_buffer = &et->as_buffer; - type->tp_name = PyString_AS_STRING(name); + type->tp_name = PyBytes_AS_STRING(name); /* Set tp_base and tp_bases */ type->tp_bases = bases; @@ -2305,14 +2304,14 @@ */ { PyObject *doc = PyDict_GetItemString(dict, "__doc__"); - if (doc != NULL && PyString_Check(doc)) { - const size_t n = (size_t)PyString_GET_SIZE(doc); + if (doc != NULL && PyBytes_Check(doc)) { + const size_t n = (size_t)PyBytes_GET_SIZE(doc); char *tp_doc = (char *)PyObject_MALLOC(n+1); if (tp_doc == NULL) { Py_DECREF(type); return NULL; } - memcpy(tp_doc, PyString_AS_STRING(doc), n+1); + memcpy(tp_doc, PyBytes_AS_STRING(doc), n+1); type->tp_doc = tp_doc; } } @@ -2335,7 +2334,7 @@ slotoffset = base->tp_basicsize; if (slots != NULL) { for (i = 0; i < nslots; i++, mp++) { - mp->name = PyString_AS_STRING( + mp->name = PyBytes_AS_STRING( PyTuple_GET_ITEM(slots, i)); mp->type = T_OBJECT_EX; mp->offset = slotoffset; @@ -2536,7 +2535,7 @@ /* Give up */ PyErr_Format(PyExc_AttributeError, "type object '%.50s' has no attribute '%.400s'", - type->tp_name, PyString_AS_STRING(name)); + type->tp_name, PyBytes_AS_STRING(name)); return NULL; } @@ -2855,7 +2854,7 @@ if (sorted_methods == NULL) goto error; if (comma == NULL) { - comma = PyString_InternFromString(", "); + comma = PyBytes_InternFromString(", "); if (comma == NULL) goto error; } @@ -2863,7 +2862,7 @@ "O", sorted_methods); if (joined == NULL) goto error; - joined_str = PyString_AsString(joined); + joined_str = PyBytes_AsString(joined); if (joined_str == NULL) goto error; @@ -2897,20 +2896,20 @@ mod = type_module(type, NULL); if (mod == NULL) PyErr_Clear(); - else if (!PyString_Check(mod)) { + else if (!PyBytes_Check(mod)) { Py_DECREF(mod); mod = NULL; } name = type_name(type, NULL); if (name == NULL) return NULL; - if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__")) - rtn = PyString_FromFormat("<%s.%s object at %p>", - PyString_AS_STRING(mod), - PyString_AS_STRING(name), + if (mod != NULL && strcmp(PyBytes_AS_STRING(mod), "__builtin__")) + rtn = PyBytes_FromFormat("<%s.%s object at %p>", + PyBytes_AS_STRING(mod), + PyBytes_AS_STRING(name), self); else - rtn = PyString_FromFormat("<%s object at %p>", + rtn = PyBytes_FromFormat("<%s object at %p>", type->tp_name, self); Py_XDECREF(mod); Py_DECREF(name); @@ -3070,7 +3069,7 @@ static PyObject *copyreg_str; if (!copyreg_str) { - copyreg_str = PyString_InternFromString("copy_reg"); + copyreg_str = PyBytes_InternFromString("copy_reg"); if (copyreg_str == NULL) return NULL; } @@ -3376,7 +3375,7 @@ return NULL; if (PyUnicode_Check(format_spec)) { self_as_str = PyObject_Unicode(self); - } else if (PyString_Check(format_spec)) { + } else if (PyBytes_Check(format_spec)) { self_as_str = PyObject_Str(self); } else { PyErr_SetString(PyExc_TypeError, "argument to __format__ must be unicode or str"); @@ -3619,7 +3618,7 @@ type->tp_flags |= Py_TPFLAGS_INT_SUBCLASS; else if (PyType_IsSubtype(base, &PyLong_Type)) type->tp_flags |= Py_TPFLAGS_LONG_SUBCLASS; - else if (PyType_IsSubtype(base, &PyString_Type)) + else if (PyType_IsSubtype(base, &PyBytes_Type)) type->tp_flags |= Py_TPFLAGS_STRING_SUBCLASS; #ifdef Py_USING_UNICODE else if (PyType_IsSubtype(base, &PyUnicode_Type)) @@ -3958,7 +3957,7 @@ */ if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) { if (type->tp_doc != NULL) { - PyObject *doc = PyString_FromString(type->tp_doc); + PyObject *doc = PyBytes_FromString(type->tp_doc); if (doc == NULL) goto error; PyDict_SetItemString(type->tp_dict, "__doc__", doc); @@ -4846,7 +4845,7 @@ descrgetfunc f; if (getitem_str == NULL) { - getitem_str = PyString_InternFromString("__getitem__"); + getitem_str = PyBytes_InternFromString("__getitem__"); if (getitem_str == NULL) return NULL; } @@ -5214,7 +5213,7 @@ return res; } PyErr_Clear(); - return PyString_FromFormat("<%s object at %p>", + return PyBytes_FromFormat("<%s object at %p>", Py_TYPE(self)->tp_name, self); } @@ -5322,13 +5321,13 @@ static PyObject *getattr_str = NULL; if (getattr_str == NULL) { - getattr_str = PyString_InternFromString("__getattr__"); + getattr_str = PyBytes_InternFromString("__getattr__"); if (getattr_str == NULL) return NULL; } if (getattribute_str == NULL) { getattribute_str = - PyString_InternFromString("__getattribute__"); + PyBytes_InternFromString("__getattribute__"); if (getattribute_str == NULL) return NULL; } @@ -5469,7 +5468,7 @@ static PyObject *get_str = NULL; if (get_str == NULL) { - get_str = PyString_InternFromString("__get__"); + get_str = PyBytes_InternFromString("__get__"); if (get_str == NULL) return NULL; } @@ -5539,7 +5538,7 @@ Py_ssize_t i, n; if (new_str == NULL) { - new_str = PyString_InternFromString("__new__"); + new_str = PyBytes_InternFromString("__new__"); if (new_str == NULL) return NULL; } @@ -6069,7 +6068,7 @@ if (initialized) return; for (p = slotdefs; p->name; p++) { - p->name_strobj = PyString_InternFromString(p->name); + p->name_strobj = PyBytes_InternFromString(p->name); if (!p->name_strobj) Py_FatalError("Out of memory interning slotdef names"); } @@ -6092,7 +6091,7 @@ update_subclasses() recursion below, but carefully: they each have their own conditions on which to stop recursing into subclasses. */ - type_modified(type); + PyType_Modified(type); init_slotdefs(); pp = ptrs; @@ -6284,12 +6283,12 @@ superobject *su = (superobject *)self; if (su->obj_type) - return PyString_FromFormat( + return PyBytes_FromFormat( ", <%s object>>", su->type ? su->type->tp_name : "NULL", su->obj_type->tp_name); else - return PyString_FromFormat( + return PyBytes_FromFormat( ", NULL>", su->type ? su->type->tp_name : "NULL"); } @@ -6303,9 +6302,9 @@ if (!skip) { /* We want __class__ to return the class of the super object (i.e. super, or a subclass), not the class of su->obj. */ - skip = (PyString_Check(name) && - PyString_GET_SIZE(name) == 9 && - strcmp(PyString_AS_STRING(name), "__class__") == 0); + skip = (PyBytes_Check(name) && + PyBytes_GET_SIZE(name) == 9 && + strcmp(PyBytes_AS_STRING(name), "__class__") == 0); } if (!skip) { @@ -6397,7 +6396,7 @@ PyObject *class_attr; if (class_str == NULL) { - class_str = PyString_FromString("__class__"); + class_str = PyBytes_FromString("__class__"); if (class_str == NULL) return NULL; } Modified: python/branches/tlee-ast-optimize/Objects/unicodeobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/unicodeobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/unicodeobject.c Sun Jun 1 17:18:10 2008 @@ -42,8 +42,6 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "formatter_unicode.h" - #include "unicodeobject.h" #include "ucnhash.h" @@ -1080,11 +1078,11 @@ #endif /* Coerce object */ - if (PyString_Check(obj)) { - s = PyString_AS_STRING(obj); - len = PyString_GET_SIZE(obj); + if (PyBytes_Check(obj)) { + s = PyBytes_AS_STRING(obj); + len = PyBytes_GET_SIZE(obj); } - else if (PyBytes_Check(obj)) { + else if (PyByteArray_Check(obj)) { /* Python 2.x specific */ PyErr_Format(PyExc_TypeError, "decoding bytearray is not supported"); @@ -1254,7 +1252,7 @@ v = PyCodec_Encode(unicode, encoding, errors); if (v == NULL) goto onError; - if (!PyString_Check(v)) { + if (!PyBytes_Check(v)) { PyErr_Format(PyExc_TypeError, "encoder did not return a string object (type=%.400s)", Py_TYPE(v)->tp_name); @@ -1654,13 +1652,13 @@ char * start; if (size == 0) - return PyString_FromStringAndSize(NULL, 0); + return PyBytes_FromStringAndSize(NULL, 0); - v = PyString_FromStringAndSize(NULL, cbAllocated); + v = PyBytes_FromStringAndSize(NULL, cbAllocated); if (v == NULL) return NULL; - start = out = PyString_AS_STRING(v); + start = out = PyBytes_AS_STRING(v); for (;i < size; ++i) { Py_UNICODE ch = s[i]; @@ -1726,7 +1724,7 @@ *out++ = '-'; } - _PyString_Resize(&v, out - start); + _PyBytes_Resize(&v, out - start); return v; } @@ -1991,10 +1989,10 @@ nallocated = size * 4; if (nallocated / 4 != size) /* overflow! */ return PyErr_NoMemory(); - v = PyString_FromStringAndSize(NULL, nallocated); + v = PyBytes_FromStringAndSize(NULL, nallocated); if (v == NULL) return NULL; - p = PyString_AS_STRING(v); + p = PyBytes_AS_STRING(v); } for (i = 0; i < size;) { @@ -2042,13 +2040,13 @@ /* This was stack allocated. */ nneeded = p - stackbuf; assert(nneeded <= nallocated); - v = PyString_FromStringAndSize(stackbuf, nneeded); + v = PyBytes_FromStringAndSize(stackbuf, nneeded); } else { /* Cut back to size actually needed. */ - nneeded = p - PyString_AS_STRING(v); + nneeded = p - PyBytes_AS_STRING(v); assert(nneeded <= nallocated); - _PyString_Resize(&v, nneeded); + _PyBytes_Resize(&v, nneeded); } return v; @@ -2276,12 +2274,12 @@ 0xDC00 <= s[i+1] && s[i+1] <= 0xDFFF) pairs++; #endif - v = PyString_FromStringAndSize(NULL, + v = PyBytes_FromStringAndSize(NULL, 4 * (size - pairs + (byteorder == 0))); if (v == NULL) return NULL; - p = (unsigned char *)PyString_AS_STRING(v); + p = (unsigned char *)PyBytes_AS_STRING(v); if (byteorder == 0) STORECHAR(0xFEFF); if (size == 0) @@ -2541,12 +2539,12 @@ if (s[i] >= 0x10000) pairs++; #endif - v = PyString_FromStringAndSize(NULL, + v = PyBytes_FromStringAndSize(NULL, 2 * (size + pairs + (byteorder == 0))); if (v == NULL) return NULL; - p = (unsigned char *)PyString_AS_STRING(v); + p = (unsigned char *)PyBytes_AS_STRING(v); if (byteorder == 0) STORECHAR(0xFEFF); if (size == 0) @@ -2889,7 +2887,7 @@ escape. */ - repr = PyString_FromStringAndSize(NULL, + repr = PyBytes_FromStringAndSize(NULL, 2 #ifdef Py_UNICODE_WIDE + 10*size @@ -2900,7 +2898,7 @@ if (repr == NULL) return NULL; - p = PyString_AS_STRING(repr); + p = PyBytes_AS_STRING(repr); if (quotes) { *p++ = 'u'; @@ -2912,7 +2910,7 @@ /* Escape quotes and backslashes */ if ((quotes && - ch == (Py_UNICODE) PyString_AS_STRING(repr)[1]) || ch == '\\') { + ch == (Py_UNICODE) PyBytes_AS_STRING(repr)[1]) || ch == '\\') { *p++ = '\\'; *p++ = (char) ch; continue; @@ -2998,10 +2996,10 @@ *p++ = (char) ch; } if (quotes) - *p++ = PyString_AS_STRING(repr)[1]; + *p++ = PyBytes_AS_STRING(repr)[1]; *p = '\0'; - _PyString_Resize(&repr, p - PyString_AS_STRING(repr)); + _PyBytes_Resize(&repr, p - PyBytes_AS_STRING(repr)); return repr; } @@ -3150,16 +3148,16 @@ static const char *hexdigit = "0123456789abcdef"; #ifdef Py_UNICODE_WIDE - repr = PyString_FromStringAndSize(NULL, 10 * size); + repr = PyBytes_FromStringAndSize(NULL, 10 * size); #else - repr = PyString_FromStringAndSize(NULL, 6 * size); + repr = PyBytes_FromStringAndSize(NULL, 6 * size); #endif if (repr == NULL) return NULL; if (size == 0) return repr; - p = q = PyString_AS_STRING(repr); + p = q = PyBytes_AS_STRING(repr); while (size-- > 0) { Py_UNICODE ch = *s++; #ifdef Py_UNICODE_WIDE @@ -3218,7 +3216,7 @@ *p++ = (char) ch; } *p = '\0'; - _PyString_Resize(&repr, p - q); + _PyBytes_Resize(&repr, p - q); return repr; } @@ -3458,12 +3456,12 @@ /* allocate enough for a simple encoding without replacements, if we need more, we'll resize */ - res = PyString_FromStringAndSize(NULL, size); + res = PyBytes_FromStringAndSize(NULL, size); if (res == NULL) goto onError; if (size == 0) return res; - str = PyString_AS_STRING(res); + str = PyBytes_AS_STRING(res); ressize = size; while (p ressize) { if (requiredsize<2*ressize) requiredsize = 2*ressize; - if (_PyString_Resize(&res, requiredsize)) + if (_PyBytes_Resize(&res, requiredsize)) goto onError; - str = PyString_AS_STRING(res) + respos; + str = PyBytes_AS_STRING(res) + respos; ressize = requiredsize; } /* generate replacement (temporarily (mis)uses p) */ @@ -3560,17 +3558,17 @@ /* need more space? (at least enough for what we have+the replacement+the rest of the string, so we won't have to check space for encodable characters) */ - respos = str-PyString_AS_STRING(res); + respos = str-PyBytes_AS_STRING(res); repsize = PyUnicode_GET_SIZE(repunicode); requiredsize = respos+repsize+(endp-collend); if (requiredsize > ressize) { if (requiredsize<2*ressize) requiredsize = 2*ressize; - if (_PyString_Resize(&res, requiredsize)) { + if (_PyBytes_Resize(&res, requiredsize)) { Py_DECREF(repunicode); goto onError; } - str = PyString_AS_STRING(res) + respos; + str = PyBytes_AS_STRING(res) + respos; ressize = requiredsize; } /* check if there is anything unencodable in the replacement @@ -3591,10 +3589,10 @@ } } /* Resize if we allocated to much */ - respos = str-PyString_AS_STRING(res); + respos = str-PyBytes_AS_STRING(res); if (respos 0) { - char *s = PyString_AS_STRING(*repr) + n; + char *s = PyBytes_AS_STRING(*repr) + n; if (0 == WideCharToMultiByte(CP_ACP, 0, p, size, s, mbcssize, NULL, NULL)) { PyErr_SetFromWindowsErrWithFilename(0, NULL); return -1; @@ -4329,7 +4327,7 @@ } return x; } - else if (PyString_Check(x)) + else if (PyBytes_Check(x)) return x; else { /* wrong return value */ @@ -4343,11 +4341,11 @@ static int charmapencode_resize(PyObject **outobj, Py_ssize_t *outpos, Py_ssize_t requiredsize) { - Py_ssize_t outsize = PyString_GET_SIZE(*outobj); + Py_ssize_t outsize = PyBytes_GET_SIZE(*outobj); /* exponentially overallocate to minimize reallocations */ if (requiredsize < 2*outsize) requiredsize = 2*outsize; - if (_PyString_Resize(outobj, requiredsize)) { + if (_PyBytes_Resize(outobj, requiredsize)) { return 0; } return 1; @@ -4368,7 +4366,7 @@ { PyObject *rep; char *outstart; - Py_ssize_t outsize = PyString_GET_SIZE(*outobj); + Py_ssize_t outsize = PyBytes_GET_SIZE(*outobj); if (Py_TYPE(mapping) == &EncodingMapType) { int res = encoding_map_lookup(c, mapping); @@ -4378,7 +4376,7 @@ if (outsize unicode\n\ +"S.replace (old, new[, count]) -> unicode\n\ \n\ Return a copy of S with all occurrences of substring\n\ -old replaced by new. If the optional argument maxsplit is\n\ -given, only the first maxsplit occurrences are replaced."); +old replaced by new. If the optional argument count is\n\ +given, only the first count occurrences are replaced."); static PyObject* unicode_replace(PyUnicodeObject *self, PyObject *args) @@ -7863,6 +7861,35 @@ \n\ "); +static PyObject * +unicode__format__(PyObject *self, PyObject *args) +{ + PyObject *format_spec; + PyObject *result = NULL; + PyObject *tmp = NULL; + + /* If 2.x, convert format_spec to the same type as value */ + /* This is to allow things like u''.format('') */ + if (!PyArg_ParseTuple(args, "O:__format__", &format_spec)) + goto done; + if (!(PyBytes_Check(format_spec) || PyUnicode_Check(format_spec))) { + PyErr_Format(PyExc_TypeError, "__format__ arg must be str " + "or unicode, not %s", Py_TYPE(format_spec)->tp_name); + goto done; + } + tmp = PyObject_Unicode(format_spec); + if (tmp == NULL) + goto done; + format_spec = tmp; + + result = _PyUnicode_FormatAdvanced(self, + PyUnicode_AS_UNICODE(format_spec), + PyUnicode_GET_SIZE(format_spec)); +done: + Py_XDECREF(tmp); + return result; +} + PyDoc_STRVAR(p_format__doc__, "S.__format__(format_spec) -> unicode\n\ \n\ @@ -8071,8 +8098,8 @@ str = _PyUnicode_AsDefaultEncodedString((PyObject *)self, NULL); if (str == NULL) return -1; - *ptr = (void *) PyString_AS_STRING(str); - return PyString_GET_SIZE(str); + *ptr = (void *) PyBytes_AS_STRING(str); + return PyBytes_GET_SIZE(str); } /* Helpers for PyUnicode_Format() */ @@ -8191,7 +8218,7 @@ PyObject *str; /* temporary string object. */ PyUnicodeObject *result; - str = _PyString_FormatLong(val, flags, prec, type, &buf, &len); + str = _PyBytes_FormatLong(val, flags, prec, type, &buf, &len); if (!str) return NULL; result = _PyUnicode_New(len); @@ -8293,10 +8320,10 @@ buf[0] = PyUnicode_AS_UNICODE(v)[0]; } - else if (PyString_Check(v)) { - if (PyString_GET_SIZE(v) != 1) + else if (PyBytes_Check(v)) { + if (PyBytes_GET_SIZE(v) != 1) goto onError; - buf[0] = (Py_UNICODE)PyString_AS_STRING(v)[0]; + buf[0] = (Py_UNICODE)PyBytes_AS_STRING(v)[0]; } else { @@ -8579,10 +8606,10 @@ goto onError; if (PyUnicode_Check(temp)) /* nothing to do */; - else if (PyString_Check(temp)) { + else if (PyBytes_Check(temp)) { /* convert to string to Unicode */ - unicode = PyUnicode_Decode(PyString_AS_STRING(temp), - PyString_GET_SIZE(temp), + unicode = PyUnicode_Decode(PyBytes_AS_STRING(temp), + PyBytes_GET_SIZE(temp), NULL, "strict"); Py_DECREF(temp); Modified: python/branches/tlee-ast-optimize/Objects/weakrefobject.c ============================================================================== --- python/branches/tlee-ast-optimize/Objects/weakrefobject.c (original) +++ python/branches/tlee-ast-optimize/Objects/weakrefobject.c Sun Jun 1 17:18:10 2008 @@ -166,8 +166,8 @@ "__name__"); if (nameobj == NULL) PyErr_Clear(); - else if (PyString_Check(nameobj)) - name = PyString_AS_STRING(nameobj); + else if (PyBytes_Check(nameobj)) + name = PyBytes_AS_STRING(nameobj); PyOS_snprintf(buffer, sizeof(buffer), name ? "" : "", @@ -177,7 +177,7 @@ name); Py_XDECREF(nameobj); } - return PyString_FromString(buffer); + return PyBytes_FromString(buffer); } /* Weak references only support equality, not ordering. Two weak references @@ -448,7 +448,7 @@ "", proxy, Py_TYPE(PyWeakref_GET_OBJECT(proxy))->tp_name, PyWeakref_GET_OBJECT(proxy)); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } Modified: python/branches/tlee-ast-optimize/PC/VC6/pythoncore.dsp ============================================================================== --- python/branches/tlee-ast-optimize/PC/VC6/pythoncore.dsp (original) +++ python/branches/tlee-ast-optimize/PC/VC6/pythoncore.dsp Sun Jun 1 17:18:10 2008 @@ -237,6 +237,10 @@ # End Source File # Begin Source File +SOURCE=..\..\Objects\bytearrayobject.c +# End Source File +# Begin Source File + SOURCE=..\..\Objects\bytesobject.c # End Source File # Begin Source File @@ -643,10 +647,6 @@ # End Source File # Begin Source File -SOURCE=..\..\Objects\stringobject.c -# End Source File -# Begin Source File - SOURCE=..\..\Modules\stropmodule.c # End Source File # Begin Source File Modified: python/branches/tlee-ast-optimize/PC/VS7.1/pythoncore.vcproj ============================================================================== --- python/branches/tlee-ast-optimize/PC/VS7.1/pythoncore.vcproj (original) +++ python/branches/tlee-ast-optimize/PC/VS7.1/pythoncore.vcproj Sun Jun 1 17:18:10 2008 @@ -443,6 +443,9 @@ RelativePath="..\..\Objects\bufferobject.c"> + + - - @@ -423,7 +418,7 @@ /> Modified: python/branches/tlee-ast-optimize/PC/VS8.0/_elementtree.vcproj ============================================================================== --- python/branches/tlee-ast-optimize/PC/VS8.0/_elementtree.vcproj (original) +++ python/branches/tlee-ast-optimize/PC/VS8.0/_elementtree.vcproj Sun Jun 1 17:18:10 2008 @@ -56,6 +56,7 @@ /> @@ -431,6 +437,7 @@ /> Modified: python/branches/tlee-ast-optimize/PC/VS8.0/_sqlite3.vcproj ============================================================================== --- python/branches/tlee-ast-optimize/PC/VS8.0/_sqlite3.vcproj (original) +++ python/branches/tlee-ast-optimize/PC/VS8.0/_sqlite3.vcproj Sun Jun 1 17:18:10 2008 @@ -53,12 +53,9 @@ /> @@ -446,12 +428,9 @@ /> Modified: python/branches/tlee-ast-optimize/PC/VS8.0/_ssl.vcproj ============================================================================== --- python/branches/tlee-ast-optimize/PC/VS8.0/_ssl.vcproj (original) +++ python/branches/tlee-ast-optimize/PC/VS8.0/_ssl.vcproj Sun Jun 1 17:18:10 2008 @@ -27,7 +27,7 @@ > - - Modified: python/branches/tlee-ast-optimize/PC/VS8.0/_tkinter.vcproj ============================================================================== --- python/branches/tlee-ast-optimize/PC/VS8.0/_tkinter.vcproj (original) +++ python/branches/tlee-ast-optimize/PC/VS8.0/_tkinter.vcproj Sun Jun 1 17:18:10 2008 @@ -56,7 +56,7 @@ /> + @@ -104,6 +107,96 @@ Name="VCPostBuildEventTool" /> + + + + + + + + + + + + + + + + + + + Modified: python/branches/tlee-ast-optimize/PC/VS8.0/debug.vsprops ============================================================================== --- python/branches/tlee-ast-optimize/PC/VS8.0/debug.vsprops (original) +++ python/branches/tlee-ast-optimize/PC/VS8.0/debug.vsprops Sun Jun 1 17:18:10 2008 @@ -8,4 +8,8 @@ Name="VCCLCompilerTool" PreprocessorDefinitions="_DEBUG" /> - \ No newline at end of file + + Modified: python/branches/tlee-ast-optimize/PC/VS8.0/make_versioninfo.vcproj ============================================================================== --- python/branches/tlee-ast-optimize/PC/VS8.0/make_versioninfo.vcproj (original) +++ python/branches/tlee-ast-optimize/PC/VS8.0/make_versioninfo.vcproj Sun Jun 1 17:18:10 2008 @@ -67,6 +67,7 @@ /> + + + + + + + + Modified: python/branches/tlee-ast-optimize/PC/VS8.0/python.vcproj ============================================================================== --- python/branches/tlee-ast-optimize/PC/VS8.0/python.vcproj (original) +++ python/branches/tlee-ast-optimize/PC/VS8.0/python.vcproj Sun Jun 1 17:18:10 2008 @@ -62,6 +62,7 @@ /> + + + + @@ -1363,11 +1371,15 @@ > + + - - Modified: python/branches/tlee-ast-optimize/PC/VS8.0/release.vsprops ============================================================================== --- python/branches/tlee-ast-optimize/PC/VS8.0/release.vsprops (original) +++ python/branches/tlee-ast-optimize/PC/VS8.0/release.vsprops Sun Jun 1 17:18:10 2008 @@ -8,4 +8,8 @@ Name="VCCLCompilerTool" PreprocessorDefinitions="NDEBUG" /> + Modified: python/branches/tlee-ast-optimize/PC/VS8.0/x64.vsprops ============================================================================== --- python/branches/tlee-ast-optimize/PC/VS8.0/x64.vsprops (original) +++ python/branches/tlee-ast-optimize/PC/VS8.0/x64.vsprops Sun Jun 1 17:18:10 2008 @@ -15,4 +15,8 @@ Name="VCLinkerTool" TargetMachine="17" /> + Modified: python/branches/tlee-ast-optimize/PC/_msi.c ============================================================================== --- python/branches/tlee-ast-optimize/PC/_msi.c (original) +++ python/branches/tlee-ast-optimize/PC/_msi.c Sun Jun 1 17:18:10 2008 @@ -35,7 +35,7 @@ return NULL; } - oresult = PyString_FromString(cresult); + oresult = PyBytes_FromString(cresult); RpcStringFree(&cresult); return oresult; @@ -136,14 +136,14 @@ PyObject *result = PyObject_CallMethod(pv, "getnextcabinet", "i", pccab->iCab); if (result == NULL) return -1; - if (!PyString_Check(result)) { + if (!PyBytes_Check(result)) { PyErr_Format(PyExc_TypeError, "Incorrect return type %s from getnextcabinet", result->ob_type->tp_name); Py_DECREF(result); return FALSE; } - strncpy(pccab->szCab, PyString_AsString(result), sizeof(pccab->szCab)); + strncpy(pccab->szCab, PyBytes_AsString(result), sizeof(pccab->szCab)); return TRUE; } return FALSE; @@ -507,7 +507,7 @@ PyErr_SetString(PyExc_NotImplementedError, "FILETIME result"); return NULL; case VT_LPSTR: - result = PyString_FromStringAndSize(sval, ssize); + result = PyBytes_FromStringAndSize(sval, ssize); if (sval != sbuf) free(sval); return result; @@ -539,9 +539,9 @@ if (!PyArg_ParseTuple(args, "iO:SetProperty", &field, &data)) return NULL; - if (PyString_Check(data)) { + if (PyBytes_Check(data)) { status = MsiSummaryInfoSetProperty(si->h, field, VT_LPSTR, - 0, NULL, PyString_AsString(data)); + 0, NULL, PyBytes_AsString(data)); } else if (PyInt_Check(data)) { status = MsiSummaryInfoSetProperty(si->h, field, VT_I4, PyInt_AsLong(data), NULL, NULL); Modified: python/branches/tlee-ast-optimize/PC/_subprocess.c ============================================================================== --- python/branches/tlee-ast-optimize/PC/_subprocess.c (original) +++ python/branches/tlee-ast-optimize/PC/_subprocess.c Sun Jun 1 17:18:10 2008 @@ -304,42 +304,42 @@ if (!keys || !values) goto error; - out = PyString_FromStringAndSize(NULL, 2048); + out = PyBytes_FromStringAndSize(NULL, 2048); if (! out) goto error; - p = PyString_AS_STRING(out); + p = PyBytes_AS_STRING(out); for (i = 0; i < envsize; i++) { int ksize, vsize, totalsize; PyObject* key = PyList_GET_ITEM(keys, i); PyObject* value = PyList_GET_ITEM(values, i); - if (! PyString_Check(key) || ! PyString_Check(value)) { + if (! PyBytes_Check(key) || ! PyBytes_Check(value)) { PyErr_SetString(PyExc_TypeError, "environment can only contain strings"); goto error; } - ksize = PyString_GET_SIZE(key); - vsize = PyString_GET_SIZE(value); - totalsize = (p - PyString_AS_STRING(out)) + ksize + 1 + + ksize = PyBytes_GET_SIZE(key); + vsize = PyBytes_GET_SIZE(value); + totalsize = (p - PyBytes_AS_STRING(out)) + ksize + 1 + vsize + 1 + 1; - if (totalsize > PyString_GET_SIZE(out)) { - int offset = p - PyString_AS_STRING(out); - _PyString_Resize(&out, totalsize + 1024); - p = PyString_AS_STRING(out) + offset; + if (totalsize > PyBytes_GET_SIZE(out)) { + int offset = p - PyBytes_AS_STRING(out); + _PyBytes_Resize(&out, totalsize + 1024); + p = PyBytes_AS_STRING(out) + offset; } - memcpy(p, PyString_AS_STRING(key), ksize); + memcpy(p, PyBytes_AS_STRING(key), ksize); p += ksize; *p++ = '='; - memcpy(p, PyString_AS_STRING(value), vsize); + memcpy(p, PyBytes_AS_STRING(value), vsize); p += vsize; *p++ = '\0'; } /* add trailing null byte */ *p++ = '\0'; - _PyString_Resize(&out, p - PyString_AS_STRING(out)); + _PyBytes_Resize(&out, p - PyBytes_AS_STRING(out)); /* PyObject_Print(out, stdout, 0); */ @@ -413,7 +413,7 @@ NULL, inherit_handles, creation_flags, - environment ? PyString_AS_STRING(environment) : NULL, + environment ? PyBytes_AS_STRING(environment) : NULL, current_directory, &si, &pi); @@ -516,7 +516,7 @@ if (! result) return PyErr_SetFromWindowsErr(GetLastError()); - return PyString_FromString(filename); + return PyBytes_FromString(filename); } static PyMethodDef sp_functions[] = { Modified: python/branches/tlee-ast-optimize/PC/_winreg.c ============================================================================== --- python/branches/tlee-ast-optimize/PC/_winreg.c (original) +++ python/branches/tlee-ast-optimize/PC/_winreg.c Sun Jun 1 17:18:10 2008 @@ -424,7 +424,7 @@ PyHKEYObject *pyhkey = (PyHKEYObject *)ob; char resBuf[160]; wsprintf(resBuf, "", pyhkey->hkey); - return PyString_FromString(resBuf); + return PyBytes_FromString(resBuf); } static int @@ -767,11 +767,11 @@ return FALSE; need_decref = 1; } - if (!PyString_Check(value)) + if (!PyBytes_Check(value)) return FALSE; *retDataSize = 1 + strlen( - PyString_AS_STRING( - (PyStringObject *)value)); + PyBytes_AS_STRING( + (PyBytesObject *)value)); } *retDataBuf = (BYTE *)PyMem_NEW(DWORD, *retDataSize); if (*retDataBuf==NULL){ @@ -782,8 +782,8 @@ strcpy((char *)*retDataBuf, ""); else strcpy((char *)*retDataBuf, - PyString_AS_STRING( - (PyStringObject *)value)); + PyBytes_AS_STRING( + (PyBytesObject *)value)); if (need_decref) Py_DECREF(value); break; @@ -808,7 +808,7 @@ PyObject *t; t = PyList_GET_ITEM( (PyListObject *)value,j); - if (PyString_Check(t)) { + if (PyBytes_Check(t)) { obs[j] = t; Py_INCREF(t); } else if (PyUnicode_Check(t)) { @@ -821,8 +821,8 @@ } else goto reg_multi_fail; size += 1 + strlen( - PyString_AS_STRING( - (PyStringObject *)obs[j])); + PyBytes_AS_STRING( + (PyBytesObject *)obs[j])); } *retDataSize = size + 1; @@ -839,11 +839,11 @@ PyObject *t; t = obs[j]; strcpy(P, - PyString_AS_STRING( - (PyStringObject *)t)); + PyBytes_AS_STRING( + (PyBytesObject *)t)); P += 1 + strlen( - PyString_AS_STRING( - (PyStringObject *)t)); + PyBytes_AS_STRING( + (PyBytesObject *)t)); Py_DECREF(obs[j]); } /* And doubly-terminate the list... */ @@ -1085,7 +1085,7 @@ if (rc != ERROR_SUCCESS) return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx"); - retStr = PyString_FromStringAndSize(tmpbuf, len); + retStr = PyBytes_FromStringAndSize(tmpbuf, len); return retStr; /* can be NULL */ } @@ -1303,17 +1303,17 @@ != ERROR_SUCCESS) return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryValue"); - retStr = PyString_FromStringAndSize(NULL, bufSize); + retStr = PyBytes_FromStringAndSize(NULL, bufSize); if (retStr == NULL) return NULL; - retBuf = PyString_AS_STRING(retStr); + retBuf = PyBytes_AS_STRING(retStr); if ((rc = RegQueryValue(hKey, subKey, retBuf, &bufSize)) != ERROR_SUCCESS) { Py_DECREF(retStr); return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryValue"); } - _PyString_Resize(&retStr, strlen(retBuf)); + _PyBytes_Resize(&retStr, strlen(retBuf)); return retStr; } @@ -1414,14 +1414,14 @@ return NULL; } /* XXX - need Unicode support */ - str = PyString_AsString(obStrVal); + str = PyBytes_AsString(obStrVal); if (str == NULL) return NULL; - len = PyString_Size(obStrVal); + len = PyBytes_Size(obStrVal); if (obSubKey == Py_None) subKey = NULL; else { - subKey = PyString_AsString(obSubKey); + subKey = PyBytes_AsString(obSubKey); if (subKey == NULL) return NULL; } Modified: python/branches/tlee-ast-optimize/PC/bdist_wininst/install.c ============================================================================== --- python/branches/tlee-ast-optimize/PC/bdist_wininst/install.c (original) +++ python/branches/tlee-ast-optimize/PC/bdist_wininst/install.c Sun Jun 1 17:18:10 2008 @@ -2115,11 +2115,6 @@ { HKEY hk; char key_name[80]; - OSVERSIONINFO winverinfo; - winverinfo.dwOSVersionInfoSize = sizeof(winverinfo); - // If less than XP, then we can't do it (and its not necessary). - if (!GetVersionEx(&winverinfo) || winverinfo.dwMajorVersion < 5) - return FALSE; // no Python version info == we can't know yet. if (target_version[0] == '\0') return FALSE; @@ -2135,6 +2130,23 @@ return TRUE; } +// Returns TRUE if the platform supports UAC. +BOOL PlatformSupportsUAC() +{ + // Note that win2k does seem to support ShellExecute with 'runas', + // but does *not* support IsUserAnAdmin - so we just pretend things + // only work on XP and later. + BOOL bIsWindowsXPorLater; + OSVERSIONINFO winverinfo; + winverinfo.dwOSVersionInfoSize = sizeof(winverinfo); + if (!GetVersionEx(&winverinfo)) + return FALSE; // something bad has gone wrong + bIsWindowsXPorLater = + ( (winverinfo.dwMajorVersion > 5) || + ( (winverinfo.dwMajorVersion == 5) && (winverinfo.dwMinorVersion >= 1) )); + return bIsWindowsXPorLater; +} + // Spawn ourself as an elevated application. On failure, a message is // displayed to the user - but this app will always terminate, even // on error. @@ -2190,7 +2202,7 @@ // See if we need to do the Vista UAC magic. if (strcmp(user_access_control, "force")==0) { - if (!MyIsUserAnAdmin()) { + if (PlatformSupportsUAC() && !MyIsUserAnAdmin()) { SpawnUAC(); return 0; } @@ -2198,7 +2210,7 @@ } else if (strcmp(user_access_control, "auto")==0) { // Check if it looks like we need UAC control, based // on how Python itself was installed. - if (!MyIsUserAnAdmin() && NeedAutoUAC()) { + if (PlatformSupportsUAC() && !MyIsUserAnAdmin() && NeedAutoUAC()) { SpawnUAC(); return 0; } Modified: python/branches/tlee-ast-optimize/PC/msvcrtmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/PC/msvcrtmodule.c (original) +++ python/branches/tlee-ast-optimize/PC/msvcrtmodule.c Sun Jun 1 17:18:10 2008 @@ -140,7 +140,7 @@ ch = _getch(); Py_END_ALLOW_THREADS s[0] = ch; - return PyString_FromStringAndSize(s, 1); + return PyBytes_FromStringAndSize(s, 1); } static PyObject * @@ -172,7 +172,7 @@ ch = _getche(); Py_END_ALLOW_THREADS s[0] = ch; - return PyString_FromStringAndSize(s, 1); + return PyBytes_FromStringAndSize(s, 1); } static PyObject * Modified: python/branches/tlee-ast-optimize/PC/winsound.c ============================================================================== --- python/branches/tlee-ast-optimize/PC/winsound.c (original) +++ python/branches/tlee-ast-optimize/PC/winsound.c Sun Jun 1 17:18:10 2008 @@ -151,7 +151,7 @@ static void add_define(PyObject *dict, const char *key, long value) { - PyObject *k=PyString_FromString(key); + PyObject *k=PyBytes_FromString(key); PyObject *v=PyLong_FromLong(value); if(v&&k) { Modified: python/branches/tlee-ast-optimize/PCbuild/pythoncore.vcproj ============================================================================== --- python/branches/tlee-ast-optimize/PCbuild/pythoncore.vcproj (original) +++ python/branches/tlee-ast-optimize/PCbuild/pythoncore.vcproj Sun Jun 1 17:18:10 2008 @@ -659,6 +659,10 @@ > + + @@ -1371,6 +1375,10 @@ > + + @@ -1491,10 +1499,6 @@ > - - Modified: python/branches/tlee-ast-optimize/Parser/asdl_c.py ============================================================================== --- python/branches/tlee-ast-optimize/Parser/asdl_c.py (original) +++ python/branches/tlee-ast-optimize/Parser/asdl_c.py Sun Jun 1 17:18:10 2008 @@ -375,7 +375,7 @@ # there's really nothing more we can do if this fails ... self.emit("if (tmp == NULL) goto failed;", 1) error = "expected some sort of %s, but got %%.400s" % name - format = "PyErr_Format(PyExc_TypeError, \"%s\", PyString_AS_STRING(tmp));" + format = "PyErr_Format(PyExc_TypeError, \"%s\", PyBytes_AS_STRING(tmp));" self.emit(format % error, 1, reflow=False) self.emit("failed:", 0) self.emit("Py_XDECREF(tmp);", 1) @@ -710,7 +710,7 @@ fnames = PyTuple_New(num_fields); if (!fnames) return NULL; for (i = 0; i < num_fields; i++) { - PyObject *field = PyString_FromString(fields[i]); + PyObject *field = PyBytes_FromString(fields[i]); if (!field) { Py_DECREF(fnames); return NULL; @@ -729,7 +729,7 @@ PyObject *s, *l = PyTuple_New(num_fields); if (!l) return 0; for(i = 0; i < num_fields; i++) { - s = PyString_FromString(attrs[i]); + s = PyBytes_FromString(attrs[i]); if (!s) { Py_DECREF(l); return 0; @@ -803,7 +803,7 @@ PyObject *s = PyObject_Repr(obj); if (s == NULL) return 1; PyErr_Format(PyExc_ValueError, "invalid integer value: %.400s", - PyString_AS_STRING(s)); + PyBytes_AS_STRING(s)); Py_DECREF(s); return 1; } @@ -821,7 +821,7 @@ PyObject *s = PyObject_Repr(obj); if (s == NULL) return 1; PyErr_Format(PyExc_ValueError, "invalid boolean value: %.400s", - PyString_AS_STRING(s)); + PyBytes_AS_STRING(s)); Py_DECREF(s); return 1; } Modified: python/branches/tlee-ast-optimize/Parser/tokenizer.c ============================================================================== --- python/branches/tlee-ast-optimize/Parser/tokenizer.c (original) +++ python/branches/tlee-ast-optimize/Parser/tokenizer.c Sun Jun 1 17:18:10 2008 @@ -12,7 +12,7 @@ #ifndef PGEN #include "unicodeobject.h" -#include "stringobject.h" +#include "bytesobject.h" #include "fileobject.h" #include "codecs.h" #include "abstract.h" @@ -344,7 +344,7 @@ 1) NULL: need to call tok->decoding_readline to get a new line 2) PyUnicodeObject *: decoding_feof has called tok->decoding_readline and stored the result in tok->decoding_buffer - 3) PyStringObject *: previous call to fp_readl did not have enough room + 3) PyBytesObject *: previous call to fp_readl did not have enough room (in the s buffer) to copy entire contents of the line read by tok->decoding_readline. tok->decoding_buffer has the overflow. In this case, fp_readl is called in a loop (with an expanded buffer) @@ -375,7 +375,7 @@ return error_ret(tok); } else { tok->decoding_buffer = NULL; - if (PyString_CheckExact(buf)) + if (PyBytes_CheckExact(buf)) utf8 = buf; } if (utf8 == NULL) { @@ -384,10 +384,10 @@ if (utf8 == NULL) return error_ret(tok); } - str = PyString_AsString(utf8); - utf8len = PyString_GET_SIZE(utf8); + str = PyBytes_AsString(utf8); + utf8len = PyBytes_GET_SIZE(utf8); if (utf8len > size) { - tok->decoding_buffer = PyString_FromStringAndSize(str+size, utf8len-size); + tok->decoding_buffer = PyBytes_FromStringAndSize(str+size, utf8len-size); if (tok->decoding_buffer == NULL) { Py_DECREF(utf8); return error_ret(tok); @@ -591,7 +591,7 @@ utf8 = translate_into_utf8(str, tok->enc); if (utf8 == NULL) return error_ret(tok); - str = PyString_AsString(utf8); + str = PyBytes_AsString(utf8); } #endif for (s = str;; s++) { @@ -624,7 +624,7 @@ "unknown encoding: %s", tok->enc); return error_ret(tok); } - str = PyString_AsString(utf8); + str = PyBytes_AsString(utf8); } #endif assert(tok->decoding_buffer == NULL); @@ -706,11 +706,11 @@ return 0; enc = ((PyFileObject *)sysstdin)->f_encoding; - if (enc == NULL || !PyString_Check(enc)) + if (enc == NULL || !PyBytes_Check(enc)) return 0; Py_INCREF(enc); - encoding = PyString_AsString(enc); + encoding = PyBytes_AsString(enc); decoded = PyUnicode_Decode(*inp, strlen(*inp), encoding, NULL); if (decoded == NULL) goto error_clear; @@ -720,9 +720,9 @@ if (utf8 == NULL) goto error_clear; - assert(PyString_Check(utf8)); - converted = new_string(PyString_AS_STRING(utf8), - PyString_GET_SIZE(utf8)); + assert(PyBytes_Check(utf8)); + converted = new_string(PyBytes_AS_STRING(utf8), + PyBytes_GET_SIZE(utf8)); Py_DECREF(utf8); if (converted == NULL) goto error_nomem; @@ -1609,8 +1609,8 @@ /* convert source to original encondig */ PyObject *lineobj = dec_utf8(tok->encoding, tok->buf, len); if (lineobj != NULL) { - int linelen = PyString_Size(lineobj); - const char *line = PyString_AsString(lineobj); + int linelen = PyBytes_Size(lineobj); + const char *line = PyBytes_AsString(lineobj); text = PyObject_MALLOC(linelen + 1); if (text != NULL && line != NULL) { if (linelen) @@ -1624,7 +1624,7 @@ PyObject *offsetobj = dec_utf8(tok->encoding, tok->buf, *offset-1); if (offsetobj) { - *offset = PyString_Size(offsetobj) + 1; + *offset = PyBytes_Size(offsetobj) + 1; Py_DECREF(offsetobj); } } Modified: python/branches/tlee-ast-optimize/Python/Python-ast.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/Python-ast.c (original) +++ python/branches/tlee-ast-optimize/Python/Python-ast.c Sun Jun 1 17:18:10 2008 @@ -499,7 +499,7 @@ fnames = PyTuple_New(num_fields); if (!fnames) return NULL; for (i = 0; i < num_fields; i++) { - PyObject *field = PyString_FromString(fields[i]); + PyObject *field = PyBytes_FromString(fields[i]); if (!field) { Py_DECREF(fnames); return NULL; @@ -518,7 +518,7 @@ PyObject *s, *l = PyTuple_New(num_fields); if (!l) return 0; for(i = 0; i < num_fields; i++) { - s = PyString_FromString(attrs[i]); + s = PyBytes_FromString(attrs[i]); if (!s) { Py_DECREF(l); return 0; @@ -592,7 +592,7 @@ PyObject *s = PyObject_Repr(obj); if (s == NULL) return 1; PyErr_Format(PyExc_ValueError, "invalid integer value: %.400s", - PyString_AS_STRING(s)); + PyBytes_AS_STRING(s)); Py_DECREF(s); return 1; } @@ -610,7 +610,7 @@ PyObject *s = PyObject_Repr(obj); if (s == NULL) return 1; PyErr_Format(PyExc_ValueError, "invalid boolean value: %.400s", - PyString_AS_STRING(s)); + PyBytes_AS_STRING(s)); Py_DECREF(s); return 1; } @@ -3320,7 +3320,7 @@ tmp = PyObject_Repr(obj); if (tmp == NULL) goto failed; - PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %.400s", PyString_AS_STRING(tmp)); + PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %.400s", PyBytes_AS_STRING(tmp)); failed: Py_XDECREF(tmp); return 1; @@ -4448,7 +4448,7 @@ tmp = PyObject_Repr(obj); if (tmp == NULL) goto failed; - PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %.400s", PyString_AS_STRING(tmp)); + PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %.400s", PyBytes_AS_STRING(tmp)); failed: Py_XDECREF(tmp); return 1; @@ -5318,7 +5318,7 @@ tmp = PyObject_Repr(obj); if (tmp == NULL) goto failed; - PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %.400s", PyString_AS_STRING(tmp)); + PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %.400s", PyBytes_AS_STRING(tmp)); failed: Py_XDECREF(tmp); return 1; @@ -5356,7 +5356,7 @@ tmp = PyObject_Repr(obj); if (tmp == NULL) goto failed; - PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %.400s", PyString_AS_STRING(tmp)); + PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %.400s", PyBytes_AS_STRING(tmp)); failed: Py_XDECREF(tmp); return 1; @@ -5474,7 +5474,7 @@ tmp = PyObject_Repr(obj); if (tmp == NULL) goto failed; - PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %.400s", PyString_AS_STRING(tmp)); + PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %.400s", PyBytes_AS_STRING(tmp)); failed: Py_XDECREF(tmp); return 1; @@ -5496,7 +5496,7 @@ tmp = PyObject_Repr(obj); if (tmp == NULL) goto failed; - PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %.400s", PyString_AS_STRING(tmp)); + PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %.400s", PyBytes_AS_STRING(tmp)); failed: Py_XDECREF(tmp); return 1; @@ -5558,7 +5558,7 @@ tmp = PyObject_Repr(obj); if (tmp == NULL) goto failed; - PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %.400s", PyString_AS_STRING(tmp)); + PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %.400s", PyBytes_AS_STRING(tmp)); failed: Py_XDECREF(tmp); return 1; @@ -5588,7 +5588,7 @@ tmp = PyObject_Repr(obj); if (tmp == NULL) goto failed; - PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %.400s", PyString_AS_STRING(tmp)); + PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %.400s", PyBytes_AS_STRING(tmp)); failed: Py_XDECREF(tmp); return 1; @@ -5642,7 +5642,7 @@ tmp = PyObject_Repr(obj); if (tmp == NULL) goto failed; - PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %.400s", PyString_AS_STRING(tmp)); + PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %.400s", PyBytes_AS_STRING(tmp)); failed: Py_XDECREF(tmp); return 1; @@ -5808,7 +5808,7 @@ tmp = PyObject_Repr(obj); if (tmp == NULL) goto failed; - PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %.400s", PyString_AS_STRING(tmp)); + PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %.400s", PyBytes_AS_STRING(tmp)); failed: Py_XDECREF(tmp); return 1; Modified: python/branches/tlee-ast-optimize/Python/_warnings.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/_warnings.c (original) +++ python/branches/tlee-ast-optimize/Python/_warnings.c Sun Jun 1 17:18:10 2008 @@ -44,7 +44,7 @@ int result; if (warnings_str == NULL) { - warnings_str = PyString_InternFromString("warnings"); + warnings_str = PyBytes_InternFromString("warnings"); if (warnings_str == NULL) return NULL; } @@ -132,7 +132,7 @@ return NULL; if (good_msg && is_subclass && good_mod && (ln == 0 || lineno == ln)) - return PyString_AsString(action); + return PyBytes_AsString(action); } m = PyImport_ImportModule(MODULE_NAME); @@ -144,7 +144,7 @@ return NULL; action = PyDict_GetItemString(d, DEFAULT_ACTION_NAME); if (action != NULL) - return PyString_AsString(action); + return PyBytes_AsString(action); PyErr_SetString(PyExc_ValueError, MODULE_NAME "." DEFAULT_ACTION_NAME " not found"); @@ -184,17 +184,17 @@ if (rc == -1) return NULL; else if (rc == 0) - return PyString_FromString(""); + return PyBytes_FromString(""); - mod_str = PyString_AsString(filename); + mod_str = PyBytes_AsString(filename); if (mod_str == NULL) return NULL; - len = PyString_Size(filename); + len = PyBytes_Size(filename); if (len < 0) return NULL; if (len >= 3 && strncmp(mod_str + (len - 3), ".py", 3) == 0) { - module = PyString_FromStringAndSize(mod_str, len-3); + module = PyBytes_FromStringAndSize(mod_str, len-3); } else { module = filename; @@ -258,7 +258,7 @@ /* Print " source_line\n" */ PyFile_WriteString(" ", f_stderr); if (sourceline) { - char *source_line_str = PyString_AS_STRING(sourceline); + char *source_line_str = PyBytes_AS_STRING(sourceline); while (*source_line_str == ' ' || *source_line_str == '\t' || *source_line_str == '\014') source_line_str++; @@ -267,7 +267,7 @@ PyFile_WriteString("\n", f_stderr); } else - Py_DisplaySourceLine(f_stderr, PyString_AS_STRING(filename), lineno); + Py_DisplaySourceLine(f_stderr, PyBytes_AS_STRING(filename), lineno); PyErr_Clear(); } @@ -359,7 +359,7 @@ const char *err_str = "???"; if (to_str != NULL) - err_str = PyString_AS_STRING(to_str); + err_str = PyBytes_AS_STRING(to_str); PyErr_Format(PyExc_RuntimeError, "Unrecognized action (%s) in warnings.filters:\n %s", action, err_str); @@ -380,7 +380,7 @@ else { const char *msg = "functions overriding warnings.showwarning() " "must support the 'line' argument"; - const char *text_char = PyString_AS_STRING(text); + const char *text_char = PyBytes_AS_STRING(text); if (strcmp(msg, text_char) == 0) { /* Prevent infinite recursion by using built-in implementation @@ -484,7 +484,7 @@ /* Setup module. */ *module = PyDict_GetItemString(globals, "__name__"); if (*module == NULL) { - *module = PyString_FromString(""); + *module = PyBytes_FromString(""); if (*module == NULL) goto handle_error; } @@ -494,8 +494,8 @@ /* Setup filename. */ *filename = PyDict_GetItemString(globals, "__file__"); if (*filename != NULL) { - Py_ssize_t len = PyString_Size(*filename); - const char *file_str = PyString_AsString(*filename); + Py_ssize_t len = PyBytes_Size(*filename); + const char *file_str = PyBytes_AsString(*filename); if (file_str == NULL || (len < 0 && PyErr_Occurred())) goto handle_error; @@ -507,7 +507,7 @@ (tolower(file_str[len-1]) == 'c' || tolower(file_str[len-1]) == 'o')) { - *filename = PyString_FromStringAndSize(file_str, len-1); + *filename = PyBytes_FromStringAndSize(file_str, len-1); if (*filename == NULL) goto handle_error; } @@ -515,7 +515,7 @@ Py_INCREF(*filename); } else { - const char *module_str = PyString_AsString(*module); + const char *module_str = PyBytes_AsString(*module); if (module_str && strcmp(module_str, "__main__") == 0) { PyObject *argv = PySys_GetObject("argv"); if (argv != NULL && PyList_Size(argv) > 0) { @@ -530,14 +530,14 @@ } else if (!is_true) { Py_DECREF(*filename); - *filename = PyString_FromString("__main__"); + *filename = PyBytes_FromString("__main__"); if (*filename == NULL) goto handle_error; } } else { /* embedded interpreters don't have sys.argv, see bug #839151 */ - *filename = PyString_FromString("__main__"); + *filename = PyBytes_FromString("__main__"); if (*filename == NULL) goto handle_error; } @@ -649,12 +649,12 @@ PyObject *returned; if (get_source_name == NULL) { - get_source_name = PyString_InternFromString("get_source"); + get_source_name = PyBytes_InternFromString("get_source"); if (!get_source_name) return NULL; } if (splitlines_name == NULL) { - splitlines_name = PyString_InternFromString("splitlines"); + splitlines_name = PyBytes_InternFromString("splitlines"); if (!splitlines_name) return NULL; } @@ -711,7 +711,7 @@ PyErr_WarnEx(PyObject *category, const char *text, Py_ssize_t stack_level) { PyObject *res; - PyObject *message = PyString_FromString(text); + PyObject *message = PyBytes_FromString(text); if (message == NULL) return -1; @@ -745,15 +745,15 @@ const char *module_str, PyObject *registry) { PyObject *res; - PyObject *message = PyString_FromString(text); - PyObject *filename = PyString_FromString(filename_str); + PyObject *message = PyBytes_FromString(text); + PyObject *filename = PyBytes_FromString(filename_str); PyObject *module = NULL; int ret = -1; if (message == NULL || filename == NULL) goto exit; if (module_str != NULL) { - module = PyString_FromString(module_str); + module = PyBytes_FromString(module_str); if (module == NULL) goto exit; } @@ -775,15 +775,6 @@ } -int -PyErr_WarnPy3k(const char *text, Py_ssize_t stacklevel) -{ - if (Py_Py3kWarningFlag) - return PyErr_WarnEx(PyExc_DeprecationWarning, text, stacklevel); - return 0; -} - - PyDoc_STRVAR(warn_doc, "Issue a warning, or maybe ignore it or raise an exception."); @@ -812,7 +803,7 @@ if (!strcmp(action, "ignore")) { if (ignore_str == NULL) { - ignore_str = PyString_InternFromString("ignore"); + ignore_str = PyBytes_InternFromString("ignore"); if (ignore_str == NULL) return NULL; } @@ -820,7 +811,7 @@ } else if (!strcmp(action, "error")) { if (error_str == NULL) { - error_str = PyString_InternFromString("error"); + error_str = PyBytes_InternFromString("error"); if (error_str == NULL) return NULL; } @@ -828,7 +819,7 @@ } else if (!strcmp(action, "default")) { if (default_str == NULL) { - default_str = PyString_InternFromString("default"); + default_str = PyBytes_InternFromString("default"); if (default_str == NULL) return NULL; } @@ -901,7 +892,7 @@ if (PyModule_AddObject(m, "once_registry", _once_registry) < 0) return; - default_action = PyString_InternFromString("default"); + default_action = PyBytes_InternFromString("default"); if (default_action == NULL) return; if (PyModule_AddObject(m, DEFAULT_ACTION_NAME, default_action) < 0) Modified: python/branches/tlee-ast-optimize/Python/ast.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/ast.c (original) +++ python/branches/tlee-ast-optimize/Python/ast.c Sun Jun 1 17:18:10 2008 @@ -46,7 +46,7 @@ static identifier new_identifier(const char* n, PyArena *arena) { - PyObject* id = PyString_InternFromString(n); + PyObject* id = PyBytes_InternFromString(n); PyArena_AddPyObject(arena, id); return id; } @@ -352,7 +352,7 @@ switch (e->kind) { case Attribute_kind: if (ctx == Store && - !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) { + !strcmp(PyBytes_AS_STRING(e->v.Attribute.attr), "None")) { return ast_error(n, "assignment to None"); } e->v.Attribute.ctx = ctx; @@ -362,7 +362,7 @@ break; case Name_kind: if (ctx == Store && - !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) { + !strcmp(PyBytes_AS_STRING(e->v.Name.id), "None")) { return ast_error(n, "assignment to None"); } e->v.Name.ctx = ctx; @@ -1276,7 +1276,7 @@ if (errstr) { char *s = ""; char buf[128]; - s = PyString_AsString(errstr); + s = PyBytes_AsString(errstr); PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s); ast_error(n, buf); } else { @@ -1921,7 +1921,7 @@ return NULL; } key = e->v.Name.id; - if (!strcmp(PyString_AS_STRING(key), "None")) { + if (!strcmp(PyBytes_AS_STRING(key), "None")) { ast_error(CHILD(ch, 0), "assignment to None"); return NULL; } @@ -2050,7 +2050,7 @@ "expression not possible"); return NULL; case Name_kind: { - const char *var_name = PyString_AS_STRING(expr1->v.Name.id); + const char *var_name = PyBytes_AS_STRING(expr1->v.Name.id); if (var_name[0] == 'N' && !strcmp(var_name, "None")) { ast_error(ch, "assignment to None"); return NULL; @@ -2326,10 +2326,10 @@ /* length of string plus one for the dot */ len += strlen(STR(CHILD(n, i))) + 1; len--; /* the last name doesn't have a dot */ - str = PyString_FromStringAndSize(NULL, len); + str = PyBytes_FromStringAndSize(NULL, len); if (!str) return NULL; - s = PyString_AS_STRING(str); + s = PyBytes_AS_STRING(str); if (!s) return NULL; for (i = 0; i < NCH(n); i += 2) { @@ -2340,13 +2340,13 @@ } --s; *s = '\0'; - PyString_InternInPlace(&str); + PyBytes_InternInPlace(&str); PyArena_AddPyObject(c->c_arena, str); return alias(str, NULL, c->c_arena); } break; case STAR: - str = PyString_InternFromString("*"); + str = PyBytes_InternFromString("*"); PyArena_AddPyObject(c->c_arena, str); return alias(str, NULL, c->c_arena); default: @@ -3196,10 +3196,10 @@ u = NULL; } else { /* "\XX" may become "\u005c\uHHLL" (12 bytes) */ - u = PyString_FromStringAndSize((char *)NULL, len * 4); + u = PyBytes_FromStringAndSize((char *)NULL, len * 4); if (u == NULL) return NULL; - p = buf = PyString_AsString(u); + p = buf = PyBytes_AsString(u); end = s + len; while (s < end) { if (*s == '\\') { @@ -3218,8 +3218,8 @@ Py_DECREF(u); return NULL; } - r = PyString_AsString(w); - rn = PyString_Size(w); + r = PyBytes_AsString(w); + rn = PyBytes_Size(w); assert(rn % 2 == 0); for (i = 0; i < rn; i += 2) { sprintf(p, "\\u%02x%02x", @@ -3318,11 +3318,11 @@ return v; #endif } else { - return PyString_FromStringAndSize(s, len); + return PyBytes_FromStringAndSize(s, len); } } - return PyString_DecodeEscape(s, len, NULL, unicode, + return PyBytes_DecodeEscape(s, len, NULL, unicode, need_encoding ? c->c_encoding : NULL); } @@ -3343,8 +3343,8 @@ s = parsestr(c, STR(CHILD(n, i))); if (s == NULL) goto onError; - if (PyString_Check(v) && PyString_Check(s)) { - PyString_ConcatAndDel(&v, s); + if (PyBytes_Check(v) && PyBytes_Check(s)) { + PyBytes_ConcatAndDel(&v, s); if (v == NULL) goto onError; } Modified: python/branches/tlee-ast-optimize/Python/bltinmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/bltinmodule.c (original) +++ python/branches/tlee-ast-optimize/Python/bltinmodule.c Sun Jun 1 17:18:10 2008 @@ -249,7 +249,7 @@ return NULL; /* Strings and tuples return a result of the same type. */ - if (PyString_Check(seq)) + if (PyBytes_Check(seq)) return filterstring(func, seq); #ifdef Py_USING_UNICODE if (PyUnicode_Check(seq)) @@ -383,7 +383,7 @@ return NULL; } s[0] = (char)x; - return PyString_FromStringAndSize(s, 1); + return PyBytes_FromStringAndSize(s, 1); } PyDoc_STRVAR(chr_doc, @@ -671,7 +671,7 @@ return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals); } - if (!PyString_Check(cmd) && + if (!PyBytes_Check(cmd) && !PyUnicode_Check(cmd)) { PyErr_SetString(PyExc_TypeError, "eval() arg 1 must be a string or code object"); @@ -688,7 +688,7 @@ cf.cf_flags |= PyCF_SOURCE_IS_UTF8; } #endif - if (PyString_AsStringAndSize(cmd, &str, NULL)) { + if (PyBytes_AsStringAndSize(cmd, &str, NULL)) { Py_XDECREF(tmp); return NULL; } @@ -833,7 +833,7 @@ } #endif - if (!PyString_Check(name)) { + if (!PyBytes_Check(name)) { PyErr_SetString(PyExc_TypeError, "getattr(): attribute name must be string"); return NULL; @@ -889,7 +889,7 @@ } #endif - if (!PyString_Check(name)) { + if (!PyBytes_Check(name)) { PyErr_SetString(PyExc_TypeError, "hasattr(): attribute name must be string"); return NULL; @@ -1208,7 +1208,7 @@ return NULL; } res = (*nb->nb_hex)(v); - if (res && !PyString_Check(res)) { + if (res && !PyBytes_Check(res)) { PyErr_Format(PyExc_TypeError, "__hex__ returned non-string (type %.200s)", res->ob_type->tp_name); @@ -1268,13 +1268,13 @@ PyObject *s; if (!PyArg_ParseTuple(args, "S:intern", &s)) return NULL; - if (!PyString_CheckExact(s)) { + if (!PyBytes_CheckExact(s)) { PyErr_SetString(PyExc_TypeError, "can't intern subclass of string"); return NULL; } Py_INCREF(s); - PyString_InternInPlace(&s); + PyBytes_InternInPlace(&s); return s; } @@ -1476,7 +1476,7 @@ return NULL; } res = (*nb->nb_oct)(v); - if (res && !PyString_Check(res)) { + if (res && !PyBytes_Check(res)) { PyErr_Format(PyExc_TypeError, "__oct__ returned non-string (type %.200s)", res->ob_type->tp_name); @@ -1511,16 +1511,16 @@ long ord; Py_ssize_t size; - if (PyString_Check(obj)) { - size = PyString_GET_SIZE(obj); + if (PyBytes_Check(obj)) { + size = PyBytes_GET_SIZE(obj); if (size == 1) { - ord = (long)((unsigned char)*PyString_AS_STRING(obj)); + ord = (long)((unsigned char)*PyBytes_AS_STRING(obj)); return PyInt_FromLong(ord); } - } else if (PyBytes_Check(obj)) { - size = PyBytes_GET_SIZE(obj); + } else if (PyByteArray_Check(obj)) { + size = PyByteArray_GET_SIZE(obj); if (size == 1) { - ord = (long)((unsigned char)*PyBytes_AS_STRING(obj)); + ord = (long)((unsigned char)*PyByteArray_AS_STRING(obj)); return PyInt_FromLong(ord); } @@ -1591,14 +1591,14 @@ Py_RETURN_NONE; } - if (sep && sep != Py_None && !PyString_Check(sep) && + if (sep && sep != Py_None && !PyBytes_Check(sep) && !PyUnicode_Check(sep)) { PyErr_Format(PyExc_TypeError, "sep must be None, str or unicode, not %.200s", sep->ob_type->tp_name); return NULL; } - if (end && end != Py_None && !PyString_Check(end) && + if (end && end != Py_None && !PyBytes_Check(end) && !PyUnicode_Check(end)) { PyErr_Format(PyExc_TypeError, "end must be None, str or unicode, not %.200s", @@ -1967,7 +1967,7 @@ po = PyObject_Str(v); if (po == NULL) return NULL; - prompt = PyString_AsString(po); + prompt = PyBytes_AsString(po); if (prompt == NULL) return NULL; } @@ -1995,7 +1995,7 @@ result = NULL; } else { - result = PyString_FromStringAndSize(s, len-1); + result = PyBytes_FromStringAndSize(s, len-1); } } PyMem_FREE(s); @@ -2324,14 +2324,14 @@ return PyFloat_FromDouble(f_result); } if (PyFloat_CheckExact(item)) { - PyFPE_START_PROTECT("add", return 0) + PyFPE_START_PROTECT("add", Py_DECREF(item); Py_DECREF(iter); return 0) f_result += PyFloat_AS_DOUBLE(item); PyFPE_END_PROTECT(f_result) Py_DECREF(item); continue; } if (PyInt_CheckExact(item)) { - PyFPE_START_PROTECT("add", return 0) + PyFPE_START_PROTECT("add", Py_DECREF(item); Py_DECREF(iter); return 0) f_result += (double)PyInt_AS_LONG(item); PyFPE_END_PROTECT(f_result) Py_DECREF(item); @@ -2637,8 +2637,8 @@ SETBUILTIN("basestring", &PyBaseString_Type); SETBUILTIN("bool", &PyBool_Type); /* SETBUILTIN("memoryview", &PyMemoryView_Type); */ - SETBUILTIN("bytearray", &PyBytes_Type); - SETBUILTIN("bytes", &PyString_Type); + SETBUILTIN("bytearray", &PyByteArray_Type); + SETBUILTIN("bytes", &PyBytes_Type); SETBUILTIN("buffer", &PyBuffer_Type); SETBUILTIN("classmethod", &PyClassMethod_Type); #ifndef WITHOUT_COMPLEX @@ -2658,7 +2658,7 @@ SETBUILTIN("set", &PySet_Type); SETBUILTIN("slice", &PySlice_Type); SETBUILTIN("staticmethod", &PyStaticMethod_Type); - SETBUILTIN("str", &PyString_Type); + SETBUILTIN("str", &PyBytes_Type); SETBUILTIN("super", &PySuper_Type); SETBUILTIN("tuple", &PyTuple_Type); SETBUILTIN("type", &PyType_Type); @@ -2756,7 +2756,7 @@ { PyObject *result; Py_ssize_t i, j; - Py_ssize_t len = PyString_Size(strobj); + Py_ssize_t len = PyBytes_Size(strobj); Py_ssize_t outlen = len; if (func == Py_None) { @@ -2764,12 +2764,12 @@ * as no character is ever false and __getitem__ * does return this character. If it's a subclass * we must go through the __getitem__ loop */ - if (PyString_CheckExact(strobj)) { + if (PyBytes_CheckExact(strobj)) { Py_INCREF(strobj); return strobj; } } - if ((result = PyString_FromStringAndSize(NULL, len)) == NULL) + if ((result = PyBytes_FromStringAndSize(NULL, len)) == NULL) return NULL; for (i = j = 0; i < len; ++i) { @@ -2799,16 +2799,16 @@ } if (ok) { Py_ssize_t reslen; - if (!PyString_Check(item)) { + if (!PyBytes_Check(item)) { PyErr_SetString(PyExc_TypeError, "can't filter str to str:" " __getitem__ returned different type"); Py_DECREF(item); goto Fail_1; } - reslen = PyString_GET_SIZE(item); + reslen = PyBytes_GET_SIZE(item); if (reslen == 1) { - PyString_AS_STRING(result)[j++] = - PyString_AS_STRING(item)[0]; + PyBytes_AS_STRING(result)[j++] = + PyBytes_AS_STRING(item)[0]; } else { /* do we need more space? */ Py_ssize_t need = j + reslen + len-i-1; @@ -2816,15 +2816,15 @@ /* overallocate, to avoid reallocations */ if (need<2*outlen) need = 2*outlen; - if (_PyString_Resize(&result, need)) { + if (_PyBytes_Resize(&result, need)) { Py_DECREF(item); return NULL; } outlen = need; } memcpy( - PyString_AS_STRING(result) + j, - PyString_AS_STRING(item), + PyBytes_AS_STRING(result) + j, + PyBytes_AS_STRING(item), reslen ); j += reslen; @@ -2834,7 +2834,7 @@ } if (j < outlen) - _PyString_Resize(&result, j); + _PyBytes_Resize(&result, j); return result; Modified: python/branches/tlee-ast-optimize/Python/ceval.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/ceval.c (original) +++ python/branches/tlee-ast-optimize/Python/ceval.c Sun Jun 1 17:18:10 2008 @@ -739,7 +739,7 @@ consts = co->co_consts; fastlocals = f->f_localsplus; freevars = f->f_localsplus + co->co_nlocals; - first_instr = (unsigned char*) PyString_AS_STRING(co->co_code); + first_instr = (unsigned char*) PyBytes_AS_STRING(co->co_code); /* An explanation is in order for the next line. f->f_lasti now refers to the index of the last instruction @@ -766,7 +766,7 @@ lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL; #endif #if defined(Py_DEBUG) || defined(LLTRACE) - filename = PyString_AsString(co->co_filename); + filename = PyBytes_AsString(co->co_filename); #endif why = WHY_NOT; @@ -1147,8 +1147,8 @@ goto slow_add; x = PyInt_FromLong(i); } - else if (PyString_CheckExact(v) && - PyString_CheckExact(w)) { + else if (PyBytes_CheckExact(v) && + PyBytes_CheckExact(w)) { x = string_concatenate(v, w, f, next_instr); /* string_concatenate consumed the ref to v */ goto skip_decref_vx; @@ -1349,8 +1349,8 @@ goto slow_iadd; x = PyInt_FromLong(i); } - else if (PyString_CheckExact(v) && - PyString_CheckExact(w)) { + else if (PyBytes_CheckExact(v) && + PyBytes_CheckExact(w)) { x = string_concatenate(v, w, f, next_instr); /* string_concatenate consumed the ref to v */ goto skip_decref_v; @@ -1576,9 +1576,9 @@ err = PyFile_WriteObject(v, w, Py_PRINT_RAW); if (err == 0) { /* XXX move into writeobject() ? */ - if (PyString_Check(v)) { - char *s = PyString_AS_STRING(v); - Py_ssize_t len = PyString_GET_SIZE(v); + if (PyBytes_Check(v)) { + char *s = PyBytes_AS_STRING(v); + Py_ssize_t len = PyBytes_GET_SIZE(v); if (len == 0 || !isspace(Py_CHARMASK(s[len-1])) || s[len-1] == ' ') @@ -1705,7 +1705,7 @@ retval = POP(); } else if (PyExceptionClass_Check(v) || - PyString_Check(v)) { + PyBytes_Check(v)) { w = POP(); u = POP(); PyErr_Restore(v, w, u); @@ -1869,11 +1869,11 @@ case LOAD_GLOBAL: w = GETITEM(names, oparg); - if (PyString_CheckExact(w)) { + if (PyBytes_CheckExact(w)) { /* Inline the PyDict_GetItem() calls. WARNING: this is an extreme speed hack. Do not try this at home. */ - long hash = ((PyStringObject *)w)->ob_shash; + long hash = ((PyBytesObject *)w)->ob_shash; if (hash != -1) { PyDictObject *d; PyDictEntry *e; @@ -2726,7 +2726,7 @@ PyErr_Format(PyExc_TypeError, "%.200s() takes %s %d " "%sargument%s (%d given)", - PyString_AsString(co->co_name), + PyBytes_AsString(co->co_name), defcount ? "at most" : "exactly", co->co_argcount, kwcount ? "non-keyword " : "", @@ -2756,10 +2756,10 @@ PyObject *keyword = kws[2*i]; PyObject *value = kws[2*i + 1]; int j; - if (keyword == NULL || !PyString_Check(keyword)) { + if (keyword == NULL || !PyBytes_Check(keyword)) { PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", - PyString_AsString(co->co_name)); + PyBytes_AsString(co->co_name)); goto fail; } /* XXX slow -- speed up using dictionary? */ @@ -2781,8 +2781,8 @@ PyErr_Format(PyExc_TypeError, "%.200s() got an unexpected " "keyword argument '%.400s'", - PyString_AsString(co->co_name), - PyString_AsString(keyword)); + PyBytes_AsString(co->co_name), + PyBytes_AsString(keyword)); goto fail; } PyDict_SetItem(kwdict, keyword, value); @@ -2793,8 +2793,8 @@ "%.200s() got multiple " "values for keyword " "argument '%.400s'", - PyString_AsString(co->co_name), - PyString_AsString(keyword)); + PyBytes_AsString(co->co_name), + PyBytes_AsString(keyword)); goto fail; } Py_INCREF(value); @@ -2808,7 +2808,7 @@ PyErr_Format(PyExc_TypeError, "%.200s() takes %s %d " "%sargument%s (%d given)", - PyString_AsString(co->co_name), + PyBytes_AsString(co->co_name), ((co->co_flags & CO_VARARGS) || defcount) ? "at least" : "exactly", @@ -2834,7 +2834,7 @@ if (argcount > 0 || kwcount > 0) { PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%d given)", - PyString_AsString(co->co_name), + PyBytes_AsString(co->co_name), argcount + kwcount); goto fail; } @@ -2860,11 +2860,11 @@ list so that we can march over it more efficiently? */ for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) { - cellname = PyString_AS_STRING( + cellname = PyBytes_AS_STRING( PyTuple_GET_ITEM(co->co_cellvars, i)); found = 0; for (j = 0; j < nargs; j++) { - argname = PyString_AS_STRING( + argname = PyBytes_AS_STRING( PyTuple_GET_ITEM(co->co_varnames, j)); if (strcmp(cellname, argname) == 0) { c = PyCell_New(GETLOCAL(j)); @@ -3522,13 +3522,13 @@ if (PyMethod_Check(func)) return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func)); else if (PyFunction_Check(func)) - return PyString_AsString(((PyFunctionObject*)func)->func_name); + return PyBytes_AsString(((PyFunctionObject*)func)->func_name); else if (PyCFunction_Check(func)) return ((PyCFunctionObject*)func)->m_ml->ml_name; else if (PyClass_Check(func)) - return PyString_AsString(((PyClassObject*)func)->cl_name); + return PyBytes_AsString(((PyClassObject*)func)->cl_name); else if (PyInstance_Check(func)) { - return PyString_AsString( + return PyBytes_AsString( ((PyInstanceObject*)func)->in_class->cl_name); } else { return func->ob_type->tp_name; @@ -3767,7 +3767,7 @@ "for keyword argument '%.200s'", PyEval_GetFuncName(func), PyEval_GetFuncDesc(func), - PyString_AsString(key)); + PyBytes_AsString(key)); Py_DECREF(key); Py_DECREF(value); Py_DECREF(kwdict); @@ -4086,7 +4086,7 @@ length = PyTuple_Size(w); for (i = 0; i < length; i += 1) { PyObject *exc = PyTuple_GET_ITEM(w, i); - if (PyString_Check(exc)) { + if (PyBytes_Check(exc)) { int ret_val; ret_val = PyErr_WarnEx( PyExc_DeprecationWarning, @@ -4109,7 +4109,7 @@ } } else { - if (PyString_Check(w)) { + if (PyBytes_Check(w)) { int ret_val; ret_val = PyErr_WarnEx( PyExc_DeprecationWarning, @@ -4149,7 +4149,7 @@ if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Format(PyExc_ImportError, "cannot import name %.230s", - PyString_AsString(name)); + PyBytes_AsString(name)); } return x; } @@ -4191,8 +4191,8 @@ break; } if (skip_leading_underscores && - PyString_Check(name) && - PyString_AS_STRING(name)[0] == '_') + PyBytes_Check(name) && + PyBytes_AS_STRING(name)[0] == '_') { Py_DECREF(name); continue; @@ -4251,12 +4251,12 @@ PyObject *ptype, *pvalue, *ptraceback; PyErr_Fetch(&ptype, &pvalue, &ptraceback); - if (PyString_Check(pvalue)) { + if (PyBytes_Check(pvalue)) { PyObject *newmsg; - newmsg = PyString_FromFormat( + newmsg = PyBytes_FromFormat( "Error when calling the metaclass bases\n" " %s", - PyString_AS_STRING(pvalue)); + PyBytes_AS_STRING(pvalue)); if (newmsg != NULL) { Py_DECREF(pvalue); pvalue = newmsg; @@ -4297,7 +4297,7 @@ } else if (locals == Py_None) locals = globals; - if (!PyString_Check(prog) && + if (!PyBytes_Check(prog) && !PyUnicode_Check(prog) && !PyCode_Check(prog) && !PyFile_Check(prog)) { @@ -4327,7 +4327,7 @@ } else if (PyFile_Check(prog)) { FILE *fp = PyFile_AsFile(prog); - char *name = PyString_AsString(PyFile_Name(prog)); + char *name = PyBytes_AsString(PyFile_Name(prog)); PyCompilerFlags cf; if (name == NULL) return -1; @@ -4353,7 +4353,7 @@ cf.cf_flags |= PyCF_SOURCE_IS_UTF8; } #endif - if (PyString_AsStringAndSize(prog, &str, NULL)) + if (PyBytes_AsStringAndSize(prog, &str, NULL)) return -1; if (PyEval_MergeCompilerFlags(&cf)) v = PyRun_StringFlags(str, Py_file_input, globals, @@ -4378,7 +4378,7 @@ if (!obj) return; - obj_str = PyString_AsString(obj); + obj_str = PyBytes_AsString(obj); if (!obj_str) return; @@ -4391,8 +4391,8 @@ { /* This function implements 'variable += expr' when both arguments are strings. */ - Py_ssize_t v_len = PyString_GET_SIZE(v); - Py_ssize_t w_len = PyString_GET_SIZE(w); + Py_ssize_t v_len = PyBytes_GET_SIZE(v); + Py_ssize_t w_len = PyBytes_GET_SIZE(w); Py_ssize_t new_len = v_len + w_len; if (new_len < 0) { PyErr_SetString(PyExc_OverflowError, @@ -4441,12 +4441,12 @@ } } - if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) { + if (v->ob_refcnt == 1 && !PyBytes_CHECK_INTERNED(v)) { /* Now we own the last reference to 'v', so we can resize it * in-place. */ - if (_PyString_Resize(&v, new_len) != 0) { - /* XXX if _PyString_Resize() fails, 'v' has been + if (_PyBytes_Resize(&v, new_len) != 0) { + /* XXX if _PyBytes_Resize() fails, 'v' has been * deallocated so it cannot be put back into * 'variable'. The MemoryError is raised when there * is no value in 'variable', which might (very @@ -4455,13 +4455,13 @@ return NULL; } /* copy 'w' into the newly allocated area of 'v' */ - memcpy(PyString_AS_STRING(v) + v_len, - PyString_AS_STRING(w), w_len); + memcpy(PyBytes_AS_STRING(v) + v_len, + PyBytes_AS_STRING(w), w_len); return v; } else { /* When in-place resizing is not an option. */ - PyString_Concat(&v, w); + PyBytes_Concat(&v, w); return v; } } Modified: python/branches/tlee-ast-optimize/Python/codecs.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/codecs.c (original) +++ python/branches/tlee-ast-optimize/Python/codecs.c Sun Jun 1 17:18:10 2008 @@ -61,10 +61,10 @@ return NULL; } - v = PyString_FromStringAndSize(NULL, len); + v = PyBytes_FromStringAndSize(NULL, len); if (v == NULL) return NULL; - p = PyString_AS_STRING(v); + p = PyBytes_AS_STRING(v); for (i = 0; i < len; i++) { register char ch = string[i]; if (ch == ' ') @@ -112,7 +112,7 @@ v = normalizestring(encoding); if (v == NULL) goto onError; - PyString_InternInPlace(&v); + PyBytes_InternInPlace(&v); /* First, try to lookup the name in the registry dictionary */ result = PyDict_GetItem(interp->codec_search_cache, v); @@ -190,7 +190,7 @@ if (errors) { PyObject *v; - v = PyString_FromString(errors); + v = PyBytes_FromString(errors); if (v == NULL) { Py_DECREF(args); return NULL; @@ -451,7 +451,7 @@ if (string != NULL) { PyErr_Format(PyExc_TypeError, "don't know how to handle %.400s in error callback", - PyString_AS_STRING(string)); + PyBytes_AS_STRING(string)); Py_DECREF(string); } } Modified: python/branches/tlee-ast-optimize/Python/compile.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/compile.c (original) +++ python/branches/tlee-ast-optimize/Python/compile.c Sun Jun 1 17:18:10 2008 @@ -210,15 +210,15 @@ { /* Name mangling: __private becomes _classname__private. This is independent from how the name is used. */ - const char *p, *name = PyString_AsString(ident); + const char *p, *name = PyBytes_AsString(ident); char *buffer; size_t nlen, plen; - if (privateobj == NULL || !PyString_Check(privateobj) || + if (privateobj == NULL || !PyBytes_Check(privateobj) || name == NULL || name[0] != '_' || name[1] != '_') { Py_INCREF(ident); return ident; } - p = PyString_AsString(privateobj); + p = PyBytes_AsString(privateobj); nlen = strlen(name); /* Don't mangle __id__ or names with dots. @@ -242,11 +242,11 @@ return ident; /* Don't mangle if class is just underscores */ } plen = strlen(p); - ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen); + ident = PyBytes_FromStringAndSize(NULL, 1 + nlen + plen); if (!ident) return 0; /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */ - buffer = PyString_AS_STRING(ident); + buffer = PyBytes_AS_STRING(ident); buffer[0] = '_'; strncpy(buffer+1, p, plen); strcpy(buffer+1+plen, name); @@ -274,7 +274,7 @@ PyCompilerFlags local_flags; if (!__doc__) { - __doc__ = PyString_InternFromString("__doc__"); + __doc__ = PyBytes_InternFromString("__doc__"); if (!__doc__) return NULL; } @@ -563,7 +563,7 @@ { char tmpname[256]; PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname); - return PyString_FromString(tmpname); + return PyBytes_FromString(tmpname); } /* Allocate a new block and return a pointer to it. @@ -1216,7 +1216,7 @@ int addNone = 1; static PyObject *module; if (!module) { - module = PyString_InternFromString(""); + module = PyBytes_InternFromString(""); if (!module) return NULL; } @@ -1268,8 +1268,8 @@ PyOS_snprintf(buf, sizeof(buf), "unknown scope for %.100s in %.100s(%s) in %s\n" "symbols: %s\nlocals: %s\nglobals: %s\n", - PyString_AS_STRING(name), - PyString_AS_STRING(c->u->u_name), + PyBytes_AS_STRING(name), + PyBytes_AS_STRING(c->u->u_name), PyObject_REPR(c->u->u_ste->ste_id), c->c_filename, PyObject_REPR(c->u->u_ste->ste_symbols), @@ -1327,9 +1327,9 @@ printf("lookup %s in %s %d %d\n" "freevars of %s: %s\n", PyObject_REPR(name), - PyString_AS_STRING(c->u->u_name), + PyBytes_AS_STRING(c->u->u_name), reftype, arg, - PyString_AS_STRING(co->co_name), + PyBytes_AS_STRING(co->co_name), PyObject_REPR(co->co_freevars)); Py_FatalError("compiler_make_closure()"); } @@ -1364,7 +1364,7 @@ for (i = 0; i < n; i++) { expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i); if (arg->kind == Tuple_kind) { - PyObject *id = PyString_FromFormat(".%d", i); + PyObject *id = PyBytes_FromFormat(".%d", i); if (id == NULL) { return 0; } @@ -1457,7 +1457,7 @@ Py_XDECREF(c->u->u_private); c->u->u_private = s->v.ClassDef.name; Py_INCREF(c->u->u_private); - str = PyString_InternFromString("__name__"); + str = PyBytes_InternFromString("__name__"); if (!str || !compiler_nameop(c, str, Load)) { Py_XDECREF(str); compiler_exit_scope(c); @@ -1465,7 +1465,7 @@ } Py_DECREF(str); - str = PyString_InternFromString("__module__"); + str = PyBytes_InternFromString("__module__"); if (!str || !compiler_nameop(c, str, Store)) { Py_XDECREF(str); compiler_exit_scope(c); @@ -1532,7 +1532,7 @@ assert(e->kind == Lambda_kind); if (!name) { - name = PyString_InternFromString(""); + name = PyBytes_InternFromString(""); if (!name) return 0; } @@ -1922,7 +1922,7 @@ If there is a dot in name, we need to split it and emit a LOAD_ATTR for each name. */ - const char *src = PyString_AS_STRING(name); + const char *src = PyBytes_AS_STRING(name); const char *dot = strchr(src, '.'); if (dot) { /* Consume the base module name to get the first attribute */ @@ -1931,7 +1931,7 @@ /* NB src is only defined when dot != NULL */ PyObject *attr; dot = strchr(src, '.'); - attr = PyString_FromStringAndSize(src, + attr = PyBytes_FromStringAndSize(src, dot ? dot - src : strlen(src)); if (!attr) return -1; @@ -1980,10 +1980,10 @@ } else { identifier tmp = alias->name; - const char *base = PyString_AS_STRING(alias->name); + const char *base = PyBytes_AS_STRING(alias->name); char *dot = strchr(base, '.'); if (dot) - tmp = PyString_FromStringAndSize(base, + tmp = PyBytes_FromStringAndSize(base, dot - base); r = compiler_nameop(c, tmp, Store); if (dot) { @@ -2026,7 +2026,7 @@ } if (s->lineno > c->c_future->ff_lineno) { - if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module), + if (!strcmp(PyBytes_AS_STRING(s->v.ImportFrom.module), "__future__")) { Py_DECREF(level); Py_DECREF(names); @@ -2046,7 +2046,7 @@ alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i); identifier store_name; - if (i == 0 && *PyString_AS_STRING(alias->name) == '*') { + if (i == 0 && *PyBytes_AS_STRING(alias->name) == '*') { assert(n == 1); ADDOP(c, IMPORT_STAR); return 1; @@ -2076,7 +2076,7 @@ if (Py_OptimizeFlag) return 1; if (assertion_error == NULL) { - assertion_error = PyString_InternFromString("AssertionError"); + assertion_error = PyBytes_InternFromString("AssertionError"); if (assertion_error == NULL) return 0; } @@ -2359,7 +2359,7 @@ /* First check for assignment to __debug__. Param? */ if ((ctx == Store || ctx == AugStore || ctx == Del) - && !strcmp(PyString_AS_STRING(name), "__debug__")) { + && !strcmp(PyBytes_AS_STRING(name), "__debug__")) { return compiler_error(c, "can not assign to __debug__"); } @@ -2397,7 +2397,7 @@ } /* XXX Leave assert here, but handle __doc__ and the like better */ - assert(scope || PyString_AS_STRING(name)[0] == '_'); + assert(scope || PyBytes_AS_STRING(name)[0] == '_'); switch (optype) { case OP_DEREF: @@ -2411,7 +2411,7 @@ PyErr_Format(PyExc_SyntaxError, "can not delete variable '%s' referenced " "in nested scope", - PyString_AS_STRING(name)); + PyBytes_AS_STRING(name)); Py_DECREF(mangled); return 0; case Param: @@ -2796,7 +2796,7 @@ 0)))->iter; if (!name) { - name = PyString_FromString(""); + name = PyBytes_FromString(""); if (!name) return 0; } @@ -2845,7 +2845,7 @@ case Name_kind: /* __debug__ is not assignable, so we can optimize * it away in if and while statements */ - if (strcmp(PyString_AS_STRING(e->v.Name.id), + if (strcmp(PyBytes_AS_STRING(e->v.Name.id), "__debug__") == 0) return ! Py_OptimizeFlag; /* fall through */ @@ -2887,12 +2887,12 @@ assert(s->kind == With_kind); if (!enter_attr) { - enter_attr = PyString_InternFromString("__enter__"); + enter_attr = PyBytes_InternFromString("__enter__"); if (!enter_attr) return 0; } if (!exit_attr) { - exit_attr = PyString_InternFromString("__exit__"); + exit_attr = PyBytes_InternFromString("__exit__"); if (!exit_attr) return 0; } @@ -3498,10 +3498,10 @@ { memset(a, 0, sizeof(struct assembler)); a->a_lineno = firstlineno; - a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE); + a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE); if (!a->a_bytecode) return 0; - a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE); + a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE); if (!a->a_lnotab) return 0; a->a_postorder = (basicblock **)PyObject_Malloc( @@ -3613,17 +3613,17 @@ if (d_bytecode > 255) { int j, nbytes, ncodes = d_bytecode / 255; nbytes = a->a_lnotab_off + 2 * ncodes; - len = PyString_GET_SIZE(a->a_lnotab); + len = PyBytes_GET_SIZE(a->a_lnotab); if (nbytes >= len) { if (len * 2 < nbytes) len = nbytes; else len *= 2; - if (_PyString_Resize(&a->a_lnotab, len) < 0) + if (_PyBytes_Resize(&a->a_lnotab, len) < 0) return 0; } lnotab = (unsigned char *) - PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off; + PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; for (j = 0; j < ncodes; j++) { *lnotab++ = 255; *lnotab++ = 0; @@ -3635,17 +3635,17 @@ if (d_lineno > 255) { int j, nbytes, ncodes = d_lineno / 255; nbytes = a->a_lnotab_off + 2 * ncodes; - len = PyString_GET_SIZE(a->a_lnotab); + len = PyBytes_GET_SIZE(a->a_lnotab); if (nbytes >= len) { if (len * 2 < nbytes) len = nbytes; else len *= 2; - if (_PyString_Resize(&a->a_lnotab, len) < 0) + if (_PyBytes_Resize(&a->a_lnotab, len) < 0) return 0; } lnotab = (unsigned char *) - PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off; + PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; *lnotab++ = d_bytecode; *lnotab++ = 255; d_bytecode = 0; @@ -3657,13 +3657,13 @@ a->a_lnotab_off += ncodes * 2; } - len = PyString_GET_SIZE(a->a_lnotab); + len = PyBytes_GET_SIZE(a->a_lnotab); if (a->a_lnotab_off + 2 >= len) { - if (_PyString_Resize(&a->a_lnotab, len * 2) < 0) + if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0) return 0; } lnotab = (unsigned char *) - PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off; + PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; a->a_lnotab_off += 2; if (d_bytecode) { @@ -3688,7 +3688,7 @@ assemble_emit(struct assembler *a, struct instr *i) { int size, arg = 0, ext = 0; - Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode); + Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode); char *code; size = instrsize(i); @@ -3699,10 +3699,10 @@ if (i->i_lineno && !assemble_lnotab(a, i)) return 0; if (a->a_offset + size >= len) { - if (_PyString_Resize(&a->a_bytecode, len * 2) < 0) + if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0) return 0; } - code = PyString_AS_STRING(a->a_bytecode) + a->a_offset; + code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset; a->a_offset += size; if (size == 6) { assert(i->i_hasarg); @@ -3875,7 +3875,7 @@ freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars)); if (!freevars) goto error; - filename = PyString_FromString(c->c_filename); + filename = PyBytes_FromString(c->c_filename); if (!filename) goto error; @@ -3995,9 +3995,9 @@ goto error; } - if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) + if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) goto error; - if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0) + if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0) goto error; co = makecode(c, &a); Modified: python/branches/tlee-ast-optimize/Python/errors.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/errors.c (original) +++ python/branches/tlee-ast-optimize/Python/errors.c Sun Jun 1 17:18:10 2008 @@ -66,7 +66,7 @@ void PyErr_SetString(PyObject *exception, const char *string) { - PyObject *value = PyString_FromString(string); + PyObject *value = PyBytes_FromString(string); PyErr_SetObject(exception, value); Py_XDECREF(value); } @@ -351,7 +351,7 @@ PyObject * PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename) { - PyObject *name = filename ? PyString_FromString(filename) : NULL; + PyObject *name = filename ? PyBytes_FromString(filename) : NULL; PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name); Py_XDECREF(name); return result; @@ -430,7 +430,7 @@ int ierr, const char *filename) { - PyObject *name = filename ? PyString_FromString(filename) : NULL; + PyObject *name = filename ? PyBytes_FromString(filename) : NULL; PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, ierr, name); @@ -469,7 +469,7 @@ int ierr, const char *filename) { - PyObject *name = filename ? PyString_FromString(filename) : NULL; + PyObject *name = filename ? PyBytes_FromString(filename) : NULL; PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject( PyExc_WindowsError, ierr, name); @@ -527,7 +527,7 @@ va_start(vargs); #endif - string = PyString_FromFormatV(format, vargs); + string = PyBytes_FromFormatV(format, vargs); PyErr_SetObject(exception, string); Py_XDECREF(string); va_end(vargs); @@ -559,7 +559,7 @@ goto failure; } if (PyDict_GetItemString(dict, "__module__") == NULL) { - modulename = PyString_FromStringAndSize(name, + modulename = PyBytes_FromStringAndSize(name, (Py_ssize_t)(dot-name)); if (modulename == NULL) goto failure; @@ -611,7 +611,7 @@ if (moduleName == NULL) PyFile_WriteString("", f); else { - char* modstr = PyString_AsString(moduleName); + char* modstr = PyBytes_AsString(moduleName); if (modstr && strcmp(modstr, "exceptions") != 0) { @@ -665,7 +665,7 @@ Py_DECREF(tmp); } if (filename != NULL) { - tmp = PyString_FromString(filename); + tmp = PyBytes_FromString(filename); if (tmp == NULL) PyErr_Clear(); else { @@ -742,7 +742,7 @@ char *p = linebuf; while (*p == ' ' || *p == '\t' || *p == '\014') p++; - return PyString_FromString(p); + return PyBytes_FromString(p); } return NULL; } Modified: python/branches/tlee-ast-optimize/Python/formatter_string.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/formatter_string.c (original) +++ python/branches/tlee-ast-optimize/Python/formatter_string.c Sun Jun 1 17:18:10 2008 @@ -4,12 +4,11 @@ of int.__float__, etc., that take and return string objects */ #include "Python.h" -#include "formatter_string.h" - #include "../Objects/stringlib/stringdefs.h" -#define FORMAT_STRING string__format__ -#define FORMAT_LONG string_long__format__ -#define FORMAT_INT string_int__format__ -#define FORMAT_FLOAT string_float__format__ +#define FORMAT_STRING _PyBytes_FormatAdvanced +#define FORMAT_LONG _PyLong_FormatAdvanced +#define FORMAT_INT _PyInt_FormatAdvanced +#define FORMAT_FLOAT _PyFloat_FormatAdvanced + #include "../Objects/stringlib/formatter.h" Modified: python/branches/tlee-ast-optimize/Python/formatter_unicode.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/formatter_unicode.c (original) +++ python/branches/tlee-ast-optimize/Python/formatter_unicode.c Sun Jun 1 17:18:10 2008 @@ -2,12 +2,12 @@ built-in formatter for unicode. That is, unicode.__format__(). */ #include "Python.h" -#include "formatter_unicode.h" - #include "../Objects/stringlib/unicodedefs.h" -#define FORMAT_STRING unicode__format__ +#define FORMAT_STRING _PyUnicode_FormatAdvanced + /* don't define FORMAT_LONG and FORMAT_FLOAT, since we can live with only the string versions of those. The builtin format() will convert them to unicode. */ + #include "../Objects/stringlib/formatter.h" Modified: python/branches/tlee-ast-optimize/Python/future.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/future.c (original) +++ python/branches/tlee-ast-optimize/Python/future.c Sun Jun 1 17:18:10 2008 @@ -20,7 +20,7 @@ names = s->v.ImportFrom.names; for (i = 0; i < asdl_seq_LEN(names); i++) { alias_ty name = (alias_ty)asdl_seq_GET(names, i); - const char *feature = PyString_AsString(name->name); + const char *feature = PyBytes_AsString(name->name); if (!feature) return 0; if (strcmp(feature, FUTURE_NESTED_SCOPES) == 0) { @@ -59,7 +59,7 @@ static PyObject *future; if (!future) { - future = PyString_InternFromString("__future__"); + future = PyBytes_InternFromString("__future__"); if (!future) return 0; } Modified: python/branches/tlee-ast-optimize/Python/getargs.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/getargs.c (original) +++ python/branches/tlee-ast-optimize/Python/getargs.c Sun Jun 1 17:18:10 2008 @@ -418,7 +418,7 @@ n++; } - if (!PySequence_Check(arg) || PyString_Check(arg)) { + if (!PySequence_Check(arg) || PyBytes_Check(arg)) { levels[0] = 0; PyOS_snprintf(msgbuf, bufsize, toplevel ? "expected %d arguments, not %.50s" : @@ -765,8 +765,8 @@ case 'c': {/* char */ char *p = va_arg(*p_va, char *); - if (PyString_Check(arg) && PyString_Size(arg) == 1) - *p = PyString_AS_STRING(arg)[0]; + if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1) + *p = PyBytes_AS_STRING(arg)[0]; else return converterr("char", arg, msgbuf, bufsize); break; @@ -777,9 +777,9 @@ void **p = (void **)va_arg(*p_va, char **); FETCH_SIZE; - if (PyString_Check(arg)) { - *p = PyString_AS_STRING(arg); - STORE_SIZE(PyString_GET_SIZE(arg)); + if (PyBytes_Check(arg)) { + *p = PyBytes_AS_STRING(arg); + STORE_SIZE(PyBytes_GET_SIZE(arg)); } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(arg)) { @@ -787,8 +787,8 @@ if (uarg == NULL) return converterr(CONV_UNICODE, arg, msgbuf, bufsize); - *p = PyString_AS_STRING(uarg); - STORE_SIZE(PyString_GET_SIZE(uarg)); + *p = PyBytes_AS_STRING(uarg); + STORE_SIZE(PyBytes_GET_SIZE(uarg)); } #endif else { /* any buffer-like object */ @@ -802,20 +802,20 @@ } else { char **p = va_arg(*p_va, char **); - if (PyString_Check(arg)) - *p = PyString_AS_STRING(arg); + if (PyBytes_Check(arg)) + *p = PyBytes_AS_STRING(arg); #ifdef Py_USING_UNICODE else if (PyUnicode_Check(arg)) { uarg = UNICODE_DEFAULT_ENCODING(arg); if (uarg == NULL) return converterr(CONV_UNICODE, arg, msgbuf, bufsize); - *p = PyString_AS_STRING(uarg); + *p = PyBytes_AS_STRING(uarg); } #endif else return converterr("string", arg, msgbuf, bufsize); - if ((Py_ssize_t)strlen(*p) != PyString_Size(arg)) + if ((Py_ssize_t)strlen(*p) != PyBytes_Size(arg)) return converterr("string without null bytes", arg, msgbuf, bufsize); } @@ -831,9 +831,9 @@ *p = 0; STORE_SIZE(0); } - else if (PyString_Check(arg)) { - *p = PyString_AS_STRING(arg); - STORE_SIZE(PyString_GET_SIZE(arg)); + else if (PyBytes_Check(arg)) { + *p = PyBytes_AS_STRING(arg); + STORE_SIZE(PyBytes_GET_SIZE(arg)); } #ifdef Py_USING_UNICODE else if (PyUnicode_Check(arg)) { @@ -841,8 +841,8 @@ if (uarg == NULL) return converterr(CONV_UNICODE, arg, msgbuf, bufsize); - *p = PyString_AS_STRING(uarg); - STORE_SIZE(PyString_GET_SIZE(uarg)); + *p = PyBytes_AS_STRING(uarg); + STORE_SIZE(PyBytes_GET_SIZE(uarg)); } #endif else { /* any buffer-like object */ @@ -858,15 +858,15 @@ if (arg == Py_None) *p = 0; - else if (PyString_Check(arg)) - *p = PyString_AS_STRING(arg); + else if (PyBytes_Check(arg)) + *p = PyBytes_AS_STRING(arg); #ifdef Py_USING_UNICODE else if (PyUnicode_Check(arg)) { uarg = UNICODE_DEFAULT_ENCODING(arg); if (uarg == NULL) return converterr(CONV_UNICODE, arg, msgbuf, bufsize); - *p = PyString_AS_STRING(uarg); + *p = PyBytes_AS_STRING(uarg); } #endif else @@ -878,11 +878,11 @@ if (arg == Py_None) *q = 0; else - *q = PyString_Size(arg); + *q = PyBytes_Size(arg); format++; } else if (*p != NULL && - (Py_ssize_t)strlen(*p) != PyString_Size(arg)) + (Py_ssize_t)strlen(*p) != PyBytes_Size(arg)) return converterr( "string without null bytes or None", arg, msgbuf, bufsize); @@ -923,7 +923,7 @@ arg, msgbuf, bufsize); /* Encode object */ - if (!recode_strings && PyString_Check(arg)) { + if (!recode_strings && PyBytes_Check(arg)) { s = arg; Py_INCREF(s); } @@ -946,7 +946,7 @@ if (s == NULL) return converterr("(encoding failed)", arg, msgbuf, bufsize); - if (!PyString_Check(s)) { + if (!PyBytes_Check(s)) { Py_DECREF(s); return converterr( "(encoder failed to return a string)", @@ -956,7 +956,7 @@ return converterr("string", arg, msgbuf, bufsize); #endif } - size = PyString_GET_SIZE(s); + size = PyBytes_GET_SIZE(s); /* Write output; output is guaranteed to be 0-terminated */ if (*format == '#') { @@ -1013,7 +1013,7 @@ } } memcpy(*buffer, - PyString_AS_STRING(s), + PyBytes_AS_STRING(s), size + 1); STORE_SIZE(size); } else { @@ -1030,7 +1030,7 @@ PyMem_Free()ing it after usage */ - if ((Py_ssize_t)strlen(PyString_AS_STRING(s)) + if ((Py_ssize_t)strlen(PyBytes_AS_STRING(s)) != size) { Py_DECREF(s); return converterr( @@ -1049,7 +1049,7 @@ arg, msgbuf, bufsize); } memcpy(*buffer, - PyString_AS_STRING(s), + PyBytes_AS_STRING(s), size + 1); } Py_DECREF(s); @@ -1083,7 +1083,7 @@ case 'S': { /* string object */ PyObject **p = va_arg(*p_va, PyObject **); - if (PyString_Check(arg)) + if (PyBytes_Check(arg)) *p = arg; else return converterr("string", arg, msgbuf, bufsize); @@ -1473,12 +1473,12 @@ while (PyDict_Next(keywords, &pos, &key, &value)) { int match = 0; char *ks; - if (!PyString_Check(key)) { + if (!PyBytes_Check(key)) { PyErr_SetString(PyExc_TypeError, "keywords must be strings"); return cleanreturn(0, freelist); } - ks = PyString_AsString(key); + ks = PyBytes_AsString(key); for (i = 0; i < len; i++) { if (!strcmp(ks, kwlist[i])) { match = 1; Modified: python/branches/tlee-ast-optimize/Python/import.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/import.c (original) +++ python/branches/tlee-ast-optimize/Python/import.c Sun Jun 1 17:18:10 2008 @@ -467,8 +467,8 @@ while (PyDict_Next(modules, &pos, &key, &value)) { if (value->ob_refcnt != 1) continue; - if (PyString_Check(key) && PyModule_Check(value)) { - name = PyString_AS_STRING(key); + if (PyBytes_Check(key) && PyModule_Check(value)) { + name = PyBytes_AS_STRING(key); if (strcmp(name, "__builtin__") == 0) continue; if (strcmp(name, "sys") == 0) @@ -486,8 +486,8 @@ /* Next, delete all modules (still skipping __builtin__ and sys) */ pos = 0; while (PyDict_Next(modules, &pos, &key, &value)) { - if (PyString_Check(key) && PyModule_Check(value)) { - name = PyString_AS_STRING(key); + if (PyBytes_Check(key) && PyModule_Check(value)) { + name = PyBytes_AS_STRING(key); if (strcmp(name, "__builtin__") == 0) continue; if (strcmp(name, "sys") == 0) @@ -665,7 +665,7 @@ /* Remember the filename as the __file__ attribute */ v = NULL; if (pathname != NULL) { - v = PyString_FromString(pathname); + v = PyBytes_FromString(pathname); if (v == NULL) PyErr_Clear(); } @@ -1002,7 +1002,7 @@ PySys_WriteStderr("import %s # directory %s\n", name, pathname); d = PyModule_GetDict(m); - file = PyString_FromString(pathname); + file = PyBytes_FromString(pathname); if (file == NULL) goto error; path = Py_BuildValue("[O]", file); @@ -1214,15 +1214,15 @@ Py_DECREF(meta_path); } - if (path != NULL && PyString_Check(path)) { + if (path != NULL && PyBytes_Check(path)) { /* The only type of submodule allowed inside a "frozen" package are other frozen modules or packages. */ - if (PyString_Size(path) + 1 + strlen(name) >= (size_t)buflen) { + if (PyBytes_Size(path) + 1 + strlen(name) >= (size_t)buflen) { PyErr_SetString(PyExc_ImportError, "full frozen module name too long"); return NULL; } - strcpy(buf, PyString_AsString(path)); + strcpy(buf, PyBytes_AsString(path)); strcat(buf, "."); strcat(buf, name); strcpy(name, buf); @@ -1291,14 +1291,14 @@ } else #endif - if (!PyString_Check(v)) + if (!PyBytes_Check(v)) continue; - len = PyString_GET_SIZE(v); + len = PyBytes_GET_SIZE(v); if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) { Py_XDECREF(copy); continue; /* Too long */ } - strcpy(buf, PyString_AS_STRING(v)); + strcpy(buf, PyBytes_AS_STRING(v)); if (strlen(buf) != len) { Py_XDECREF(copy); continue; /* v contains '\0' */ @@ -1963,7 +1963,7 @@ if (m == NULL) goto err_return; d = PyModule_GetDict(m); - s = PyString_InternFromString(name); + s = PyBytes_InternFromString(name); if (s == NULL) goto err_return; err = PyDict_SetItemString(d, "__path__", s); @@ -1992,7 +1992,7 @@ PyObject *pname; PyObject *result; - pname = PyString_FromString(name); + pname = PyBytes_FromString(name); if (pname == NULL) return NULL; result = PyImport_Import(pname); @@ -2165,17 +2165,17 @@ return Py_None; if (namestr == NULL) { - namestr = PyString_InternFromString("__name__"); + namestr = PyBytes_InternFromString("__name__"); if (namestr == NULL) return NULL; } if (pathstr == NULL) { - pathstr = PyString_InternFromString("__path__"); + pathstr = PyBytes_InternFromString("__path__"); if (pathstr == NULL) return NULL; } if (pkgstr == NULL) { - pkgstr = PyString_InternFromString("__package__"); + pkgstr = PyBytes_InternFromString("__package__"); if (pkgstr == NULL) return NULL; } @@ -2187,12 +2187,12 @@ if ((pkgname != NULL) && (pkgname != Py_None)) { /* __package__ is set, so use it */ Py_ssize_t len; - if (!PyString_Check(pkgname)) { + if (!PyBytes_Check(pkgname)) { PyErr_SetString(PyExc_ValueError, "__package__ set to non-string"); return NULL; } - len = PyString_GET_SIZE(pkgname); + len = PyBytes_GET_SIZE(pkgname); if (len == 0) { if (level > 0) { PyErr_SetString(PyExc_ValueError, @@ -2206,24 +2206,24 @@ "Package name too long"); return NULL; } - strcpy(buf, PyString_AS_STRING(pkgname)); + strcpy(buf, PyBytes_AS_STRING(pkgname)); } else { /* __package__ not set, so figure it out and set it */ modname = PyDict_GetItem(globals, namestr); - if (modname == NULL || !PyString_Check(modname)) + if (modname == NULL || !PyBytes_Check(modname)) return Py_None; modpath = PyDict_GetItem(globals, pathstr); if (modpath != NULL) { /* __path__ is set, so modname is already the package name */ - Py_ssize_t len = PyString_GET_SIZE(modname); + Py_ssize_t len = PyBytes_GET_SIZE(modname); int error; if (len > MAXPATHLEN) { PyErr_SetString(PyExc_ValueError, "Module name too long"); return NULL; } - strcpy(buf, PyString_AS_STRING(modname)); + strcpy(buf, PyBytes_AS_STRING(modname)); error = PyDict_SetItem(globals, pkgstr, modname); if (error) { PyErr_SetString(PyExc_ValueError, @@ -2232,7 +2232,7 @@ } } else { /* Normal module, so work out the package name if any */ - char *start = PyString_AS_STRING(modname); + char *start = PyBytes_AS_STRING(modname); char *lastdot = strrchr(start, '.'); size_t len; int error; @@ -2258,7 +2258,7 @@ } strncpy(buf, start, len); buf[len] = '\0'; - pkgname = PyString_FromString(buf); + pkgname = PyBytes_FromString(buf); if (pkgname == NULL) { return NULL; } @@ -2394,13 +2394,13 @@ } return 0; } - if (!PyString_Check(item)) { + if (!PyBytes_Check(item)) { PyErr_SetString(PyExc_TypeError, "Item in ``from list'' not a string"); Py_DECREF(item); return 0; } - if (PyString_AS_STRING(item)[0] == '*') { + if (PyBytes_AS_STRING(item)[0] == '*') { PyObject *all; Py_DECREF(item); /* See if the package defines __all__ */ @@ -2419,7 +2419,7 @@ } hasit = PyObject_HasAttr(mod, item); if (!hasit) { - char *subname = PyString_AS_STRING(item); + char *subname = PyBytes_AS_STRING(item); PyObject *submod; char *p; if (buflen + strlen(subname) >= MAXPATHLEN) { @@ -2585,7 +2585,7 @@ subname = name; else { PyObject *parentname, *parent; - parentname = PyString_FromStringAndSize(name, (subname-name)); + parentname = PyBytes_FromStringAndSize(name, (subname-name)); if (parentname == NULL) { imp_modules_reloading_clear(); return NULL; @@ -2594,7 +2594,7 @@ if (parent == NULL) { PyErr_Format(PyExc_ImportError, "reload(): parent %.200s not in sys.modules", - PyString_AS_STRING(parentname)); + PyBytes_AS_STRING(parentname)); Py_DECREF(parentname); imp_modules_reloading_clear(); return NULL; @@ -2639,7 +2639,7 @@ done using whatever import hooks are installed in the current environment, e.g. by "rexec". A dummy list ["__doc__"] is passed as the 4th argument so that - e.g. PyImport_Import(PyString_FromString("win32com.client.gencache")) + e.g. PyImport_Import(PyBytes_FromString("win32com.client.gencache")) will return instead of . */ PyObject * @@ -2655,10 +2655,10 @@ /* Initialize constant string objects */ if (silly_list == NULL) { - import_str = PyString_InternFromString("__import__"); + import_str = PyBytes_InternFromString("__import__"); if (import_str == NULL) return NULL; - builtins_str = PyString_InternFromString("__builtins__"); + builtins_str = PyBytes_InternFromString("__builtins__"); if (builtins_str == NULL) return NULL; silly_list = Py_BuildValue("[s]", "__doc__"); @@ -2726,7 +2726,7 @@ buf[2] = (char) ((pyc_magic >> 16) & 0xff); buf[3] = (char) ((pyc_magic >> 24) & 0xff); - return PyString_FromStringAndSize(buf, 4); + return PyBytes_FromStringAndSize(buf, 4); } static PyObject * Modified: python/branches/tlee-ast-optimize/Python/mactoolboxglue.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/mactoolboxglue.c (original) +++ python/branches/tlee-ast-optimize/Python/mactoolboxglue.c Sun Jun 1 17:18:10 2008 @@ -52,7 +52,7 @@ buf[0] = '\0'; } else { - char *input = PyString_AsString(rv); + char *input = PyBytes_AsString(rv); if (!input) { PyErr_Clear(); buf[0] = '\0'; @@ -124,7 +124,7 @@ if (!rv) goto error; - input = PyString_AsString(rv); + input = PyBytes_AsString(rv); if (!input) goto error; @@ -159,12 +159,12 @@ PyMac_GetOSType(PyObject *v, OSType *pr) { uint32_t tmp; - if (!PyString_Check(v) || PyString_Size(v) != 4) { + if (!PyBytes_Check(v) || PyBytes_Size(v) != 4) { PyErr_SetString(PyExc_TypeError, "OSType arg must be string of 4 chars"); return 0; } - memcpy((char *)&tmp, PyString_AsString(v), 4); + memcpy((char *)&tmp, PyBytes_AsString(v), 4); *pr = (OSType)ntohl(tmp); return 1; } @@ -174,7 +174,7 @@ PyMac_BuildOSType(OSType t) { uint32_t tmp = htonl((uint32_t)t); - return PyString_FromStringAndSize((char *)&tmp, 4); + return PyBytes_FromStringAndSize((char *)&tmp, 4); } /* Convert an NumVersion value to a 4-element tuple */ @@ -190,13 +190,13 @@ PyMac_GetStr255(PyObject *v, Str255 pbuf) { int len; - if (!PyString_Check(v) || (len = PyString_Size(v)) > 255) { + if (!PyBytes_Check(v) || (len = PyBytes_Size(v)) > 255) { PyErr_SetString(PyExc_TypeError, "Str255 arg must be string of at most 255 chars"); return 0; } pbuf[0] = len; - memcpy((char *)(pbuf+1), PyString_AsString(v), len); + memcpy((char *)(pbuf+1), PyBytes_AsString(v), len); return 1; } @@ -208,7 +208,7 @@ PyErr_SetString(PyExc_SystemError, "Str255 pointer is NULL"); return NULL; } - return PyString_FromStringAndSize((char *)&s[1], (int)s[0]); + return PyBytes_FromStringAndSize((char *)&s[1], (int)s[0]); } PyObject * @@ -218,7 +218,7 @@ Py_INCREF(Py_None); return Py_None; } - return PyString_FromStringAndSize((char *)&s[1], (int)s[0]); + return PyBytes_FromStringAndSize((char *)&s[1], (int)s[0]); } Modified: python/branches/tlee-ast-optimize/Python/marshal.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/marshal.c (original) +++ python/branches/tlee-ast-optimize/Python/marshal.c Sun Jun 1 17:18:10 2008 @@ -64,18 +64,18 @@ Py_ssize_t size, newsize; if (p->str == NULL) return; /* An error already occurred */ - size = PyString_Size(p->str); + size = PyBytes_Size(p->str); newsize = size + size + 1024; if (newsize > 32*1024*1024) { newsize = size + 1024*1024; } - if (_PyString_Resize(&p->str, newsize) != 0) { + if (_PyBytes_Resize(&p->str, newsize) != 0) { p->ptr = p->end = NULL; } else { - p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size; + p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size; p->end = - PyString_AS_STRING((PyStringObject *)p->str) + newsize; + PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize; *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char); } } @@ -239,8 +239,8 @@ } } #endif - else if (PyString_CheckExact(v)) { - if (p->strings && PyString_CHECK_INTERNED(v)) { + else if (PyBytes_CheckExact(v)) { + if (p->strings && PyBytes_CHECK_INTERNED(v)) { PyObject *o = PyDict_GetItem(p->strings, v); if (o) { long w = PyInt_AsLong(o); @@ -265,7 +265,7 @@ else { w_byte(TYPE_STRING, p); } - n = PyString_GET_SIZE(v); + n = PyBytes_GET_SIZE(v); if (n > INT_MAX) { /* huge strings are not supported */ p->depth--; @@ -273,7 +273,7 @@ return; } w_long((long)n, p); - w_string(PyString_AS_STRING(v), (int)n, p); + w_string(PyBytes_AS_STRING(v), (int)n, p); } #ifdef Py_USING_UNICODE else if (PyUnicode_CheckExact(v)) { @@ -285,14 +285,14 @@ return; } w_byte(TYPE_UNICODE, p); - n = PyString_GET_SIZE(utf8); + n = PyBytes_GET_SIZE(utf8); if (n > INT_MAX) { p->depth--; p->error = 1; return; } w_long((long)n, p); - w_string(PyString_AS_STRING(utf8), (int)n, p); + w_string(PyBytes_AS_STRING(utf8), (int)n, p); Py_DECREF(utf8); } #endif @@ -713,12 +713,12 @@ retval = NULL; break; } - v = PyString_FromStringAndSize((char *)NULL, n); + v = PyBytes_FromStringAndSize((char *)NULL, n); if (v == NULL) { retval = NULL; break; } - if (r_string(PyString_AS_STRING(v), (int)n, p) != n) { + if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) { Py_DECREF(v); PyErr_SetString(PyExc_EOFError, "EOF read where object expected"); @@ -726,7 +726,7 @@ break; } if (type == TYPE_INTERNED) { - PyString_InternInPlace(&v); + PyBytes_InternInPlace(&v); if (PyList_Append(p->strings, v) < 0) { retval = NULL; break; @@ -1113,11 +1113,11 @@ { WFILE wf; wf.fp = NULL; - wf.str = PyString_FromStringAndSize((char *)NULL, 50); + wf.str = PyBytes_FromStringAndSize((char *)NULL, 50); if (wf.str == NULL) return NULL; - wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str); - wf.end = wf.ptr + PyString_Size(wf.str); + wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str); + wf.end = wf.ptr + PyBytes_Size(wf.str); wf.error = 0; wf.depth = 0; wf.version = version; @@ -1125,14 +1125,14 @@ w_object(x, &wf); Py_XDECREF(wf.strings); if (wf.str != NULL) { - char *base = PyString_AS_STRING((PyStringObject *)wf.str); + char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str); if (wf.ptr - base > PY_SSIZE_T_MAX) { Py_DECREF(wf.str); PyErr_SetString(PyExc_OverflowError, "too much marshall data for a string"); return NULL; } - _PyString_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)); + _PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)); } if (wf.error) { Py_XDECREF(wf.str); Modified: python/branches/tlee-ast-optimize/Python/modsupport.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/modsupport.c (original) +++ python/branches/tlee-ast-optimize/Python/modsupport.c Sun Jun 1 17:18:10 2008 @@ -65,7 +65,7 @@ return NULL; d = PyModule_GetDict(m); if (methods != NULL) { - n = PyString_FromString(name); + n = PyBytes_FromString(name); if (n == NULL) return NULL; for (ml = methods; ml->ml_name != NULL; ml++) { @@ -92,7 +92,7 @@ Py_DECREF(n); } if (doc != NULL) { - v = PyString_FromString(doc); + v = PyBytes_FromString(doc); if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) { Py_XDECREF(v); return NULL; @@ -391,7 +391,7 @@ { char p[1]; p[0] = (char)va_arg(*p_va, int); - return PyString_FromStringAndSize(p, 1); + return PyBytes_FromStringAndSize(p, 1); } case 's': @@ -423,7 +423,7 @@ } n = (Py_ssize_t)m; } - v = PyString_FromStringAndSize(str, n); + v = PyBytes_FromStringAndSize(str, n); } return v; } @@ -633,7 +633,7 @@ int PyModule_AddStringConstant(PyObject *m, const char *name, const char *value) { - PyObject *o = PyString_FromString(value); + PyObject *o = PyBytes_FromString(value); if (!o) return -1; if (PyModule_AddObject(m, name, o) == 0) Modified: python/branches/tlee-ast-optimize/Python/mysnprintf.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/mysnprintf.c (original) +++ python/branches/tlee-ast-optimize/Python/mysnprintf.c Sun Jun 1 17:18:10 2008 @@ -54,18 +54,28 @@ PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) { int len; /* # bytes written, excluding \0 */ -#ifndef HAVE_SNPRINTF +#ifdef HAVE_SNPRINTF +#define _PyOS_vsnprintf_EXTRA_SPACE 1 +#else +#define _PyOS_vsnprintf_EXTRA_SPACE 512 char *buffer; #endif assert(str != NULL); assert(size > 0); assert(format != NULL); + /* We take a size_t as input but return an int. Sanity check + * our input so that it won't cause an overflow in the + * vsnprintf return value or the buffer malloc size. */ + if (size > INT_MAX - _PyOS_vsnprintf_EXTRA_SPACE) { + len = -666; + goto Done; + } #ifdef HAVE_SNPRINTF len = vsnprintf(str, size, format, va); #else /* Emulate it. */ - buffer = PyMem_MALLOC(size + 512); + buffer = PyMem_MALLOC(size + _PyOS_vsnprintf_EXTRA_SPACE); if (buffer == NULL) { len = -666; goto Done; @@ -75,7 +85,7 @@ if (len < 0) /* ignore the error */; - else if ((size_t)len >= size + 512) + else if ((size_t)len >= size + _PyOS_vsnprintf_EXTRA_SPACE) Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf"); else { @@ -86,8 +96,10 @@ str[to_copy] = '\0'; } PyMem_FREE(buffer); -Done: #endif - str[size-1] = '\0'; +Done: + if (size > 0) + str[size-1] = '\0'; return len; +#undef _PyOS_vsnprintf_EXTRA_SPACE } Modified: python/branches/tlee-ast-optimize/Python/peephole.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/peephole.c (original) +++ python/branches/tlee-ast-optimize/Python/peephole.c Sun Jun 1 17:18:10 2008 @@ -141,15 +141,15 @@ goto exitUnchanged; /* Bypass optimization when the lineno table is too complex */ - assert(PyString_Check(lineno_obj)); - lineno = (unsigned char*)PyString_AS_STRING(lineno_obj); - tabsiz = PyString_GET_SIZE(lineno_obj); + assert(PyBytes_Check(lineno_obj)); + lineno = (unsigned char*)PyBytes_AS_STRING(lineno_obj); + tabsiz = PyBytes_GET_SIZE(lineno_obj); if (memchr(lineno, 255, tabsiz) != NULL) goto exitUnchanged; /* Avoid situations where jump retargeting could overflow */ - assert(PyString_Check(code)); - codelen = PyString_GET_SIZE(code); + assert(PyBytes_Check(code)); + codelen = PyBytes_GET_SIZE(code); if (codelen > 32700) goto exitUnchanged; @@ -158,7 +158,7 @@ if (codestr == NULL) goto exitUnchanged; codestr = (unsigned char *)memcpy(codestr, - PyString_AS_STRING(code), codelen); + PyBytes_AS_STRING(code), codelen); /* Verify that RETURN_VALUE terminates the codestring. This allows the various transformation patterns to look ahead several @@ -347,7 +347,7 @@ } assert(h + nops == codelen); - code = PyString_FromStringAndSize((char *)codestr, h); + code = PyBytes_FromStringAndSize((char *)codestr, h); PyMem_Free(addrmap); PyMem_Free(codestr); PyMem_Free(blocks); Modified: python/branches/tlee-ast-optimize/Python/pystrtod.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/pystrtod.c (original) +++ python/branches/tlee-ast-optimize/Python/pystrtod.c Sun Jun 1 17:18:10 2008 @@ -364,7 +364,7 @@ /* At this point, p points just past the right-most character we want to format. We need to add the grouping string for the characters between buffer and p. */ - return _PyString_InsertThousandsGrouping(buffer, len, p, + return _PyBytes_InsertThousandsGrouping(buffer, len, p, buf_size, NULL, 1); } Modified: python/branches/tlee-ast-optimize/Python/pythonrun.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/pythonrun.c (original) +++ python/branches/tlee-ast-optimize/Python/pythonrun.c Sun Jun 1 17:18:10 2008 @@ -134,10 +134,19 @@ PyThreadState *tstate; PyObject *bimod, *sysmod; char *p; -#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) - char *codeset; - char *saved_locale; + char *icodeset; /* On Windows, input codeset may theoretically + differ from output codeset. */ + char *codeset = NULL; + char *errors = NULL; + int free_codeset = 0; + int overridden = 0; PyObject *sys_stream, *sys_isatty; +#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) + char *saved_locale, *loc_codeset; +#endif +#ifdef MS_WINDOWS + char ibuf[128]; + char buf[128]; #endif extern void _Py_ReadyTypes(void); @@ -171,7 +180,7 @@ if (!_PyInt_Init()) Py_FatalError("Py_Initialize: can't init ints"); - if (!PyBytes_Init()) + if (!PyByteArray_Init()) Py_FatalError("Py_Initialize: can't init bytearray"); _PyFloat_Init(); @@ -240,38 +249,75 @@ _PyGILState_Init(interp, tstate); #endif /* WITH_THREAD */ + if ((p = Py_GETENV("PYTHONIOENCODING")) && *p != '\0') { + p = icodeset = codeset = strdup(p); + free_codeset = 1; + errors = strchr(p, ':'); + if (errors) { + *errors = '\0'; + errors++; + } + overridden = 1; + } + #if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) /* On Unix, set the file system encoding according to the user's preference, if the CODESET names a well-known Python codec, and Py_FileSystemDefaultEncoding isn't initialized by other means. Also set the encoding of - stdin and stdout if these are terminals. */ + stdin and stdout if these are terminals, unless overridden. */ - saved_locale = strdup(setlocale(LC_CTYPE, NULL)); - setlocale(LC_CTYPE, ""); - codeset = nl_langinfo(CODESET); - if (codeset && *codeset) { - PyObject *enc = PyCodec_Encoder(codeset); - if (enc) { - codeset = strdup(codeset); - Py_DECREF(enc); - } else { - codeset = NULL; - PyErr_Clear(); + if (!overridden || !Py_FileSystemDefaultEncoding) { + saved_locale = strdup(setlocale(LC_CTYPE, NULL)); + setlocale(LC_CTYPE, ""); + loc_codeset = nl_langinfo(CODESET); + if (loc_codeset && *loc_codeset) { + PyObject *enc = PyCodec_Encoder(loc_codeset); + if (enc) { + loc_codeset = strdup(loc_codeset); + Py_DECREF(enc); + } else { + loc_codeset = NULL; + PyErr_Clear(); + } + } else + loc_codeset = NULL; + setlocale(LC_CTYPE, saved_locale); + free(saved_locale); + + if (!overridden) { + codeset = icodeset = loc_codeset; + free_codeset = 1; + } + + /* Initialize Py_FileSystemDefaultEncoding from + locale even if PYTHONIOENCODING is set. */ + if (!Py_FileSystemDefaultEncoding) { + Py_FileSystemDefaultEncoding = loc_codeset; + if (!overridden) + free_codeset = 0; } - } else - codeset = NULL; - setlocale(LC_CTYPE, saved_locale); - free(saved_locale); + } +#endif + +#ifdef MS_WINDOWS + if (!overridden) { + icodeset = ibuf; + codeset = buf; + sprintf(ibuf, "cp%d", GetConsoleCP()); + sprintf(buf, "cp%d", GetConsoleOutputCP()); + } +#endif if (codeset) { sys_stream = PySys_GetObject("stdin"); sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); if (!sys_isatty) PyErr_Clear(); - if(sys_isatty && PyObject_IsTrue(sys_isatty) && + if ((overridden || + (sys_isatty && PyObject_IsTrue(sys_isatty))) && PyFile_Check(sys_stream)) { - if (!PyFile_SetEncoding(sys_stream, codeset)) + if (!PyFile_SetEncodingAndErrors(sys_stream, icodeset, errors)) Py_FatalError("Cannot set codeset of stdin"); } Py_XDECREF(sys_isatty); @@ -280,9 +326,10 @@ sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); if (!sys_isatty) PyErr_Clear(); - if(sys_isatty && PyObject_IsTrue(sys_isatty) && + if ((overridden || + (sys_isatty && PyObject_IsTrue(sys_isatty))) && PyFile_Check(sys_stream)) { - if (!PyFile_SetEncoding(sys_stream, codeset)) + if (!PyFile_SetEncodingAndErrors(sys_stream, codeset, errors)) Py_FatalError("Cannot set codeset of stdout"); } Py_XDECREF(sys_isatty); @@ -291,19 +338,17 @@ sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); if (!sys_isatty) PyErr_Clear(); - if(sys_isatty && PyObject_IsTrue(sys_isatty) && + if((overridden || + (sys_isatty && PyObject_IsTrue(sys_isatty))) && PyFile_Check(sys_stream)) { - if (!PyFile_SetEncoding(sys_stream, codeset)) + if (!PyFile_SetEncodingAndErrors(sys_stream, codeset, errors)) Py_FatalError("Cannot set codeset of stderr"); } Py_XDECREF(sys_isatty); - if (!Py_FileSystemDefaultEncoding) - Py_FileSystemDefaultEncoding = codeset; - else + if (free_codeset) free(codeset); } -#endif } void @@ -452,8 +497,8 @@ PyTuple_Fini(); PyList_Fini(); PySet_Fini(); - PyString_Fini(); PyBytes_Fini(); + PyByteArray_Fini(); PyInt_Fini(); PyFloat_Fini(); PyDict_Fini(); @@ -701,12 +746,12 @@ } v = PySys_GetObject("ps1"); if (v == NULL) { - PySys_SetObject("ps1", v = PyString_FromString(">>> ")); + PySys_SetObject("ps1", v = PyBytes_FromString(">>> ")); Py_XDECREF(v); } v = PySys_GetObject("ps2"); if (v == NULL) { - PySys_SetObject("ps2", v = PyString_FromString("... ")); + PySys_SetObject("ps2", v = PyBytes_FromString("... ")); Py_XDECREF(v); } for (;;) { @@ -753,16 +798,16 @@ v = PyObject_Str(v); if (v == NULL) PyErr_Clear(); - else if (PyString_Check(v)) - ps1 = PyString_AsString(v); + else if (PyBytes_Check(v)) + ps1 = PyBytes_AsString(v); } w = PySys_GetObject("ps2"); if (w != NULL) { w = PyObject_Str(w); if (w == NULL) PyErr_Clear(); - else if (PyString_Check(w)) - ps2 = PyString_AsString(w); + else if (PyBytes_Check(w)) + ps2 = PyBytes_AsString(w); } arena = PyArena_New(); if (arena == NULL) { @@ -855,7 +900,7 @@ return -1; d = PyModule_GetDict(m); if (PyDict_GetItemString(d, "__file__") == NULL) { - PyObject *f = PyString_FromString(filename); + PyObject *f = PyBytes_FromString(filename); if (f == NULL) return -1; if (PyDict_SetItemString(d, "__file__", f) < 0) { @@ -939,7 +984,7 @@ goto finally; if (v == Py_None) *filename = NULL; - else if (! (*filename = PyString_AsString(v))) + else if (! (*filename = PyBytes_AsString(v))) goto finally; Py_DECREF(v); @@ -971,7 +1016,7 @@ goto finally; if (v == Py_None) *text = NULL; - else if (! (*text = PyString_AsString(v))) + else if (! (*text = PyBytes_AsString(v))) goto finally; Py_DECREF(v); return 1; @@ -1194,7 +1239,7 @@ if (moduleName == NULL) err = PyFile_WriteString("", f); else { - char* modstr = PyString_AsString(moduleName); + char* modstr = PyBytes_AsString(moduleName); if (modstr && strcmp(modstr, "exceptions")) { err = PyFile_WriteString(modstr, f); @@ -1218,8 +1263,8 @@ */ if (s == NULL) err = -1; - else if (!PyString_Check(s) || - PyString_GET_SIZE(s) != 0) + else if (!PyBytes_Check(s) || + PyBytes_GET_SIZE(s) != 0) err = PyFile_WriteString(": ", f); if (err == 0) err = PyFile_WriteObject(s, f, Py_PRINT_RAW); @@ -1566,7 +1611,7 @@ if (value != NULL) { u = PyObject_Str(value); if (u != NULL) { - msg = PyString_AsString(u); + msg = PyBytes_AsString(u); } } if (msg == NULL) Modified: python/branches/tlee-ast-optimize/Python/structmember.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/structmember.c (original) +++ python/branches/tlee-ast-optimize/Python/structmember.c Sun Jun 1 17:18:10 2008 @@ -16,7 +16,7 @@ if (v != NULL) { for (i = 0; i < n; i++) PyList_SetItem(v, i, - PyString_FromString(mlist[i].name)); + PyBytes_FromString(mlist[i].name)); if (PyErr_Occurred()) { Py_DECREF(v); v = NULL; @@ -103,13 +103,13 @@ v = Py_None; } else - v = PyString_FromString(*(char**)addr); + v = PyBytes_FromString(*(char**)addr); break; case T_STRING_INPLACE: - v = PyString_FromString((char*)addr); + v = PyBytes_FromString((char*)addr); break; case T_CHAR: - v = PyString_FromStringAndSize((char*)addr, 1); + v = PyBytes_FromStringAndSize((char*)addr, 1); break; case T_OBJECT: v = *(PyObject **)addr; @@ -310,8 +310,8 @@ Py_XDECREF(oldv); break; case T_CHAR: - if (PyString_Check(v) && PyString_Size(v) == 1) { - *(char*)addr = PyString_AsString(v)[0]; + if (PyBytes_Check(v) && PyBytes_Size(v) == 1) { + *(char*)addr = PyBytes_AsString(v)[0]; } else { PyErr_BadArgument(); Modified: python/branches/tlee-ast-optimize/Python/symtable.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/symtable.c (original) +++ python/branches/tlee-ast-optimize/Python/symtable.c Sun Jun 1 17:18:10 2008 @@ -87,9 +87,9 @@ PyOS_snprintf(buf, sizeof(buf), "", - PyString_AS_STRING(ste->ste_name), + PyBytes_AS_STRING(ste->ste_name), PyInt_AS_LONG(ste->ste_id), ste->ste_lineno); - return PyString_FromString(buf); + return PyBytes_FromString(buf); } static void @@ -180,7 +180,7 @@ static identifier top = NULL, lambda = NULL, genexpr = NULL; #define GET_IDENTIFIER(VAR) \ - ((VAR) ? (VAR) : ((VAR) = PyString_InternFromString(# VAR))) + ((VAR) ? (VAR) : ((VAR) = PyBytes_InternFromString(# VAR))) #define DUPLICATE_ARGUMENT \ "duplicate argument '%s' in function definition" @@ -372,7 +372,7 @@ if (flags & DEF_PARAM) { PyErr_Format(PyExc_SyntaxError, "name '%s' is local and global", - PyString_AS_STRING(name)); + PyBytes_AS_STRING(name)); return 0; } SET_SCOPE(dict, name, GLOBAL_EXPLICIT); @@ -487,19 +487,19 @@ PyOS_snprintf(buf, sizeof(buf), "import * is not allowed in function '%.100s' " "because it is %s", - PyString_AS_STRING(ste->ste_name), trailer); + PyBytes_AS_STRING(ste->ste_name), trailer); break; case OPT_BARE_EXEC: PyOS_snprintf(buf, sizeof(buf), "unqualified exec is not allowed in function " "'%.100s' it %s", - PyString_AS_STRING(ste->ste_name), trailer); + PyBytes_AS_STRING(ste->ste_name), trailer); break; default: PyOS_snprintf(buf, sizeof(buf), "function '%.100s' uses import * and bare exec, " "which are illegal because it %s", - PyString_AS_STRING(ste->ste_name), trailer); + PyBytes_AS_STRING(ste->ste_name), trailer); break; } @@ -800,7 +800,7 @@ if ((flag & DEF_PARAM) && (val & DEF_PARAM)) { /* Is it better to use 'mangled' or 'name' here? */ PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT, - PyString_AsString(name)); + PyBytes_AsString(name)); PyErr_SyntaxLocation(st->st_filename, st->st_cur->ste_lineno); goto error; @@ -914,7 +914,7 @@ PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++st->st_cur->ste_tmpname); - tmp = PyString_InternFromString(tmpname); + tmp = PyBytes_InternFromString(tmpname); if (!tmp) return 0; if (!symtable_add_def(st, tmp, DEF_LOCAL)) @@ -1065,7 +1065,7 @@ asdl_seq *seq = s->v.Global.names; for (i = 0; i < asdl_seq_LEN(seq); i++) { identifier name = (identifier)asdl_seq_GET(seq, i); - char *c_name = PyString_AS_STRING(name); + char *c_name = PyBytes_AS_STRING(name); long cur = symtable_lookup(st, name); if (cur < 0) return 0; @@ -1219,7 +1219,7 @@ static int symtable_implicit_arg(struct symtable *st, int pos) { - PyObject *id = PyString_FromFormat(".%d", pos); + PyObject *id = PyBytes_FromFormat(".%d", pos); if (id == NULL) return 0; if (!symtable_add_def(st, id, DEF_PARAM)) { @@ -1327,10 +1327,10 @@ */ PyObject *store_name; PyObject *name = (a->asname == NULL) ? a->name : a->asname; - const char *base = PyString_AS_STRING(name); + const char *base = PyBytes_AS_STRING(name); char *dot = strchr(base, '.'); if (dot) { - store_name = PyString_FromStringAndSize(base, dot - base); + store_name = PyBytes_FromStringAndSize(base, dot - base); if (!store_name) return 0; } @@ -1338,7 +1338,7 @@ store_name = name; Py_INCREF(store_name); } - if (strcmp(PyString_AS_STRING(name), "*")) { + if (strcmp(PyBytes_AS_STRING(name), "*")) { int r = symtable_add_def(st, store_name, DEF_IMPORT); Py_DECREF(store_name); return r; Modified: python/branches/tlee-ast-optimize/Python/sysmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/sysmodule.c (original) +++ python/branches/tlee-ast-optimize/Python/sysmodule.c Sun Jun 1 17:18:10 2008 @@ -229,7 +229,7 @@ static PyObject * sys_getdefaultencoding(PyObject *self) { - return PyString_FromString(PyUnicode_GetDefaultEncoding()); + return PyBytes_FromString(PyUnicode_GetDefaultEncoding()); } PyDoc_STRVAR(getdefaultencoding_doc, @@ -261,7 +261,7 @@ sys_getfilesystemencoding(PyObject *self) { if (Py_FileSystemDefaultEncoding) - return PyString_FromString(Py_FileSystemDefaultEncoding); + return PyBytes_FromString(Py_FileSystemDefaultEncoding); Py_INCREF(Py_None); return Py_None; } @@ -290,7 +290,7 @@ int i; for (i = 0; i < 7; ++i) { if (whatstrings[i] == NULL) { - name = PyString_InternFromString(whatnames[i]); + name = PyBytes_InternFromString(whatnames[i]); if (name == NULL) return -1; whatstrings[i] = name; @@ -891,7 +891,7 @@ if (list == NULL) return NULL; for (i = 0; PyImport_Inittab[i].name != NULL; i++) { - PyObject *name = PyString_FromString( + PyObject *name = PyBytes_FromString( PyImport_Inittab[i].name); if (name == NULL) break; @@ -931,7 +931,7 @@ if (warnoptions == NULL) return; } - str = PyString_FromString(s); + str = PyBytes_FromString(s); if (str != NULL) { PyList_Append(warnoptions, str); Py_DECREF(str); @@ -1232,9 +1232,6 @@ PyObject *m, *v, *sysdict; PyObject *sysin, *sysout, *syserr; char *s; -#ifdef MS_WINDOWS - char buf[128]; -#endif m = Py_InitModule3("sys", sys_methods, sys_doc); if (m == NULL) @@ -1272,23 +1269,6 @@ syserr = PyFile_FromFile(stderr, "", "w", _check_and_flush); if (PyErr_Occurred()) return NULL; -#ifdef MS_WINDOWS - if(isatty(_fileno(stdin)) && PyFile_Check(sysin)) { - sprintf(buf, "cp%d", GetConsoleCP()); - if (!PyFile_SetEncoding(sysin, buf)) - return NULL; - } - if(isatty(_fileno(stdout)) && PyFile_Check(sysout)) { - sprintf(buf, "cp%d", GetConsoleOutputCP()); - if (!PyFile_SetEncoding(sysout, buf)) - return NULL; - } - if(isatty(_fileno(stderr)) && PyFile_Check(syserr)) { - sprintf(buf, "cp%d", GetConsoleOutputCP()); - if (!PyFile_SetEncoding(syserr, buf)) - return NULL; - } -#endif PyDict_SetItemString(sysdict, "stdin", sysin); PyDict_SetItemString(sysdict, "stdout", sysout); @@ -1306,7 +1286,7 @@ Py_XDECREF(syserr); SET_SYS_FROM_STRING("version", - PyString_FromString(Py_GetVersion())); + PyBytes_FromString(Py_GetVersion())); SET_SYS_FROM_STRING("hexversion", PyInt_FromLong(PY_VERSION_HEX)); svnversion_init(); @@ -1337,15 +1317,15 @@ SET_SYS_FROM_STRING("api_version", PyInt_FromLong(PYTHON_API_VERSION)); SET_SYS_FROM_STRING("copyright", - PyString_FromString(Py_GetCopyright())); + PyBytes_FromString(Py_GetCopyright())); SET_SYS_FROM_STRING("platform", - PyString_FromString(Py_GetPlatform())); + PyBytes_FromString(Py_GetPlatform())); SET_SYS_FROM_STRING("executable", - PyString_FromString(Py_GetProgramFullPath())); + PyBytes_FromString(Py_GetProgramFullPath())); SET_SYS_FROM_STRING("prefix", - PyString_FromString(Py_GetPrefix())); + PyBytes_FromString(Py_GetPrefix())); SET_SYS_FROM_STRING("exec_prefix", - PyString_FromString(Py_GetExecPrefix())); + PyBytes_FromString(Py_GetExecPrefix())); SET_SYS_FROM_STRING("maxsize", PyInt_FromSsize_t(PY_SSIZE_T_MAX)); SET_SYS_FROM_STRING("maxint", @@ -1372,13 +1352,13 @@ else value = "little"; SET_SYS_FROM_STRING("byteorder", - PyString_FromString(value)); + PyBytes_FromString(value)); } #ifdef MS_COREDLL SET_SYS_FROM_STRING("dllhandle", PyLong_FromVoidPtr(PyWin_DLLhModule)); SET_SYS_FROM_STRING("winver", - PyString_FromString(PyWin_DLLVersionString)); + PyBytes_FromString(PyWin_DLLVersionString)); #endif if (warnoptions == NULL) { warnoptions = PyList_New(0); @@ -1423,7 +1403,7 @@ p = strchr(path, delim); if (p == NULL) p = strchr(path, '\0'); /* End of string */ - w = PyString_FromStringAndSize(path, (Py_ssize_t) (p - path)); + w = PyBytes_FromStringAndSize(path, (Py_ssize_t) (p - path)); if (w == NULL) { Py_DECREF(v); return NULL; @@ -1468,14 +1448,14 @@ if (i == 0) { char* fn = decc$translate_vms(argv[0]); if ((fn == (char *)0) || fn == (char *)-1) - v = PyString_FromString(argv[0]); + v = PyBytes_FromString(argv[0]); else - v = PyString_FromString( + v = PyBytes_FromString( decc$translate_vms(argv[0])); } else - v = PyString_FromString(argv[i]); + v = PyBytes_FromString(argv[i]); #else - PyObject *v = PyString_FromString(argv[i]); + PyObject *v = PyBytes_FromString(argv[i]); #endif if (v == NULL) { Py_DECREF(av); @@ -1579,7 +1559,7 @@ #endif /* Unix */ } #endif /* All others */ - a = PyString_FromStringAndSize(argv0, n); + a = PyBytes_FromStringAndSize(argv0, n); if (a == NULL) Py_FatalError("no mem for sys.path insertion"); if (PyList_Insert(path, 0, a) < 0) Modified: python/branches/tlee-ast-optimize/Python/traceback.c ============================================================================== --- python/branches/tlee-ast-optimize/Python/traceback.c (original) +++ python/branches/tlee-ast-optimize/Python/traceback.c Sun Jun 1 17:18:10 2008 @@ -155,12 +155,12 @@ PyErr_Clear(); break; } - if (PyString_Check(v)) { + if (PyBytes_Check(v)) { size_t len; - len = PyString_GET_SIZE(v); + len = PyBytes_GET_SIZE(v); if (len + 1 + taillen >= MAXPATHLEN) continue; /* Too long */ - strcpy(namebuf, PyString_AsString(v)); + strcpy(namebuf, PyBytes_AsString(v)); if (strlen(namebuf) != len) continue; /* v contains '\0' */ if (len > 0 && namebuf[len-1] != SEP) @@ -238,10 +238,10 @@ while (tb != NULL && err == 0) { if (depth <= limit) { err = tb_displayline(f, - PyString_AsString( + PyBytes_AsString( tb->tb_frame->f_code->co_filename), tb->tb_lineno, - PyString_AsString(tb->tb_frame->f_code->co_name)); + PyBytes_AsString(tb->tb_frame->f_code->co_name)); } depth--; tb = tb->tb_next; Modified: python/branches/tlee-ast-optimize/RISCOS/Modules/drawfmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/RISCOS/Modules/drawfmodule.c (original) +++ python/branches/tlee-ast-optimize/RISCOS/Modules/drawfmodule.c Sun Jun 1 17:18:10 2008 @@ -333,7 +333,7 @@ char *dtable; if(!PyArg_ParseTuple(arg,"O!",&PyDict_Type,&d)) return NULL; while(PyDict_Next(d,&n,&key,&value)) - { int m=PyString_Size(value); + { int m=PyBytes_Size(value); if(m<0||!PyInt_Check(key)) return NULL; size+=m+2; } @@ -350,9 +350,9 @@ memset(dtable,0,size-8); n=0; while(PyDict_Next(d,&n,&key,&value)) - { int m=PyString_Size(value); + { int m=PyBytes_Size(value); *dtable=(char)PyInt_AsLong(key); - strcpy(dtable+1,PyString_AsString(value)); + strcpy(dtable+1,PyBytes_AsString(value)); dtable+=m+2; } Py_INCREF(Py_None);return Py_None; @@ -609,8 +609,8 @@ if (!strcmp(name, "__members__")) { PyObject *list = PyList_New(2); if (list) - { PyList_SetItem(list, 0, PyString_FromString("size")); - PyList_SetItem(list, 1, PyString_FromString("start")); + { PyList_SetItem(list, 0, PyBytes_FromString("size")); + PyList_SetItem(list, 1, PyBytes_FromString("start")); if (PyErr_Occurred()) { Py_DECREF(list);list = NULL;} } return list; @@ -659,6 +659,6 @@ { PyObject *m, *d; m = Py_InitModule("drawf", DrawFMethods); d = PyModule_GetDict(m); - DrawFError=PyString_FromString("drawf.error"); + DrawFError=PyBytes_FromString("drawf.error"); PyDict_SetItemString(d,"error",DrawFError); } Modified: python/branches/tlee-ast-optimize/RISCOS/Modules/riscosmodule.c ============================================================================== --- python/branches/tlee-ast-optimize/RISCOS/Modules/riscosmodule.c (original) +++ python/branches/tlee-ast-optimize/RISCOS/Modules/riscosmodule.c Sun Jun 1 17:18:10 2008 @@ -79,9 +79,9 @@ char *buf; e=xosfscontrol_canonicalise_path(path,0,0,0,0,&len); if(e) return riscos_oserror(); - obj=PyString_FromStringAndSize(NULL,-len); + obj=PyBytes_FromStringAndSize(NULL,-len); if(obj==NULL) return NULL; - buf=PyString_AsString(obj); + buf=PyBytes_AsString(obj); e=xosfscontrol_canonicalise_path(path,buf,0,0,1-len,&len); if(len!=1) return riscos_error("Error expanding path"); if(!e) return obj; @@ -131,7 +131,7 @@ { Py_DECREF(d);return riscos_oserror(); } if(count) - { v=PyString_FromString(buf); + { v=PyBytes_FromString(buf); if(!v) { Py_DECREF(d);return 0;} if(PyList_Append(d,v)) {Py_DECREF(d);Py_DECREF(v);return 0;} } @@ -320,7 +320,7 @@ char *name,*value; if(!PyArg_ParseTuple(args,"s:getenv",&name)) return NULL; value=getenv(name); - if(value) return PyString_FromString(value); + if(value) return PyBytes_FromString(value); Py_INCREF(Py_None); return Py_None; } @@ -371,7 +371,7 @@ os_VARTYPE_EXPANDED,&size,(int *)&context,0)) { PyObject *v; value[size]='\0'; - v = PyString_FromString(value); + v = PyBytes_FromString(value); if (v == NULL) continue; PyDict_SetItemString(dict, context, v); Py_DECREF(v); Modified: python/branches/tlee-ast-optimize/RISCOS/Modules/swimodule.c ============================================================================== --- python/branches/tlee-ast-optimize/RISCOS/Modules/swimodule.c (original) +++ python/branches/tlee-ast-optimize/RISCOS/Modules/swimodule.c Sun Jun 1 17:18:10 2008 @@ -66,10 +66,10 @@ b->length=4*size; b->heap=1; if(init) - { if(PyString_Check(init)) - { int n=PyString_Size(init); + { if(PyBytes_Check(init)) + { int n=PyBytes_Size(init); if (n>4*size) n=4*size; - memcpy(b->block,PyString_AsString(init),n); + memcpy(b->block,PyBytes_AsString(init),n); memset((char*)b->block+n,0,4*size-n); } else @@ -113,7 +113,7 @@ { PyErr_SetString(PyExc_IndexError,"block index out of range"); return NULL; } - return PyString_FromStringAndSize((char*)self->block+s,e-s); + return PyBytes_FromStringAndSize((char*)self->block+s,e-s); } static PyObject *PyBlock_NullString(PyBlockObject *self,PyObject *arg) @@ -125,7 +125,7 @@ return NULL; } for(i=s;iblock+s,i-s); + return PyBytes_FromStringAndSize((char*)self->block+s,i-s); } static PyObject *PyBlock_CtrlString(PyBlockObject *self,PyObject *arg) @@ -137,7 +137,7 @@ return NULL; } for(i=s;iblock+s,i-s); + return PyBytes_FromStringAndSize((char*)self->block+s,i-s); } static PyObject *PyBlock_PadString(PyBlockObject *self,PyObject *arg) @@ -296,9 +296,9 @@ if (!strcmp(name, "__members__")) { PyObject *list = PyList_New(3); if (list) - { PyList_SetItem(list, 0, PyString_FromString("length")); - PyList_SetItem(list, 1, PyString_FromString("start")); - PyList_SetItem(list, 2, PyString_FromString("end")); + { PyList_SetItem(list, 0, PyBytes_FromString("length")); + PyList_SetItem(list, 1, PyBytes_FromString("start")); + PyList_SetItem(list, 2, PyBytes_FromString("end")); if (PyErr_Occurred()) { Py_DECREF(list);list = NULL;} } return list; @@ -402,7 +402,7 @@ for(;*fmt;fmt++) { switch(*fmt) { case 'i':v=PyInt_FromLong((long)r.r[rno++]); break; - case 's':v=PyString_FromString((char*)(r.r[rno++])); break; + case 's':v=PyBytes_FromString((char*)(r.r[rno++])); break; case '.':rno++; continue; case '*':v=PyInt_FromLong((long)carry); break; } @@ -421,7 +421,7 @@ if(!PyArg_ParseTuple(arg,"i|i",(unsigned int *)&s, &l)) return NULL; if (l==-1) l = strlen(s); - return PyString_FromStringAndSize((char*)s, l); + return PyBytes_FromStringAndSize((char*)s, l); } static char swi_string__doc__[] = Modified: python/branches/tlee-ast-optimize/configure.in ============================================================================== --- python/branches/tlee-ast-optimize/configure.in (original) +++ python/branches/tlee-ast-optimize/configure.in Sun Jun 1 17:18:10 2008 @@ -1,4 +1,7 @@ -dnl Process this file with autoconf 2.0 or later to make a configure script. +dnl *********************************************** +dnl * Please run autoreconf to test your changes! * +dnl *********************************************** +dnl NOTE: autoconf 2.64 doesn't seem to work (use 2.63). # Set VERSION so we only need to edit in one place (i.e., here) m4_define(PYTHON_VERSION, 2.6) Modified: python/branches/tlee-ast-optimize/setup.py ============================================================================== --- python/branches/tlee-ast-optimize/setup.py (original) +++ python/branches/tlee-ast-optimize/setup.py Sun Jun 1 17:18:10 2008 @@ -5,6 +5,7 @@ import sys, os, imp, re, optparse from glob import glob +from platform import machine as platform_machine from distutils import log from distutils import sysconfig @@ -687,13 +688,39 @@ # a release. Most open source OSes come with one or more # versions of BerkeleyDB already installed. - max_db_ver = (4, 5) # XXX(gregory.p.smith): 4.6 "works" but seems to - # have issues on many platforms. I've temporarily - # disabled 4.6 to see what the odd platform - # buildbots say. + max_db_ver = (4, 7) min_db_ver = (3, 3) db_setup_debug = False # verbose debug prints from this script? + def allow_db_ver(db_ver): + """Returns a boolean if the given BerkeleyDB version is acceptable. + + Args: + db_ver: A tuple of the version to verify. + """ + if not (min_db_ver <= db_ver <= max_db_ver): + return False + # Use this function to filter out known bad configurations. + if (4, 6) == db_ver[:2]: + # BerkeleyDB 4.6.x is not stable on many architectures. + arch = platform_machine() + if arch not in ('i386', 'i486', 'i586', 'i686', + 'x86_64', 'ia64'): + return False + return True + + def gen_db_minor_ver_nums(major): + if major == 4: + for x in range(max_db_ver[1]+1): + if allow_db_ver((4, x)): + yield x + elif major == 3: + for x in (3,): + if allow_db_ver((3, x)): + yield x + else: + raise ValueError("unknown major BerkeleyDB version", major) + # construct a list of paths to look for the header file in on # top of the normal inc_dirs. db_inc_paths = [ @@ -708,7 +735,7 @@ '/sw/include/db3', ] # 4.x minor number specific paths - for x in range(max_db_ver[1]+1): + for x in gen_db_minor_ver_nums(4): db_inc_paths.append('/usr/include/db4%d' % x) db_inc_paths.append('/usr/include/db4.%d' % x) db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x) @@ -718,7 +745,7 @@ # MacPorts default (http://www.macports.org/) db_inc_paths.append('/opt/local/include/db4%d' % x) # 3.x minor number specific paths - for x in (3,): + for x in gen_db_minor_ver_nums(3): db_inc_paths.append('/usr/include/db3%d' % x) db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x) db_inc_paths.append('/usr/local/include/db3%d' % x) @@ -733,10 +760,10 @@ for dn in inc_dirs: std_variants.append(os.path.join(dn, 'db3')) std_variants.append(os.path.join(dn, 'db4')) - for x in range(max_db_ver[1]+1): + for x in gen_db_minor_ver_nums(4): std_variants.append(os.path.join(dn, "db4%d"%x)) std_variants.append(os.path.join(dn, "db4.%d"%x)) - for x in (3,): + for x in gen_db_minor_ver_nums(3): std_variants.append(os.path.join(dn, "db3%d"%x)) std_variants.append(os.path.join(dn, "db3.%d"%x)) @@ -771,7 +798,7 @@ continue if ( (not db_ver_inc_map.has_key(db_ver)) and - (db_ver <= max_db_ver and db_ver >= min_db_ver) ): + allow_db_ver(db_ver) ): # save the include directory with the db.h version # (first occurrence only) db_ver_inc_map[db_ver] = d @@ -815,8 +842,9 @@ if db_setup_debug: print "db lib: ", dblib, "not found" except db_found: - print "bsddb using BerkeleyDB lib:", db_ver, dblib - print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir + if db_setup_debug: + print "bsddb using BerkeleyDB lib:", db_ver, dblib + print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir db_incs = [db_incdir] dblibs = [dblib] # We add the runtime_library_dirs argument because the From python-checkins at python.org Sun Jun 1 17:27:17 2008 From: python-checkins at python.org (georg.brandl) Date: Sun, 1 Jun 2008 17:27:17 +0200 (CEST) Subject: [Python-checkins] r63855 - in doctools/trunk: doc/builders.rst sphinx/builder.py sphinx/environment.py sphinx/latexwriter.py sphinx/textwriter.py Message-ID: <20080601152717.438C11E4009@bag.python.org> Author: georg.brandl Date: Sun Jun 1 17:27:16 2008 New Revision: 63855 Log: Add a preliminary text writer, mainly for producing pydoc-compatible topic help. Added: doctools/trunk/sphinx/textwriter.py Modified: doctools/trunk/doc/builders.rst doctools/trunk/sphinx/builder.py doctools/trunk/sphinx/environment.py doctools/trunk/sphinx/latexwriter.py Modified: doctools/trunk/doc/builders.rst ============================================================================== --- doctools/trunk/doc/builders.rst (original) +++ doctools/trunk/doc/builders.rst Sun Jun 1 17:27:16 2008 @@ -51,6 +51,16 @@ Its name is ``latex``. +.. class:: TextBuilder + + This builder produces a text file for each reST file -- this is almost the + same as the reST source, but with much of the markup stripped for better + readability. + + Its name is ``text``. + + .. versionadded:: 0.4 + .. class:: ChangesBuilder This builder produces an HTML overview of all :dir:`versionadded`, Modified: doctools/trunk/sphinx/builder.py ============================================================================== --- doctools/trunk/sphinx/builder.py (original) +++ doctools/trunk/sphinx/builder.py Sun Jun 1 17:27:16 2008 @@ -28,6 +28,7 @@ from sphinx.util import ensuredir, relative_uri, SEP, os_path from sphinx.htmlhelp import build_hhx from sphinx.htmlwriter import HTMLWriter, HTMLTranslator, SmartyPantsHTMLTranslator +from sphinx.textwriter import TextWriter from sphinx.latexwriter import LaTeXWriter from sphinx.environment import BuildEnvironment, NoUri from sphinx.highlighting import PygmentsBridge @@ -223,7 +224,7 @@ self.info(bold('build succeeded.')) def write(self, build_docnames, updated_docnames, method='update'): - if build_docnames is None: + if build_docnames is None or build_docnames == ['__all__']: # build_all build_docnames = self.env.found_docs if method == 'update': @@ -980,6 +981,56 @@ def finish(self): pass + +class TextBuilder(Builder): + name = 'text' + out_suffix = '.txt' + + def init(self): + pass + + def get_outdated_docs(self): + for docname in self.env.found_docs: + if docname not in self.env.all_docs: + yield docname + continue + targetname = self.env.doc2path(docname, self.outdir, self.out_suffix) + try: + targetmtime = path.getmtime(targetname) + except Exception: + targetmtime = 0 + try: + srcmtime = path.getmtime(self.env.doc2path(docname)) + if srcmtime > targetmtime: + yield docname + except EnvironmentError: + # source doesn't exist anymore + pass + + def get_target_uri(self, docname, typ=None): + return '' + + def prepare_writing(self, docnames): + self.writer = TextWriter(self) + + def write_doc(self, docname, doctree): + destination = StringOutput(encoding='utf-8') + self.writer.write(doctree, destination) + outfilename = path.join(self.outdir, os_path(docname) + self.out_suffix) + ensuredir(path.dirname(outfilename)) # normally different from self.outdir + try: + f = codecs.open(outfilename, 'w', 'utf-8') + try: + f.write(self.writer.output) + finally: + f.close() + except (IOError, OSError), err: + self.warn("Error writing file %s: %s" % (outfilename, err)) + + def finish(self): + pass + + # compatibility alias WebHTMLBuilder = PickleHTMLBuilder @@ -992,6 +1043,7 @@ 'web': PickleHTMLBuilder, 'htmlhelp': HTMLHelpBuilder, 'latex': LaTeXBuilder, + 'text': TextBuilder, 'changes': ChangesBuilder, 'linkcheck': CheckExternalLinksBuilder, } Modified: doctools/trunk/sphinx/environment.py ============================================================================== --- doctools/trunk/sphinx/environment.py (original) +++ doctools/trunk/sphinx/environment.py Sun Jun 1 17:27:16 2008 @@ -1004,8 +1004,12 @@ includes = getinc(docname) # previous if not previous: + # if no previous sibling, go to parent previous = parents[0][0] else: + # else, go to previous sibling, or if it has children, to + # the last of its children, or if that has children, to the + # last of those, and so forth while 1: previncs = getinc(previous) if previncs: @@ -1014,10 +1018,14 @@ break # next if includes: + # if it has children, go to first of them next = includes[0] elif next: + # else, if next sibling, go to it pass else: + # else, go to the next sibling of the parent, if present, + # else the grandparent's sibling, if present, and so forth for parname, parindex in parents: parincs = getinc(parname) if parincs and parindex + 1 < len(parincs): Modified: doctools/trunk/sphinx/latexwriter.py ============================================================================== --- doctools/trunk/sphinx/latexwriter.py (original) +++ doctools/trunk/sphinx/latexwriter.py Sun Jun 1 17:27:16 2008 @@ -993,6 +993,9 @@ def depart_Text(self, node): pass + def visit_comment(self, node): + raise nodes.SkipNode + def visit_system_message(self, node): pass def depart_system_message(self, node): Added: doctools/trunk/sphinx/textwriter.py ============================================================================== --- (empty file) +++ doctools/trunk/sphinx/textwriter.py Sun Jun 1 17:27:16 2008 @@ -0,0 +1,595 @@ +# -*- coding: utf-8 -*- +""" + sphinx.textwriter + ~~~~~~~~~~~~~~~~~ + + Custom docutils writer for plain text. + + :copyright: 2008 by Georg Brandl. + :license: BSD. +""" + +import re +import textwrap + +from docutils import nodes, writers + +from sphinx import addnodes + + +class TextWriter(writers.Writer): + supported = ('text',) + settings_spec = ('No options here.', '', ()) + settings_defaults = {} + + output = None + + def __init__(self, builder): + writers.Writer.__init__(self) + self.builder = builder + + def translate(self): + visitor = TextTranslator(self.document, self.builder) + self.document.walkabout(visitor