[pypy-svn] r25314 - in pypy/dist/pypy: annotation rpython/rctypes rpython/rctypes/test

arigo at codespeak.net arigo at codespeak.net
Tue Apr 4 19:15:48 CEST 2006


Author: arigo
Date: Tue Apr  4 19:15:47 2006
New Revision: 25314

Modified:
   pypy/dist/pypy/annotation/binaryop.py
   pypy/dist/pypy/rpython/rctypes/rarray.py
   pypy/dist/pypy/rpython/rctypes/rmodel.py
   pypy/dist/pypy/rpython/rctypes/rpointer.py
   pypy/dist/pypy/rpython/rctypes/rprimitive.py
   pypy/dist/pypy/rpython/rctypes/test/test_rarray.py
   pypy/dist/pypy/rpython/rctypes/test/test_rpointer.py
Log:
(arre, arigo)

Some refactoring.  Added a (skipped) test and started to work on it.



Modified: pypy/dist/pypy/annotation/binaryop.py
==============================================================================
--- pypy/dist/pypy/annotation/binaryop.py	(original)
+++ pypy/dist/pypy/annotation/binaryop.py	Tue Apr  4 19:15:47 2006
@@ -774,7 +774,7 @@
         else:
             return SomeCTypesObject(
                 s_cto.knowntype._type_,
-                memorystate=s_cto.memorystate)
+                memorystate=SomeCTypesObject.MEMORYALIAS)
 
 class __extend__(pairtype(SomeCTypesObject, SomeSlice)):
     def setitem((s_cto, s_slice), s_iterable):

Modified: pypy/dist/pypy/rpython/rctypes/rarray.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/rarray.py	(original)
+++ pypy/dist/pypy/rpython/rctypes/rarray.py	Tue Apr  4 19:15:47 2006
@@ -16,10 +16,9 @@
         item_ctype = array_ctype._type_
         self.length = array_ctype._length_
         
-        # Find the low-level repr of items using the extregistry
-        item_entry = extregistry.lookup_type(item_ctype)
-        self.r_item = item_entry.get_repr(rtyper, SomeCTypesObject(item_ctype,
-                                            SomeCTypesObject.OWNSMEMORY))
+        # Find the repr and low-level type of items from their ctype
+        self.r_item = rtyper.getrepr(SomeCTypesObject(item_ctype,
+                                            SomeCTypesObject.MEMORYALIAS))
 
         # Here, self.c_data_type == self.ll_type
         c_data_type = lltype.Array(self.r_item.ll_type,

Modified: pypy/dist/pypy/rpython/rctypes/rmodel.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/rmodel.py	(original)
+++ pypy/dist/pypy/rpython/rctypes/rmodel.py	Tue Apr  4 19:15:47 2006
@@ -111,6 +111,14 @@
             llops.genop('setfield', inputargs)
         return v_box
 
+    def return_c_data(self, llops, v_c_data):
+        """Turn a raw C pointer to the data into a memory-alias box.
+        Used when the data is returned from an operation or C function call.
+        Special-cased in PrimitiveRepr.
+        """
+        # XXX add v_c_data_owner
+        return self.allocate_instance_ref(llops, v_c_data)
+
 
 class __extend__(pairtype(CTypesRepr, CTypesRepr)):
 
@@ -142,15 +150,21 @@
         return lltype.Struct('C_Data_%s' % (self.ctype.__name__,),
                              ('value', ll_type) )
 
-    def setvalue(self, llops, v_box, v_value):
-        """Writes to the 'value' field of the raw data."""
-        v_c_data = self.get_c_data(llops, v_box)
+    def getvalue_from_c_data(self, llops, v_c_data):
+        cname = inputconst(lltype.Void, 'value')
+        return llops.genop('getfield', [v_c_data, cname],
+                resulttype=self.ll_type)
+
+    def setvalue_inside_c_data(self, llops, v_c_data, v_value):
         cname = inputconst(lltype.Void, 'value')
         llops.genop('setfield', [v_c_data, cname, v_value])
 
     def getvalue(self, llops, v_box):
         """Reads from the 'value' field of the raw data."""
         v_c_data = self.get_c_data(llops, v_box)
-        cname = inputconst(lltype.Void, 'value')
-        return llops.genop('getfield', [v_c_data, cname],
-                resulttype=self.ll_type)
+        return self.getvalue_from_c_data(llops, v_c_data)
+
+    def setvalue(self, llops, v_box, v_value):
+        """Writes to the 'value' field of the raw data."""
+        v_c_data = self.get_c_data(llops, v_box)
+        self.setvalue_inside_c_data(llops, v_c_data, v_value)

Modified: pypy/dist/pypy/rpython/rctypes/rpointer.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/rpointer.py	(original)
+++ pypy/dist/pypy/rpython/rctypes/rpointer.py	Tue Apr  4 19:15:47 2006
@@ -1,17 +1,21 @@
-from pypy.rpython.rmodel import Repr, inputconst
+from pypy.rpython.rmodel import Repr, IntegerRepr, inputconst
 from pypy.rpython import extregistry
 from pypy.rpython.lltypesystem import lltype
 from pypy.annotation import model as annmodel
+from pypy.annotation.pairtype import pairtype
 from pypy.rpython.rctypes.rmodel import CTypesValueRepr
 
 from ctypes import POINTER, pointer, c_int
 
 class PointerRepr(CTypesValueRepr):
-    def __init__(self, rtyper, s_pointer, s_contents):
-        self.s_pointer = s_pointer
-        self.s_contents = s_contents
-        self.ref_ctype = s_contents.knowntype
-        self.r_contents = rtyper.getrepr(s_contents)
+    def __init__(self, rtyper, s_pointer):
+        ptr_ctype = s_pointer.knowntype
+        ref_ctype = ptr_ctype._type_
+
+        # Find the repr and low-level type of the contents from its ctype
+        self.r_contents = rtyper.getrepr(annmodel.SomeCTypesObject(ref_ctype,
+                                     annmodel.SomeCTypesObject.MEMORYALIAS))
+
         ll_contents = lltype.Ptr(self.r_contents.c_data_type)
 
         super(PointerRepr, self).__init__(rtyper, s_pointer, ll_contents)
@@ -30,8 +34,30 @@
         assert s_attr.is_constant()
         assert s_attr.const == 'contents'
         v_ptr = hop.inputarg(self, 0)
-        v_value = self.getvalue(hop.llops, v_ptr)
-        return self.r_contents.allocate_instance_ref(hop.llops, v_value)
+        v_c_ptr = self.getvalue(hop.llops, v_ptr)
+        return self.r_contents.allocate_instance_ref(hop.llops, v_c_ptr)
+
+
+class __extend__(pairtype(PointerRepr, IntegerRepr)):
+
+    def rtype_getitem((r_ptr, _), hop):
+        self = r_ptr
+        v_ptr, v_index = hop.inputargs(self, lltype.Signed)
+        if hop.args_s[1].is_constant() and hop.args_s[1].const == 0:
+            v_c_ptr = self.getvalue(hop. llops, v_ptr)
+            return self.r_contents.return_c_data(hop.llops, v_c_ptr)
+        else:
+            raise NotImplementedError("XXX: pointer[non-zero-index]")
+
+    def rtype_setitem((r_ptr, _), hop):
+        self = r_ptr
+        v_ptr, v_index, v_newvalue = hop.inputargs(self, lltype.Signed, XXX)
+                                                   
+        if hop.args_s[1].is_constant() and hop.args_s[1].const == 0:
+            v_c_ptr = self.getvalue(hop. llops, v_ptr)
+            XXX
+        else:
+            raise NotImplementedError("XXX: pointer[non-zero-index] = value")
 
 #def registerPointerType(ptrtype):
 #    """Adds a new pointer type to the extregistry.
@@ -138,8 +164,7 @@
                                      annmodel.SomeCTypesObject.MEMORYALIAS)
 
 def pointerinstance_get_repr(rtyper, s_pointer):
-    s_contents = pointerinstance_field_annotation(s_pointer, "contents")
-    return PointerRepr(rtyper, s_pointer, s_contents)
+    return PointerRepr(rtyper, s_pointer)
 
 PointerType = type(POINTER(c_int))
 extregistry.register_type(PointerType,

Modified: pypy/dist/pypy/rpython/rctypes/rprimitive.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/rprimitive.py	(original)
+++ pypy/dist/pypy/rpython/rctypes/rprimitive.py	Tue Apr  4 19:15:47 2006
@@ -27,6 +27,12 @@
 
 class PrimitiveRepr(CTypesValueRepr):
 
+    def return_c_data(self, llops, v_c_data):
+        """Read out the atomic data from a raw C pointer.
+        Used when the data is returned from an operation or C function call.
+        """
+        return self.getvalue_from_c_data(llops, v_c_data)
+
     def convert_const(self, ctype_value):
         assert isinstance(ctype_value, self.ctype)
         key = id(ctype_value)

Modified: pypy/dist/pypy/rpython/rctypes/test/test_rarray.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/test/test_rarray.py	(original)
+++ pypy/dist/pypy/rpython/rctypes/test/test_rarray.py	Tue Apr  4 19:15:47 2006
@@ -49,26 +49,6 @@
         if conftest.option.view:
             t.view()
 
-    def test_annotate_pointer_access_as_array(self):
-        """
-        Make sure that pointers work the same way as arrays.
-        """
-        def access_array():
-            # Never run this function!
-            my_pointer = pointer(c_int(10))
-            my_pointer[0] = c_int(1)
-            my_pointer[1] = 2    # <== because of this
-
-            return my_pointer[0]
-
-        t = TranslationContext()
-        a = t.buildannotator()
-        s = a.build_types(access_array, [])
-        assert s.knowntype == int
-
-        if conftest.option.view:
-            t.view()
-
     def x_test_annotate_array_slice_access(self):
         def slice_access():
             my_array = c_int_10()

Modified: pypy/dist/pypy/rpython/rctypes/test/test_rpointer.py
==============================================================================
--- pypy/dist/pypy/rpython/rctypes/test/test_rpointer.py	(original)
+++ pypy/dist/pypy/rpython/rctypes/test/test_rpointer.py	Tue Apr  4 19:15:47 2006
@@ -63,6 +63,26 @@
 
         assert s.knowntype == int
 
+    def test_annotate_pointer_access_as_array(self):
+        """
+        Make sure that pointers work the same way as arrays.
+        """
+        def access_array():
+            # Never run this function!
+            my_pointer = pointer(c_int(10))
+            my_pointer[0] = c_int(1)
+            my_pointer[1] = 2    # <== because of this
+
+            return my_pointer[0]
+
+        t = TranslationContext()
+        a = t.buildannotator()
+        s = a.build_types(access_array, [])
+        assert s.knowntype == int
+
+        if conftest.option.view:
+            t.view()
+
 
 class Test_specialization:
     def test_specialize_c_int_ptr(self):
@@ -134,3 +154,21 @@
         assert func() == 123
         res = interpret(func, [])
         assert res == 123
+
+    def test_specialize_pointer_access_as_array(self):
+        """
+        Make sure that pointers work the same way as arrays.
+        """
+        py.test.skip("in-progress")
+        def access_array():
+            my_pointer = pointer(c_int(11))
+            x = my_pointer[0]
+            my_pointer[0] = c_int(7)
+            y = my_pointer[0]
+            my_pointer[0] = 5
+            z = my_pointer.contents.value
+            return x * y * z
+
+        assert access_array() == 5 * 7 * 11
+        res = interpret(access_array, [])
+        assert res == 5 * 7 * 11



More information about the Pypy-commit mailing list