Author: Ronan Lamy <[email protected]>
Branch: SomeRange
Changeset: r82005:d458d86b6ce2
Date: 2016-01-29 19:08 +0000
http://bitbucket.org/pypy/pypy/changeset/d458d86b6ce2/
Log: Merge rpython.rtyper.lltypesystem.rrange into rpython.rtyper.rrange
diff --git a/rpython/rtyper/lltypesystem/rrange.py
b/rpython/rtyper/lltypesystem/rrange.py
deleted file mode 100644
--- a/rpython/rtyper/lltypesystem/rrange.py
+++ /dev/null
@@ -1,98 +0,0 @@
-from rpython.rtyper.lltypesystem.lltype import Ptr, GcStruct, Signed, malloc,
Void
-from rpython.rtyper.rrange import AbstractRangeRepr, AbstractRangeIteratorRepr
-from rpython.rtyper.error import TyperError
-
-# ____________________________________________________________
-#
-# Concrete implementation of RPython lists that are returned by range()
-# and never mutated afterwards:
-#
-# struct range {
-# Signed start, stop; // step is always constant
-# }
-#
-# struct rangest {
-# Signed start, stop, step; // rare case, for completeness
-# }
-
-def ll_length(l):
- if l.step > 0:
- lo = l.start
- hi = l.stop
- step = l.step
- else:
- lo = l.stop
- hi = l.start
- step = -l.step
- if hi <= lo:
- return 0
- n = (hi - lo - 1) // step + 1
- return n
-
-def ll_getitem_fast(l, index):
- return l.start + index * l.step
-
-RANGEST = GcStruct("range", ("start", Signed), ("stop", Signed), ("step",
Signed),
- adtmeths = {
- "ll_length":ll_length,
- "ll_getitem_fast":ll_getitem_fast,
- },
- hints = {'immutable': True})
-RANGESTITER = GcStruct("range", ("next", Signed), ("stop", Signed), ("step",
Signed))
-
-class RangeRepr(AbstractRangeRepr):
-
- RANGEST = Ptr(RANGEST)
- RANGESTITER = Ptr(RANGESTITER)
-
- getfield_opname = "getfield"
-
- def __init__(self, step, *args):
- self.RANGE = Ptr(GcStruct("range", ("start", Signed), ("stop", Signed),
- adtmeths = {
- "ll_length":ll_length,
- "ll_getitem_fast":ll_getitem_fast,
- "step":step,
- },
- hints = {'immutable': True}))
- self.RANGEITER = Ptr(GcStruct("range", ("next", Signed), ("stop",
Signed)))
- AbstractRangeRepr.__init__(self, step, *args)
- self.ll_newrange = ll_newrange
- self.ll_newrangest = ll_newrangest
-
- def make_iterator_repr(self, variant=None):
- if variant is not None:
- raise TyperError("unsupported %r iterator over a range list" %
- (variant,))
- return RangeIteratorRepr(self)
-
-
-def ll_newrange(RANGE, start, stop):
- l = malloc(RANGE.TO)
- l.start = start
- l.stop = stop
- return l
-
-def ll_newrangest(start, stop, step):
- if step == 0:
- raise ValueError
- l = malloc(RANGEST)
- l.start = start
- l.stop = stop
- l.step = step
- return l
-
-class RangeIteratorRepr(AbstractRangeIteratorRepr):
-
- def __init__(self, *args):
- AbstractRangeIteratorRepr.__init__(self, *args)
- self.ll_rangeiter = ll_rangeiter
-
-def ll_rangeiter(ITERPTR, rng):
- iter = malloc(ITERPTR.TO)
- iter.next = rng.start
- iter.stop = rng.stop
- if ITERPTR.TO is RANGESTITER:
- iter.step = rng.step
- return iter
-
diff --git a/rpython/rtyper/rlist.py b/rpython/rtyper/rlist.py
--- a/rpython/rtyper/rlist.py
+++ b/rpython/rtyper/rlist.py
@@ -44,7 +44,7 @@
s_value = listitem.s_value
if (listitem.range_step is not None and not listitem.mutated and
not isinstance(s_value, annmodel.SomeImpossibleValue)):
- from rpython.rtyper.lltypesystem.rrange import RangeRepr
+ from rpython.rtyper.rrange import RangeRepr
return RangeRepr(listitem.range_step)
else:
# cannot do the rtyper.getrepr() call immediately, for the case
diff --git a/rpython/rtyper/rrange.py b/rpython/rtyper/rrange.py
--- a/rpython/rtyper/rrange.py
+++ b/rpython/rtyper/rrange.py
@@ -1,19 +1,79 @@
from rpython.flowspace.model import Constant
from rpython.rtyper.error import TyperError
-from rpython.rtyper.lltypesystem.lltype import Signed, Void, Ptr
+from rpython.rtyper.lltypesystem.lltype import (
+ Ptr, GcStruct, Signed, malloc, Void)
from rpython.rtyper.rlist import dum_nocheck, dum_checkidx
from rpython.rtyper.rmodel import Repr, IteratorRepr
from rpython.rtyper.rint import IntegerRepr
from rpython.tool.pairtype import pairtype
+# ____________________________________________________________
+#
+# Concrete implementation of RPython lists that are returned by range()
+# and never mutated afterwards:
+#
+# struct range {
+# Signed start, stop; // step is always constant
+# }
+#
+# struct rangest {
+# Signed start, stop, step; // rare case, for completeness
+# }
-class AbstractRangeRepr(Repr):
+def ll_length(l):
+ if l.step > 0:
+ lo = l.start
+ hi = l.stop
+ step = l.step
+ else:
+ lo = l.stop
+ hi = l.start
+ step = -l.step
+ if hi <= lo:
+ return 0
+ n = (hi - lo - 1) // step + 1
+ return n
+
+def ll_getitem_fast(l, index):
+ return l.start + index * l.step
+
+RANGEST = GcStruct("range", ("start", Signed), ("stop", Signed), ("step",
Signed),
+ adtmeths = {
+ "ll_length":ll_length,
+ "ll_getitem_fast":ll_getitem_fast,
+ },
+ hints = {'immutable': True})
+RANGESTITER = GcStruct("range", ("next", Signed), ("stop", Signed), ("step",
Signed))
+
+class RangeRepr(Repr):
+
+ RANGEST = Ptr(RANGEST)
+ RANGESTITER = Ptr(RANGESTITER)
+
+ getfield_opname = "getfield"
+
def __init__(self, step):
+ self.RANGE = Ptr(GcStruct("range", ("start", Signed), ("stop", Signed),
+ adtmeths = {
+ "ll_length":ll_length,
+ "ll_getitem_fast":ll_getitem_fast,
+ "step":step,
+ },
+ hints = {'immutable': True}))
+ self.RANGEITER = Ptr(GcStruct("range", ("next", Signed), ("stop",
Signed)))
self.step = step
if step != 0:
self.lowleveltype = self.RANGE
else:
self.lowleveltype = self.RANGEST
+ self.ll_newrange = ll_newrange
+ self.ll_newrangest = ll_newrangest
+
+ def make_iterator_repr(self, variant=None):
+ if variant is not None:
+ raise TyperError("unsupported %r iterator over a range list" %
+ (variant,))
+ return RangeIteratorRepr(self)
def _getstep(self, v_rng, hop):
return hop.genop(self.getfield_opname,
@@ -29,7 +89,9 @@
v_step = self._getstep(v_rng, hop)
return hop.gendirectcall(ll_rangelen, v_rng, v_step)
-class __extend__(pairtype(AbstractRangeRepr, IntegerRepr)):
+
+
+class __extend__(pairtype(RangeRepr, IntegerRepr)):
def rtype_getitem((r_rng, r_int), hop):
if hop.has_implicit_exception(IndexError):
@@ -89,6 +151,21 @@
index += length
return l.start + index * step
+def ll_newrange(RANGE, start, stop):
+ l = malloc(RANGE.TO)
+ l.start = start
+ l.stop = stop
+ return l
+
+def ll_newrangest(start, stop, step):
+ if step == 0:
+ raise ValueError
+ l = malloc(RANGEST)
+ l.start = start
+ l.stop = stop
+ l.step = step
+ return l
+
# ____________________________________________________________
#
# Irregular operations.
@@ -105,7 +182,7 @@
if isinstance(vstep, Constant) and vstep.value == 0:
# not really needed, annotator catches it. Just in case...
raise TyperError("range cannot have a const step of zero")
- if isinstance(hop.r_result, AbstractRangeRepr):
+ if isinstance(hop.r_result, RangeRepr):
if hop.r_result.step != 0:
c_rng = hop.inputconst(Void, hop.r_result.RANGE)
hop.exception_is_here()
@@ -142,13 +219,14 @@
#
# Iteration.
-class AbstractRangeIteratorRepr(IteratorRepr):
+class RangeIteratorRepr(IteratorRepr):
def __init__(self, r_rng):
self.r_rng = r_rng
if r_rng.step != 0:
self.lowleveltype = r_rng.RANGEITER
else:
self.lowleveltype = r_rng.RANGESTITER
+ self.ll_rangeiter = ll_rangeiter
def newiter(self, hop):
v_rng, = hop.inputargs(self.r_rng)
@@ -169,6 +247,14 @@
hop.exception_is_here()
return hop.gendirectcall(llfn, v_iter, *args)
+def ll_rangeiter(ITERPTR, rng):
+ iter = malloc(ITERPTR.TO)
+ iter.next = rng.start
+ iter.stop = rng.stop
+ if ITERPTR.TO is RANGESTITER:
+ iter.step = rng.step
+ return iter
+
def ll_rangenext_up(iter, step):
next = iter.next
if next >= iter.stop:
diff --git a/rpython/rtyper/test/test_rrange.py
b/rpython/rtyper/test/test_rrange.py
--- a/rpython/rtyper/test/test_rrange.py
+++ b/rpython/rtyper/test/test_rrange.py
@@ -1,6 +1,7 @@
from rpython.rlib.rarithmetic import intmask
-from rpython.rtyper.rrange import ll_rangelen, ll_rangeitem,
ll_rangeitem_nonneg, dum_nocheck
-from rpython.rtyper.lltypesystem import rrange
+from rpython.rtyper.rrange import (
+ ll_rangelen, ll_rangeitem, ll_rangeitem_nonneg, dum_nocheck, ll_newrangest,
+ RangeRepr, ll_newrange)
from rpython.rtyper.test.tool import BaseRtypingTest
@@ -11,11 +12,11 @@
expected = range(start, stop, step)
length = len(expected)
if varstep:
- l = rrange.ll_newrangest(start, stop, step)
+ l = ll_newrangest(start, stop, step)
step = l.step
else:
- RANGE = rrange.RangeRepr(step).RANGE
- l = rrange.ll_newrange(RANGE, start, stop)
+ RANGE = RangeRepr(step).RANGE
+ l = ll_newrange(RANGE, start, stop)
assert ll_rangelen(l, step) == length
lst = [ll_rangeitem(dum_nocheck, l, i, step) for i in
range(length)]
assert lst == expected
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit