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

Reply via email to