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