[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