[pypy-svn] r10510 - in pypy/dist/pypy/translator: . genc genc/test
arigo at codespeak.net
arigo at codespeak.net
Sun Apr 10 15:24:05 CEST 2005
Author: arigo
Date: Sun Apr 10 15:24:05 2005
New Revision: 10510
Modified:
pypy/dist/pypy/translator/genc/ctyper.py
pypy/dist/pypy/translator/genc/funcdef.py
pypy/dist/pypy/translator/genc/genc.py
pypy/dist/pypy/translator/genc/t_func.py
pypy/dist/pypy/translator/genc/t_pyobj.py
pypy/dist/pypy/translator/genc/t_simple.py
pypy/dist/pypy/translator/genc/t_tuple.py
pypy/dist/pypy/translator/genc/test/test_ctrans.py
pypy/dist/pypy/translator/translator.py
Log:
Fixed the handling of incref/decref with elements of tuples. Now all tests
pass.
Modified: pypy/dist/pypy/translator/genc/ctyper.py
==============================================================================
--- pypy/dist/pypy/translator/genc/ctyper.py (original)
+++ pypy/dist/pypy/translator/genc/ctyper.py Sun Apr 10 15:24:05 2005
@@ -95,6 +95,7 @@
yield self.typed_op(SpaceOperation('tuple_setitem',
[v2, Constant(i), vitem], v0), # args, ret
[ctup, TInt, ct ], TNone) # a_t, r_t
+ yield self.incref_op(vitem)
return
if op.opname == 'getitem':
@@ -111,7 +112,19 @@
else:
yield self.typed_op(op, [ctup, self.TInt], ct,
newopname='tuple_getitem')
+ yield self.incref_op(op.result)
return
# fall-back
yield Specializer.specialized_op(self, op, bindings)
+
+
+ def incref_op(self, v):
+ vnone = Variable()
+ vnone.concretetype = self.TNone
+ return SpaceOperation('incref', [v], vnone)
+
+ def deref_op(self, v):
+ vnone = Variable()
+ vnone.concretetype = self.TNone
+ return SpaceOperation('decref', [v], vnone)
Modified: pypy/dist/pypy/translator/genc/funcdef.py
==============================================================================
--- pypy/dist/pypy/translator/genc/funcdef.py (original)
+++ pypy/dist/pypy/translator/genc/funcdef.py Sun Apr 10 15:24:05 2005
@@ -371,9 +371,9 @@
# generate an incref for each input argument
for a in self.graphargs:
- cincref = self.ctypeof(a).cincref
- if cincref:
- print >> f, '\t' + cincref % (self.expr(a),)
+ line = self.ctypeof(a).cincref(self.expr(a))
+ if line:
+ print >> f, '\t' + line
# print the body
for line in body:
@@ -417,13 +417,14 @@
ct1 = self.ctypeof(a1)
ct2 = self.ctypeof(a2)
assert ct1 == ct2
- if ct1.cincref:
- line += '\t' + ct1.cincref % (self.expr(a2),)
+ line2 = ct1.cincref(self.expr(a2))
+ if line2:
+ line += '\t' + line2
yield line
for v in has_ref:
- cdecref = self.ctypeof(v).cdecref
- if cdecref:
- yield cdecref % (linklocalvars[v],)
+ line = self.ctypeof(v).cdecref(linklocalvars[v])
+ if line:
+ yield line
yield 'goto block%d;' % blocknum[link.target]
# collect all blocks
@@ -521,12 +522,9 @@
while to_release:
v = to_release.pop()
if err_reachable:
- if not hasattr(v, 'concretetype'):
- cdecref = 'ERR_DECREF(%s)'
- else:
- cdecref = v.concretetype.cdecref
- if cdecref:
- yield cdecref % (self.expr(v),)
+ line = self.ctypeof(v).cdecref(self.expr(v))
+ if line:
+ yield line
yield 'err%d_%d:' % (blocknum[block], len(to_release))
err_reachable = True
if err_reachable:
@@ -596,6 +594,14 @@
return '%s = %s(%s); if (PyErr_Occurred()) FAIL(%s)' % (
r, args[0], ', '.join(args[1:]), err)
+ def OP_INCREF(self, args, r, err):
+ v, = args[0].args
+ return self.ctypeof(v).cincref(args[0].compute())
+
+ def OP_DECREF(self, args, r, err):
+ v, = args[0].args
+ return self.ctypeof(v).cdecref(args[0].compute())
+
# ____________________________________________________________
class lazy:
Modified: pypy/dist/pypy/translator/genc/genc.py
==============================================================================
--- pypy/dist/pypy/translator/genc/genc.py (original)
+++ pypy/dist/pypy/translator/genc/genc.py Sun Apr 10 15:24:05 2005
@@ -130,10 +130,11 @@
def gen_global_declarations(self):
# collect more of the latercode between the functions,
# and produce the corresponding global declarations
- for ct in self.translator.concretetypes.values():
+ for ct in self.translator.ctlist:
if ct not in self.ctypes_alreadyseen:
self.globaldecl += list(ct.init_globals(self))
self.ctypes_alreadyseen[ct] = True
+ for ct in self.translator.ctlist:
self.globaldecl += list(ct.collect_globals(self))
g = self.globaldecl
if g:
Modified: pypy/dist/pypy/translator/genc/t_func.py
==============================================================================
--- pypy/dist/pypy/translator/genc/t_func.py (original)
+++ pypy/dist/pypy/translator/genc/t_func.py Sun Apr 10 15:24:05 2005
@@ -23,7 +23,7 @@
# a nice textual name for debugging...
argnames = [ct.debugname() for ct in self.argtypes]
returnname = self.returntype.debugname()
- return 'fn (%s) -> %s' % (', '.join(argnames), returnname)
+ return 'fn(%s) -> %s' % (', '.join(argnames), returnname)
def nameof(self, func, debug=None):
return self.genc().getfuncdef(func).fast_name
Modified: pypy/dist/pypy/translator/genc/t_pyobj.py
==============================================================================
--- pypy/dist/pypy/translator/genc/t_pyobj.py (original)
+++ pypy/dist/pypy/translator/genc/t_pyobj.py Sun Apr 10 15:24:05 2005
@@ -15,8 +15,6 @@
reconstruct them.
"""
ctypetemplate = 'PyObject *%s'
- cincref = 'Py_INCREF(%s);'
- cdecref = 'Py_DECREF(%s);'
error_return = 'NULL'
def __init__(self, translator):
@@ -53,6 +51,12 @@
self.globalobjects = []
self.debugstack = () # linked list of nested nameof()
+ def cincref(self, expr):
+ return 'Py_INCREF(%s);' % expr
+
+ def cdecref(self, expr):
+ return 'Py_DECREF(%s);' % expr
+
def nameof(self, obj, debug=None):
key = Constant(obj).key
try:
Modified: pypy/dist/pypy/translator/genc/t_simple.py
==============================================================================
--- pypy/dist/pypy/translator/genc/t_simple.py (original)
+++ pypy/dist/pypy/translator/genc/t_simple.py Sun Apr 10 15:24:05 2005
@@ -4,8 +4,6 @@
class CType(object):
- cincref = None
- cdecref = None
def __init__(self, translator):
self.translator = translator
@@ -30,6 +28,12 @@
def collect_globals(self, genc):
return []
+ def cincref(self, expr):
+ return ''
+
+ def cdecref(self, expr):
+ return ''
+
class CIntType(CType):
error_return = '-1'
Modified: pypy/dist/pypy/translator/genc/t_tuple.py
==============================================================================
--- pypy/dist/pypy/translator/genc/t_tuple.py (original)
+++ pypy/dist/pypy/translator/genc/t_tuple.py Sun Apr 10 15:24:05 2005
@@ -22,7 +22,7 @@
def debugname(self):
# a nice textual name for debugging...
itemnames = [ct.debugname() for ct in self.itemtypes]
- return 'tuple (%s)' % (', '.join(itemnames),)
+ return 'tuple(%s)' % (', '.join(itemnames),)
def fieldnames(self):
return ['f%d' % i for i in range(len(self.itemtypes))]
@@ -32,14 +32,31 @@
for ct, name in zip(self.itemtypes, self.fieldnames()):
yield '\t' + ct.ctypetemplate % (name,) + ';'
yield '};'
- yield '%s %s; /* uninitialized */' % (self.structname,
- self.error_return)
+ self.globaldecl.append(
+ '%s %s; /* uninitialized */' % (self.structname,
+ self.error_return))
def collect_globals(self, genc):
result = self.globaldecl
self.globaldecl = []
return result
+ def cincref(self, expr):
+ result = []
+ for i in range(len(self.itemtypes)):
+ line = self.itemtypes[i].cincref('%s.f%d' % (expr, i))
+ if line:
+ result.append(line)
+ return ' '.join(result)
+
+ def cdecref(self, expr):
+ result = []
+ for i in range(len(self.itemtypes)):
+ line = self.itemtypes[i].cdecref('%s.f%d' % (expr, i))
+ if line:
+ result.append(line)
+ return '\t'.join(result)
+
def nameof(self, tup, debug=None):
genc = self.genc()
try:
@@ -66,6 +83,7 @@
yield typer.typed_op(SpaceOperation('tuple_getitem',
[v1, Constant(i)], vitem), # args, retval
[self, TInt ], ct ) # arg_t, ret_t
+ yield typer.incref_op(vitem)
pyobjitems_v.append(vitem)
# create a new PyTupleObject with these values
# note that typed_op() will insert the conversion of vitem if needed
@@ -85,9 +103,11 @@
yield typer.typed_op(SpaceOperation('pytuple_getitem',
[v1, Constant(i)], vitem), # args, retval
[TPyObj, TInt ], TPyObj) # arg_t, ret_t
+ yield typer.incref_op(vitem)
# store it into the "struct" tuple
# note that typed_op() will insert the conversion of vitem if needed
v0 = Variable()
yield typer.typed_op(SpaceOperation('tuple_setitem',
[v2, Constant(i), vitem], v0), # args, ret
[self, TInt, ct ], TNone) # a_t, r_t
+ yield typer.incref_op(vitem)
Modified: pypy/dist/pypy/translator/genc/test/test_ctrans.py
==============================================================================
--- pypy/dist/pypy/translator/genc/test/test_ctrans.py (original)
+++ pypy/dist/pypy/translator/genc/test/test_ctrans.py Sun Apr 10 15:24:05 2005
@@ -360,7 +360,3 @@
def test_int_overflow(self):
fn = self.getcompiled(snippet.simple_func)
raises(OverflowError, fn, sys.maxint+1)
-
-
- def test_get_set_del_slice(self):
- py.test.skip("missing incref/decref in tuples")
Modified: pypy/dist/pypy/translator/translator.py
==============================================================================
--- pypy/dist/pypy/translator/translator.py (original)
+++ pypy/dist/pypy/translator/translator.py Sun Apr 10 15:24:05 2005
@@ -64,6 +64,7 @@
self.callgraph = {} # {opaque_tag: (caller, callee)}
self.frozen = False # when frozen, no more flowgraphs can be generated
self.concretetypes = {} # see getconcretetype()
+ self.ctlist = [] # "
if self.entrypoint:
self.getflowgraph()
@@ -281,6 +282,7 @@
return self.concretetypes[cls, args]
except KeyError:
result = self.concretetypes[cls, args] = cls(self, *args)
+ self.ctlist.append(result)
return result
More information about the Pypy-commit
mailing list