[pypy-commit] pypy controller-refactor: Merge rcontrollerentry into controllerentry
rlamy
pypy.commits at gmail.com
Wed Dec 7 19:23:02 EST 2016
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: controller-refactor
Changeset: r88963:68adf38ffa01
Date: 2016-12-08 00:21 +0000
http://bitbucket.org/pypy/pypy/changeset/68adf38ffa01/
Log: Merge rcontrollerentry into controllerentry
diff --git a/rpython/rtyper/controllerentry.py b/rpython/rtyper/controllerentry.py
--- a/rpython/rtyper/controllerentry.py
+++ b/rpython/rtyper/controllerentry.py
@@ -1,6 +1,9 @@
+from rpython.flowspace.model import Constant
+from rpython.flowspace.operation import op
from rpython.annotator import model as annmodel
from rpython.tool.pairtype import pairtype
from rpython.annotator.bookkeeper import getbookkeeper
+from rpython.rtyper.rmodel import Repr
from rpython.rtyper.extregistry import ExtRegistryEntry
from rpython.rtyper.annlowlevel import cachedtype
from rpython.rtyper.error import TyperError
@@ -23,7 +26,6 @@
return self._controller_()
def specialize_call(self, hop, **kwds_i):
- from rpython.rtyper.rcontrollerentry import rtypedelegate
if hop.s_result == annmodel.s_ImpossibleValue:
raise TyperError("object creation always raises: %s" % (
hop.spaceop,))
@@ -101,7 +103,6 @@
return SomeControlledInstance(s_real_obj, controller=controller)
def specialize_call(self, hop):
- from rpython.rtyper.rcontrollerentry import ControlledInstanceRepr
if not isinstance(hop.r_result, ControlledInstanceRepr):
raise TyperError("box() should return ControlledInstanceRepr,\n"
"got %r" % (hop.r_result,))
@@ -119,7 +120,6 @@
return s_obj.s_real_obj
def specialize_call(self, hop):
- from rpython.rtyper.rcontrollerentry import ControlledInstanceRepr
if not isinstance(hop.args_r[1], ControlledInstanceRepr):
raise TyperError("unbox() should take a ControlledInstanceRepr,\n"
"got %r" % (hop.args_r[1],))
@@ -162,7 +162,6 @@
return SomeControlledInstance(self.s_real_obj, self.controller)
def rtyper_makerepr(self, rtyper):
- from rpython.rtyper.rcontrollerentry import ControlledInstanceRepr
return ControlledInstanceRepr(rtyper, self.s_real_obj, self.controller)
def rtyper_makekey(self):
@@ -207,3 +206,75 @@
return SomeControlledInstance(annmodel.unionof(s_cin1.s_real_obj,
s_cin2.s_real_obj),
s_cin1.controller)
+
+class ControlledInstanceRepr(Repr):
+
+ def __init__(self, rtyper, s_real_obj, controller):
+ self.rtyper = rtyper
+ self.s_real_obj = s_real_obj
+ self.r_real_obj = rtyper.getrepr(s_real_obj)
+ self.controller = controller
+ self.lowleveltype = self.r_real_obj.lowleveltype
+
+ def convert_const(self, value):
+ real_value = self.controller.convert(value)
+ return self.r_real_obj.convert_const(real_value)
+
+ 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 rtypedelegate(self.controller.getattr, hop)
+
+ def rtype_setattr(self, hop):
+ return rtypedelegate(self.controller.setattr, hop)
+
+ def rtype_bool(self, hop):
+ return rtypedelegate(self.controller.bool, hop)
+
+ def rtype_simple_call(self, hop):
+ return rtypedelegate(self.controller.call, hop)
+
+
+class __extend__(pairtype(ControlledInstanceRepr, Repr)):
+
+ def rtype_getitem((r_controlled, r_key), hop):
+ return rtypedelegate(r_controlled.controller.getitem, hop)
+
+ def rtype_setitem((r_controlled, r_key), hop):
+ return rtypedelegate(r_controlled.controller.setitem, hop)
+
+ def rtype_delitem((r_controlled, r_key), hop):
+ return rtypedelegate(r_controlled.controller.delitem, 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)
+ spaceop = op.simple_call(*hop2.args_v)
+ spaceop.result = hop2.spaceop.result
+ hop2.spaceop = spaceop
+ return hop2.dispatch()
diff --git a/rpython/rtyper/rcontrollerentry.py b/rpython/rtyper/rcontrollerentry.py
deleted file mode 100644
--- a/rpython/rtyper/rcontrollerentry.py
+++ /dev/null
@@ -1,78 +0,0 @@
-from rpython.flowspace.model import Constant
-from rpython.flowspace.operation import op
-from rpython.rtyper.error import TyperError
-from rpython.rtyper.rmodel import Repr
-from rpython.tool.pairtype import pairtype
-
-
-class ControlledInstanceRepr(Repr):
-
- def __init__(self, rtyper, s_real_obj, controller):
- self.rtyper = rtyper
- self.s_real_obj = s_real_obj
- self.r_real_obj = rtyper.getrepr(s_real_obj)
- self.controller = controller
- self.lowleveltype = self.r_real_obj.lowleveltype
-
- def convert_const(self, value):
- real_value = self.controller.convert(value)
- return self.r_real_obj.convert_const(real_value)
-
- 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 rtypedelegate(self.controller.getattr, hop)
-
- def rtype_setattr(self, hop):
- return rtypedelegate(self.controller.setattr, hop)
-
- def rtype_bool(self, hop):
- return rtypedelegate(self.controller.bool, hop)
-
- def rtype_simple_call(self, hop):
- return rtypedelegate(self.controller.call, hop)
-
-
-class __extend__(pairtype(ControlledInstanceRepr, Repr)):
-
- def rtype_getitem((r_controlled, r_key), hop):
- return rtypedelegate(r_controlled.controller.getitem, hop)
-
- def rtype_setitem((r_controlled, r_key), hop):
- return rtypedelegate(r_controlled.controller.setitem, hop)
-
- def rtype_delitem((r_controlled, r_key), hop):
- return rtypedelegate(r_controlled.controller.delitem, 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)
- spaceop = op.simple_call(*hop2.args_v)
- spaceop.result = hop2.spaceop.result
- hop2.spaceop = spaceop
- return hop2.dispatch()
More information about the pypy-commit
mailing list