[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