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
_______________________________________________
[email protected]
http://codespeak.net/mailman/listinfo/pypy-dev