[pypy-svn] r14711 - in pypy/dist/pypy/rpython: . test

pedronis at codespeak.net pedronis at codespeak.net
Fri Jul 15 22:03:09 CEST 2005


Author: pedronis
Date: Fri Jul 15 22:03:07 2005
New Revision: 14711

Modified:
   pypy/dist/pypy/rpython/rmodel.py
   pypy/dist/pypy/rpython/rpbc.py
   pypy/dist/pypy/rpython/test/test_rpbc.py
Log:
- more generic approach to implemeting is

- conversion from SingleFrozenPBCRepr to MultipleFrozenPBCRepr

- new test



Modified: pypy/dist/pypy/rpython/rmodel.py
==============================================================================
--- pypy/dist/pypy/rpython/rmodel.py	(original)
+++ pypy/dist/pypy/rpython/rmodel.py	Fri Jul 15 22:03:07 2005
@@ -123,6 +123,12 @@
 class __extend__(pairtype(Repr, Repr)):
     
     def rtype_is_((robj1, robj2), hop):
+        if hop.s_result.is_constant():
+            return inputconst(Bool, hop.s_result.const)
+        if robj1.lowleveltype == Void:
+            robj1 = robj2
+        elif robj2.lowleveltype == Void:
+            robj2 = robj1
         if (not isinstance(robj1.lowleveltype, Ptr) or
             not isinstance(robj2.lowleveltype, Ptr)):
             raise TyperError('is of instances of the non-pointers: %r, %r' % (

Modified: pypy/dist/pypy/rpython/rpbc.py
==============================================================================
--- pypy/dist/pypy/rpython/rpbc.py	(original)
+++ pypy/dist/pypy/rpython/rpbc.py	Fri Jul 15 22:03:07 2005
@@ -103,19 +103,24 @@
 def getPyObjRepr(rtyper, s_pbc):
     return robject.pyobj_repr
 
+def get_access_set(rtyper, pbc):
+    access_sets = rtyper.annotator.getpbcaccesssets()
+    try:
+        return access_sets[pbc]
+    except KeyError:
+        return None    
 
 def getFrozenPBCRepr(rtyper, s_pbc):
     if len(s_pbc.prebuiltinstances) <= 1:
         #if s_pbc.const is None:   -- take care of by rtyper_makerepr() above
         #    return none_frozen_pbc_repr
-        return single_frozen_pbc_repr
+        return SingleFrozenPBCRepr(s_pbc.prebuiltinstances.keys()[0])
     else:
         pbcs = [pbc for pbc in s_pbc.prebuiltinstances.keys()
                     if pbc is not None]
-        access_sets = rtyper.annotator.getpbcaccesssets()
-        _, _, access = access_sets.find(pbcs[0])
+        access = get_access_set(rtyper, pbcs[0])
         for obj in pbcs[1:]:
-            _, _, access1 = access_sets.find(obj)
+            access1 = get_access_set(rtyper, obj)
             assert access1 is access       # XXX not implemented
         try:
             return rtyper.pbc_reprs[access]
@@ -130,20 +135,21 @@
     """Representation selected for a single non-callable pre-built constant."""
     lowleveltype = Void
 
+    def __init__(self, value):
+        self.value = value
+
     def rtype_getattr(_, hop):
         if not hop.s_result.is_constant():
             raise TyperError("getattr on a constant PBC returns a non-constant")
         return hop.inputconst(hop.r_result, hop.s_result.const)
 
-single_frozen_pbc_repr = SingleFrozenPBCRepr()
-
 # __ None ____________________________________________________
 class NoneFrozenPBCRepr(SingleFrozenPBCRepr):
     
     def rtype_is_true(self, hop):
         return Constant(False, Bool)
 
-none_frozen_pbc_repr = NoneFrozenPBCRepr()
+none_frozen_pbc_repr = NoneFrozenPBCRepr(None)
 
 
 def rtype_is_None(robj1, rnone2, hop, pos=0):
@@ -190,14 +196,15 @@
         self.initialized = "in progress"
         llfields = []
         llfieldmap = {}
-        attrlist = self.access_set.attrs.keys()
-        attrlist.sort()
-        for attr in attrlist:
-            s_value = self.access_set.attrs[attr]
-            r_value = self.rtyper.getrepr(s_value)
-            mangled_name = 'pbc_' + attr
-            llfields.append((mangled_name, r_value.lowleveltype))
-            llfieldmap[attr] = mangled_name, r_value
+        if self.access_set is not None:
+            attrlist = self.access_set.attrs.keys()
+            attrlist.sort()
+            for attr in attrlist:
+                s_value = self.access_set.attrs[attr]
+                r_value = self.rtyper.getrepr(s_value)
+                mangled_name = 'pbc_' + attr
+                llfields.append((mangled_name, r_value.lowleveltype))
+                llfieldmap[attr] = mangled_name, r_value
         self.pbc_type.become(Struct('pbc', *llfields))
         self.llfieldmap = llfieldmap
         self.initialized = True
@@ -248,6 +255,19 @@
         return llops.genop('getfield', [vpbc, cmangledname],
                            resulttype = r_value)
 
+class __extend__(pairtype(MultipleFrozenPBCRepr, MultipleFrozenPBCRepr)):
+    def convert_from_to((r_pbc1, r_pbc2), v, llops):
+        if r_pbc1.access_set == r_pbc2.access_set:
+            return v
+        return NotImplemented
+
+class __extend__(pairtype(SingleFrozenPBCRepr, MultipleFrozenPBCRepr)):
+    def convert_from_to((r_pbc1, r_pbc2), v, llops):
+        value = r_pbc1.value
+        access = get_access_set(r_pbc2.rtyper, value)
+        if access is r_pbc2.access_set:
+            return inputconst(r_pbc2, value)
+        return NotImplemented
 
 # ____________________________________________________________
 

Modified: pypy/dist/pypy/rpython/test/test_rpbc.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_rpbc.py	(original)
+++ pypy/dist/pypy/rpython/test/test_rpbc.py	Fri Jul 15 22:03:07 2005
@@ -158,6 +158,24 @@
     res = interpret(f, [-1])
     assert res == 5
 
+def test_is_among_frozen():
+    fr1 = Freezing()
+    fr2 = Freezing()
+    def givefr1():
+        return fr1
+    def givefr2():
+        return fr2
+    def f(i):
+        if i == 1:
+            fr = givefr1()
+        else:
+            fr = givefr2()
+        return fr is fr1
+    res = interpret(f, [0])
+    assert res is False
+    res = interpret(f, [1])
+    assert res is True
+
 def test_unbound_method():
     def f():
         inst = MySubclass()



More information about the Pypy-commit mailing list