Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r76599:79d3671d75fe
Date: 2015-03-27 18:51 +0100
http://bitbucket.org/pypy/pypy/changeset/79d3671d75fe/

Log:    merge heads

diff --git a/pypy/goal/targetpypystandalone.py 
b/pypy/goal/targetpypystandalone.py
--- a/pypy/goal/targetpypystandalone.py
+++ b/pypy/goal/targetpypystandalone.py
@@ -141,7 +141,7 @@
         res = _pypy_execute_source(source)
         before = rffi.aroundstate.before
         if before: before()
-        return rffi.cast(rffi.INT, res)        
+        return rffi.cast(rffi.INT, res)
 
     @entrypoint('main', [], c_name='pypy_init_threads')
     def pypy_init_threads():
@@ -312,7 +312,7 @@
         w_dict = app.getwdict(space)
         entry_point, _ = create_entry_point(space, w_dict)
 
-        return entry_point, None, PyPyAnnotatorPolicy(single_space = space)
+        return entry_point, None, PyPyAnnotatorPolicy()
 
     def interface(self, ns):
         for name in ['take_options', 'handle_config', 'print_help', 'target',
diff --git a/pypy/module/_ssl/interp_ssl.py b/pypy/module/_ssl/interp_ssl.py
--- a/pypy/module/_ssl/interp_ssl.py
+++ b/pypy/module/_ssl/interp_ssl.py
@@ -33,7 +33,8 @@
 PY_SSL_CLIENT, PY_SSL_SERVER = 0, 1
 
 (PY_SSL_VERSION_SSL2, PY_SSL_VERSION_SSL3,
- PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1) = range(4)
+ PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1, PY_SSL_VERSION_TLS1_1,
+ PY_SSL_VERSION_TLS1_2) = range(6)
 
 SOCKET_IS_NONBLOCKING, SOCKET_IS_BLOCKING = 0, 1
 SOCKET_HAS_TIMED_OUT, SOCKET_HAS_BEEN_CLOSED = 2, 3
@@ -72,6 +73,9 @@
     constants["PROTOCOL_SSLv3"]  = PY_SSL_VERSION_SSL3
 constants["PROTOCOL_SSLv23"] = PY_SSL_VERSION_SSL23
 constants["PROTOCOL_TLSv1"]  = PY_SSL_VERSION_TLS1
+if HAVE_TLSv1_2:
+    constants["PROTOCOL_TLSv1_1"] = PY_SSL_VERSION_TLS1_1
+    constants["PROTOCOL_TLSv1_2"] = PY_SSL_VERSION_TLS1_2
 
 constants["OP_ALL"] = SSL_OP_ALL &~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
 constants["OP_NO_SSLv2"] = SSL_OP_NO_SSLv2
@@ -140,7 +144,7 @@
 
     def __del__(self):
         rffi.free_nonmovingbuffer(
-            self.protos, self.buf, self.pinned, self.is_raw)    
+            self.protos, self.buf, self.pinned, self.is_raw)
 
     @staticmethod
     def advertiseNPN_cb(s, data_ptr, len_ptr, args):
@@ -162,7 +166,7 @@
             client_len = len(npn.protos)
         else:
             client = lltype.nullptr(rffi.CCHARP.TO)
-            client_len = 0            
+            client_len = 0
 
         libssl_SSL_select_next_proto(out_ptr, outlen_ptr,
                                      server, server_len,
@@ -593,14 +597,14 @@
         CB_MAXLEN = 128
 
         with lltype.scoped_alloc(rffi.CCHARP.TO, CB_MAXLEN) as buf:
-            if (libssl_SSL_session_reused(self.ssl) ^ 
+            if (libssl_SSL_session_reused(self.ssl) ^
                 (self.socket_type == PY_SSL_CLIENT)):
                 # if session is resumed XOR we are the client
                 length = libssl_SSL_get_finished(self.ssl, buf, CB_MAXLEN)
             else:
                 # if a new session XOR we are the server
                 length = libssl_SSL_get_peer_finished(self.ssl, buf, CB_MAXLEN)
-            
+
             if length > 0:
                 return space.wrap(rffi.charpsize2str(buf, intmask(length)))
 
@@ -1107,7 +1111,7 @@
             except OperationError as e:
                 if not e.match(space, space.w_TypeError):
                     raise
-                raise oefmt(space.w_TypeError, 
+                raise oefmt(space.w_TypeError,
                             "password callback must return a string")
         except OperationError as e:
             pw_info.operationerror = e
@@ -1196,6 +1200,10 @@
             method = libssl_SSLv2_method()
         elif protocol == PY_SSL_VERSION_SSL23:
             method = libssl_SSLv23_method()
+        elif protocol == PY_SSL_VERSION_TLS1_1 and HAVE_TLSv1_2:
+            method = libssl_TLSv1_1_method()
+        elif protocol == PY_SSL_VERSION_TLS1_2 and HAVE_TLSv1_2:
+            method = libssl_TLSv1_2_method()
         else:
             raise oefmt(space.w_ValueError, "invalid protocol version")
         ctx = libssl_SSL_CTX_new(method)
@@ -1348,7 +1356,7 @@
                 except OperationError as e:
                     if not e.match(space, space.w_TypeError):
                         raise
-                    raise oefmt(space.w_TypeError, 
+                    raise oefmt(space.w_TypeError,
                                 "password should be a string or callable")
 
             libssl_SSL_CTX_set_default_passwd_cb(
@@ -1452,7 +1460,7 @@
         if cadata is not None:
             with rffi.scoped_nonmovingbuffer(cadata) as buf:
                 self._add_ca_certs(space, buf, len(cadata), ca_file_type)
-            
+
         # load cafile or capath
         if cafile is not None or capath is not None:
             ret = libssl_SSL_CTX_load_verify_locations(
diff --git a/pypy/tool/ann_override.py b/pypy/tool/ann_override.py
--- a/pypy/tool/ann_override.py
+++ b/pypy/tool/ann_override.py
@@ -13,13 +13,12 @@
 
 
 class PyPyAnnotatorPolicy(AnnotatorPolicy):
-    def __init__(pol, single_space=None):
-        pol.lookups = {}
-        pol.lookups_where = {}
-        pol.pypytypes = {}
-        pol.single_space = single_space
+    def __init__(self):
+        self.lookups = {}
+        self.lookups_where = {}
+        self.pypytypes = {}
 
-    def specialize__wrap(pol,  funcdesc, args_s):
+    def specialize__wrap(self,  funcdesc, args_s):
         from pypy.interpreter.baseobjspace import W_Root
         from rpython.annotator.classdef import ClassDef
         W_Root_def = funcdesc.bookkeeper.getuniqueclassdef(W_Root)
@@ -51,102 +50,102 @@
                 typ = (None, str)
         return funcdesc.cachedgraph(typ)
 
-    def _remember_immutable(pol, t, cached):
+    def _remember_immutable(self, t, cached):
         # for jit benefit
         if cached not in t._immutable_fields_: # accessed this way just
                                                # for convenience
             t._immutable_fields_.append(cached)
 
-    def attach_lookup(pol, t, attr):
+    def attach_lookup(self, t, attr):
         cached = "cached_%s" % attr
         if not t.is_heaptype() and not t.is_cpytype():
-            pol._remember_immutable(t, cached)
+            self._remember_immutable(t, cached)
             setattr(t, cached, t._lookup(attr))
             return True
         return False
 
-    def attach_lookup_in_type_where(pol, t, attr):
+    def attach_lookup_in_type_where(self, t, attr):
         cached = "cached_where_%s" % attr
         if not t.is_heaptype() and not t.is_cpytype():
-            pol._remember_immutable(t, cached)
+            self._remember_immutable(t, cached)
             setattr(t, cached, t._lookup_where(attr))
             return True
         return False
 
-    def consider_lookup(pol, bookkeeper, attr):
+    def consider_lookup(self, bookkeeper, attr):
         from rpython.annotator.classdef import InstanceSource
-        assert attr not in pol.lookups
+        assert attr not in self.lookups
         from pypy.objspace.std import typeobject
         cached = "cached_%s" % attr
         clsdef = bookkeeper.getuniqueclassdef(typeobject.W_TypeObject)
         classdesc = clsdef.classdesc
         classdesc.classdict[cached] = Constant(None)
         clsdef.add_source_for_attribute(cached, classdesc)
-        for t in pol.pypytypes:
-            if pol.attach_lookup(t, attr):
+        for t in self.pypytypes:
+            if self.attach_lookup(t, attr):
                 source = InstanceSource(bookkeeper, t)
                 clsdef.add_source_for_attribute(cached, source)
-        pol.lookups[attr] = True
+        self.lookups[attr] = True
 
-    def consider_lookup_in_type_where(pol, bookkeeper, attr):
+    def consider_lookup_in_type_where(self, bookkeeper, attr):
         from rpython.annotator.classdef import InstanceSource
-        assert attr not in pol.lookups_where
+        assert attr not in self.lookups_where
         from pypy.objspace.std import typeobject
         cached = "cached_where_%s" % attr
         clsdef = bookkeeper.getuniqueclassdef(typeobject.W_TypeObject)
         classdesc = clsdef.classdesc
         classdesc.classdict[cached] = Constant((None, None))
         clsdef.add_source_for_attribute(cached, classdesc)
-        for t in pol.pypytypes:
-            if pol.attach_lookup_in_type_where(t, attr):
+        for t in self.pypytypes:
+            if self.attach_lookup_in_type_where(t, attr):
                 source = InstanceSource(bookkeeper, t)
                 clsdef.add_source_for_attribute(cached, source)
-        pol.lookups_where[attr] = True
+        self.lookups_where[attr] = True
 
-    def specialize__lookup(pol, funcdesc, args_s):
+    def specialize__lookup(self, funcdesc, args_s):
         s_space, s_obj, s_name = args_s
         if s_name.is_constant():
             attr = s_name.const
             def builder(translator, func):
                 #print "LOOKUP", attr
-                pol.consider_lookup(funcdesc.bookkeeper, attr)
+                self.consider_lookup(funcdesc.bookkeeper, attr)
                 d = {'__name__': '<ann_override_lookup>'}
                 exec CACHED_LOOKUP % {'attr': attr} in d
                 return translator.buildflowgraph(d['lookup_'+attr])
             return funcdesc.cachedgraph(attr, builder=builder)
         else:
-            pol.lookups[None] = True
+            self.lookups[None] = True
             return funcdesc.cachedgraph(None) # don't specialize
 
-    def specialize__lookup_in_type_where(pol, funcdesc, args_s):
+    def specialize__lookup_in_type_where(self, funcdesc, args_s):
         s_space, s_obj, s_name = args_s
         if s_name.is_constant():
             attr = s_name.const
             def builder(translator, func):
                 #print "LOOKUP_IN_TYPE_WHERE", attr
-                pol.consider_lookup_in_type_where(funcdesc.bookkeeper, attr)
+                self.consider_lookup_in_type_where(funcdesc.bookkeeper, attr)
                 d = {'__name__': '<ann_override_lookup>'}
                 exec CACHED_LOOKUP_IN_TYPE_WHERE % {'attr': attr} in d
                 return 
translator.buildflowgraph(d['lookup_in_type_where_'+attr])
             return funcdesc.cachedgraph(attr, builder=builder)
         else:
-            pol.lookups_where[None] = True
+            self.lookups_where[None] = True
             return funcdesc.cachedgraph(None)
 
-    def event(pol, bookkeeper, what, x):
+    def event(self, bookkeeper, what, x):
         from pypy.objspace.std import typeobject
         if isinstance(x, typeobject.W_TypeObject):
             from rpython.annotator.classdef import InstanceSource
             clsdef = bookkeeper.getuniqueclassdef(typeobject.W_TypeObject)
-            pol.pypytypes[x] = True
+            self.pypytypes[x] = True
             #print "TYPE", x
-            for attr in pol.lookups:
-                if attr and pol.attach_lookup(x, attr):
+            for attr in self.lookups:
+                if attr and self.attach_lookup(x, attr):
                     cached = "cached_%s" % attr
                     source = InstanceSource(bookkeeper, x)
                     clsdef.add_source_for_attribute(cached, source)
-            for attr in pol.lookups_where:
-                if attr and pol.attach_lookup_in_type_where(x, attr):
+            for attr in self.lookups_where:
+                if attr and self.attach_lookup_in_type_where(x, attr):
                     cached = "cached_where_%s" % attr
                     source = InstanceSource(bookkeeper, x)
                     clsdef.add_source_for_attribute(cached, source)
diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py
--- a/rpython/annotator/annrpython.py
+++ b/rpython/annotator/annrpython.py
@@ -12,6 +12,7 @@
 from rpython.annotator import model as annmodel, signature
 from rpython.annotator.argument import simple_args
 from rpython.annotator.bookkeeper import Bookkeeper
+from rpython.rtyper.normalizecalls import perform_normalizations
 
 import py
 log = py.log.Producer("annrpython")
@@ -317,6 +318,8 @@
                     graphs[graph] = True
         for graph in graphs:
             simplify.eliminate_empty_blocks(graph)
+        if block_subset is None:
+            perform_normalizations(self)
 
 
     #___ flowing annotations in blocks _____________________
diff --git a/rpython/annotator/bookkeeper.py b/rpython/annotator/bookkeeper.py
--- a/rpython/annotator/bookkeeper.py
+++ b/rpython/annotator/bookkeeper.py
@@ -42,7 +42,7 @@
 
     def __setstate__(self, dic):
         self.__dict__.update(dic) # normal action
-        delayed_imports()
+        self.register_builtins()
 
     def __init__(self, annotator):
         self.annotator = annotator
@@ -67,7 +67,13 @@
         self.needs_generic_instantiate = {}
         self.thread_local_fields = set()
 
-        delayed_imports()
+        self.register_builtins()
+
+    def register_builtins(self):
+        import rpython.annotator.builtin  # for side-effects
+        from rpython.annotator.exception import standardexceptions
+        for cls in standardexceptions:
+            self.getuniqueclassdef(cls)
 
     def enter(self, position_key):
         """Start of an operation.
@@ -605,6 +611,3 @@
 
 def immutablevalue(x):
     return getbookkeeper().immutablevalue(x)
-
-def delayed_imports():
-    import rpython.annotator.builtin
diff --git a/rpython/annotator/exception.py b/rpython/annotator/exception.py
new file mode 100644
--- /dev/null
+++ b/rpython/annotator/exception.py
@@ -0,0 +1,7 @@
+from rpython.rlib import rstackovf
+
+# the exceptions that can be implicitely raised by some operations
+standardexceptions = set([TypeError, OverflowError, ValueError,
+    ZeroDivisionError, MemoryError, IOError, OSError, StopIteration, KeyError,
+    IndexError, AssertionError, RuntimeError, UnicodeDecodeError,
+    UnicodeEncodeError, NotImplementedError, rstackovf._StackOverflow])
diff --git a/rpython/rlib/ropenssl.py b/rpython/rlib/ropenssl.py
--- a/rpython/rlib/ropenssl.py
+++ b/rpython/rlib/ropenssl.py
@@ -255,6 +255,8 @@
                              OPENSSL_VERSION_NUMBER != 0x00909000
 if OPENSSL_VERSION_NUMBER < 0x0090800f and not OPENSSL_NO_ECDH:
     OPENSSL_NO_ECDH = True
+HAVE_TLSv1_2 = OPENSSL_VERSION_NUMBER >= 0x10001000
+
 
 def external(name, argtypes, restype, **kw):
     kw['compilation_info'] = eci
@@ -284,6 +286,9 @@
 ssl_external('SSL_get_SSL_CTX', [SSL], SSL_CTX)
 ssl_external('SSL_set_SSL_CTX', [SSL, SSL_CTX], SSL_CTX)
 ssl_external('TLSv1_method', [], SSL_METHOD)
+if HAVE_TLSv1_2:
+    ssl_external('TLSv1_1_method', [], SSL_METHOD)
+    ssl_external('TLSv1_2_method', [], SSL_METHOD)
 ssl_external('SSLv2_method', [], SSL_METHOD)
 ssl_external('SSLv3_method', [], SSL_METHOD)
 ssl_external('SSLv23_method', [], SSL_METHOD)
diff --git a/rpython/rtyper/annlowlevel.py b/rpython/rtyper/annlowlevel.py
--- a/rpython/rtyper/annlowlevel.py
+++ b/rpython/rtyper/annlowlevel.py
@@ -41,9 +41,10 @@
     __repr__ = __str__
 
 class LowLevelAnnotatorPolicy(AnnotatorPolicy):
-    def __init__(pol, rtyper=None):
-        pol.rtyper = rtyper
+    def __init__(self, rtyper=None):
+        self.rtyper = rtyper
 
+    @staticmethod
     def lowlevelspecialize(funcdesc, args_s, key_for_args):
         args_s, key1, builder = flatten_star_args(funcdesc, args_s)
         key = []
@@ -73,21 +74,20 @@
         flowgraph = funcdesc.cachedgraph(key, builder=builder)
         args_s[:] = new_args_s
         return flowgraph
-    lowlevelspecialize = staticmethod(lowlevelspecialize)
 
+    @staticmethod
     def default_specialize(funcdesc, args_s):
         return LowLevelAnnotatorPolicy.lowlevelspecialize(funcdesc, args_s, {})
-    default_specialize = staticmethod(default_specialize)
 
     specialize__ll = default_specialize
 
+    @staticmethod
     def specialize__ll_and_arg(funcdesc, args_s, *argindices):
         keys = {}
         for i in argindices:
             keys[i] = args_s[i].const
         return LowLevelAnnotatorPolicy.lowlevelspecialize(funcdesc, args_s,
                                                           keys)
-    specialize__ll_and_arg = staticmethod(specialize__ll_and_arg)
 
 def annotate_lowlevel_helper(annotator, ll_function, args_s, policy=None):
     if policy is None:
@@ -99,24 +99,23 @@
 
 class MixLevelAnnotatorPolicy(LowLevelAnnotatorPolicy):
 
-    def __init__(pol, annhelper):
-        pol.annhelper = annhelper
-        pol.rtyper = annhelper.rtyper
+    def __init__(self, annhelper):
+        self.rtyper = annhelper.rtyper
 
-    def default_specialize(pol, funcdesc, args_s):
+    def default_specialize(self, funcdesc, args_s):
         name = funcdesc.name
         if name.startswith('ll_') or name.startswith('_ll_'): # xxx can we do 
better?
-            return super(MixLevelAnnotatorPolicy, pol).default_specialize(
+            return super(MixLevelAnnotatorPolicy, self).default_specialize(
                 funcdesc, args_s)
         else:
             return AnnotatorPolicy.default_specialize(funcdesc, args_s)
 
-    def specialize__arglltype(pol, funcdesc, args_s, i):
-        key = pol.rtyper.getrepr(args_s[i]).lowleveltype
+    def specialize__arglltype(self, funcdesc, args_s, i):
+        key = self.rtyper.getrepr(args_s[i]).lowleveltype
         alt_name = funcdesc.name+"__for_%sLlT" % key._short_name()
         return funcdesc.cachedgraph(key, alt_name=valid_identifier(alt_name))
 
-    def specialize__genconst(pol, funcdesc, args_s, i):
+    def specialize__genconst(self, funcdesc, args_s, i):
         # XXX this is specific to the JIT
         TYPE = annotation_to_lltype(args_s[i], 'genconst')
         args_s[i] = lltype_to_annotation(TYPE)
diff --git a/rpython/rtyper/exceptiondata.py b/rpython/rtyper/exceptiondata.py
--- a/rpython/rtyper/exceptiondata.py
+++ b/rpython/rtyper/exceptiondata.py
@@ -1,15 +1,9 @@
 from rpython.annotator import model as annmodel
+from rpython.annotator.exception import standardexceptions
 from rpython.rtyper.llannotation import SomePtr
-from rpython.rlib import rstackovf
 from rpython.rtyper.rclass import (
     ll_issubclass, ll_type, ll_cast_to_object, getclassrepr, getinstancerepr)
 
-# the exceptions that can be implicitely raised by some operations
-standardexceptions = set([TypeError, OverflowError, ValueError,
-    ZeroDivisionError, MemoryError, IOError, OSError, StopIteration, KeyError,
-    IndexError, AssertionError, RuntimeError, UnicodeDecodeError,
-    UnicodeEncodeError, NotImplementedError, rstackovf._StackOverflow])
-
 class UnknownException(Exception):
     pass
 
@@ -20,7 +14,6 @@
     standardexceptions = standardexceptions
 
     def __init__(self, rtyper):
-        self.make_standard_exceptions(rtyper)
         # (NB. rclass identifies 'Exception' and 'object')
         r_type = rtyper.rootclass_repr
         r_instance = getinstancerepr(rtyper, None)
@@ -32,11 +25,6 @@
         self.lltype_of_exception_value = r_instance.lowleveltype
         self.rtyper = rtyper
 
-    def make_standard_exceptions(self, rtyper):
-        bk = rtyper.annotator.bookkeeper
-        for cls in self.standardexceptions:
-            bk.getuniqueclassdef(cls)
-
     def finish(self, rtyper):
         bk = rtyper.annotator.bookkeeper
         for cls in self.standardexceptions:
diff --git a/rpython/rtyper/rtyper.py b/rpython/rtyper/rtyper.py
--- a/rpython/rtyper/rtyper.py
+++ b/rpython/rtyper/rtyper.py
@@ -26,7 +26,6 @@
     attachRuntimeTypeInfo, Primitive)
 from rpython.rtyper.rmodel import Repr, inputconst, BrokenReprTyperError
 from rpython.rtyper.typesystem import LowLevelTypeSystem, getfunctionptr
-from rpython.rtyper.normalizecalls import perform_normalizations
 from rpython.rtyper import rclass
 from rpython.rtyper.rclass import RootClassRepr
 from rpython.tool.pairtype import pair
@@ -55,8 +54,6 @@
         self.concrete_calltables = {}
         self.cache_dummy_values = {}
         self.lltype2vtable = {}
-        self.typererrors = []
-        self.typererror_count = 0
         # make the primitive_to_repr constant mapping
         self.primitive_to_repr = {}
         self.isinstance_helpers = {}
@@ -169,22 +166,16 @@
     def specialize(self, dont_simplify_again=False):
         """Main entry point: specialize all annotated blocks of the program."""
         # specialize depends on annotator simplifications
-        assert dont_simplify_again in (False, True)  # safety check
         if not dont_simplify_again:
             self.annotator.simplify()
-
-        # first make sure that all functions called in a group have exactly
-        # the same signature, by hacking their flow graphs if needed
-        perform_normalizations(self.annotator)
         self.exceptiondata.finish(self)
 
         # new blocks can be created as a result of specialize_block(), so
         # we need to be careful about the loop here.
         self.already_seen = {}
         self.specialize_more_blocks()
-        if self.exceptiondata is not None:
-            self.exceptiondata.make_helpers(self)
-            self.specialize_more_blocks()   # for the helpers just made
+        self.exceptiondata.make_helpers(self)
+        self.specialize_more_blocks()   # for the helpers just made
 
     def getannmixlevel(self):
         if self.annmixlevel is not None:
@@ -231,18 +222,11 @@
                     percentage = 100 * n // total
                     if percentage >= previous_percentage + 5:
                         previous_percentage = percentage
-                        if self.typererror_count:
-                            error_report = " but %d errors" % 
self.typererror_count
-                        else:
-                            error_report = ''
-                        self.log.event('specializing: %d / %d blocks   
(%d%%)%s' %
-                                       (n, total, percentage, error_report))
+                        self.log.event('specializing: %d / %d blocks   (%d%%)' 
%
+                                       (n, total, percentage))
             # make sure all reprs so far have had their setup() called
             self.call_all_setups()
 
-        if self.typererrors:
-            self.dump_typererrors(to_log=True)
-            raise TyperError("there were %d error" % len(self.typererrors))
         self.log.event('-=- specialized %d%s blocks -=-' % (
             blockcount, newtext))
         annmixlevel = self.annmixlevel
@@ -250,29 +234,6 @@
         if annmixlevel is not None:
             annmixlevel.finish()
 
-    def dump_typererrors(self, num=None, minimize=True, to_log=False):
-        c = 0
-        bc = 0
-        for err in self.typererrors[:num]:
-            c += 1
-            if minimize and isinstance(err, BrokenReprTyperError):
-                bc += 1
-                continue
-            graph, block, position = err.where
-            errmsg = ("TyperError-%d: %s\n" % (c, graph) +
-                      str(err) +
-                      "\n")
-            if to_log:
-                self.log.ERROR(errmsg)
-            else:
-                print errmsg
-        if bc:
-            minmsg = "(minimized %d errors away for this dump)" % (bc,)
-            if to_log:
-                self.log.ERROR(minmsg)
-            else:
-                print minmsg
-
     def call_all_setups(self):
         # make sure all reprs so far have had their setup() called
         must_setup_more = []
@@ -324,9 +285,9 @@
         # give the best possible types to the input args
         try:
             self.setup_block_entry(block)
-        except TyperError, e:
-            self.gottypererror(e, block, "block-entry", None)
-            return  # cannot continue this block
+        except TyperError as e:
+            self.gottypererror(e, block, "block-entry")
+            raise
 
 
         # specialize all the operations, as far as possible
@@ -341,9 +302,9 @@
             try:
                 hop.setup()  # this is called from here to catch TyperErrors...
                 self.translate_hl_to_ll(hop, varmapping)
-            except TyperError, e:
-                self.gottypererror(e, block, hop.spaceop, newops)
-                return  # cannot continue this block: no op.result.concretetype
+            except TyperError as e:
+                self.gottypererror(e, block, hop.spaceop)
+                raise
 
         block.operations[:] = newops
         block.renamevariables(varmapping)
@@ -432,9 +393,9 @@
                     continue   # no conversion needed
                 try:
                     new_a1 = newops.convertvar(a1, r_a1, r_a2)
-                except TyperError, e:
-                    self.gottypererror(e, block, link, newops)
-                    continue # try other args
+                except TyperError as e:
+                    self.gottypererror(e, block, link)
+                    raise
                 if new_a1 != a1:
                     newlinkargs[i] = new_a1
 
@@ -516,14 +477,10 @@
                              "has no return value" % op.opname)
         op.result.concretetype = Void
 
-    def gottypererror(self, e, block, position, llops):
-        """Record a TyperError without crashing immediately.
-        Put a 'TyperError' operation in the graph instead.
-        """
+    def gottypererror(self, exc, block, position):
+        """Record information about the location of a TyperError"""
         graph = self.annotator.annotated.get(block)
-        e.where = (graph, block, position)
-        self.typererror_count += 1
-        raise
+        exc.where = (graph, block, position)
 
     # __________ regular operations __________
 
diff --git a/rpython/rtyper/test/test_llinterp.py 
b/rpython/rtyper/test/test_llinterp.py
--- a/rpython/rtyper/test/test_llinterp.py
+++ b/rpython/rtyper/test/test_llinterp.py
@@ -25,22 +25,12 @@
     py.log._setstate(mod.logstate)
 
 
-
-def timelog(prefix, call, *args, **kwds):
-    #import time
-    #print prefix, "...",
-    #start = time.time()
-    res = call(*args, **kwds)
-    #elapsed = time.time() - start
-    #print "%.2f secs" % (elapsed,)
-    return res
-
 def gengraph(func, argtypes=[], viewbefore='auto', policy=None,
              backendopt=False, config=None, **extraconfigopts):
     t = TranslationContext(config=config)
     t.config.set(**extraconfigopts)
     a = t.buildannotator(policy=policy)
-    timelog("annotating", a.build_types, func, argtypes, main_entry_point=True)
+    a.build_types(func, argtypes, main_entry_point=True)
     a.validate()
     if viewbefore == 'auto':
         viewbefore = getattr(option, 'view', False)
@@ -49,13 +39,13 @@
         t.view()
     global typer # we need it for find_exception
     typer = t.buildrtyper()
-    timelog("rtyper-specializing", typer.specialize)
+    typer.specialize()
     #t.view()
-    timelog("checking graphs", t.checkgraphs)
+    t.checkgraphs()
     if backendopt:
         from rpython.translator.backendopt.all import backend_optimizations
         backend_optimizations(t)
-        timelog("checking graphs", t.checkgraphs)
+        t.checkgraphs()
         if viewbefore:
             t.view()
     desc = t.annotator.bookkeeper.getdesc(func)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to