New issue 2011: RPython: Better error message for obvious type errors
https://bitbucket.org/pypy/pypy/issue/2011/rpython-better-error-message-for-obvious

Ronan Lamy:

Consider this code:

```
#!python

def entry_point(argv):
    print len([0, 1][0])
    return 0

def target(*args):
    return entry_point, None

```
Currently, translating it fails with
```
[translation:ERROR] MissingRTypeOperation: unimplemented operation: 'len' on 
<IntegerRepr Signed>
[translation:ERROR] .. (targ:1)entry_point
[translation:ERROR] .. block@9 with 1 exits
[translation:ERROR] .. v28 = len(v27)
```
which tends to confuse users. The problem, calling `len()` on an int, could 
easily be detected during annotation. If we raised an AnnotationError, we could 
have a much nicer error message, for instance:
```
[translation:ERROR] AnnotatorError:
[translation:ERROR]
[translation:ERROR] Object has no len()
[translation:ERROR]
[translation:ERROR]
[translation:ERROR]     v1 = len(v0)
[translation:ERROR]
[translation:ERROR] In <FunctionGraph of (targ:1)entry_point at 0x2bbb0d0>:
[translation:ERROR] Happened at file targ.py line 2
[translation:ERROR]
[translation:ERROR] ==>     print len([0, 1][0])
[translation:ERROR]
[translation:ERROR] Known variable annotations:
[translation:ERROR]  v0 = SomeInteger(knowntype=int, nonneg=True, 
unsigned=False)
[translation:ERROR]
[translation:ERROR] Processing block:
[translation:ERROR]  block@9 is a <class 
'rpython.flowspace.flowcontext.SpamBlock'>
[translation:ERROR]  in (targ:1)entry_point
[translation:ERROR]  containing the following operations:
[translation:ERROR]        v2 = newlist((0), (1))
[translation:ERROR]        v0 = getitem(v2, (0))
[translation:ERROR]        v1 = len(v0)
[translation:ERROR]        v3 = str(v1)
[translation:ERROR]        v4 = simple_call((function rpython_print_item), v3)
[translation:ERROR]        v5 = simple_call((function rpython_print_newline))
[translation:ERROR]  --end--
```

Note that `len()` is just an example, there are many similar cases, including 
those where the error message is the dreaded "Blocked block -- operation cannot 
succeed" instead of MissingRTypeOperation.


_______________________________________________
pypy-issue mailing list
pypy-issue@python.org
https://mail.python.org/mailman/listinfo/pypy-issue

Reply via email to