churchyard pushed to pypy3 (f21). "Rebase to 1.5 (rhbz#701121) (..more)"

notifications at fedoraproject.org notifications at fedoraproject.org
Sun May 10 19:33:56 UTC 2015


From 169de85aca1a527ea42ef102aa32a40ba1740168 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm at redhat.com>
Date: Mon, 2 May 2011 14:46:32 -0400
Subject: Rebase to 1.5 (rhbz#701121)

Update patches:
  patch 0: pypy-1.4-config.patch -> pypy-1.5-config.patch
  patch 4: pypy-1.4.1-more-readable-c-code.patch -> pypy-1.5-more-readable-c-code.patch

Remove references to *.inl files, no longer present

Add the following tests to the skip list:
  test_audioop, test_capi, test_distutils, test_gc, test_gdb, test_generators,
  test_getargs2, test_hotshot, test_io, test_multiprocessing, test_posix,
  test_readline, test_scope, test_strop, test_structmembers, test_subprocess,
  test_symtable, test_sys_settrace, test_tempfile, test_thread, test_uuid,
  test_zipimport_support

Add a couple of text files to the payload (TODO, stdlib-version.txt)

diff --git a/.gitignore b/.gitignore
index 2878978..017cf34 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
 /pypy-1.4.1-src.tar.bz2
+/pypy-1.5-src.tar.bz2
diff --git a/pypy-1.4-config.patch b/pypy-1.4-config.patch
deleted file mode 100644
index 0b82ac8..0000000
--- a/pypy-1.4-config.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-Index: pypy-1.4/pypy/translator/platform/linux.py
-===================================================================
---- pypy-1.4.orig/pypy/translator/platform/linux.py
-+++ pypy-1.4/pypy/translator/platform/linux.py
-@@ -3,17 +3,22 @@ import py, os
- from pypy.translator.platform import _run_subprocess
- from pypy.translator.platform.posix import BasePosix
- 
-+CFLAGS = ['-O3', '-pthread', '-fomit-frame-pointer',
-+          '-Wall', '-Wno-unused']
-+if os.environ.get('CFLAGS', None):
-+    CFLAGS.extend(os.environ['CFLAGS'].split())
-+CFLAGS = tuple(CFLAGS)
-+
- class BaseLinux(BasePosix):
-     name = "linux"
-     
-     link_flags = ('-pthread', '-lrt')
--    cflags = ('-O3', '-pthread', '-fomit-frame-pointer',
--              '-Wall', '-Wno-unused')
-+    cflags = CFLAGS
-     standalone_only = ()
-     shared_only = ('-fPIC',)
-     so_ext = 'so'
-     so_prefixes = ('lib', '')
--    
-+
-     def _args_for_shared(self, args):
-         return ['-shared'] + args
- 
-@@ -29,9 +34,10 @@ class BaseLinux(BasePosix):
- class Linux(BaseLinux):
-     shared_only = ()    # it seems that on 32-bit linux, compiling with -fPIC
-                         # gives assembler that asmgcc is not happy about.
--    def library_dirs_for_libffi_a(self):
--        # places where we need to look for libffi.a
--        return self.library_dirs_for_libffi() + ['/usr/lib']
-+    # Fedora Linux, at least, has the shared version but not the static
-+    #def library_dirs_for_libffi_a(self):
-+    #    # places where we need to look for libffi.a
-+    #    return self.library_dirs_for_libffi() + ['/usr/lib']
- 
- 
- class Linux64(BaseLinux):
diff --git a/pypy-1.4.1-more-readable-c-code.patch b/pypy-1.4.1-more-readable-c-code.patch
deleted file mode 100644
index 45fa534..0000000
--- a/pypy-1.4.1-more-readable-c-code.patch
+++ /dev/null
@@ -1,695 +0,0 @@
-diff -r cd083843b67a pypy/interpreter/pycode.py
---- a/pypy/interpreter/pycode.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/interpreter/pycode.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -14,6 +14,7 @@
- from pypy.interpreter.astcompiler.consts import (CO_OPTIMIZED,
-     CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS, CO_NESTED,
-     CO_GENERATOR, CO_CONTAINSGLOBALS)
-+from pypy.interpreter.pytraceback import offset2lineno
- from pypy.rlib.rarithmetic import intmask
- from pypy.rlib.debug import make_sure_not_resized
- from pypy.rlib import jit
-@@ -81,6 +82,7 @@
-         self.hidden_applevel = hidden_applevel
-         self.magic = magic
-         self._signature = cpython_code_signature(self)
-+        self._cached_source = None
-         self._initialize()
- 
-     def _initialize(self):
-@@ -403,3 +405,25 @@
-     def repr(self, space):
-         return space.wrap(self.get_repr())
-     repr.unwrap_spec = ['self', ObjSpace]
-+
-+    def get_linenum_for_offset(self, offset):
-+        # Given a bytecode offset, return a 1-based index into the lines of the
-+        # source code
-+        return offset2lineno(self, offset)
-+
-+    def _ensure_source(self):
-+        # Lazily grab the source lines into self._cached_source (or raise
-+        # an IOError)
-+        if not self._cached_source:
-+            f = open(self.co_filename, 'r')
-+            source = [line.rstrip() for line in f.readlines()]
-+            f.close()
-+            self._cached_source = source
-+    
-+    def get_source_text(self, linenum):
-+        # Given a 1-based index, get the corresponding line of source code (or
-+        # raise an IOError)
-+        self._ensure_source()
-+        return self._cached_source[linenum - 1]
-+
-+        
-diff -r cd083843b67a pypy/objspace/flow/model.py
---- a/pypy/objspace/flow/model.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/objspace/flow/model.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -31,6 +31,120 @@
- 
- __metaclass__ = type
- 
-+class SourceLoc(object):
-+    # A srcloc is a specific location within the RPython source code,
-+    # intended for human display
-+    __slots__ = ('code', # code object
-+                 'linenum' # 1-based index, as displayed to a user
-+                 )
-+    def __init__(self, code, linenum):
-+        self.code = code
-+        self.linenum = linenum
-+
-+    def get_text(self):
-+        # Get the actual source text of this line
-+        return self.code.get_source_text(self.linenum)
-+
-+    def __eq__(self, other):
-+        return self.code == other.code and self.linenum == other.linenum
-+
-+    def __ne__(self, other):
-+        if other:
-+            return self.code != other.code or self.linenum != other.linenum
-+        else:
-+            return True
-+
-+class CodeLoc(object):
-+    # A codeloc is a specific location within the RPython bytecode
-+    __slots__ = ('code', # code object
-+                 'offset' # int index into bytecode, or -1
-+                 )
-+
-+    def __init__(self, code, offset):
-+        self.code = code
-+        self.offset = offset
-+
-+    def __str__(self):
-+        if self.offset >= 0:
-+            return "%s@%d" % (self.code.co_name, self.offset)
-+        else:
-+            return ""
-+
-+    def __ne__(self, other):
-+        if other:
-+            return self.code != other.code or self.offset != other.offset
-+        else:
-+            return True
-+
-+    def __cmp__(self, other):
-+        # Partial ordering, for those locations that have an offset:
-+        if other:
-+            if self.offset >= 0 and other.offset >= 0:
-+                return self.offset - other.offset
-+        return 0
-+
-+    def get_source_loc(self):
-+        # Convert to a SourceLoc:
-+        return SourceLoc(self.code, self.code.get_linenum_for_offset(self.offset))
-+
-+class OperationLoc(object):
-+    # An oploc is the location within the RPython source code of a given
-+    # operation
-+    # 
-+    # This is a list consisting of CodeLoc instances, some of which may be None
-+    #
-+    # For the simple case, this is list of length 1 with a single CodeLoc
-+    #
-+    # For an operation inside an inlined callsite, we have a list of length 2:
-+    #    [codeloc of callsite,
-+    #     codeloc of operation within inlined body]
-+    #
-+    # For more interesting inlined cases, we have a chain of source locations:
-+    #    [codeloc of callsite,
-+    #     codeloc of inner callsite,
-+    #     ... ,
-+    #     codeloc of innermost inlined callsite,
-+    #     codeloc of operation within inlined body]
-+    #
-+
-+    __slots__ = ('codelocs', )
-+
-+    def __init__(self, codelocs):
-+        self.codelocs = codelocs
-+
-+    def __str__(self):
-+        return '[' + ' > '.join(str(codeloc) for codeloc in self.codelocs) + ']'
-+
-+    def __cmp__(self, other):
-+        return cmp(self.codelocs, other.codelocs)
-+
-+def block_comparator(blk0, blk1):
-+    '''
-+    Sort function for blocks, putting them in an ordering that attempts to
-+    maximize readability of the generated C code
-+    '''
-+    # print 'comparing %r and %r' % (blk0, blk1)
-+    # Put the start/end block at the top/bottom:
-+    if blk0.isstartblock:
-+        return -1
-+
-+    if blk1.isstartblock:
-+        return 1
-+
-+    # Order blocks by the offset, where present:
-+    if blk0.operations:
-+        if blk1.operations:
-+            return cmp(blk0.operations[0].oploc, blk1.operations[0].oploc)
-+        else:
-+            return -1
-+    else:
-+        if blk1.operations:
-+            return 1
-+        else:
-+            return 0
-+
-+def edge_comparator(edge0, edge1):
-+    return block_comparator(edge0.target, edge1.target)
- 
- class FunctionGraph(object):
-     __slots__ = ['startblock', 'returnblock', 'exceptblock', '__dict__']
-@@ -94,6 +208,21 @@
-                 seen[block] = True
-                 stack += block.exits[::-1]
- 
-+    def iterblocks_by_source(self):
-+        # Try to preserve logical source ordering in the blocks
-+        block = self.startblock
-+        yield block
-+        seen = {block: True}
-+        stack = list(block.exits[::-1])
-+        stack.sort(edge_comparator)
-+        while stack:
-+            block = stack.pop().target
-+            if block not in seen:
-+                yield block
-+                seen[block] = True
-+                stack += block.exits[::-1]
-+                stack.sort(edge_comparator)
-+
-     def iterlinks(self):
-         block = self.startblock
-         seen = {block: True}
-@@ -183,14 +312,14 @@
-         self.exits      = []              # list of Link(s)
- 
-     def at(self):
--        if self.operations and self.operations[0].offset >= 0:
--            return "@%d" % self.operations[0].offset
-+        if self.operations:
-+            return str(self.operations[0].oploc)
-         else:
-             return ""
- 
-     def __str__(self):
-         if self.operations:
--            txt = "block@%d" % self.operations[0].offset
-+            txt = "block%s" % self.operations[0].oploc
-         else:
-             if (not self.exits) and len(self.inputargs) == 1:
-                 txt = "return block"
-@@ -245,6 +374,21 @@
-         from pypy.translator.tool.graphpage import try_show
-         try_show(self)
- 
-+    def isreturnblock(self):
-+        return (not self.operations) and (not self.exits) and len(self.inputargs) == 1
-+
-+    def get_base_label(self, blocknum):
-+        # Generate a more friendly C label for this block
-+        if self.operations:
-+            txt = "block"
-+        elif (not self.exits) and len(self.inputargs) == 1:
-+            txt = "return_block"
-+        elif (not self.exits) and len(self.inputargs) == 2:
-+            txt = "raise_block"
-+        else:
-+            txt = "codeless_block"
-+        return '%s%d' % (txt, blocknum)
-+
- 
- class Variable(object):
-     __slots__ = ["_name", "_nr", "concretetype"]
-@@ -331,13 +475,15 @@
- 
- 
- class SpaceOperation(object):
--    __slots__ = "opname args result offset".split()
-+    __slots__ = "opname args result oploc".split()
- 
--    def __init__(self, opname, args, result, offset=-1):
-+    def __init__(self, opname, args, result, oploc=None):
-         self.opname = intern(opname)      # operation name
-         self.args   = list(args)  # mixed list of var/const
-         self.result = result      # either Variable or Constant instance
--        self.offset = offset      # offset in code string
-+        if oploc is None:
-+            oploc = OperationLoc([None])
-+        self.oploc = oploc
- 
-     def __eq__(self, other):
-         return (self.__class__ is other.__class__ and 
-@@ -352,8 +498,9 @@
-         return hash((self.opname,tuple(self.args),self.result))
- 
-     def __repr__(self):
--        return "%r = %s(%s)" % (self.result, self.opname,
--                                ", ".join(map(repr, self.args)))
-+        return "%r = %s(%s) (%s)" % (self.result, self.opname,
-+                                     ", ".join(map(repr, self.args)),
-+                                     self.oploc)
- 
- class Atom(object):
-     def __init__(self, name):
-@@ -448,8 +595,7 @@
-                 for op in oplist:
-                     copyop = SpaceOperation(op.opname,
-                                             [copyvar(v) for v in op.args],
--                                            copyvar(op.result), op.offset)
--                    #copyop.offset = op.offset
-+                                            copyvar(op.result), op.oploc)
-                     result.append(copyop)
-                 return result
-             newblock.operations = copyoplist(block.operations)
-diff -r cd083843b67a pypy/objspace/flow/objspace.py
---- a/pypy/objspace/flow/objspace.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/objspace/flow/objspace.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -310,7 +310,9 @@
-     def do_operation(self, name, *args_w):
-         spaceop = SpaceOperation(name, args_w, Variable())
-         if hasattr(self, 'executioncontext'):  # not here during bootstrapping
--            spaceop.offset = self.executioncontext.crnt_offset
-+            codeloc = CodeLoc(self.executioncontext.code,
-+                              self.executioncontext.crnt_offset)
-+            spaceop.oploc = OperationLoc([codeloc])
-             self.executioncontext.recorder.append(spaceop)
-         return spaceop.result
- 
-diff -r cd083843b67a pypy/objspace/flow/test/test_model.py
---- a/pypy/objspace/flow/test/test_model.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/objspace/flow/test/test_model.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -132,3 +132,25 @@
-     assert v2.renamed
-     assert v2.name.startswith("foobar_") and v2.name != v.name
-     assert v2.name.split('_', 1)[1].isdigit()
-+
-+def test_source_locations():
-+    # Invent some random offsets into the code:
-+    co = sample_function.__code__
-+    codelocA = CodeLoc(co, 42)
-+    codelocB = CodeLoc(co, 87)
-+
-+    assert str(codelocA) == 'sample_function at 42'
-+    assert str(codelocB) == 'sample_function at 87'
-+
-+    assert cmp(codelocA, codelocB) < 0
-+    assert cmp(codelocB, codelocA) > 0
-+    
-+    oplocA = OperationLoc([codelocA])
-+    oplocB = OperationLoc([codelocB])
-+
-+    assert str(oplocA) == '[sample_function at 42]'
-+    assert str(oplocB) == '[sample_function at 87]'
-+
-+    assert cmp(oplocA, oplocB) < 0
-+    assert cmp(oplocB, oplocA) > 0
-+
-diff -r cd083843b67a pypy/rpython/rtyper.py
---- a/pypy/rpython/rtyper.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/rpython/rtyper.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -800,7 +800,7 @@
-         return vars
- 
-     def genop(self, opname, args_v, resulttype=None):
--        return self.llops.genop(opname, args_v, resulttype)
-+        return self.llops.genop(opname, args_v, resulttype, self.spaceop.oploc)
- 
-     def gendirectcall(self, ll_function, *args_v):
-         return self.llops.gendirectcall(ll_function, *args_v)
-@@ -935,7 +935,7 @@
-                                                     v.concretetype))
-         return v
- 
--    def genop(self, opname, args_v, resulttype=None):
-+    def genop(self, opname, args_v, resulttype=None, oploc=None):
-         try:
-             for v in args_v:
-                 v.concretetype
-@@ -944,7 +944,7 @@
-                                  " and pass its result to genop(),"
-                                  " never hop.args_v directly.")
-         vresult = Variable()
--        self.append(SpaceOperation(opname, args_v, vresult))
-+        self.append(SpaceOperation(opname, args_v, vresult, oploc))
-         if resulttype is None:
-             vresult.concretetype = Void
-             return None
-diff -r cd083843b67a pypy/translator/backendopt/inline.py
---- a/pypy/translator/backendopt/inline.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/translator/backendopt/inline.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -4,6 +4,7 @@
- from pypy.translator.unsimplify import copyvar
- from pypy.objspace.flow.model import Variable, Constant, Block, Link
- from pypy.objspace.flow.model import SpaceOperation, c_last_exception
-+from pypy.objspace.flow.model import OperationLoc
- from pypy.objspace.flow.model import FunctionGraph
- from pypy.objspace.flow.model import traverse, mkentrymap, checkgraph
- from pypy.annotation import model as annmodel
-@@ -231,6 +232,7 @@
-         self.varmap = {}
-         self._copied_blocks = {}
-         self.op = block.operations[index_operation]
-+        self.callsite_oploc = self.op.oploc
-         self.graph_to_inline = self.get_graph_from_op(self.op)
-         self.exception_guarded = False
-         if (block.exitswitch == c_last_exception and
-@@ -297,7 +299,9 @@
-         
-     def copy_operation(self, op):
-         args = [self.get_new_name(arg) for arg in op.args]
--        result = SpaceOperation(op.opname, args, self.get_new_name(op.result))
-+        new_oploc = OperationLoc(self.callsite_oploc.codelocs[:] + op.oploc.codelocs[:])
-+        result = SpaceOperation(op.opname, args, self.get_new_name(op.result), 
-+                                new_oploc)
-         return result
- 
-     def copy_block(self, block):
-diff -r cd083843b67a pypy/translator/c/funcgen.py
---- a/pypy/translator/c/funcgen.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/translator/c/funcgen.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -1,4 +1,6 @@
- import sys
-+import inspect
-+import dis
- from pypy.translator.c.support import USESLOTS # set to False if necessary while refactoring
- from pypy.translator.c.support import cdecl
- from pypy.translator.c.support import llvalue_from_constant, gen_assignments
-@@ -22,6 +24,38 @@
- 
- KEEP_INLINED_GRAPHS = False
- 
-+def block_comparator(blk0, blk1):
-+    '''
-+    Sort function for blocks, putting them in an ordering that attempts to
-+    maximize readability of the generated C code
-+    '''
-+    # print 'comparing %r and %r' % (blk0, blk1)
-+    # Put the start/end block at the top/bottom:
-+    if blk0.isstartblock:
-+        return -1
-+
-+    if blk1.isstartblock:
-+        return 1
-+
-+    # Order blocks by the offset, where present:
-+    if blk0.operations:
-+        if blk1.operations:
-+            return cmp(blk0.operations[0].oploc, blk1.operations[0].oploc)
-+        else:
-+            return -1
-+    else:
-+        if blk1.operations:
-+            return 1
-+        else:
-+            return 0
-+
-+def escape_c_comments(py_src):
-+    # Escape C comments within RPython source, to avoid generating bogus
-+    # comments in our generated C source:
-+    py_src = py_src.replace('/*', '')
-+    py_src = py_src.replace('*/', '')
-+    return py_src
-+
- class FunctionCodeGenerator(object):
-     """
-     Collects information about a function which we have to generate
-@@ -210,14 +244,57 @@
- 
-     def cfunction_body(self):
-         graph = self.graph
--        yield 'goto block0;'    # to avoid a warning "this label is not used"
-+        # Try to print python source code:
-+        if hasattr(graph, 'func'):
-+            filename = inspect.getfile(graph.func)
-+            #yield '/* name: %r */' % filename
-+            try:
-+                src, startline = inspect.getsourcelines(graph.func)
-+            except IOError:
-+                pass # No source found
-+            except IndexError:
-+                pass # Bulletproofing
-+            else:
-+                yield '/* Python source %r' % filename
-+                for i, line in enumerate(src):
-+                    line = line.rstrip()
-+                    line = escape_c_comments(line)
-+                    # FuncNode.funcgen_implementation treats lines ending in ':'
-+                    # as C blocks, which messes up the formatting.
-+                    # Work around this:
-+                    if line.endswith(':'):
-+                        line += ' '
-+                    yield ' * %4d : %s' % (startline + i, line)
-+                yield ' */'
-+
-+        label = graph.startblock.get_base_label(self.blocknum[graph.startblock])
-+        yield 'goto %s;' % label # to avoid a warning "this label is not used"
-+
-+        # Sort the blocks into a (hopefully) readable order:
-+        blocks = list(graph.iterblocks_by_source())
-+        blocks.sort(block_comparator)
- 
-         # generate the body of each block
--        for block in graph.iterblocks():
-+        for block in blocks:
-+            cursrcloc = None
-             myblocknum = self.blocknum[block]
-             yield ''
--            yield 'block%d:' % myblocknum
-+            yield '%s:' % block.get_base_label(myblocknum)
-+            #yield "/* repr(block): %r */" % (block, )
-+            #yield "/* type(block): %r */" % (type(block), )
-             for i, op in enumerate(block.operations):
-+                #yield "/* type(op): %r */" % (type(op), )
-+                #yield "/* op.oploc: %s */" % (op.oploc, )
-+                codeloc = op.oploc.codelocs[-1]
-+                if codeloc:
-+                    srcloc = codeloc.get_source_loc()
-+                    if srcloc != cursrcloc:
-+                        try:
-+                            yield "/* %s:%d : %s */" % (codeloc.code.co_name, srcloc.linenum, escape_c_comments(srcloc.get_text()))
-+                            cursrcloc = srcloc
-+                        except IOError:
-+                            pass
-+
-                 for line in self.gen_op(op):
-                     yield line
-             if len(block.exits) == 0:
-@@ -310,7 +387,7 @@
-             assignments.append((a2typename, dest, src))
-         for line in gen_assignments(assignments):
-             yield line
--        label = 'block%d' % self.blocknum[link.target]
-+        label = link.target.get_base_label(self.blocknum[link.target])
-         if link.target in self.innerloops:
-             loop = self.innerloops[link.target]
-             if link is loop.links[-1]:   # link that ends a loop
-diff -r cd083843b67a pypy/translator/c/test/test_genc.py
---- a/pypy/translator/c/test/test_genc.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/translator/c/test/test_genc.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -1,4 +1,5 @@
- import autopath, sys, os, py
-+import re
- from pypy.rpython.lltypesystem.lltype import *
- from pypy.annotation import model as annmodel
- from pypy.translator.translator import TranslationContext
-@@ -498,3 +499,130 @@
-     else:
-         assert 0, "the call was not found in the C source"
-     assert 'PYPY_INHIBIT_TAIL_CALL();' in lines[i+1]
-+
-+def get_generated_c_source(fn, types):
-+    # Return a (optimized fn, c source code, c source filename) 3-tuple
-+    t = Translation(fn)
-+    t.annotate(types)
-+    c_filename_path = t.source_c()
-+    h = c_filename_path.open()
-+    src = h.read()
-+    h.close()
-+    c_fn = t.compile_c()
-+    return (c_fn, src, c_filename_path)
-+
-+def extract_c_function(c_src, fname):
-+    # Extract the source for a given C function out of a the given src string
-+    # Makes assumptions about the layout of the source
-+    pattern = '^(.+) \**%s\(.*\) {$' % fname
-+    within_fn = False
-+    result = ''
-+    for line in c_src.splitlines():
-+        if within_fn:
-+            result += line + '\n'
-+            if line.startswith('}'):
-+                return result
-+        else:
-+            m = re.match(pattern, line)
-+            if m:
-+                within_fn = True
-+                result += line + '\n'
-+    return result
-+    
-+    
-+
-+def test_generated_c_source():
-+    # Verify that generate C source "looks good"
-+    # We'll use is_perfect_number, as it contains a loop and a conditional
-+
-+    # Generate C source code
-+    from pypy.translator.test.snippet import is_perfect_number
-+    c_fn, c_src, c_filename_path = get_generated_c_source(is_perfect_number,
-+                                                        [int])
-+
-+    # Locate the C source for the type-specialized function:
-+    c_fn_src = extract_c_function(c_src, 'pypy_g_is_perfect_number')
-+    
-+    # Verify that the C source contains embedded comments containing the lines
-+    # of the python source:
-+    expected_comment_lines = [
-+        '/* is_perfect_number:31 :     while div < n: */',
-+        '/* is_perfect_number:32 :         if n % div == 0: */',
-+        '/* is_perfect_number:33 :             sum += div */',
-+        '/* is_perfect_number:34 :         div += 1 */',
-+        '/* is_perfect_number:35 :     return n == sum */']
-+    for exp_line in expected_comment_lines:
-+        assert exp_line in c_fn_src
-+        
-+    # Verify that the lines occur in the correct order
-+    # ...we do this by filtering the function's generated C source to just
-+    # those lines containing our comments (and dropping whitespace):
-+    lines = c_fn_src.splitlines()
-+    lines = [line.strip()
-+             for line in lines
-+             if '/* is_perfect_number:' in line]
-+
-+    # ...we should now have exact equality: the ordering should be as expected,
-+    # and each comment should appear exactly once:
-+    assert lines == expected_comment_lines
-+
-+    # Ensure that the generated C function does the right thing:
-+    assert c_fn(5) == False
-+    assert c_fn(6) == True
-+    assert c_fn(7) == False
-+
-+    assert c_fn(5.0) == False
-+    assert c_fn(6.0) == True
-+    assert c_fn(7.0) == False
-+
-+    assert c_fn(5L) == False
-+    assert c_fn(6L) == True
-+    assert c_fn(7L) == False
-+
-+    try:
-+        c_fn('hello world')
-+    except:
-+        pass
-+    else:
-+        raise 'Was expected exception'
-+    
-+def test_escaping_c_comments():
-+    # Ensure that c comments within RPython code get escaped when we generate
-+    # our .c code (to avoid generating bogus C)
-+    # See e.g. pypy.module.cpyext.dictobject's PyDict_Next, which has a
-+    # docstring embedding a C comment
-+    def c_style_comment(a, b):
-+        '''Here is a C-style comment within an RPython docstring:
-+                /* hello world */
-+        '''
-+        # and here's one in a string literal:
-+        return '/* hello world a:%s b:%s */' % (a, b)
-+
-+    def cplusplus_style_comment(a, b):
-+        '''Here is a C++-style comment within an RPython docstring:
-+                // hello world
-+        '''
-+        # and here are some in string literals, and one as the floor division
-+        # operator:
-+        return '// hello world: a // b = %s' % (a // b)
-+
-+    for fn_name, exp_output in [('c_style_comment',
-+                                 '/* hello world a:6 b:3 */'),
-+                                ('cplusplus_style_comment',
-+                                 '// hello world: a // b = 2')]:
-+        fn = locals()[fn_name]
-+
-+        c_fn, c_src, c_filename_path = get_generated_c_source(fn, [int, int])
-+        # If the above survived, then the C compiler managed to handle
-+        # the generated C code
-+
-+        # Verify that the generated code works (i.e. that we didn't
-+        # accidentally change the meaning):
-+        assert c_fn(6, 3) == exp_output
-+
-+        # Ensure that at least part of the docstrings made it into the C
-+        # code:
-+        c_fn_src = extract_c_function(c_src, 'pypy_g_' + fn_name)
-+        assert 'Here is a ' in c_fn_src
-+        assert 'style comment within an RPython docstring' in c_fn_src
-+        
-diff -r cd083843b67a pypy/translator/driver.py
---- a/pypy/translator/driver.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/translator/driver.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -539,6 +539,7 @@
-             dstname = self.compute_exe_name() + '.staticdata.info'
-             shutil.copy(str(fname), str(dstname))
-             self.log.info('Static data info written to %s' % dstname)
-+        return c_source_filename
- 
-     #
-     task_source_c = taskdef(task_source_c, ['database_c'], "Generating c source")
-diff -r cd083843b67a pypy/translator/gensupp.py
---- a/pypy/translator/gensupp.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/translator/gensupp.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -16,8 +16,8 @@
-     def visit(block):
-         if isinstance(block, Block):
-             # first we order by offset in the code string
--            if block.operations:
--                ofs = block.operations[0].offset
-+            if block.operations and block.operations[0].oploc.codelocs[0]:
-+                ofs = block.operations[0].oploc.codelocs[0].offset
-             else:
-                 ofs = sys.maxint
-             # then we order by input variable name or value
-diff -r cd083843b67a pypy/translator/interactive.py
---- a/pypy/translator/interactive.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/translator/interactive.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -138,7 +138,7 @@
-     def source_c(self, argtypes=None, **kwds):
-         self.update_options(argtypes, kwds)
-         self.ensure_backend('c')
--        self.driver.source_c()
-+        return self.driver.source_c()
- 
-     def source_cl(self, argtypes=None, **kwds):
-         self.update_options(argtypes, kwds)
-diff -r cd083843b67a pypy/translator/llsupport/wrapper.py
---- a/pypy/translator/llsupport/wrapper.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/translator/llsupport/wrapper.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -59,6 +59,8 @@
-     # "return result"
-     block = Block(wrapper_inputargs)
-     wgraph = FunctionGraph('pyfn_' + (newname or func.func_name), block)
-+    if hasattr(graph, 'func'):
-+        wgraph.func = graph.func
-     translator.update_call_graph(wgraph, graph, object())
-     translator.graphs.append(wgraph)
-     block.operations[:] = newops
-diff -r cd083843b67a pypy/translator/simplify.py
---- a/pypy/translator/simplify.py	Mon Dec 20 17:17:45 2010 +0100
-+++ b/pypy/translator/simplify.py	Wed Jan 05 16:14:35 2011 -0500
-@@ -294,7 +294,7 @@
-                 return renaming.get(v, v)
-             def rename_op(op):
-                 args = [rename(a) for a in op.args]
--                op = SpaceOperation(op.opname, args, rename(op.result), op.offset)
-+                op = SpaceOperation(op.opname, args, rename(op.result), op.oploc)
-                 # special case...
-                 if op.opname == 'indirect_call':
-                     if isinstance(op.args[0], Constant):
diff --git a/pypy-1.5-config.patch b/pypy-1.5-config.patch
new file mode 100644
index 0000000..82d8fc9
--- /dev/null
+++ b/pypy-1.5-config.patch
@@ -0,0 +1,39 @@
+diff -up pypy-1.5-src/pypy/translator/platform/linux.py.configure-fedora pypy-1.5-src/pypy/translator/platform/linux.py
+--- pypy-1.5-src/pypy/translator/platform/linux.py.configure-fedora	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/translator/platform/linux.py	2011-04-30 18:59:24.041160978 -0400
+@@ -1,13 +1,18 @@
+ """Support for Linux."""
+-
++import os
+ from pypy.translator.platform.posix import BasePosix
+ 
++CFLAGS = ['-O3', '-pthread', '-fomit-frame-pointer',
++          '-Wall', '-Wno-unused']
++if os.environ.get('CFLAGS', None):
++    CFLAGS.extend(os.environ['CFLAGS'].split())
++CFLAGS = tuple(CFLAGS)
++
+ class BaseLinux(BasePosix):
+     name = "linux"
+     
+     link_flags = ('-pthread', '-lrt')
+-    cflags = ('-O3', '-pthread', '-fomit-frame-pointer',
+-              '-Wall', '-Wno-unused')
++    cflags = CFLAGS
+     standalone_only = ()
+     shared_only = ('-fPIC',)
+     so_ext = 'so'
+@@ -29,9 +34,10 @@ class Linux(BaseLinux):
+     shared_only = ()    # it seems that on 32-bit linux, compiling with -fPIC
+                         # gives assembler that asmgcc is not happy about.
+ 
+-    def library_dirs_for_libffi_a(self):
+-        # places where we need to look for libffi.a
+-        return self.library_dirs_for_libffi() + ['/usr/lib']
++    # Fedora Linux, at least, has the shared version but not the static
++    #def library_dirs_for_libffi_a(self):
++    #    # places where we need to look for libffi.a
++    #    return self.library_dirs_for_libffi() + ['/usr/lib']
+ 
+ 
+ class Linux64(BaseLinux):
diff --git a/pypy-1.5-more-readable-c-code.patch b/pypy-1.5-more-readable-c-code.patch
new file mode 100644
index 0000000..b7103e2
--- /dev/null
+++ b/pypy-1.5-more-readable-c-code.patch
@@ -0,0 +1,693 @@
+diff -up pypy-1.5-src/pypy/interpreter/pycode.py.more-readable-c-code pypy-1.5-src/pypy/interpreter/pycode.py
+--- pypy-1.5-src/pypy/interpreter/pycode.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/interpreter/pycode.py	2011-05-02 14:28:33.942161002 -0400
+@@ -13,6 +13,7 @@ from pypy.interpreter.gateway import Non
+ from pypy.interpreter.astcompiler.consts import (CO_OPTIMIZED,
+     CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS, CO_NESTED,
+     CO_GENERATOR, CO_CONTAINSGLOBALS)
++from pypy.interpreter.pytraceback import offset2lineno
+ from pypy.rlib.rarithmetic import intmask
+ from pypy.rlib.debug import make_sure_not_resized
+ from pypy.rlib import jit
+@@ -80,6 +81,7 @@ class PyCode(eval.Code):
+         self.hidden_applevel = hidden_applevel
+         self.magic = magic
+         self._signature = cpython_code_signature(self)
++        self._cached_source = None
+         self._initialize()
+ 
+     def _initialize(self):
+@@ -396,3 +398,23 @@ class PyCode(eval.Code):
+ 
+     def repr(self, space):
+         return space.wrap(self.get_repr())
++
++    def get_linenum_for_offset(self, offset):
++        # Given a bytecode offset, return a 1-based index into the lines of the
++        # source code
++        return offset2lineno(self, offset)
++
++    def _ensure_source(self):
++        # Lazily grab the source lines into self._cached_source (or raise
++        # an IOError)
++        if not self._cached_source:
++            f = open(self.co_filename, 'r')
++            source = [line.rstrip() for line in f.readlines()]
++            f.close()
++            self._cached_source = source
++    
++    def get_source_text(self, linenum):
++        # Given a 1-based index, get the corresponding line of source code (or
++        # raise an IOError)
++        self._ensure_source()
++        return self._cached_source[linenum - 1]
+diff -up pypy-1.5-src/pypy/objspace/flow/model.py.more-readable-c-code pypy-1.5-src/pypy/objspace/flow/model.py
+--- pypy-1.5-src/pypy/objspace/flow/model.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/objspace/flow/model.py	2011-05-02 14:28:33.942161002 -0400
+@@ -31,6 +31,120 @@ from pypy.tool.identity_dict import iden
+ 
+ __metaclass__ = type
+ 
++class SourceLoc(object):
++    # A srcloc is a specific location within the RPython source code,
++    # intended for human display
++    __slots__ = ('code', # code object
++                 'linenum' # 1-based index, as displayed to a user
++                 )
++    def __init__(self, code, linenum):
++        self.code = code
++        self.linenum = linenum
++
++    def get_text(self):
++        # Get the actual source text of this line
++        return self.code.get_source_text(self.linenum)
++
++    def __eq__(self, other):
++        return self.code == other.code and self.linenum == other.linenum
++
++    def __ne__(self, other):
++        if other:
++            return self.code != other.code or self.linenum != other.linenum
++        else:
++            return True
++
++class CodeLoc(object):
++    # A codeloc is a specific location within the RPython bytecode
++    __slots__ = ('code', # code object
++                 'offset' # int index into bytecode, or -1
++                 )
++
++    def __init__(self, code, offset):
++        self.code = code
++        self.offset = offset
++
++    def __str__(self):
++        if self.offset >= 0:
++            return "%s@%d" % (self.code.co_name, self.offset)
++        else:
++            return ""
++
++    def __ne__(self, other):
++        if other:
++            return self.code != other.code or self.offset != other.offset
++        else:
++            return True
++
++    def __cmp__(self, other):
++        # Partial ordering, for those locations that have an offset:
++        if other:
++            if self.offset >= 0 and other.offset >= 0:
++                return self.offset - other.offset
++        return 0
++
++    def get_source_loc(self):
++        # Convert to a SourceLoc:
++        return SourceLoc(self.code, self.code.get_linenum_for_offset(self.offset))
++
++class OperationLoc(object):
++    # An oploc is the location within the RPython source code of a given
++    # operation
++    # 
++    # This is a list consisting of CodeLoc instances, some of which may be None
++    #
++    # For the simple case, this is list of length 1 with a single CodeLoc
++    #
++    # For an operation inside an inlined callsite, we have a list of length 2:
++    #    [codeloc of callsite,
++    #     codeloc of operation within inlined body]
++    #
++    # For more interesting inlined cases, we have a chain of source locations:
++    #    [codeloc of callsite,
++    #     codeloc of inner callsite,
++    #     ... ,
++    #     codeloc of innermost inlined callsite,
++    #     codeloc of operation within inlined body]
++    #
++
++    __slots__ = ('codelocs', )
++
++    def __init__(self, codelocs):
++        self.codelocs = codelocs
++
++    def __str__(self):
++        return '[' + ' > '.join(str(codeloc) for codeloc in self.codelocs) + ']'
++
++    def __cmp__(self, other):
++        return cmp(self.codelocs, other.codelocs)
++
++def block_comparator(blk0, blk1):
++    '''
++    Sort function for blocks, putting them in an ordering that attempts to
++    maximize readability of the generated C code
++    '''
++    # print 'comparing %r and %r' % (blk0, blk1)
++    # Put the start/end block at the top/bottom:
++    if blk0.isstartblock:
++        return -1
++
++    if blk1.isstartblock:
++        return 1
++
++    # Order blocks by the offset, where present:
++    if blk0.operations:
++        if blk1.operations:
++            return cmp(blk0.operations[0].oploc, blk1.operations[0].oploc)
++        else:
++            return -1
++    else:
++        if blk1.operations:
++            return 1
++        else:
++            return 0
++
++def edge_comparator(edge0, edge1):
++    return block_comparator(edge0.target, edge1.target)
+ 
+ class FunctionGraph(object):
+     __slots__ = ['startblock', 'returnblock', 'exceptblock', '__dict__']
+@@ -94,6 +208,21 @@ class FunctionGraph(object):
+                 seen[block] = True
+                 stack += block.exits[::-1]
+ 
++    def iterblocks_by_source(self):
++        # Try to preserve logical source ordering in the blocks
++        block = self.startblock
++        yield block
++        seen = {block: True}
++        stack = list(block.exits[::-1])
++        stack.sort(edge_comparator)
++        while stack:
++            block = stack.pop().target
++            if block not in seen:
++                yield block
++                seen[block] = True
++                stack += block.exits[::-1]
++                stack.sort(edge_comparator)
++
+     def iterlinks(self):
+         block = self.startblock
+         seen = {block: True}
+@@ -183,14 +312,14 @@ class Block(object):
+         self.exits      = []              # list of Link(s)
+ 
+     def at(self):
+-        if self.operations and self.operations[0].offset >= 0:
+-            return "@%d" % self.operations[0].offset
++        if self.operations:
++            return str(self.operations[0].oploc)
+         else:
+             return ""
+ 
+     def __str__(self):
+         if self.operations:
+-            txt = "block@%d" % self.operations[0].offset
++            txt = "block%s" % self.operations[0].oploc
+         else:
+             if (not self.exits) and len(self.inputargs) == 1:
+                 txt = "return block"
+@@ -245,6 +374,21 @@ class Block(object):
+         from pypy.translator.tool.graphpage import try_show
+         try_show(self)
+ 
++    def isreturnblock(self):
++        return (not self.operations) and (not self.exits) and len(self.inputargs) == 1
++
++    def get_base_label(self, blocknum):
++        # Generate a more friendly C label for this block
++        if self.operations:
++            txt = "block"
++        elif (not self.exits) and len(self.inputargs) == 1:
++            txt = "return_block"
++        elif (not self.exits) and len(self.inputargs) == 2:
++            txt = "raise_block"
++        else:
++            txt = "codeless_block"
++        return '%s%d' % (txt, blocknum)
++
+ 
+ class Variable(object):
+     __slots__ = ["_name", "_nr", "concretetype"]
+@@ -331,13 +475,15 @@ class WrapException(Exception):
+ 
+ 
+ class SpaceOperation(object):
+-    __slots__ = "opname args result offset".split()
++    __slots__ = "opname args result oploc".split()
+ 
+-    def __init__(self, opname, args, result, offset=-1):
++    def __init__(self, opname, args, result, oploc=None):
+         self.opname = intern(opname)      # operation name
+         self.args   = list(args)  # mixed list of var/const
+         self.result = result      # either Variable or Constant instance
+-        self.offset = offset      # offset in code string
++        if oploc is None:
++            oploc = OperationLoc([None])
++        self.oploc = oploc
+ 
+     def __eq__(self, other):
+         return (self.__class__ is other.__class__ and 
+@@ -352,8 +498,9 @@ class SpaceOperation(object):
+         return hash((self.opname,tuple(self.args),self.result))
+ 
+     def __repr__(self):
+-        return "%r = %s(%s)" % (self.result, self.opname,
+-                                ", ".join(map(repr, self.args)))
++        return "%r = %s(%s) (%s)" % (self.result, self.opname,
++                                     ", ".join(map(repr, self.args)),
++                                     self.oploc)
+ 
+ class Atom(object):
+     def __init__(self, name):
+@@ -427,8 +574,7 @@ def copygraph(graph, shallow=False, varm
+                 for op in oplist:
+                     copyop = SpaceOperation(op.opname,
+                                             [copyvar(v) for v in op.args],
+-                                            copyvar(op.result), op.offset)
+-                    #copyop.offset = op.offset
++                                            copyvar(op.result), op.oploc)
+                     result.append(copyop)
+                 return result
+             newblock.operations = copyoplist(block.operations)
+diff -up pypy-1.5-src/pypy/objspace/flow/objspace.py.more-readable-c-code pypy-1.5-src/pypy/objspace/flow/objspace.py
+--- pypy-1.5-src/pypy/objspace/flow/objspace.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/objspace/flow/objspace.py	2011-05-02 14:28:33.943161001 -0400
+@@ -313,7 +313,9 @@ class FlowObjSpace(ObjSpace):
+     def do_operation(self, name, *args_w):
+         spaceop = SpaceOperation(name, args_w, Variable())
+         if hasattr(self, 'executioncontext'):  # not here during bootstrapping
+-            spaceop.offset = self.executioncontext.crnt_offset
++            codeloc = CodeLoc(self.executioncontext.code,
++                              self.executioncontext.crnt_offset)
++            spaceop.oploc = OperationLoc([codeloc])
+             self.executioncontext.recorder.append(spaceop)
+         return spaceop.result
+ 
+diff -up pypy-1.5-src/pypy/objspace/flow/test/test_model.py.more-readable-c-code pypy-1.5-src/pypy/objspace/flow/test/test_model.py
+--- pypy-1.5-src/pypy/objspace/flow/test/test_model.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/objspace/flow/test/test_model.py	2011-05-02 14:28:33.943161001 -0400
+@@ -119,3 +119,25 @@ def test_variable():
+     assert v2.renamed
+     assert v2.name.startswith("foobar_") and v2.name != v.name
+     assert v2.name.split('_', 1)[1].isdigit()
++
++def test_source_locations():
++    # Invent some random offsets into the code:
++    co = sample_function.__code__
++    codelocA = CodeLoc(co, 42)
++    codelocB = CodeLoc(co, 87)
++
++    assert str(codelocA) == 'sample_function at 42'
++    assert str(codelocB) == 'sample_function at 87'
++
++    assert cmp(codelocA, codelocB) < 0
++    assert cmp(codelocB, codelocA) > 0
++    
++    oplocA = OperationLoc([codelocA])
++    oplocB = OperationLoc([codelocB])
++
++    assert str(oplocA) == '[sample_function at 42]'
++    assert str(oplocB) == '[sample_function at 87]'
++
++    assert cmp(oplocA, oplocB) < 0
++    assert cmp(oplocB, oplocA) > 0
++
+diff -up pypy-1.5-src/pypy/rpython/rtyper.py.more-readable-c-code pypy-1.5-src/pypy/rpython/rtyper.py
+--- pypy-1.5-src/pypy/rpython/rtyper.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/rpython/rtyper.py	2011-05-02 14:28:33.943161001 -0400
+@@ -800,7 +800,7 @@ class HighLevelOp(object):
+         return vars
+ 
+     def genop(self, opname, args_v, resulttype=None):
+-        return self.llops.genop(opname, args_v, resulttype)
++        return self.llops.genop(opname, args_v, resulttype, self.spaceop.oploc)
+ 
+     def gendirectcall(self, ll_function, *args_v):
+         return self.llops.gendirectcall(ll_function, *args_v)
+@@ -935,7 +935,7 @@ class LowLevelOpList(list):
+                                                     v.concretetype))
+         return v
+ 
+-    def genop(self, opname, args_v, resulttype=None):
++    def genop(self, opname, args_v, resulttype=None, oploc=None):
+         try:
+             for v in args_v:
+                 v.concretetype
+@@ -944,7 +944,7 @@ class LowLevelOpList(list):
+                                  " and pass its result to genop(),"
+                                  " never hop.args_v directly.")
+         vresult = Variable()
+-        self.append(SpaceOperation(opname, args_v, vresult))
++        self.append(SpaceOperation(opname, args_v, vresult, oploc))
+         if resulttype is None:
+             vresult.concretetype = Void
+             return None
+diff -up pypy-1.5-src/pypy/translator/backendopt/inline.py.more-readable-c-code pypy-1.5-src/pypy/translator/backendopt/inline.py
+--- pypy-1.5-src/pypy/translator/backendopt/inline.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/translator/backendopt/inline.py	2011-05-02 14:32:26.975161005 -0400
+@@ -4,6 +4,7 @@ from pypy.translator.simplify import get
+ from pypy.translator.unsimplify import copyvar
+ from pypy.objspace.flow.model import Variable, Constant, Block, Link
+ from pypy.objspace.flow.model import SpaceOperation, c_last_exception
++from pypy.objspace.flow.model import OperationLoc
+ from pypy.objspace.flow.model import FunctionGraph
+ from pypy.objspace.flow.model import mkentrymap, checkgraph
+ from pypy.annotation import model as annmodel
+@@ -231,6 +232,7 @@ class BaseInliner(object):
+         self.varmap = {}
+         self._copied_blocks = {}
+         self.op = block.operations[index_operation]
++        self.callsite_oploc = self.op.oploc
+         self.graph_to_inline = self.get_graph_from_op(self.op)
+         self.exception_guarded = False
+         if (block.exitswitch == c_last_exception and
+@@ -290,7 +292,9 @@ class BaseInliner(object):
+         
+     def copy_operation(self, op):
+         args = [self.get_new_name(arg) for arg in op.args]
+-        result = SpaceOperation(op.opname, args, self.get_new_name(op.result))
++        new_oploc = OperationLoc(self.callsite_oploc.codelocs[:] + op.oploc.codelocs[:])
++        result = SpaceOperation(op.opname, args, self.get_new_name(op.result), 
++                                new_oploc)
+         return result
+ 
+     def copy_block(self, block):
+diff -up pypy-1.5-src/pypy/translator/c/funcgen.py.more-readable-c-code pypy-1.5-src/pypy/translator/c/funcgen.py
+--- pypy-1.5-src/pypy/translator/c/funcgen.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/translator/c/funcgen.py	2011-05-02 14:28:33.944161001 -0400
+@@ -1,4 +1,6 @@
+ import sys
++import inspect
++import dis
+ from pypy.translator.c.support import USESLOTS # set to False if necessary while refactoring
+ from pypy.translator.c.support import cdecl
+ from pypy.translator.c.support import llvalue_from_constant, gen_assignments
+@@ -22,6 +24,38 @@ LOCALVAR = 'l_%s'
+ 
+ KEEP_INLINED_GRAPHS = False
+ 
++def block_comparator(blk0, blk1):
++    '''
++    Sort function for blocks, putting them in an ordering that attempts to
++    maximize readability of the generated C code
++    '''
++    # print 'comparing %r and %r' % (blk0, blk1)
++    # Put the start/end block at the top/bottom:
++    if blk0.isstartblock:
++        return -1
++
++    if blk1.isstartblock:
++        return 1
++
++    # Order blocks by the offset, where present:
++    if blk0.operations:
++        if blk1.operations:
++            return cmp(blk0.operations[0].oploc, blk1.operations[0].oploc)
++        else:
++            return -1
++    else:
++        if blk1.operations:
++            return 1
++        else:
++            return 0
++
++def escape_c_comments(py_src):
++    # Escape C comments within RPython source, to avoid generating bogus
++    # comments in our generated C source:
++    py_src = py_src.replace('/*', '')
++    py_src = py_src.replace('*/', '')
++    return py_src
++
+ class FunctionCodeGenerator(object):
+     """
+     Collects information about a function which we have to generate
+@@ -210,14 +244,57 @@ class FunctionCodeGenerator(object):
+ 
+     def cfunction_body(self):
+         graph = self.graph
+-        yield 'goto block0;'    # to avoid a warning "this label is not used"
++        # Try to print python source code:
++        if hasattr(graph, 'func'):
++            filename = inspect.getfile(graph.func)
++            #yield '/* name: %r */' % filename
++            try:
++                src, startline = inspect.getsourcelines(graph.func)
++            except IOError:
++                pass # No source found
++            except IndexError:
++                pass # Bulletproofing
++            else:
++                yield '/* Python source %r' % filename
++                for i, line in enumerate(src):
++                    line = line.rstrip()
++                    line = escape_c_comments(line)
++                    # FuncNode.funcgen_implementation treats lines ending in ':'
++                    # as C blocks, which messes up the formatting.
++                    # Work around this:
++                    if line.endswith(':'):
++                        line += ' '
++                    yield ' * %4d : %s' % (startline + i, line)
++                yield ' */'
++
++        label = graph.startblock.get_base_label(self.blocknum[graph.startblock])
++        yield 'goto %s;' % label # to avoid a warning "this label is not used"
++
++        # Sort the blocks into a (hopefully) readable order:
++        blocks = list(graph.iterblocks_by_source())
++        blocks.sort(block_comparator)
+ 
+         # generate the body of each block
+-        for block in graph.iterblocks():
++        for block in blocks:
++            cursrcloc = None
+             myblocknum = self.blocknum[block]
+             yield ''
+-            yield 'block%d:' % myblocknum
++            yield '%s:' % block.get_base_label(myblocknum)
++            #yield "/* repr(block): %r */" % (block, )
++            #yield "/* type(block): %r */" % (type(block), )
+             for i, op in enumerate(block.operations):
++                #yield "/* type(op): %r */" % (type(op), )
++                #yield "/* op.oploc: %s */" % (op.oploc, )
++                codeloc = op.oploc.codelocs[-1]
++                if codeloc:
++                    srcloc = codeloc.get_source_loc()
++                    if srcloc != cursrcloc:
++                        try:
++                            yield "/* %s:%d : %s */" % (codeloc.code.co_name, srcloc.linenum, escape_c_comments(srcloc.get_text()))
++                            cursrcloc = srcloc
++                        except IOError:
++                            pass
++
+                 for line in self.gen_op(op):
+                     yield line
+             if len(block.exits) == 0:
+@@ -309,7 +386,7 @@ class FunctionCodeGenerator(object):
+             assignments.append((a2typename, dest, src))
+         for line in gen_assignments(assignments):
+             yield line
+-        label = 'block%d' % self.blocknum[link.target]
++        label = link.target.get_base_label(self.blocknum[link.target])
+         if link.target in self.innerloops:
+             loop = self.innerloops[link.target]
+             if link is loop.links[-1]:   # link that ends a loop
+diff -up pypy-1.5-src/pypy/translator/c/test/test_genc.py.more-readable-c-code pypy-1.5-src/pypy/translator/c/test/test_genc.py
+--- pypy-1.5-src/pypy/translator/c/test/test_genc.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/translator/c/test/test_genc.py	2011-05-02 14:28:33.945161001 -0400
+@@ -1,4 +1,5 @@
+ import autopath, sys, os, py
++import re
+ from pypy.rpython.lltypesystem.lltype import *
+ from pypy.annotation import model as annmodel
+ from pypy.translator.translator import TranslationContext
+@@ -515,3 +516,130 @@ def test_inhibit_tail_call():
+     else:
+         assert 0, "the call was not found in the C source"
+     assert 'PYPY_INHIBIT_TAIL_CALL();' in lines[i+1]
++
++def get_generated_c_source(fn, types):
++    # Return a (optimized fn, c source code, c source filename) 3-tuple
++    t = Translation(fn)
++    t.annotate(types)
++    c_filename_path = t.source_c()
++    h = c_filename_path.open()
++    src = h.read()
++    h.close()
++    c_fn = t.compile_c()
++    return (c_fn, src, c_filename_path)
++
++def extract_c_function(c_src, fname):
++    # Extract the source for a given C function out of a the given src string
++    # Makes assumptions about the layout of the source
++    pattern = '^(.+) \**%s\(.*\) {$' % fname
++    within_fn = False
++    result = ''
++    for line in c_src.splitlines():
++        if within_fn:
++            result += line + '\n'
++            if line.startswith('}'):
++                return result
++        else:
++            m = re.match(pattern, line)
++            if m:
++                within_fn = True
++                result += line + '\n'
++    return result
++    
++    
++
++def test_generated_c_source():
++    # Verify that generate C source "looks good"
++    # We'll use is_perfect_number, as it contains a loop and a conditional
++
++    # Generate C source code
++    from pypy.translator.test.snippet import is_perfect_number
++    c_fn, c_src, c_filename_path = get_generated_c_source(is_perfect_number,
++                                                        [int])
++
++    # Locate the C source for the type-specialized function:
++    c_fn_src = extract_c_function(c_src, 'pypy_g_is_perfect_number')
++    
++    # Verify that the C source contains embedded comments containing the lines
++    # of the python source:
++    expected_comment_lines = [
++        '/* is_perfect_number:31 :     while div < n: */',
++        '/* is_perfect_number:32 :         if n % div == 0: */',
++        '/* is_perfect_number:33 :             sum += div */',
++        '/* is_perfect_number:34 :         div += 1 */',
++        '/* is_perfect_number:35 :     return n == sum */']
++    for exp_line in expected_comment_lines:
++        assert exp_line in c_fn_src
++        
++    # Verify that the lines occur in the correct order
++    # ...we do this by filtering the function's generated C source to just
++    # those lines containing our comments (and dropping whitespace):
++    lines = c_fn_src.splitlines()
++    lines = [line.strip()
++             for line in lines
++             if '/* is_perfect_number:' in line]
++
++    # ...we should now have exact equality: the ordering should be as expected,
++    # and each comment should appear exactly once:
++    assert lines == expected_comment_lines
++
++    # Ensure that the generated C function does the right thing:
++    assert c_fn(5) == False
++    assert c_fn(6) == True
++    assert c_fn(7) == False
++
++    assert c_fn(5.0) == False
++    assert c_fn(6.0) == True
++    assert c_fn(7.0) == False
++
++    assert c_fn(5L) == False
++    assert c_fn(6L) == True
++    assert c_fn(7L) == False
++
++    try:
++        c_fn('hello world')
++    except:
++        pass
++    else:
++        raise 'Was expected exception'
++    
++def test_escaping_c_comments():
++    # Ensure that c comments within RPython code get escaped when we generate
++    # our .c code (to avoid generating bogus C)
++    # See e.g. pypy.module.cpyext.dictobject's PyDict_Next, which has a
++    # docstring embedding a C comment
++    def c_style_comment(a, b):
++        '''Here is a C-style comment within an RPython docstring:
++                /* hello world */
++        '''
++        # and here's one in a string literal:
++        return '/* hello world a:%s b:%s */' % (a, b)
++
++    def cplusplus_style_comment(a, b):
++        '''Here is a C++-style comment within an RPython docstring:
++                // hello world
++        '''
++        # and here are some in string literals, and one as the floor division
++        # operator:
++        return '// hello world: a // b = %s' % (a // b)
++
++    for fn_name, exp_output in [('c_style_comment',
++                                 '/* hello world a:6 b:3 */'),
++                                ('cplusplus_style_comment',
++                                 '// hello world: a // b = 2')]:
++        fn = locals()[fn_name]
++
++        c_fn, c_src, c_filename_path = get_generated_c_source(fn, [int, int])
++        # If the above survived, then the C compiler managed to handle
++        # the generated C code
++
++        # Verify that the generated code works (i.e. that we didn't
++        # accidentally change the meaning):
++        assert c_fn(6, 3) == exp_output
++
++        # Ensure that at least part of the docstrings made it into the C
++        # code:
++        c_fn_src = extract_c_function(c_src, 'pypy_g_' + fn_name)
++        assert 'Here is a ' in c_fn_src
++        assert 'style comment within an RPython docstring' in c_fn_src
++        
+diff -up pypy-1.5-src/pypy/translator/driver.py.more-readable-c-code pypy-1.5-src/pypy/translator/driver.py
+--- pypy-1.5-src/pypy/translator/driver.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/translator/driver.py	2011-05-02 14:28:33.945161001 -0400
+@@ -536,6 +536,7 @@ class TranslationDriver(SimpleTaskEngine
+             dstname = self.compute_exe_name() + '.staticdata.info'
+             shutil.copy(str(fname), str(dstname))
+             self.log.info('Static data info written to %s' % dstname)
++        return c_source_filename
+ 
+     #
+     task_source_c = taskdef(task_source_c, ['database_c'], "Generating c source")
+diff -up pypy-1.5-src/pypy/translator/gensupp.py.more-readable-c-code pypy-1.5-src/pypy/translator/gensupp.py
+--- pypy-1.5-src/pypy/translator/gensupp.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/translator/gensupp.py	2011-05-02 14:33:31.026161001 -0400
+@@ -14,8 +14,8 @@ def ordered_blocks(graph):
+     allblocks = []
+     for block in graph.iterblocks():
+             # first we order by offset in the code string
+-            if block.operations:
+-                ofs = block.operations[0].offset
++            if block.operations and block.operations[0].oploc.codelocs[0]:
++                ofs = block.operations[0].oploc.codelocs[0].offset
+             else:
+                 ofs = sys.maxint
+             # then we order by input variable name or value
+diff -up pypy-1.5-src/pypy/translator/interactive.py.more-readable-c-code pypy-1.5-src/pypy/translator/interactive.py
+--- pypy-1.5-src/pypy/translator/interactive.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/translator/interactive.py	2011-05-02 14:28:33.946161001 -0400
+@@ -138,7 +138,7 @@ class Translation(object):
+     def source_c(self, argtypes=None, **kwds):
+         self.update_options(argtypes, kwds)
+         self.ensure_backend('c')
+-        self.driver.source_c()
++        return self.driver.source_c()
+ 
+     def source_cl(self, argtypes=None, **kwds):
+         self.update_options(argtypes, kwds)
+diff -up pypy-1.5-src/pypy/translator/llsupport/wrapper.py.more-readable-c-code pypy-1.5-src/pypy/translator/llsupport/wrapper.py
+--- pypy-1.5-src/pypy/translator/llsupport/wrapper.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/translator/llsupport/wrapper.py	2011-05-02 14:28:33.946161001 -0400
+@@ -59,6 +59,8 @@ def new_wrapper(func, translator, newnam
+     # "return result"
+     block = Block(wrapper_inputargs)
+     wgraph = FunctionGraph('pyfn_' + (newname or func.func_name), block)
++    if hasattr(graph, 'func'):
++        wgraph.func = graph.func
+     translator.update_call_graph(wgraph, graph, object())
+     translator.graphs.append(wgraph)
+     block.operations[:] = newops
+diff -up pypy-1.5-src/pypy/translator/simplify.py.more-readable-c-code pypy-1.5-src/pypy/translator/simplify.py
+--- pypy-1.5-src/pypy/translator/simplify.py.more-readable-c-code	2011-04-30 10:18:50.000000000 -0400
++++ pypy-1.5-src/pypy/translator/simplify.py	2011-05-02 14:28:33.952161001 -0400
+@@ -298,7 +298,7 @@ def join_blocks(graph):
+                 return renaming.get(v, v)
+             def rename_op(op):
+                 args = [rename(a) for a in op.args]
+-                op = SpaceOperation(op.opname, args, rename(op.result), op.offset)
++                op = SpaceOperation(op.opname, args, rename(op.result), op.oploc)
+                 # special case...
+                 if op.opname == 'indirect_call':
+                     if isinstance(op.args[0], Constant):
diff --git a/pypy.spec b/pypy.spec
index c69893a..1a651e0 100644
--- a/pypy.spec
+++ b/pypy.spec
@@ -1,6 +1,6 @@
 Name:           pypy
-Version:        1.4.1
-Release:        10%{?dist}
+Version:        1.5
+Release:        1%{?dist}
 Summary:        Python implementation with a Just-In-Time compiler
 
 Group:          Development/Languages
@@ -105,7 +105,7 @@ BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 %global verbose_logs 0
 
 %global pypyprefix %{_libdir}/pypy-%{version}
-%global pylibver 2.5.2
+%global pylibver 2.7
 
 # We refer to this subdir of the source tree in a few places during the build:
 %global goal_dir pypy/translator/goal
@@ -120,7 +120,7 @@ BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 Source0:        http://pypy.org/download/pypy-%{version}-src.tar.bz2
 
 # Edit a translator file for linux in order to configure our cflags and dynamic libffi
-Patch0:         pypy-1.4-config.patch
+Patch0:         pypy-1.5-config.patch
 
 # By default, if built at a tty, the translation process renders a Mandelbrot
 # set to indicate progress.
@@ -150,7 +150,7 @@ Patch3: pypy-1.4.1-add-LIBRARY_INSTALLATION_PATH.patch
 #  http://codespeak.net/pipermail/pypy-dev/2010q4/006532.html
 # TODO: get this into the upstream bug tracker, and finish inlining
 # support (rhbz#666963)
-Patch4: pypy-1.4.1-more-readable-c-code.patch
+Patch4: pypy-1.5-more-readable-c-code.patch
 
 
 # Build-time requirements:
@@ -584,7 +584,7 @@ mkdir -p %{buildroot}/%{pypyprefix}/site-packages
 # interface going forward, so let's just mimic upstream for now.
 %global pypy_include_dir  %{pypyprefix}/include
 mkdir -p %{buildroot}/%{pypy_include_dir}
-cp include/*.h include/*.inl %{buildroot}/%{pypy_include_dir}
+cp include/*.h %{buildroot}/%{pypy_include_dir}
 
 
 # Capture the RPython source code files from the build within the debuginfo
@@ -698,6 +698,25 @@ CheckPyPy() {
       #   seems to hang on this test, within test_line_terminator
       SkipTest test_asynchat
 
+      # test_audioop:
+      #     test test_audioop crashed -- <type 'exceptions.ImportError'>: No module named audioop
+      #     Traceback (most recent call last):
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/regrtest.py", line 874, in runtest_inner
+      #         the_package = __import__(abstest, globals(), locals(), [])
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/test_audioop.py", line 1, in <module>
+      #         import audioop
+      #     ImportError: No module named audioop
+      SkipTest test_audioop
+
+      # test_capi:
+      #   RPython traceback:
+      #     RPython traceback:
+      #       File "implement.c", line 243013, in _PyObject_New
+      #       File "implement_1.c", line 31707, in _PyObject_NewVar
+      #       File "implement.c", line 217060, in from_ref
+      #     Fatal RPython error: AssertionError
+      SkipTest test_capi
+
       # test_compiler:
       #   4 errors out of 13:
       #     testSourceCodeEncodingsError
@@ -710,10 +729,102 @@ CheckPyPy() {
       #   failures=17, errors=20, out of 132 tests
       SkipTest test_ctypes
 
+      # test_distutils:
+      #     Warning -- os.environ was modified by test_distutils
+      #     test test_distutils failed -- multiple errors occurred; run in verbose mode for details
+      SkipTest test_distutils
+
       # test_frozen:
       #   TestFailed: import __hello__ failed:No module named __hello__
       SkipTest test_frozen
 
+      # test_gc:
+      #     test test_gc crashed -- <type 'exceptions.AttributeError'>: 'module' object has no attribute 'get_debug'
+      SkipTest test_gc
+
+      # test_gdb:
+      #     test test_gdb crashed -- <type 'exceptions.KeyError'>: 'PY_CFLAGS'
+      SkipTest test_gdb
+
+      # test_generators:
+      #     **********************************************************************
+      #     File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/test_generators.py", line ?, in test.test_generators.__test__.coroutine
+      #     Failed example:
+      #         del g; gc_collect()
+      #     Expected:
+      #         exiting
+      #     Got nothing
+      #     **********************************************************************
+      #     File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/test_generators.py", line ?, in test.test_generators.__test__.coroutine
+      #     Failed example:
+      #         del g; gc_collect()
+      #     Expected:
+      #         exiting
+      #     Got nothing
+      #     **********************************************************************
+      #     File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/test_generators.py", line ?, in test.test_generators.__test__.coroutine
+      #     Failed example:
+      #         del g; gc_collect()
+      #     Expected:
+      #         finally
+      #     Got nothing
+      #     **********************************************************************
+      #     File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/test_generators.py", line ?, in test.test_generators.__test__.coroutine
+      #     Failed example:
+      #         sys.stderr.getvalue().startswith(
+      #             "Exception RuntimeError: 'generator ignored GeneratorExit' in "
+      #         )
+      #     Expected:
+      #         True
+      #     Got:
+      #         False
+      #     **********************************************************************
+      #     File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/test_generators.py", line ?, in test.test_generators.__test__.refleaks
+      #     Failed example:
+      #         try:
+      #             sys.stderr = StringIO.StringIO()
+      #             class Leaker:
+      #                 def __del__(self):
+      #                     raise RuntimeError
+      #             l = Leaker()
+      #             del l
+      #             gc_collect()
+      #             err = sys.stderr.getvalue().strip()
+      #             err.startswith(
+      #                 "Exception RuntimeError: RuntimeError() in "
+      #             )
+      #             err.endswith("> ignored")
+      #             len(err.splitlines())
+      #         finally:
+      #             sys.stderr = old
+      #     Expected:
+      #         True
+      #         True
+      #         1
+      #     Got:
+      #         False
+      #         False
+      #         0
+      #     **********************************************************************
+      #     2 items had failures:
+      #        4 of 107 in test.test_generators.__test__.coroutine
+      #        1 of  11 in test.test_generators.__test__.refleaks
+      #     ***Test Failed*** 5 failures.
+      #     test test_generators failed -- 5 of 294 doctests failed
+      SkipTest test_generators
+
+      # test_getargs2:
+      #     test test_getargs2 failed -- multiple errors occurred; run in verbose mode for details
+      SkipTest test_getargs2
+
+      # test_hotshot:
+      #     test test_hotshot crashed -- <type 'exceptions.ImportError'>: No module named _hotshot
+      SkipTest test_hotshot
+
+      # test_io:
+      #     test test_io failed -- multiple errors occurred; run in verbose mode for details
+      SkipTest test_io
+
       # test_ioctl:
       #   Failing in Koji with dist-f15 with:
       #     ======================================================================
@@ -737,6 +848,23 @@ CheckPyPy() {
       #   24 failures out of 25, apparently all due to TypeError
       SkipTest test_iterlen
 
+      # test_multiprocessing:
+      #     test test_multiprocessing failed -- multiple errors occurred; run in verbose mode for details
+      SkipTest test_multiprocessing
+
+      # test_module:
+      #     test test_module failed -- Traceback (most recent call last):
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/test_module.py", line 81, in test_clear_dict_in_ref_cycle
+      #         self.assertEqual(destroyed, [1])
+      #     AssertionError: Lists differ: [] != [1]
+      #     Second list contains 1 additional elements.
+      #     First extra element 0:
+      #     1
+      #     - []
+      #     + [1]
+      #     ?  +
+      SkipTest test_module
+
       # test_parser:
       #   12 failures out of 15
       SkipTest test_parser
@@ -746,6 +874,44 @@ CheckPyPy() {
       #    test test_platform failed -- errors occurred in test.test_platform.PlatformTest
       SkipTest test_platform
 
+      # test_posix:
+      #     test test_posix failed -- Traceback (most recent call last):
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/test_posix.py", line 361, in test_getcwd_long_pathnames
+      #         _create_and_do_getcwd(dirname)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/test_posix.py", line 351, in _create_and_do_getcwd
+      #         _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/test_posix.py", line 351, in _create_and_do_getcwd
+      #         _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
+      #       [...repeats...]
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/test_posix.py", line 351, in _create_and_do_getcwd
+      #         _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/test_posix.py", line 356, in _create_and_do_getcwd
+      #         self.assertEqual(e.errno, expected_errno)
+      #     AssertionError: 36 != 34
+      SkipTest test_posix
+
+      # test_readline:
+      #     test test_readline failed -- Traceback (most recent call last):
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/test_readline.py", line 16, in testHistoryUpdates
+      #         readline.clear_history()
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib_pypy/pyrepl/readline.py", line 277, in clear_history
+      #         del self.get_reader().history[:]
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib_pypy/pyrepl/readline.py", line 186, in get_reader
+      #         console = UnixConsole(self.f_in, self.f_out, encoding=ENCODING)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib_pypy/pyrepl/unix_console.py", line 103, in __init__
+      #         self._clear = _my_getstr("clear")
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib_pypy/pyrepl/unix_console.py", line 45, in _my_getstr
+      #         "terminal doesn't have the required '%s' capability"%cap
+      #     InvalidTerminal: terminal doesn't have the required 'clear' capability
+      SkipTest test_readline
+
+      # test_scope:
+      #     test test_scope failed -- Traceback (most recent call last):
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/test_scope.py", line 437, in testLeaks
+      #         self.assertEqual(Foo.count, 0)
+      #     AssertionError: 100 != 0
+      SkipTest test_scope
+
       # test_socket:
       #   testSockName can fail in Koji with:
       #       my_ip_addr = socket.gethostbyname(socket.gethostname())
@@ -761,10 +927,138 @@ CheckPyPy() {
       #     ProgrammingError: Incomplete statement ''
       SkipTest test_sqlite
 
+      # test_strop:
+      #     test test_strop crashed -- <type 'exceptions.ImportError'>: No module named strop
+      SkipTest test_strop
+
+      # test_structmembers:
+      #     test test_structmembers failed -- multiple errors occurred; run in verbose mode for details
+      SkipTest test_structmembers
+
+      # test_subprocess:
+      #     debug: WARNING: library path not found, using compiled-in sys.path and sys.prefix will be unset
+      #     'import site' failed
+      #     .
+      #         this bit of output is from a test of stdout in a different process ...
+      #     /builddir/build/BUILD/pypy-1.5-src/lib_pypy/ctypes_support.py:26: RuntimeWarning: C function without declared arguments called
+      #       return standard_c_lib.__errno_location()
+      #     debug: WARNING: library path not found, using compiled-in sys.path and sys.prefix will be unset
+      #     'import site' failed
+      #     .
+      #         this bit of output is from a test of stdout in a different process ...
+      #     test test_subprocess failed -- multiple errors occurred; run in verbose mode for details
+      SkipTest test_subprocess
+
+      # test_symtable:
+      #     test test_symtable crashed -- <type 'exceptions.ImportError'>: No module named _symtable
+      SkipTest test_symtable
+
+      # test_sys_settrace:
+      #     test test_sys_settrace failed -- Traceback (most recent call last):
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/test_sys_settrace.py", line 334, in test_13_genexp
+      #         self.run_test(generator_example)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/test_sys_settrace.py", line 280, in run_test
+      #         self.run_and_compare(func, func.events)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/test_sys_settrace.py", line 277, in run_and_compare
+      #         tracer.events, events)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/test/test_sys_settrace.py", line 269, in compare_events
+      #         [str(x) for x in events])))
+      #     AssertionError: events did not match expectation:
+      #       (0, 'call')
+      #       (2, 'line')
+      #       (-6, 'call')
+      #       (-5, 'line')
+      #       (-4, 'line')
+      #       (-4, 'return')
+      #     - (-4, 'call')
+      #     - (-4, 'exception')
+      #     - (-1, 'line')
+      #     - (-1, 'return')
+      #       (5, 'line')
+      #       (6, 'line')
+      #       (5, 'line')
+      #       (6, 'line')
+      #       (5, 'line')
+      #       (6, 'line')
+      #       (5, 'line')
+      #       (6, 'line')
+      #       (5, 'line')
+      #       (6, 'line')
+      #       (5, 'line')
+      #       (6, 'line')
+      #       (5, 'line')
+      #       (6, 'line')
+      #       (5, 'line')
+      #       (6, 'line')
+      #       (5, 'line')
+      #       (6, 'line')
+      #       (5, 'line')
+      #       (6, 'line')
+      #       (5, 'line')
+      #       (5, 'return')
+      SkipTest test_sys_settrace
+
+      # test_tempfile:
+      #     test test_tempfile failed -- multiple errors occurred; run in verbose mode for details
+      SkipTest test_tempfile
+
+      # test_thread
+      #   Koji build appears to hang here
+      SkipTest test_thread
+
       # test_traceback:
       #   works when run standalone; failures seen when run as part of a suite
       SkipTest test_traceback
 
+      # test_uuid:
+      #     ======================================================================
+      #     ERROR: test_ifconfig_getnode (test.test_uuid.TestUUID)
+      #     ----------------------------------------------------------------------
+      #     Traceback (most recent call last):
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/test_uuid.py", line 306, in test_ifconfig_getnode
+      #         node = uuid._ifconfig_getnode()
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/uuid.py", line 326, in _ifconfig_getnode
+      #         ip_addr = socket.gethostbyname(socket.gethostname())
+      #     gaierror: [Errno -3] Temporary failure in name resolution
+      #     ----------------------------------------------------------------------
+      #     Ran 14 tests in 0.369s
+      #     FAILED (errors=1)
+      SkipTest test_uuid
+
+      # test_zipimport_support:
+      #     ======================================================================
+      #     ERROR: test_doctest_main_issue4197 (test.test_zipimport_support.ZipSupportTests)
+      #     ----------------------------------------------------------------------
+      #     Traceback (most recent call last):
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/test_zipimport_support.py", line 194, in test_doctest_main_issue4197
+      #         exit_code, data = run_python(script_name)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/script_helper.py", line 80, in run_python
+      #         p = spawn_python(*args, **kwargs)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/script_helper.py", line 66, in spawn_python
+      #         **kwargs)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/subprocess.py", line 672, in __init__
+      #         errread, errwrite)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/subprocess.py", line 1206, in _execute_child
+      #         raise child_exception
+      #     OSError: [Errno 13] Permission denied
+      #     ======================================================================
+      #     ERROR: test_pdb_issue4201 (test.test_zipimport_support.ZipSupportTests)
+      #     ----------------------------------------------------------------------
+      #     Traceback (most recent call last):
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/test_zipimport_support.py", line 221, in test_pdb_issue4201
+      #         p = spawn_python(script_name)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/2.7/test/script_helper.py", line 66, in spawn_python
+      #         **kwargs)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/subprocess.py", line 672, in __init__
+      #         errread, errwrite)
+      #       File "/builddir/build/BUILD/pypy-1.5-src/lib-python/modified-2.7/subprocess.py", line 1206, in _execute_child
+      #         raise child_exception
+      #     OSError: [Errno 13] Permission denied
+      #     ----------------------------------------------------------------------
+      #     Ran 4 tests in 0.726s
+      #     FAILED (errors=2)
+      SkipTest test_zipimport_support
+
       # test_zlib:
       #   failure seen in Koji, not sure of reason why:
       #     test test_zlib failed -- Traceback (most recent call last):
@@ -832,6 +1126,8 @@ rm -rf $RPM_BUILD_ROOT
 
 %dir %{pypyprefix}
 %dir %{pypyprefix}/lib-python
+%{pypyprefix}/lib-python/TODO
+%{pypyprefix}/lib-python/stdlib-version.txt
 %{pypyprefix}/lib-python/%{pylibver}/
 %{pypyprefix}/lib-python/modified-%{pylibver}/
 %{pypyprefix}/lib-python/conftest.py*
@@ -847,7 +1143,6 @@ rm -rf $RPM_BUILD_ROOT
 %defattr(-,root,root,-)
 %dir %{pypy_include_dir}
 %{pypy_include_dir}/*.h
-%{pypy_include_dir}/*.inl
 
 %if 0%{with_stackless}
 %files stackless
@@ -858,6 +1153,9 @@ rm -rf $RPM_BUILD_ROOT
 
 
 %changelog
+* Mon May  2 2011 David Malcolm <dmalcolm at redhat.com> - 1.5-1
+- 1.5
+
 * Wed Apr 20 2011 David Malcolm <dmalcolm at redhat.com> - 1.4.1-10
 - build a /usr/bin/pypy (but without the JIT compiler) on architectures that
 don't support the JIT, so that they do at least have something that runs
diff --git a/sources b/sources
index 90f34be..a047407 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-ebbbb156b1eb842e9e65d909ed5f9f6d  pypy-1.4.1-src.tar.bz2
+cb9ada2c50666318c3a2863da1fbe487  pypy-1.5-src.tar.bz2
-- 
cgit v0.10.2


	http://pkgs.fedoraproject.org/cgit/pypy3.git/commit/?h=f21&id=169de85aca1a527ea42ef102aa32a40ba1740168


More information about the scm-commits mailing list