Hi pypy !

I hit an assert in pypy/annotation/annrpython.py in addpendingblock line 231
: assert annmodel.unionof(s_oldarg, s_newarg) == s_oldarg

I think I found an explanation by digging in code :

The treated block is in the "ll_delitem_nonneg" function,
s_newarg is a "SomeInteger(nonneg=True)" and s_oldarg is a
"SomeInteger(nonneg=False)"
and in fact they are the "index" argument of this function.


oldarg comes from a previous annotation using the "rtype_method_remove" of
rlist.py.
"rtype_method_remove" use "ll_listremove" which use :
ll_delitem_nonneg(..., ll_listindex(...))
Looking at ll_listindex, it seems clear that the index can be proved as
always positive.
That's probably why s_oldarg is a "SomeInteger(nonneg=True)"


The new annotation comes from the method "rtype_delitem" (class __extend__
in rlist.py).
the index from hop is always positive, so the code :
if hop.args_s[1].nonneg:
    llfn = ll_delitem_nonneg
select "ll_delitem_nonneg" as the deletion function.
But the index given to the annotator is taken from :
v_lst, v_index = hop.inputargs(r_lst, Signed)
v_index is a "Signed"
The information concerning the "non negative" property of the index integer
is lost here.
index is now "SomeInteger(nonneg=False)" and trigs the assert.


What do you think ?

Zariko.
_______________________________________________
pypy-dev mailing list
pypy-dev@python.org
http://mail.python.org/mailman/listinfo/pypy-dev

Reply via email to