[pypy-svn] r47193 - pypy/branch/kill-keepalives-again/pypy/translator/c
cfbolz at codespeak.net
cfbolz at codespeak.net
Fri Oct 5 17:24:34 CEST 2007
Author: cfbolz
Date: Fri Oct 5 17:24:33 2007
New Revision: 47193
Modified:
pypy/branch/kill-keepalives-again/pypy/translator/c/funcgen.py
pypy/branch/kill-keepalives-again/pypy/translator/c/node.py
Log:
attempt at supporting the new operations by genc
Modified: pypy/branch/kill-keepalives-again/pypy/translator/c/funcgen.py
==============================================================================
--- pypy/branch/kill-keepalives-again/pypy/translator/c/funcgen.py (original)
+++ pypy/branch/kill-keepalives-again/pypy/translator/c/funcgen.py Fri Oct 5 17:24:33 2007
@@ -425,9 +425,9 @@
return result
def generic_set(self, op, targetexpr):
- newvalue = self.expr(op.args[2], special_case_void=False)
+ newvalue = self.expr(op.args[-1], special_case_void=False)
result = ['%s = %s;' % (targetexpr, newvalue)]
- T = self.lltypemap(op.args[2])
+ T = self.lltypemap(op.args[-1])
result = '\n'.join(result)
if T is Void:
result = '/* %s */' % result
@@ -490,6 +490,50 @@
return '%s = &%s;' % (self.expr(op.result),
arraydef.itemindex_access_expr(ptr, index))
+ def interior_expr(self, args, rettype=False):
+ TYPE = args[0].concretetype.TO
+ expr = self.expr(args[0])
+ for i, arg in enumerate(args[1:]):
+ defnode = self.db.gettypedefnode(TYPE)
+ if arg.concretetype is Void:
+ fieldname = arg.value
+ if i == 0:
+ expr = defnode.ptr_access_expr(expr, fieldname)
+ else:
+ expr = defnode.access_expr(expr, fieldname)
+ if isinstance(TYPE, FixedSizeArray):
+ TYPE = TYPE.OF
+ else:
+ TYPE = getattr(TYPE, fieldname)
+ else:
+ indexexpr = self.expr(arg)
+ if i == 0:
+ expr = defnode.itemindex_access_expr(expr, indexexpr)
+ else:
+ expr = defnode.access_expr_varindex(expr, indexexpr)
+ TYPE = TYPE.OF
+ if rettype:
+ return expr, TYPE
+ else:
+ return expr
+
+ def OP_GETINTERIORFIELD(self, op):
+ return self.generic_get(op, self.interior_expr(op.args))
+
+ def OP_BARE_SETINTERIORFIELD(self, op):
+ return self.generic_set(op, self.interior_expr(op.args[:-1]))
+ OP_SETINTERIORFIELD = OP_BARE_SETINTERIORFIELD
+
+ def OP_GETINTERIORARRAYSIZE(self, op):
+ expr, ARRAY = self.interior_expr(op.args, True)
+ if isinstance(ARRAY, FixedSizeArray):
+ return '%s = %d;'%(self.expr(op.result), ARRAY.length)
+ else:
+ assert isinstance(ARRAY, Array)
+ return '%s = %s.length;'%(self.expr(op.result), expr)
+
+
+
def OP_PTR_NONZERO(self, op):
return '%s = (%s != NULL);' % (self.expr(op.result),
self.expr(op.args[0]))
Modified: pypy/branch/kill-keepalives-again/pypy/translator/c/node.py
==============================================================================
--- pypy/branch/kill-keepalives-again/pypy/translator/c/node.py (original)
+++ pypy/branch/kill-keepalives-again/pypy/translator/c/node.py Fri Oct 5 17:24:33 2007
@@ -241,7 +241,8 @@
return '%s %s *@' % (self.typetag, self.name)
def access_expr(self, baseexpr, index):
- return '%s.items[%d]' % (baseexpr, index)
+ return '%s.items[%s]' % (baseexpr, index)
+ access_expr_varindex = access_expr
def ptr_access_expr(self, baseexpr, index):
assert 0 <= index <= sys.maxint, "invalid constant index %r" % (index,)
@@ -334,6 +335,7 @@
def access_expr(self, baseexpr, index):
return '%s[%d]' % (baseexpr, index)
+ access_expr_varindex = access_expr
def ptr_access_expr(self, baseexpr, index):
assert 0 <= index <= sys.maxint, "invalid constant index %r" % (index,)
@@ -389,6 +391,9 @@
ptr_access_expr = access_expr
+ def access_expr_varindex(self, baseexpr, index):
+ return '%s[%s]' % (baseexpr, index)
+
def itemindex_access_expr(self, baseexpr, indexexpr):
return 'RPyFxItem(%s, %s, %d)' % (baseexpr, indexexpr,
self.FIXEDARRAY.length)
More information about the Pypy-commit
mailing list