Author: Matti Picus <matti.pi...@gmail.com>
Branch: cpyext-obj-stealing
Changeset: r91158:168652ad5d5c
Date: 2017-05-01 07:35 +0300
http://bitbucket.org/pypy/pypy/changeset/168652ad5d5c/

Log:    merge default into branch

diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -30,3 +30,7 @@
 large constants is reused across instructions.
 
 .. branch: vmprof-0.4.4
+
+.. branch: controller-refactor
+
+Refactor rpython.rtyper.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,10 @@
+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.rlib.objectmodel import specialize
+from rpython.rtyper.rmodel import Repr
 from rpython.rtyper.extregistry import ExtRegistryEntry
 from rpython.rtyper.annlowlevel import cachedtype
 from rpython.rtyper.error import TyperError
@@ -10,7 +14,14 @@
 
     def compute_result_annotation(self, *args_s, **kwds_s):
         controller = self.getcontroller(*args_s, **kwds_s)
-        return controller.ctrl_new_ex(self.bookkeeper, *args_s, **kwds_s)
+        if kwds_s:
+            raise TypeError("cannot handle keyword arguments in %s" % (
+                self.new,))
+        s_real_obj = delegate(controller.new, *args_s)
+        if s_real_obj == annmodel.s_ImpossibleValue:
+            return annmodel.s_ImpossibleValue
+        else:
+            return SomeControlledInstance(s_real_obj, controller)
 
     def getcontroller(self, *args_s, **kwds_s):
         return self._controller_()
@@ -19,9 +30,10 @@
         if hop.s_result == annmodel.s_ImpossibleValue:
             raise TyperError("object creation always raises: %s" % (
                 hop.spaceop,))
+        assert not kwds_i
         controller = hop.s_result.controller
-        return controller.rtype_new(hop, **kwds_i)
-
+        return rtypedelegate(controller.new, hop, revealargs=[],
+            revealresult=True)
 
 
 def controlled_instance_box(controller, obj):
@@ -53,91 +65,25 @@
     def _freeze_(self):
         return True
 
+    @specialize.arg(0)
     def box(self, obj):
         return controlled_instance_box(self, obj)
-    box._annspecialcase_ = 'specialize:arg(0)'
 
+    @specialize.arg(0)
     def unbox(self, obj):
         return controlled_instance_unbox(self, obj)
-    unbox._annspecialcase_ = 'specialize:arg(0)'
 
+    @specialize.arg(0)
     def is_box(self, obj):
         return controlled_instance_is_box(self, obj)
-    is_box._annspecialcase_ = 'specialize:arg(0)'
 
-    def ctrl_new(self, *args_s, **kwds_s):
-        if kwds_s:
-            raise TypeError("cannot handle keyword arguments in %s" % (
-                self.new,))
-        s_real_obj = delegate(self.new, *args_s)
-        if s_real_obj == annmodel.s_ImpossibleValue:
-            return annmodel.s_ImpossibleValue
-        else:
-            return SomeControlledInstance(s_real_obj, controller=self)
-
-    def ctrl_new_ex(self, bookkeeper, *args_s, **kwds_s):
-        return self.ctrl_new(*args_s, **kwds_s)
-
-    def rtype_new(self, hop):
-        from rpython.rtyper.rcontrollerentry import rtypedelegate
-        return rtypedelegate(self.new, hop, revealargs=[], revealresult=True)
-
+    @specialize.arg(0, 2)
     def getattr(self, obj, attr):
         return getattr(self, 'get_' + attr)(obj)
-    getattr._annspecialcase_ = 'specialize:arg(0, 2)'
 
-    def ctrl_getattr(self, s_obj, s_attr):
-        return delegate(self.getattr, s_obj, s_attr)
-
-    def rtype_getattr(self, hop):
-        from rpython.rtyper.rcontrollerentry import rtypedelegate
-        return rtypedelegate(self.getattr, hop)
-
+    @specialize.arg(0, 2)
     def setattr(self, obj, attr, value):
         return getattr(self, 'set_' + attr)(obj, value)
-    setattr._annspecialcase_ = 'specialize:arg(0, 2)'
-
-    def ctrl_setattr(self, s_obj, s_attr, s_value):
-        return delegate(self.setattr, s_obj, s_attr, s_value)
-
-    def rtype_setattr(self, hop):
-        from rpython.rtyper.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):
-        from rpython.rtyper.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):
-        from rpython.rtyper.rcontrollerentry import rtypedelegate
-        return rtypedelegate(self.setitem, hop)
-
-    def ctrl_delitem(self, s_obj, s_key):
-        return delegate(self.delitem, s_obj, s_key)
-
-    def rtype_delitem(self, hop):
-        from rpython.rtyper.rcontrollerentry import rtypedelegate
-        return rtypedelegate(self.delitem, hop)
-
-    def ctrl_bool(self, s_obj):
-        return delegate(self.bool, s_obj)
-
-    def rtype_bool(self, hop):
-        from rpython.rtyper.rcontrollerentry import rtypedelegate
-        return rtypedelegate(self.bool, hop)
-
-    def ctrl_call(self, s_obj, *args_s):
-        return delegate(self.call, s_obj, *args_s)
-
-    def rtype_call(self, hop):
-        from rpython.rtyper.rcontrollerentry import rtypedelegate
-        return rtypedelegate(self.call, hop)
 
 
 def delegate(boundmethod, *args_s):
@@ -158,7 +104,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,))
@@ -176,7 +121,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],))
@@ -219,41 +163,40 @@
         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):
         real_key = self.s_real_obj.rtyper_makekey()
         return self.__class__, real_key, self.controller
 
+    def getattr(self, s_attr):
+        assert s_attr.is_constant()
+        ctrl = self.controller
+        return delegate(ctrl.getattr, self.s_real_obj, s_attr)
 
-class __extend__(SomeControlledInstance):
+    def setattr(self, s_attr, s_value):
+        assert s_attr.is_constant()
+        ctrl = self.controller
+        return delegate(ctrl.setattr, self.s_real_obj, s_attr, s_value)
 
-    def getattr(s_cin, s_attr):
-        assert s_attr.is_constant()
-        return s_cin.controller.ctrl_getattr(s_cin.s_real_obj, s_attr)
+    def bool(self):
+        ctrl = self.controller
+        return delegate(ctrl.bool, self.s_real_obj)
 
-    def setattr(s_cin, s_attr, s_value):
-        assert s_attr.is_constant()
-        s_cin.controller.ctrl_setattr(s_cin.s_real_obj, s_attr, s_value)
-
-    def bool(s_cin):
-        return s_cin.controller.ctrl_is_true(s_cin.s_real_obj)
-
-    def simple_call(s_cin, *args_s):
-        return s_cin.controller.ctrl_call(s_cin.s_real_obj, *args_s)
+    def simple_call(self, *args_s):
+        return delegate(self.controller.call, self.s_real_obj, *args_s)
 
 
 class __extend__(pairtype(SomeControlledInstance, annmodel.SomeObject)):
 
     def getitem((s_cin, s_key)):
-        return s_cin.controller.ctrl_getitem(s_cin.s_real_obj, s_key)
+        return delegate(s_cin.controller.getitem, s_cin.s_real_obj, s_key)
 
     def setitem((s_cin, s_key), s_value):
-        s_cin.controller.ctrl_setitem(s_cin.s_real_obj, s_key, s_value)
+        delegate(s_cin.controller.setitem, s_cin.s_real_obj, s_key, s_value)
 
     def delitem((s_cin, s_key)):
-        s_cin.controller.ctrl_delitem(s_cin.s_real_obj, s_key)
+        delegate(s_cin.controller.delitem, s_cin.s_real_obj, s_key)
 
 
 class __extend__(pairtype(SomeControlledInstance, SomeControlledInstance)):
@@ -264,3 +207,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 self.controller.rtype_getattr(hop)
-
-    def rtype_setattr(self, hop):
-        return self.controller.rtype_setattr(hop)
-
-    def rtype_bool(self, hop):
-        return self.controller.rtype_bool(hop)
-
-    def rtype_simple_call(self, hop):
-        return self.controller.rtype_call(hop)
-
-
-class __extend__(pairtype(ControlledInstanceRepr, Repr)):
-
-    def rtype_getitem((r_controlled, r_key), hop):
-        return r_controlled.controller.rtype_getitem(hop)
-
-    def rtype_setitem((r_controlled, r_key), hop):
-        return r_controlled.controller.rtype_setitem(hop)
-
-    def rtype_delitem((r_controlled, r_key), hop):
-        return r_controlled.controller.rtype_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()
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to