[pypy-svn] r36012 - in pypy/dist/pypy: rlib/rctypes rlib/rctypes/test rpython

arigo at codespeak.net arigo at codespeak.net
Thu Dec 28 11:40:44 CET 2006


Author: arigo
Date: Thu Dec 28 11:40:40 2006
New Revision: 36012

Modified:
   pypy/dist/pypy/rlib/rctypes/implementation.py
   pypy/dist/pypy/rlib/rctypes/rstruct.py
   pypy/dist/pypy/rlib/rctypes/test/test_rprimitive.py
   pypy/dist/pypy/rpython/controllerentry.py
   pypy/dist/pypy/rpython/rcontrollerentry.py
Log:
Turned rtypedelegate() into a more generally useful helper.
Use it to pass many of the rtyping tests of test_rprimitive.


Modified: pypy/dist/pypy/rlib/rctypes/implementation.py
==============================================================================
--- pypy/dist/pypy/rlib/rctypes/implementation.py	(original)
+++ pypy/dist/pypy/rlib/rctypes/implementation.py	Thu Dec 28 11:40:40 2006
@@ -1,6 +1,7 @@
 from pypy.annotation import model as annmodel
 from pypy.rlib.rctypes import rctypesobject
 from pypy.rpython import extregistry, controllerentry
+from pypy.rpython.error import TyperError
 from pypy.rpython.controllerentry import Controller, ControllerEntry
 from pypy.rpython.controllerentry import ControllerEntryForPrebuilt
 from pypy.rpython.controllerentry import SomeControlledInstance
@@ -69,12 +70,12 @@
                                             s_obj, s_attr, s_value)
 
     def rtype_setattr(self, hop):
-        r_controlled_instance = hop.args_r[0]
+        from pypy.rpython.rcontrollerentry import rtypedelegate
         if s_is_box(hop.args_s[2]):
             hop2 = revealbox(hop, 2)
-            return r_controlled_instance.rtypedelegate(self.setboxattr, hop2)
+            return rtypedelegate(self.setboxattr, hop2)
         else:
-            return r_controlled_instance.rtypedelegate(self.setattr, hop)
+            return rtypedelegate(self.setattr, hop)
 
     def ctrl_setitem(self, s_obj, s_key, s_value):
         if s_is_box(s_value):
@@ -85,12 +86,12 @@
                                             s_obj, s_key, s_value)
 
     def rtype_setitem(self, hop):
-        r_controlled_instance = hop.args_r[0]
+        from pypy.rpython.rcontrollerentry import rtypedelegate
         if s_is_box(hop.args_s[2]):
             hop2 = revealbox(hop, 2)
-            return r_controlled_instance.rtypedelegate(self.setboxitem, hop2)
+            return rtypedelegate(self.setboxitem, hop2)
         else:
-            return r_controlled_instance.rtypedelegate(self.setitem, hop)
+            return rtypedelegate(self.setitem, hop)
 
 
 class CTypesCallEntry(ControllerEntry):
@@ -140,7 +141,8 @@
             return s_result
 
         def specialize_call(self, hop):
-            import pdb; pdb.set_trace()
+            from pypy.rpython.rcontrollerentry import rtypedelegate
+            return rtypedelegate(controllingfn, hop, revealargs, revealresult)
 
 # ____________________________________________________________
 #

Modified: pypy/dist/pypy/rlib/rctypes/rstruct.py
==============================================================================
--- pypy/dist/pypy/rlib/rctypes/rstruct.py	(original)
+++ pypy/dist/pypy/rlib/rctypes/rstruct.py	Thu Dec 28 11:40:40 2006
@@ -18,9 +18,9 @@
         fields = []
         for name, field_ctype in ctype._fields_:
             controller = getcontroller(field_ctype)
+            setattr(self, 'fieldcontroller_' + name, controller)
             controllers.append((name, controller))
             fields.append((name, controller.knowntype))
-        self.fieldcontrollers = dict(controllers)
         external = getattr(ctype, '_external_', False)
         self.knowntype = rctypesobject.RStruct(ctype.__name__, fields,
                                                c_external = external)
@@ -29,7 +29,7 @@
         # is unrolled
         unrolled_controllers = unrolling_iterable(controllers)
 
-        def new(*args):
+        def structnew(*args):
             obj = self.knowntype.allocate()
             if len(args) > len(fields):
                 raise ValueError("too many arguments for this structure")
@@ -41,20 +41,23 @@
                     controller.set_value(itemobj, value)
             return obj
 
-        self.new = new
+        self.new = structnew
 
+        # Build custom getter and setter methods
+        def structgetattr(obj, attr):
+            controller = getattr(self, 'fieldcontroller_' + attr)
+            itemobj = getattr(obj, 'ref_' + attr)()
+            return controller.return_value(itemobj)
+        structgetattr._annspecialcase_ = 'specialize:arg(1)'
+
+        def structsetattr(obj, attr, value):
+            controller = getattr(self, 'fieldcontroller_' + attr)
+            itemobj = getattr(obj, 'ref_' + attr)()
+            controller.set_value(itemobj, value)
+        structsetattr._annspecialcase_ = 'specialize:arg(1)'
 
-    def getattr(self, obj, attr):
-        controller = self.fieldcontrollers[attr]
-        itemobj = getattr(obj, 'ref_' + attr)()
-        return controller.return_value(itemobj)
-    getattr._annspecialcase_ = 'specialize:arg(2)'
-
-    def setattr(self, obj, attr, value):
-        controller = self.fieldcontrollers[attr]
-        itemobj = getattr(obj, 'ref_' + attr)()
-        controller.set_value(itemobj, value)
-    setattr._annspecialcase_ = 'specialize:arg(2)'
+        self.getattr = structgetattr
+        self.setattr = structsetattr
 
 
 StructCTypeController.register_for_metatype(StructType)

Modified: pypy/dist/pypy/rlib/rctypes/test/test_rprimitive.py
==============================================================================
--- pypy/dist/pypy/rlib/rctypes/test/test_rprimitive.py	(original)
+++ pypy/dist/pypy/rlib/rctypes/test/test_rprimitive.py	Thu Dec 28 11:40:40 2006
@@ -232,7 +232,7 @@
             t.view()
             
         
-class INPROGRESS_Test_specialization:
+class Test_specialization:
     def test_specialize_c_int(self):
         def create_c_int():
             x = c_int(42)
@@ -300,6 +300,7 @@
         assert ("%.2f" % res) == ("%.2f" % 4.3)
 
     def test_value_for_various_types(self):
+        py.test.skip("in-progress")
         def func():
             x = c_ushort(5)
             x.value += 1
@@ -329,6 +330,7 @@
         interpret(func, [])
 
     def test_convert_from_llvalue(self):
+        py.test.skip("in-progress")
         def func():
             x = c_ushort(5)
             pointer(x)[0] += 1
@@ -358,6 +360,7 @@
         interpret(func, [])
 
     def test_truth_value(self):
+        py.test.skip("in-progress")
         bigzero = r_ulonglong(0)
         big = r_ulonglong(2L**42)
         def func(n, z):

Modified: pypy/dist/pypy/rpython/controllerentry.py
==============================================================================
--- pypy/dist/pypy/rpython/controllerentry.py	(original)
+++ pypy/dist/pypy/rpython/controllerentry.py	Thu Dec 28 11:40:40 2006
@@ -43,10 +43,8 @@
         return SomeControlledInstance(s_real_obj, controller=self)
 
     def rtype_new(self, hop):
-        r_controlled_instance = hop.r_result
-        return r_controlled_instance.rtypedelegate(self.new, hop,
-                                                   revealargs=[],
-                                                   revealresult=True)
+        from pypy.rpython.rcontrollerentry import rtypedelegate
+        return rtypedelegate(self.new, hop, revealargs=[], revealresult=True)
 
     def getattr(self, obj, attr):
         return getattr(self, 'get_' + attr)(obj)
@@ -56,8 +54,8 @@
         return delegate(self.getattr, s_obj, s_attr)
 
     def rtype_getattr(self, hop):
-        r_controlled_instance = hop.args_r[0]
-        return r_controlled_instance.rtypedelegate(self.getattr, hop)
+        from pypy.rpython.rcontrollerentry import rtypedelegate
+        return rtypedelegate(self.getattr, hop)
 
     def setattr(self, obj, attr, value):
         return getattr(self, 'set_' + attr)(obj, value)
@@ -67,22 +65,22 @@
         return delegate(self.setattr, s_obj, s_attr, s_value)
 
     def rtype_setattr(self, hop):
-        r_controlled_instance = hop.args_r[0]
-        return r_controlled_instance.rtypedelegate(self.setattr, hop)
+        from pypy.rpython.rcontrollerentry import rtypedelegate
+        return rtypedelegate(self.setattr, hop)
 
     def ctrl_getitem(self, s_obj, s_key):
         return delegate(self.getitem, s_obj, s_key)
 
     def rtype_getitem(self, hop):
-        r_controlled_instance = hop.args_r[0]
-        return r_controlled_instance.rtypedelegate(self.getitem, hop)
+        from pypy.rpython.rcontrollerentry import rtypedelegate
+        return rtypedelegate(self.getitem, hop)
 
     def ctrl_setitem(self, s_obj, s_key, s_value):
         return delegate(self.setitem, s_obj, s_key, s_value)
 
     def rtype_setitem(self, hop):
-        r_controlled_instance = hop.args_r[0]
-        return r_controlled_instance.rtypedelegate(self.setitem, hop)
+        from pypy.rpython.rcontrollerentry import rtypedelegate
+        return rtypedelegate(self.setitem, hop)
 
 
 def delegate(boundmethod, *args_s):

Modified: pypy/dist/pypy/rpython/rcontrollerentry.py
==============================================================================
--- pypy/dist/pypy/rpython/rcontrollerentry.py	(original)
+++ pypy/dist/pypy/rpython/rcontrollerentry.py	Thu Dec 28 11:40:40 2006
@@ -17,30 +17,6 @@
         real_value = self.controller.convert(value)
         return self.r_real_obj.convert_const(real_value)
 
-    def rtypedelegate(self, boundmethod, hop,
-                      revealargs=[0], revealresult=False):
-        bk = self.rtyper.annotator.bookkeeper
-        c_meth = Constant(boundmethod)
-        s_meth = bk.immutablevalue(boundmethod)
-        hop2 = hop.copy()
-        for index in revealargs:
-            s_new, r_new = self.reveal(hop2.args_r[index])
-            hop2.args_s[index], hop2.args_r[index] = s_new, r_new
-            v = hop2.args_v[index]
-            if isinstance(v, Constant):
-                real_value = self.controller.convert(v.value)
-                hop2.args_v[index] = Constant(real_value)
-        if revealresult:
-            hop2.s_result, hop2.r_result = self.reveal(hop2.r_result)
-        hop2.v_s_insertfirstarg(c_meth, s_meth)
-        hop2.forced_opname = 'simple_call'
-        return hop2.dispatch()
-
-    def reveal(self, r):
-        if r is not self:
-            raise TyperError("expected %r, got %r" % (self, r))
-        return self.s_real_obj, self.r_real_obj
-
     def rtype_getattr(self, hop):
         return self.controller.rtype_getattr(hop)
 
@@ -55,3 +31,31 @@
 
     def rtype_setitem((r_controlled, r_key), hop):
         return r_controlled.controller.rtype_setitem(hop)
+
+
+def rtypedelegate(callable, hop, revealargs=[0], revealresult=False):
+    bk = hop.rtyper.annotator.bookkeeper
+    c_meth = Constant(callable)
+    s_meth = bk.immutablevalue(callable)
+    hop2 = hop.copy()
+    for index in revealargs:
+        r_controlled = hop2.args_r[index]
+        if not isinstance(r_controlled, ControlledInstanceRepr):
+            raise TyperError("args_r[%d] = %r, expected ControlledInstanceRepr"
+                             % (index, r_controlled))
+        s_new, r_new = r_controlled.s_real_obj, r_controlled.r_real_obj
+        hop2.args_s[index], hop2.args_r[index] = s_new, r_new
+        v = hop2.args_v[index]
+        if isinstance(v, Constant):
+            real_value = r_controlled.controller.convert(v.value)
+            hop2.args_v[index] = Constant(real_value)
+    if revealresult:
+        r_controlled = hop2.r_result
+        if not isinstance(r_controlled, ControlledInstanceRepr):
+            raise TyperError("r_result = %r, expected ControlledInstanceRepr"
+                             % (r_controlled,))
+        s_new, r_new = r_controlled.s_real_obj, r_controlled.r_real_obj
+        hop2.s_result, hop2.r_result = s_new, r_new
+    hop2.v_s_insertfirstarg(c_meth, s_meth)
+    hop2.forced_opname = 'simple_call'
+    return hop2.dispatch()



More information about the Pypy-commit mailing list