[pypy-svn] r24940 - in pypy/dist/pypy: jit rpython rpython/lltypesystem rpython/ootypesystem rpython/test translator/squeak/test

nik at codespeak.net nik at codespeak.net
Fri Mar 24 10:32:43 CET 2006


Author: nik
Date: Fri Mar 24 10:32:40 2006
New Revision: 24940

Added:
   pypy/dist/pypy/rpython/lltypesystem/rtuple.py
      - copied, changed from r24667, pypy/dist/pypy/rpython/rtuple.py
   pypy/dist/pypy/rpython/ootypesystem/rtuple.py
Modified:
   pypy/dist/pypy/jit/hinttimeshift.py
   pypy/dist/pypy/rpython/callparse.py
   pypy/dist/pypy/rpython/lltypesystem/rpbc.py
   pypy/dist/pypy/rpython/rstr.py
   pypy/dist/pypy/rpython/rtuple.py
   pypy/dist/pypy/rpython/rtyper.py
   pypy/dist/pypy/rpython/test/test_rtuple.py
   pypy/dist/pypy/rpython/typesystem.py
   pypy/dist/pypy/translator/squeak/test/runtest.py
Log:
split rtuple into a version for the lltypesystem and the ootypesystem. make
some tuple tests pass on ootypes. the ootype version is for now conceptually
analoguous to the lltype one. this is a slightly invasive change, but as far
as i can tell it doesn't break any tests or translation.


Modified: pypy/dist/pypy/jit/hinttimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/hinttimeshift.py	(original)
+++ pypy/dist/pypy/jit/hinttimeshift.py	Fri Mar 24 10:32:40 2006
@@ -4,7 +4,8 @@
 from pypy.annotation import listdef, dictdef
 from pypy.jit.rtimeshift import VARLIST, RedBox, VarRedBox, ConstRedBox, JITState
 from pypy.jit.rtimeshift import make_types_const
-from pypy.rpython import rmodel, rtuple, rlist, rdict, rgenop, annlowlevel
+from pypy.rpython import rmodel, rlist, rdict, rgenop, annlowlevel
+from pypy.rpython.lltypesystem import rtuple
 from pypy.jit import rtimeshift
 from pypy.jit.hintrtyper import HintRTyper, originalconcretetype
 from pypy.jit.hintrtyper import GreenRepr, RedRepr, HintLowLevelOpList

Modified: pypy/dist/pypy/rpython/callparse.py
==============================================================================
--- pypy/dist/pypy/rpython/callparse.py	(original)
+++ pypy/dist/pypy/rpython/callparse.py	Fri Mar 24 10:32:40 2006
@@ -1,6 +1,6 @@
 from pypy.interpreter.argument import Arguments, ArgErr
 from pypy.annotation import model as annmodel
-from pypy.rpython import rtuple
+from pypy.rpython.lltypesystem import rtuple # XXX not independent of type system!
 from pypy.rpython.error import TyperError
 from pypy.rpython.lltypesystem import lltype
 

Modified: pypy/dist/pypy/rpython/lltypesystem/rpbc.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rpbc.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/rpbc.py	Fri Mar 24 10:32:40 2006
@@ -7,8 +7,6 @@
      typeOf, Void, ForwardReference, Struct, Bool, \
      Ptr, malloc, nullptr
 from pypy.rpython.rmodel import Repr, TyperError, inputconst, inputdesc
-from pypy.rpython import robject
-from pypy.rpython import rtuple
 from pypy.rpython.rpbc import samesig,\
      commonbase, allattributenames, adjust_shape, \
      AbstractClassesPBCRepr, AbstractMethodsPBCRepr, OverriddenFunctionPBCRepr, \

Added: pypy/dist/pypy/rpython/ootypesystem/rtuple.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/ootypesystem/rtuple.py	Fri Mar 24 10:32:40 2006
@@ -0,0 +1,62 @@
+from pypy.annotation.pairtype import pairtype
+from pypy.objspace.flow.model import Constant
+from pypy.rpython.rmodel import Repr, IntegerRepr, inputconst
+from pypy.rpython.rmodel import externalvsinternal
+from pypy.rpython.error import TyperError
+from pypy.rpython.rtuple import AbstractTupleRepr
+from pypy.rpython.ootypesystem import ootype
+
+
+class TupleRepr(AbstractTupleRepr):
+
+    def __init__(self, rtyper, items_r):
+        AbstractTupleRepr.__init__(self, rtyper, items_r)
+        self.lowleveltype = tuple_type(self.fieldnames, self.lltypes)
+
+    def instantiate(self):
+        return ootype.new(self.lowleveltype)
+
+    def getitem(self, llops, v_tuple, index): # ! returns internal repr lowleveltype
+        name = self.fieldnames[index]
+        llresult = self.lltypes[index]
+        cname = inputconst(ootype.Void, name)
+        return  llops.genop("oogetfield", [v_tuple, cname], resulttype=llresult)
+
+
+_tuple_types = {}
+
+def tuple_type(fieldnames, fieldtypes):
+    key = tuple(fieldtypes)
+    if _tuple_types.has_key(key):
+        return _tuple_types[key]
+    else:
+        fields = dict(zip(fieldnames, fieldtypes))
+        INST = ootype.Instance("Tuple%s" % len(fieldnames), ootype.ROOT, fields)
+        _tuple_types[key] = INST
+        return INST
+# ____________________________________________________________
+#
+#  Irregular operations.
+
+def newtuple(llops, r_tuple, items_v): # items_v should have the lowleveltype of the internal reprs
+    if len(r_tuple.items_r) == 0:
+        return inputconst(r_tuple, ())    # always the same empty tuple
+    c1 = inputconst(ootype.Void, r_tuple.lowleveltype)
+    v_result = llops.genop("new", [c1], resulttype=r_tuple.lowleveltype)
+    for i in range(len(r_tuple.items_r)):
+        cname = inputconst(ootype.Void, r_tuple.fieldnames[i])
+        llops.genop("oosetfield", [v_result, cname, items_v[i]])
+    return v_result
+
+def newtuple_cached(hop, items_v):
+    r_tuple = hop.r_result
+    if hop.s_result.is_constant():
+        return inputconst(r_tuple, hop.s_result.const)
+    else:
+        return newtuple(hop.llops, r_tuple, items_v)
+
+def rtype_newtuple(hop):
+    r_tuple = hop.r_result
+    vlist = hop.inputargs(*r_tuple.items_r)
+    return newtuple_cached(hop, vlist)
+

Modified: pypy/dist/pypy/rpython/rstr.py
==============================================================================
--- pypy/dist/pypy/rpython/rstr.py	(original)
+++ pypy/dist/pypy/rpython/rstr.py	Fri Mar 24 10:32:40 2006
@@ -6,7 +6,7 @@
 from pypy.rpython.rmodel import StringRepr, CharRepr, inputconst, UniCharRepr
 from pypy.rpython.rarithmetic import _hash_string
 from pypy.rpython.robject import PyObjRepr, pyobj_repr
-from pypy.rpython.rtuple import TupleRepr
+from pypy.rpython.lltypesystem.rtuple import TupleRepr # XXX type system!
 from pypy.rpython import rint
 from pypy.rpython.rslice import SliceRepr
 from pypy.rpython.rslice import startstop_slice_repr, startonly_slice_repr

Modified: pypy/dist/pypy/rpython/rtuple.py
==============================================================================
--- pypy/dist/pypy/rpython/rtuple.py	(original)
+++ pypy/dist/pypy/rpython/rtuple.py	Fri Mar 24 10:32:40 2006
@@ -11,82 +11,16 @@
      Ptr, GcStruct, Void, Signed, malloc, typeOf, nullptr
 from pypy.rpython.rarithmetic import intmask
 
-# ____________________________________________________________
-#
-#  Concrete implementation of RPython tuples:
-#
-#    struct tuple {
-#        type0 item0;
-#        type1 item1;
-#        type2 item2;
-#        ...
-#    }
-
 class __extend__(annmodel.SomeTuple):
     def rtyper_makerepr(self, rtyper):
-        return TupleRepr(rtyper, [rtyper.getrepr(s_item) for s_item in self.items])
+        repr_class = rtyper.type_system.rtuple.TupleRepr
+        return repr_class(rtyper, [rtyper.getrepr(s_item) for s_item in self.items])
     
     def rtyper_makekey_ex(self, rtyper):
         keys = [rtyper.makekey(s_item) for s_item in self.items]
         return tuple([self.__class__]+keys)
 
-_gen_eq_function_cache = {}
-_gen_hash_function_cache = {}
-
-def gen_eq_function(items_r):
-    eq_funcs = [r_item.get_ll_eq_function() or operator.eq for r_item in items_r]
-    key = tuple(eq_funcs)
-    try:
-        return _gen_eq_function_cache[key]
-    except KeyError:
-        miniglobals = {}
-        source = """
-def ll_eq(t1, t2):
-    %s
-    return True
-"""
-        body = []
-        for i, eq_func in enumerate(eq_funcs):
-            miniglobals['eq%d' % i] = eq_func
-            body.append("if not eq%d(t1.item%d, t2.item%d): return False" % (i, i, i))
-        body = ('\n'+' '*4).join(body)
-        source = source % body
-        exec source in miniglobals
-        ll_eq = miniglobals['ll_eq']
-        _gen_eq_function_cache[key] = ll_eq
-        return ll_eq
-
-def gen_hash_function(items_r):
-    # based on CPython
-    hash_funcs = [r_item.get_ll_hash_function() for r_item in items_r]
-    key = tuple(hash_funcs)
-    try:
-        return _gen_hash_function_cache[key]
-    except KeyError:
-        miniglobals = {}
-        source = """
-def ll_hash(t):
-    retval = 0x345678
-    %s
-    return retval
-"""
-        body = []
-        mult = 1000003
-        for i, hash_func in enumerate(hash_funcs):
-            miniglobals['hash%d' % i] = hash_func
-            body.append("retval = (retval ^ hash%d(t.item%d)) * %d" %
-                        (i, i, mult))
-            mult = intmask(mult + 82520 + 2*len(items_r))
-        body = ('\n'+' '*4).join(body)
-        source = source % body
-        exec source in miniglobals
-        ll_hash = miniglobals['ll_hash']
-        _gen_hash_function_cache[key] = ll_hash
-        return ll_hash
-
-
-
-class TupleRepr(Repr):
+class AbstractTupleRepr(Repr):
 
     def __init__(self, rtyper, items_r):
         self.items_r = []
@@ -98,93 +32,25 @@
         items_r = self.items_r
         self.fieldnames = ['item%d' % i for i in range(len(items_r))]
         self.lltypes = [r.lowleveltype for r in items_r]
-        fields = zip(self.fieldnames, self.lltypes)
-        self.lowleveltype = Ptr(GcStruct('tuple%d' % len(items_r), *fields))
         self.tuple_cache = {}
 
-    def compact_repr(self):
-        return "TupleR %s" % ' '.join([llt._short_name() for llt in self.lltypes])
-
     def convert_const(self, value):
         assert isinstance(value, tuple) and len(value) == len(self.items_r)
         key = tuple([Constant(item) for item in value])
         try:
             return self.tuple_cache[key]
         except KeyError:
-            p = malloc(self.lowleveltype.TO)
+            p = self.instantiate()
             self.tuple_cache[key] = p
             for obj, r, name in zip(value, self.items_r, self.fieldnames):
                 setattr(p, name, r.convert_const(obj))
             return p
 
-    #def get_eqfunc(self):
-    #    return inputconst(Void, self.item_repr.get_ll_eq_function())
-
-    def get_ll_eq_function(self):
-        return gen_eq_function(self.items_r)
-
-    def get_ll_hash_function(self):
-        return gen_hash_function(self.items_r)    
-
-    def can_ll_be_null(self, s_value):
-        return False
-
     def rtype_len(self, hop):
         return hop.inputconst(Signed, len(self.items_r))
 
-    def rtype_bltn_list(self, hop):
-        from pypy.rpython import rlist
-        nitems = len(self.items_r)
-        vtup = hop.inputarg(self, 0)
-        LIST = hop.r_result.lowleveltype.TO
-        cno = inputconst(Signed, nitems)
-        vlist = hop.gendirectcall(LIST.ll_newlist, cno)
-        v_func = hop.inputconst(Void, rlist.dum_nocheck)
-        for index in range(nitems):
-            name = self.fieldnames[index]
-            ritem = self.items_r[index]
-            cname = hop.inputconst(Void, name)
-            vitem = hop.genop('getfield', [vtup, cname], resulttype = ritem)
-            vitem = hop.llops.convertvar(vitem, ritem, hop.r_result.item_repr)
-            cindex = inputconst(Signed, index)
-            hop.gendirectcall(rlist.ll_setitem_nonneg, v_func, vlist, cindex, vitem)
-        return vlist
-
-    def make_iterator_repr(self):
-        if len(self.items_r) == 1:
-            return Length1TupleIteratorRepr(self)
-        raise TyperError("can only iterate over tuples of length 1 for now")
-
-    def getitem(self, llops, v_tuple, index): # ! returns internal repr lowleveltype
-        name = self.fieldnames[index]
-        llresult = self.lltypes[index]
-        cname = inputconst(Void, name)
-        return  llops.genop('getfield', [v_tuple, cname], resulttype = llresult)
-
-
 
-class __extend__(pairtype(TupleRepr, Repr)): 
-    def rtype_contains((r_tup, r_item), hop):
-        s_tup = hop.args_s[0]
-        if not s_tup.is_constant():
-            raise TyperError("contains() on non-const tuple") 
-        t = s_tup.const
-        typ = type(t[0]) 
-        for x in t[1:]: 
-            if type(x) is not typ: 
-                raise TyperError("contains() on mixed-type tuple "
-                                 "constant %r" % (t,))
-        d = {}
-        for x in t: 
-            d[x] = None 
-        hop2 = hop.copy()
-        _, _ = hop2.r_s_popfirstarg()
-        v_dict = Constant(d)
-        s_dict = hop.rtyper.annotator.bookkeeper.immutablevalue(d)
-        hop2.v_s_insertfirstarg(v_dict, s_dict)
-        return hop2.dispatch()
- 
-class __extend__(pairtype(TupleRepr, IntegerRepr)):
+class __extend__(pairtype(AbstractTupleRepr, IntegerRepr)):
 
     def rtype_getitem((r_tup, r_int), hop):
         v_tuple, v_index = hop.inputargs(r_tup, Signed)
@@ -194,123 +60,3 @@
         v = r_tup.getitem(hop.llops, v_tuple, index)
         return hop.llops.convertvar(v, r_tup.items_r[index], r_tup.external_items_r[index])
 
-class __extend__(pairtype(TupleRepr, TupleRepr)):
-    
-    def rtype_add((r_tup1, r_tup2), hop):
-        v_tuple1, v_tuple2 = hop.inputargs(r_tup1, r_tup2)
-        vlist = []
-        for i in range(len(r_tup1.items_r)):
-            vlist.append(r_tup1.getitem(hop.llops, v_tuple1, i))
-        for i in range(len(r_tup2.items_r)):
-            vlist.append(r_tup2.getitem(hop.llops, v_tuple2, i))
-        return newtuple_cached(hop, vlist)
-    rtype_inplace_add = rtype_add
-
-    def convert_from_to((r_from, r_to), v, llops):
-        if len(r_from.items_r) == len(r_to.items_r):
-            if r_from.lowleveltype == r_to.lowleveltype:
-                return v
-            n = len(r_from.items_r)
-            items_v = []
-            for i in range(n):
-                item_v = r_from.getitem(llops, v, i)
-                item_v = llops.convertvar(item_v,
-                                              r_from.items_r[i],
-                                              r_to.items_r[i])
-                items_v.append(item_v)
-            return newtuple(llops, r_to, items_v)
-        return NotImplemented
-                
-# ____________________________________________________________
-#
-#  Irregular operations.
-
-def newtuple(llops, r_tuple, items_v): # items_v should have the lowleveltype of the internal reprs
-    if len(r_tuple.items_r) == 0:
-        return inputconst(r_tuple, ())    # always the same empty tuple
-    c1 = inputconst(Void, r_tuple.lowleveltype.TO)
-    v_result = llops.genop('malloc', [c1], resulttype = r_tuple.lowleveltype)
-    for i in range(len(r_tuple.items_r)):
-        cname = inputconst(Void, r_tuple.fieldnames[i])
-        llops.genop('setfield', [v_result, cname, items_v[i]])
-    return v_result
-
-def newtuple_cached(hop, items_v):
-    r_tuple = hop.r_result
-    if hop.s_result.is_constant():
-        return inputconst(r_tuple, hop.s_result.const)
-    else:
-        return newtuple(hop.llops, r_tuple, items_v)
-
-def rtype_newtuple(hop):
-    r_tuple = hop.r_result
-    vlist = hop.inputargs(*r_tuple.items_r)
-    return newtuple_cached(hop, vlist)
-
-#
-# _________________________ Conversions _________________________
-
-class __extend__(pairtype(PyObjRepr, TupleRepr)):
-    def convert_from_to((r_from, r_to), v, llops):
-        vlist = []
-        for i in range(len(r_to.items_r)):
-            ci = inputconst(Signed, i)
-            v_item = llops.gencapicall('PyTuple_GetItem_WithIncref', [v, ci],
-                                       resulttype = pyobj_repr)
-            v_converted = llops.convertvar(v_item, pyobj_repr,
-                                           r_to.items_r[i])
-            vlist.append(v_converted)
-        return newtuple(llops, r_to, vlist)
-
-class __extend__(pairtype(TupleRepr, PyObjRepr)):
-    def convert_from_to((r_from, r_to), v, llops):
-        ci = inputconst(Signed, len(r_from.items_r))
-        v_result = llops.gencapicall('PyTuple_New', [ci],
-                                     resulttype = pyobj_repr)
-        for i in range(len(r_from.items_r)):
-            cname = inputconst(Void, r_from.fieldnames[i])
-            v_item = llops.genop('getfield', [v, cname],
-                                 resulttype = r_from.items_r[i].lowleveltype)
-            v_converted = llops.convertvar(v_item, r_from.items_r[i],
-                                           pyobj_repr)
-            ci = inputconst(Signed, i)
-            llops.gencapicall('PyTuple_SetItem_WithIncref', [v_result, ci,
-                                                             v_converted])
-        return v_result
-
-# ____________________________________________________________
-#
-#  Iteration.
-
-class Length1TupleIteratorRepr(IteratorRepr):
-
-    def __init__(self, r_tuple):
-        self.r_tuple = r_tuple
-        self.lowleveltype = Ptr(GcStruct('tuple1iter',
-                                         ('tuple', r_tuple.lowleveltype)))
-
-    def newiter(self, hop):
-        v_tuple, = hop.inputargs(self.r_tuple)
-        citerptr = hop.inputconst(Void, self.lowleveltype)
-        return hop.gendirectcall(ll_tupleiter, citerptr, v_tuple)
-
-    def rtype_next(self, hop):
-        v_iter, = hop.inputargs(self)
-        hop.has_implicit_exception(StopIteration) # record that we know about it
-        hop.exception_is_here()
-        v = hop.gendirectcall(ll_tuplenext, v_iter)
-        return hop.llops.convertvar(v, self.r_tuple.items_r[0], self.r_tuple.external_items_r[0])
-
-def ll_tupleiter(ITERPTR, tuple):
-    iter = malloc(ITERPTR.TO)
-    iter.tuple = tuple
-    return iter
-
-def ll_tuplenext(iter):
-    # for iterating over length 1 tuples only!
-    t = iter.tuple
-    if t:
-        iter.tuple = nullptr(typeOf(t).TO)
-        return t.item0
-    else:
-        raise StopIteration

Modified: pypy/dist/pypy/rpython/rtyper.py
==============================================================================
--- pypy/dist/pypy/rpython/rtyper.py	(original)
+++ pypy/dist/pypy/rpython/rtyper.py	Fri Mar 24 10:32:40 2006
@@ -509,7 +509,7 @@
         return rlist.rtype_alloc_and_set(hop)
 
     def translate_op_newtuple(self, hop):
-        return rtuple.rtype_newtuple(hop)
+        return self.type_system.rtuple.rtype_newtuple(hop)
 
     def translate_op_newslice(self, hop):
         return rslice.rtype_newslice(hop)
@@ -835,7 +835,7 @@
 from pypy.rpython import robject
 from pypy.rpython import rint, rbool, rfloat
 from pypy.rpython import rslice, rrange
-from pypy.rpython import rlist, rstr, rtuple, rdict 
+from pypy.rpython import rlist, rstr, rdict 
 from pypy.rpython import rclass, rbuiltin, rpbc, rspecialcase
 from pypy.rpython import rexternalobj
 from pypy.rpython import rptr

Modified: pypy/dist/pypy/rpython/test/test_rtuple.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_rtuple.py	(original)
+++ pypy/dist/pypy/rpython/test/test_rtuple.py	Fri Mar 24 10:32:40 2006
@@ -1,12 +1,12 @@
 from pypy.translator.translator import TranslationContext
 from pypy.rpython.lltypesystem.lltype import *
-from pypy.rpython.rtuple import *
 from pypy.rpython.rint import signed_repr
 from pypy.rpython.rbool import bool_repr
 from pypy.rpython.test.test_llinterp import interpret 
 import py
 
 def test_rtuple():
+    from pypy.rpython.lltypesystem.rtuple import TupleRepr
     rtuple = TupleRepr(None, [signed_repr, bool_repr])
     assert rtuple.lowleveltype == Ptr(GcStruct('tuple2',
                                                ('item0', Signed),
@@ -15,26 +15,31 @@
 
 # ____________________________________________________________
 
-def test_simple():
-    def dummyfn(x):
-        l = (10,x,30)
-        return l[2]
-    res = interpret(dummyfn,[4])
-    assert res == 30
-
-def test_len():
-    def dummyfn(x):
-        l = (5,x)
-        return len(l)
-    res = interpret(dummyfn, [4])
-    assert res == 2
-
-def test_return_tuple():
-    def dummyfn(x, y):
-        return (x<y, x>y)
-    res = interpret(dummyfn, [4,5])
-    assert res.item0 == True
-    assert res.item1 == False
+class AbstractTestRTuple:
+
+    def interpret(self, f, args):
+        return interpret(f, args, type_system=self.type_system)
+
+    def test_simple(self):
+        def dummyfn(x):
+            l = (10,x,30)
+            return l[2]
+        res = self.interpret(dummyfn,[4])
+        assert res == 30
+
+    def test_len(self):
+        def dummyfn(x):
+            l = (5,x)
+            return len(l)
+        res = self.interpret(dummyfn, [4])
+        assert res == 2
+
+    def test_return_tuple(self):
+        def dummyfn(x, y):
+            return (x<y, x>y)
+        res = self.interpret(dummyfn, [4,5])
+        assert res.item0 == True
+        assert res.item1 == False
 
 def test_tuple_concatenation():
     def f(n):
@@ -208,3 +213,13 @@
     res1 = interpret(f, [12, 27])
     res2 = interpret(f, [27, 12])
     assert res1 != res2
+
+
+class TestLLTuple(AbstractTestRTuple):
+
+    type_system = "lltype"
+
+class TestOOTuple(AbstractTestRTuple):
+
+    type_system = "ootype"
+

Modified: pypy/dist/pypy/rpython/typesystem.py
==============================================================================
--- pypy/dist/pypy/rpython/typesystem.py	(original)
+++ pypy/dist/pypy/rpython/typesystem.py	Fri Mar 24 10:32:40 2006
@@ -20,7 +20,7 @@
                                   None, None, ['__doc__'])
             except ImportError:
                 return None
-        if name in ('rclass', 'rpbc', 'rbuiltin', 'exceptiondata'):
+        if name in ('rclass', 'rpbc', 'rbuiltin', 'rtuple', 'exceptiondata'):
             mod = load(name)
             if mod is not None:
                 setattr(self, name, mod)

Modified: pypy/dist/pypy/translator/squeak/test/runtest.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/test/runtest.py	(original)
+++ pypy/dist/pypy/translator/squeak/test/runtest.py	Fri Mar 24 10:32:40 2006
@@ -91,7 +91,7 @@
                     "variable to point to an image.")
         startup_st = self._write_startup()
         options = "-headless"
-        if conftest.option.showsqueak:
+        if hasattr(conftest, "showsqueak") and conftest.option.showsqueak:
             options = ""
         cmd = 'squeak %s -- %s %s "%s" %s' \
                 % (options, startup_st, udir.join(self._gen.filename),



More information about the Pypy-commit mailing list