[pypy-svn] r13146 - in pypy/branch/lltype-refactoring: annotation rpython rpython/test translator/c translator/c/test

pedronis at codespeak.net pedronis at codespeak.net
Tue Jun 7 14:37:54 CEST 2005


Author: pedronis
Date: Tue Jun  7 14:37:39 2005
New Revision: 13146

Modified:
   pypy/branch/lltype-refactoring/annotation/builtin.py
   pypy/branch/lltype-refactoring/rpython/lltype.py
   pypy/branch/lltype-refactoring/rpython/rclass.py
   pypy/branch/lltype-refactoring/rpython/test/test_lltype.py
   pypy/branch/lltype-refactoring/translator/c/database.py
   pypy/branch/lltype-refactoring/translator/c/funcgen.py
   pypy/branch/lltype-refactoring/translator/c/node.py
   pypy/branch/lltype-refactoring/translator/c/test/test_database.py
   pypy/branch/lltype-refactoring/translator/c/wrapper.py
Log:
- removed flags and cast_flags

open issues:

- added _needsgc predicate to _PtrType and _ptr (what rules do we want?)

- what kind of pointers for constants? 



Modified: pypy/branch/lltype-refactoring/annotation/builtin.py
==============================================================================
--- pypy/branch/lltype-refactoring/annotation/builtin.py	(original)
+++ pypy/branch/lltype-refactoring/annotation/builtin.py	Tue Jun  7 14:37:39 2005
@@ -299,12 +299,6 @@
     #print "MALLOC", r
     return r
 
-def cast_flags(PtrT, s_p):
-    #print "CAST", s_p
-    assert isinstance(s_p, SomePtr), "casting of non-pointer: %r" % s_p
-    assert PtrT.is_constant()
-    return SomePtr(ll_ptrtype=lltype.typeOf(lltype.cast_flags(PtrT.const, s_p.ll_ptrtype._example())))
-
 def cast_parent(PtrT, s_p):
     assert isinstance(s_p, SomePtr), "casting of non-pointer: %r" % s_p
     assert PtrT.is_constant()
@@ -333,7 +327,6 @@
     return r
 
 BUILTIN_ANALYZERS[lltype.malloc] = malloc
-BUILTIN_ANALYZERS[lltype.cast_flags] = cast_flags
 BUILTIN_ANALYZERS[lltype.cast_parent] = cast_parent
 BUILTIN_ANALYZERS[lltype.typeOf] = typeOf
 BUILTIN_ANALYZERS[lltype.nullptr] = nullptr

Modified: pypy/branch/lltype-refactoring/rpython/lltype.py
==============================================================================
--- pypy/branch/lltype-refactoring/rpython/lltype.py	(original)
+++ pypy/branch/lltype-refactoring/rpython/lltype.py	Tue Jun  7 14:37:39 2005
@@ -230,26 +230,20 @@
 class _PtrType(LowLevelType):
     __name__ = property(lambda self: '%sPtr' % self.TO.__name__)
 
-    def __init__(self, TO, **flags):
+    def __init__(self, TO):
         if not isinstance(TO, ContainerType):
             raise TypeError, ("can only point to a Container type, "
                               "not to %s" % (TO,))
-        if 'gc' in flags:
-            if not isinstance(TO, GC_CONTAINER):
-                raise TypeError, ("GcPtr can only point to GcStruct, GcArray or"
-                                  " PyObject, not to %s" % (TO,))
         self.TO = TO
-        self.flags = frozendict(flags)
+
+    def _needsgc(self):
+        return self.TO._gcstatus()
 
     def _str_flags(self):
-        flags = self.flags.keys()
-        flags.sort()
-        result = []
-        for flag in flags:
-            if self.flags[flag] is not True:
-                flag = '%s=%r' % (flag, self.flags[flag])
-            result.append(flag)
-        return ', '.join(result)
+        if self._needsgc():
+            return 'gc'
+        else:
+            return ''
 
     def _str_flavor(self):
         return 'ptr(%s)' % self._str_flags()
@@ -264,20 +258,15 @@
         o = self.TO._container_example()
         return _ptr(self, o, immortal=True)
 
-    def withflags(self, **flags):
-        newflags = self.flags.copy()
-        newflags.update(flags)
-        return _PtrType(self.TO, **newflags)
-
-def GcPtr(TO, **flags):
+def GcPtr(TO):
     if not TO._gcstatus():
         raise TypeError
-    return _PtrType(TO, **flags)
+    return _PtrType(TO)
 
-def NonGcPtr(TO, **flags):
+def NonGcPtr(TO):
     if not (isinstance(TO, FuncType) or not TO._gcstatus()):
         raise TypeError
-    return _PtrType(TO, **flags)
+    return _PtrType(TO)
 
 
 # ____________________________________________________________
@@ -302,40 +291,11 @@
 class InvalidCast(TypeError):
     pass
 
-def cast_flags(PTRTYPE, ptr): # xxx Going away
-    if not isinstance(ptr, _ptr) or not isinstance(PTRTYPE, _PtrType):
-        raise TypeError, "can only cast pointers to other pointers"
-    CURTYPE = ptr._TYPE
-    if CURTYPE.TO != PTRTYPE.TO:
-        raise TypeError, "cast_flags only between pointers to the same type"
-    # allowed direct casts (for others, you need several casts):
-    # * adding one flag
-    curflags = CURTYPE.flags
-    newflags = PTRTYPE.flags
-    if len(curflags) + 1 == len(newflags):
-        for key in curflags:
-            if key not in newflags or curflags[key] != newflags[key]:
-                raise InvalidCast(CURTYPE, PTRTYPE)
-    # * removing one flag
-    elif len(curflags) - 1 == len(newflags):
-        for key in newflags:
-            if key not in curflags or curflags[key] != newflags[key]:
-                raise InvalidCast(CURTYPE, PTRTYPE)
-    # end
-    elif len(curflags) == len(newflags):
-        pass # temporary hack as long as cast flags is around
-    else:
-        raise InvalidCast(CURTYPE, PTRTYPE)
-    return _ptr(PTRTYPE, ptr._obj)
-
 def cast_parent(PTRTYPE, ptr):
     if not isinstance(ptr, _ptr) or not isinstance(PTRTYPE, _PtrType):
         raise TypeError, "can only cast pointers to other pointers"
     CURTYPE = ptr._TYPE
-    if CURTYPE.flags != PTRTYPE.flags:
-        raise TypeError("cast_parent() cannot change the flags (%s) to (%s)"
-                        % (CURTYPE._str_flags(), PTRTYPE._str_flags()))
-    if CURTYPE.TO._gcstatus() != PTRTYPE.TO._gcstatus():
+    if CURTYPE._needsgc() != PTRTYPE._needsgc():
         raise TypeError("cast_parent() cannot change the gc status: %s to %s"
                         % (CURTYPE, PTRTYPE))
     # * converting from TO-structure to a parent TO-structure whose first
@@ -388,6 +348,9 @@
 class _ptr(object):
     _weak = False
 
+    def _needsgc(self):
+        return self._TYPE._needsgc() # xxx other rules?
+
     def __init__(self, TYPE, pointing_to, immortal=False):
         self.__dict__['_TYPE'] = TYPE
         self.__dict__['_T'] = TYPE.TO
@@ -407,7 +370,7 @@
     def __nonzero__(self):
         return self._obj is not None
 
-    def _setobj(self, pointing_to, immortal=False):
+    def _setobj(self, pointing_to, immortal=False):        
         if pointing_to is None:
             obj0 = None
         elif immortal or isinstance(self._T, (GC_CONTAINER, FuncType)):
@@ -416,6 +379,7 @@
         else:
             self.__dict__['_weak'] = True
             obj0 = weakref.ref(pointing_to)
+        self.__dict__['_immortal'] = immortal
         self.__dict__['_obj0'] = obj0
         
     def _getobj(self):
@@ -433,9 +397,7 @@
         if isinstance(self._T, Struct):
             if field_name in self._T._flds:
                 o = getattr(self._obj, field_name)
-                can_have_gc = (field_name == self._T._names[0] and
-                               'gc' in self._TYPE.flags)
-                return _expose(o, can_have_gc)
+                return _expose(o)
         raise AttributeError("%r instance has no field %r" % (self._T,
                                                               field_name))
 

Modified: pypy/branch/lltype-refactoring/rpython/rclass.py
==============================================================================
--- pypy/branch/lltype-refactoring/rpython/rclass.py	(original)
+++ pypy/branch/lltype-refactoring/rpython/rclass.py	Tue Jun  7 14:37:39 2005
@@ -60,8 +60,6 @@
 def cast_vtable_to_typeptr(vtable):
     while typeOf(vtable).TO != OBJECT_VTABLE:
         vtable = vtable.super
-    if typeOf(vtable) != TYPEPTR:
-        vtable = cast_flags(TYPEPTR, vtable)
     return vtable
 
 

Modified: pypy/branch/lltype-refactoring/rpython/test/test_lltype.py
==============================================================================
--- pypy/branch/lltype-refactoring/rpython/test/test_lltype.py	(original)
+++ pypy/branch/lltype-refactoring/rpython/test/test_lltype.py	Tue Jun  7 14:37:39 2005
@@ -122,7 +122,7 @@
     assert isweak(p1.sub1, S2)
     assert isweak(p1.sub2, S2)
     assert isweak(p1.sub1.s3, S3)
-    p2 = cast_flags(NonGcPtr(S2), p1.sub1)
+    p2 = p1.sub1
     assert isweak(p2.s3, S3)
 
 def test_gc_substructure_ptr():
@@ -133,46 +133,12 @@
     assert typeOf(p1.sub1) == GcPtr(S1)
     assert isweak(p1.sub2, S2)
 
-#def test_tagged_pointer():
-#    S1 = GcStruct("s1", ('a', Signed), ('b', Unsigned))
-#    PList = [
-#        GcPtr(S1),
-#        NonGcPtr(S1),
-#        GcPtr(S1, mytag=True),
-#        NonGcPtr(S1, mytag=True),
-#        GcPtr(S1, myothertag=True),
-#        ]
-#    for P1 in PList:
-#        for P2 in PList:
-#            assert (P1 == P2) == (P1 is P2)
-#    assert PList[2] == GcPtr(S1, mytag=True)
-
-#def test_cast_flags():
-#    S1 = GcStruct("s1", ('a', Signed), ('b', Unsigned))
-#    p1 = malloc(S1)
-#    p2 = cast_flags(NonGcPtr(S1), p1)
-#    assert typeOf(p2) == NonGcPtr(S1)
-#    p3 = cast_flags(GcPtr(S1), p2)
-#    assert typeOf(p3) == GcPtr(S1)
-#    assert p1 == p3
-#    py.test.raises(TypeError, "p1 == p2")
-#    py.test.raises(TypeError, "p2 == p3")
-#
-#    PT = GcPtr(S1, mytag=True)
-#    p2 = cast_flags(PT, p1)
-#    assert typeOf(p2) == PT
-#    p3 = cast_flags(GcPtr(S1), p2)
-#    assert typeOf(p3) == GcPtr(S1)
-#    assert p1 == p3
-#    py.test.raises(TypeError, "p1 == p2")
-#    py.test.raises(TypeError, "p2 == p3")
-
 def test_cast_parent():
     S2 = Struct("s2", ('a', Signed))
     S1 = Struct("s1", ('sub1', S2), ('sub2', S2))
     p1 = malloc(S1, immortal=True)
     p2 = p1.sub1
-    p3 = cast_flags(NonGcPtr(S2), p2)
+    p3 = p2
     assert typeOf(p3) == NonGcPtr(S2)
     p4 = cast_parent(NonGcPtr(S1), p3)
     assert typeOf(p4) == NonGcPtr(S1)

Modified: pypy/branch/lltype-refactoring/translator/c/database.py
==============================================================================
--- pypy/branch/lltype-refactoring/translator/c/database.py	(original)
+++ pypy/branch/lltype-refactoring/translator/c/database.py	Tue Jun  7 14:37:39 2005
@@ -103,7 +103,7 @@
                 raise Exception("don't know about %r" % (obj,))
 
     def cincrefstmt(self, expr, T):
-        if isinstance(T, _PtrType) and T.TO._gcstatus():
+        if isinstance(T, _PtrType) and T._needsgc():
             if T.TO == PyObject:
                 return 'Py_XINCREF(%s);' % expr
             else:
@@ -113,7 +113,7 @@
         return ''
 
     def cdecrefstmt(self, expr, T):
-        if isinstance(T, _PtrType) and T.TO._gcstatus():
+        if isinstance(T, _PtrType) and T._needsgc():
             if T.TO == PyObject:
                 return 'Py_XDECREF(%s);' % expr
             else:

Modified: pypy/branch/lltype-refactoring/translator/c/funcgen.py
==============================================================================
--- pypy/branch/lltype-refactoring/translator/c/funcgen.py	(original)
+++ pypy/branch/lltype-refactoring/translator/c/funcgen.py	Tue Jun  7 14:37:39 2005
@@ -7,9 +7,7 @@
 from pypy.rpython.lltype import pyobjectptr, Struct, Array
 
 
-PyObjGcPtr    = GcPtr(PyObject)
-#PyObjNonGcPtr = NonGcPtr(PyObject)
-
+PyObjPtr = GcPtr(PyObject)
 
 class FunctionCodeGenerator:
     """
@@ -41,10 +39,8 @@
         resultvar = self.graph.getreturnvar()
         lltypemap = {resultvar: Void}   # default value, normally overridden
         for v in uniqueitems(result):
-            if isinstance(v, Variable):
-                T = getattr(v, 'concretetype', PyObjGcPtr)
-            else:
-                T = getattr(v, 'concretetype', PyObjGcPtr) # xxx was NonGcPtr, what do we want?
+            # xxx what kind of pointer for constants?
+            T = getattr(v, 'concretetype', PyObjPtr)           
             lltypemap[v] = T
         return lltypemap
 

Modified: pypy/branch/lltype-refactoring/translator/c/node.py
==============================================================================
--- pypy/branch/lltype-refactoring/translator/c/node.py	(original)
+++ pypy/branch/lltype-refactoring/translator/c/node.py	Tue Jun  7 14:37:39 2005
@@ -82,7 +82,7 @@
         STRUCT = self.STRUCT
         for name in STRUCT._names:
             FIELD_T = self.c_struct_field_type(name)
-            if isinstance(FIELD_T, _PtrType) and FIELD_T.TO._gcstatus():
+            if isinstance(FIELD_T, _PtrType) and FIELD_T._needsgc():
                 cname = self.c_struct_field_name(name)
                 line = self.db.cdecrefstmt('%s%s' % (prefix, cname), FIELD_T)
                 if line:

Modified: pypy/branch/lltype-refactoring/translator/c/test/test_database.py
==============================================================================
--- pypy/branch/lltype-refactoring/translator/c/test/test_database.py	(original)
+++ pypy/branch/lltype-refactoring/translator/c/test/test_database.py	Tue Jun  7 14:37:39 2005
@@ -73,7 +73,7 @@
     s.x = malloc(T)
     s.x.y = 42
     s.u.z = -100
-    s.p = cast_flags(NonGcPtr(U), s.u)
+    s.p = s.u
     db.get(s)
     db.complete()
     dump_on_stdout(db)
@@ -105,8 +105,8 @@
     a.y[2].i = 102
     s = malloc(S)
     s.aptr = a
-    s.anitem = cast_flags(NonGcPtr(A.y.OF), a.y[1])
-    s.anarray = cast_flags(NonGcPtr(A.y), a.y)
+    s.anitem =  a.y[1]
+    s.anarray = a.y
     db.get(s)
     db.complete()
     dump_on_stdout(db)

Modified: pypy/branch/lltype-refactoring/translator/c/wrapper.py
==============================================================================
--- pypy/branch/lltype-refactoring/translator/c/wrapper.py	(original)
+++ pypy/branch/lltype-refactoring/translator/c/wrapper.py	Tue Jun  7 14:37:39 2005
@@ -8,7 +8,7 @@
 from pypy.interpreter.pycode import CO_VARARGS
 
 
-Ptr = GcPtr # xxx was NonGcPtr, what do we need?
+PyObjPtr = GcPtr(PyObject)
 
 def gen_wrapper(func, rtyper):
     """generate a wrapper function for 'func' that can be put in a
@@ -35,9 +35,9 @@
     vkwds = Variable('kwds')
     vfname = Constant(func.func_name)
     # avoid incref/decref on the arguments: 'self' and 'kwds' can be NULL
-    vself.concretetype = Ptr(PyObject)
-    vargs.concretetype = Ptr(PyObject)
-    vkwds.concretetype = Ptr(PyObject)
+    vself.concretetype = PyObjPtr
+    vargs.concretetype = PyObjPtr
+    vkwds.concretetype = PyObjPtr
 
     varguments = []
     varnames = func.func_code.co_varnames
@@ -105,9 +105,9 @@
     block.closeblock(Link([vresult], wgraph.returnblock))
     checkgraph(wgraph)
 
-    return functionptr(FuncType([Ptr(PyObject),
-                                 Ptr(PyObject),
-                                 Ptr(PyObject)],
-                                GcPtr(PyObject)),
+    return functionptr(FuncType([PyObjPtr,
+                                 PyObjPtr,
+                                 PyObjPtr],
+                                PyObjPtr),
                        wgraph.name,
                        graph = wgraph)



More information about the Pypy-commit mailing list