[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