Christian Tismer wrote:
Hi Armin,
when I added a few tests for the new variable step variant,
I observed the following behavior of ranges:
When a variable is conditionally assigned two different ranges,
the ranges are kept, unless the steps are different.
Well, after all this is not too surprizing, since we are compiling
the step constant in.
But I thing the action taken is not so pleasant:
The range is turned into a list in this case!
I guess what we want is either special-casing the respective blocks,
or at least map this to the variable step case, if this is possible.
I would like to understand why the annotator thinks this must
become a list, and how I can convince it to take a different action.
I think, using the variable variant would be adequate in this case.
you changed what happens on range calls annotation-wise, but not the
behavior of what should occur when types are mixed, this is specified by
the union operation which for list/ranges basically goes through the
ListItem.merge, which still has the behavior that mixing different-step
ranges unifies to list:
if other.range_step != self.range_step:
self.range_step = None
in listdef.py . If I have understood your changes you want 0 in this
case unless one of the range_step is already None meaning list.
Notice that if you change this you probably need to change
rtype_builtin_range because this assumes that it can use partially the
information in its arguments instead of about the result to decide
what to produce.
A test_range_funny was added to test_rrange.py, not really
meant as a test, but to explain that.
Please let me know what you think.
cheers - chris
_______________________________________________
pypy-dev@codespeak.net
http://codespeak.net/mailman/listinfo/pypy-dev