[pypy-dev] Re: rtyper hook ++
Samuele Pedroni
pedronis at strakt.com
Tue Jul 19 16:26:58 CEST 2005
amaury.forgeotdarc at ubitrade.com wrote:
>Hello,
>
>Chritian Tismer wrote:
>
>
>>If we teach the specializer to not crash if something
>>does not work out, but to add the problem blocks to a list,
>>then we could have one report with all pending problems
>>and work through this in a more general way.
>>We also would get an estimate how much has still to be done.
>>
>>
>
>That's what I have done to follow the fantastic progress you
>make on the translation process.
>
>- In rtyper.py, there is already a crash_on_first_typeerror
>variable. Turn it to False, this will catch all TyperErrors.
>
>- There are some assertions and other exceptions that will stop
>the process. I changed all of them into TyperErrors.
>I suppose that some tests are not done at the right place,
>but they do the job...
>
>And the specialization goes to the end!
>There are 81 TyperErrors left for 20206 blocks.
>They were 230 last week. Good job!
>
>Then the "Back-end optimizations" fail, probably because of
>the incompletely specialized blocks.
>
>I hope this helps! Here are my diffs:
>
>
>
>
thanks a lot for suggesting and trying this out. I will try out a
variation on the patch.
The hook should then be useful to reproduce in a direct and mostly
deterministic way the problems.
>Index: pypy/rpython/rstr.py
>===================================================================
>--- pypy/rpython/rstr.py (revision 14755)
>+++ pypy/rpython/rstr.py (working copy)
>@@ -264,7 +264,8 @@
> if curstr:
> r.append(curstr)
> curstr = ''
>- assert f in 'xdsrf'
>+ if f not in 'xdsrf':
>+ raise TyperError("String format not supported: %r" % (f,))
>
> r.append((f,))
> else:
>@@ -295,6 +296,9 @@
> vitem, r_arg = argsiter.next()
> rep = inputconst(Void, r_arg)
> if code == 's' or (code == 'r' and isinstance(r_arg,
>InstanceRepr)):
>+ if not hasattr(r_arg,'ll_str'):
>+ raise TyperError("AttributeError: %s instance has no
>attribute 'll_str'"
>+ % r_arg)
> vchunk = hop.gendirectcall(r_arg.ll_str, vitem, rep)
> elif code == 'd':
> assert isinstance(r_arg, IntegerRepr)
>Index: pypy/rpython/callparse.py
>===================================================================
>--- pypy/rpython/callparse.py (revision 14755)
>+++ pypy/rpython/callparse.py (working copy)
>@@ -2,6 +2,7 @@
> from pypy.interpreter.argument import Arguments, ArgErr
> from pypy.annotation import model as annmodel
> from pypy.rpython import rtuple
>+from pypy.rpython.rmodel import TyperError
>
> class CallPatternTooComplex(Exception):
> pass
>@@ -47,7 +48,7 @@
> try:
> holders = arguments.match_signature(signature, defs_h)
> except ArgErr, e:
>- raise TypeError, "signature mismatch: %s" % e.getmsg(arguments,
>func.__name__)
>+ raise TyperError, "signature mismatch: %s" % e.getmsg(arguments,
>func.__name__)
>
> assert len(holders) == len(rinputs), "argument parsing mismatch"
> vlist = []
>Index: pypy/rpython/rbuiltin.py
>===================================================================
>--- pypy/rpython/rbuiltin.py (revision 14755)
>+++ pypy/rpython/rbuiltin.py (working copy)
>@@ -107,9 +107,15 @@
>
> def rtype_builtin_unichr(hop):
> assert hop.nb_args == 1
>+ if not hasattr(hop.args_r[0],'rtype_unichr'):
>+ raise TyperError("AttributeError: %s instance has no attribute
>'rtype_unichr'"
>+ % hop.args_r[0])
> return hop.args_r[0].rtype_unichr(hop)
>
> def rtype_builtin_list(hop):
>+ if not hasattr(hop.args_r[0],'rtype_bltn_list'):
>+ raise TyperError("AttributeError: %s instance has no attribute
>'rtype_bltn_list'"
>+ % hop.args_r[0])
> return hop.args_r[0].rtype_bltn_list(hop)
>
> def rtype_builtin_isinstance(hop):
>Index: pypy/rpython/rtyper.py
>===================================================================
>--- pypy/rpython/rtyper.py (revision 14755)
>+++ pypy/rpython/rtyper.py (working copy)
>@@ -31,7 +31,7 @@
>
> log = py.log.Producer("rtyper")
> py.log.setconsumer("rtyper", None)
>-crash_on_first_typeerror = True
>+crash_on_first_typeerror = False
>
> class RPythonTyper:
>
>@@ -45,6 +45,7 @@
> self.pbc_reprs = {}
> self.class_pbc_attributes = {}
> self.typererror = None
>+ self.nb_typeerrors = 0
> # make the primitive_to_repr constant mapping
> self.primitive_to_repr = {}
> for s_primitive, lltype in annmodel.annotation_to_ll_map:
>@@ -138,8 +139,8 @@
> n = len(self.already_seen)
> if n % 100 == 0:
> total = len(self.annotator.annotated)
>- print 'specializing: %d / %d blocks (%d%%)' % (
>- n, total, 100 * n // total)
>+ print 'specializing: %d / %d blocks (%d%%, %d
>errors)' % (
>+ n, total, 100 * n // total, self.nb_typeerrors)
> # make sure all reprs so far have had their setup() called
> self.call_all_setups()
>
>@@ -200,7 +201,11 @@
>
> def specialize_block(self, block):
> # give the best possible types to the input args
>- self.setup_block_entry(block)
>+ try:
>+ self.setup_block_entry(block)
>+ except TyperError, e:
>+ self.gottypererror(e, block, "block entry", None)
>+ return # cannot continue this block
>
> # specialize all the operations, as far as possible
> if block.operations == (): # return or except block
>@@ -269,8 +274,9 @@
> new_a1 = newops.convertvar(a1, r_a1, r_a2)
> except TyperError, e:
> self.gottypererror(e, block, link, newops)
>- if new_a1 != a1:
>- newlinkargs[i] = new_a1
>+ else:
>+ if new_a1 != a1:
>+ newlinkargs[i] = new_a1
>
> if newops:
> if can_insert_here:
>@@ -343,13 +349,16 @@
> """Record a TyperError without crashing immediately.
> Put a 'TyperError' operation in the graph instead.
> """
>+ self.nb_typeerrors += 1
> e.where = (block, position)
> if crash_on_first_typeerror:
> raise
>+ print "*** TyperError:",e
> if self.typererror is None:
> self.typererror = sys.exc_info()
> c1 = inputconst(Void, Exception.__str__(e))
>- llops.genop('TYPER ERROR', [c1], resulttype=Void)
>+ if llops:
>+ llops.genop('TYPER ERROR', [c1], resulttype=Void)
>
> # __________ regular operations __________
>
>@@ -377,7 +386,12 @@
> def translate_op_contains(self, hop):
> r_arg1 = hop.args_r[0]
> r_arg2 = hop.args_r[1]
>- return pair(r_arg1, r_arg2).rtype_contains(hop)
>+ p = pair(r_arg1, r_arg2)
>+ try:
>+ f = p.rtype_contains
>+ except AttributeError,e:
>+ raise TyperError(str(e))
>+ return f(hop)
>
> # __________ irregular operations __________
>
>
>--
>Amaury Forgeot d'Arc
>Ubix Development
>www.ubitrade.com
>
>
>_______________________________________________
>pypy-dev at codespeak.net
>http://codespeak.net/mailman/listinfo/pypy-dev
>
>
More information about the pypy-dev
mailing list