[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