[pypy-commit] pypy cpyext-injection: try to rpythonize the whole mess

fijal pypy.commits at gmail.com
Wed Oct 26 09:36:10 EDT 2016


Author: fijal
Branch: cpyext-injection
Changeset: r87936:2bbc5adbc7a4
Date: 2016-10-26 15:35 +0200
http://bitbucket.org/pypy/pypy/changeset/2bbc5adbc7a4/

Log:	try to rpythonize the whole mess

diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py
--- a/pypy/interpreter/typedef.py
+++ b/pypy/interpreter/typedef.py
@@ -7,19 +7,24 @@
      WrappedDefault)
 
 from rpython.rlib.jit import promote
-from rpython.rlib.objectmodel import compute_identity_hash, specialize
+from rpython.rlib.objectmodel import compute_identity_hash, specialize,\
+     we_are_translated
 from rpython.tool.sourcetools import compile2, func_with_new_name
 
+class TypeContainer(object):
+    _immutable_fields_ = ['w_value?']
+
+    def __init__(self):
+        self.w_value = None
 
 class TypeDef(object):
-    _immutable_fields_ = ["w_type_injected?"]
 
     def __init__(self, __name, __base=None, __total_ordering__=None,
                  __buffer=None, **rawdict):
         "NOT_RPYTHON: initialization-time only"
         self.name = __name
         self.injected_type = False
-        self.w_type_injected = None
+        self.type_injected_container = None
         if __base is None:
             bases = []
         elif isinstance(__base, tuple):
@@ -54,6 +59,16 @@
                 value.name = key
         self.rawdict.update(rawdict)
 
+    def set_injected_type(self, w_type):
+        if self.type_injected_container is None and not we_are_translated():
+            self.type_injected_container = TypeContainer()
+        self.type_injected_container.w_value = w_type
+
+    def get_injected_type(self):
+        if self.type_injected_container is None:
+            return None
+        return self.type_injected_container.w_value
+
     def auto_total_ordering(self):
         assert '__lt__' in self.rawdict, "__total_ordering='auto' requires __lt__"
         assert '__eq__' in self.rawdict, "__total_ordering='auto' requires __eq__"
@@ -64,6 +79,8 @@
 
     def _freeze_(self):
         # hint for the annotator: track individual constant instances of TypeDef
+        if self.injected_type:
+            self.type_injected_container = TypeContainer()
         return True
 
     def __repr__(self):
diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py
--- a/pypy/module/cpyext/typeobject.py
+++ b/pypy/module/cpyext/typeobject.py
@@ -467,7 +467,7 @@
         newtypedef = inject_operators(space, name, dict_w, pto)
         if newtypedef is not None:
             assert newtypedef.injected_type
-            newtypedef.w_type_injected = self
+            newtypedef.set_injected_type(self)
         new_layout = (pto.c_tp_basicsize > rffi.sizeof(PyObject.TO) or
                       pto.c_tp_itemsize > 0 or newtypedef is not None)
 
diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py
--- a/pypy/objspace/std/objspace.py
+++ b/pypy/objspace/std/objspace.py
@@ -127,9 +127,10 @@
         # unique-for-this-space W_TypeObject instance
         assert typedef is not None
         if typedef.injected_type:
-            assert typedef.w_type_injected is not None
-            assert typedef.w_type_injected.space is self
-            return typedef.w_type_injected
+            w_type_injected = typedef.get_injected_type()
+            assert w_type_injected is not None
+            assert w_type_injected.space is self
+            return w_type_injected
         return self.fromcache(TypeCache).getorbuild(typedef)
 
     @specialize.argtype(1)


More information about the pypy-commit mailing list