[pypy-svn] r6293 - pypy/branch/pypy-genc/translator

arigo at codespeak.net arigo at codespeak.net
Mon Sep 6 14:41:51 CEST 2004


Author: arigo
Date: Mon Sep  6 14:41:50 2004
New Revision: 6293

Modified:
   pypy/branch/pypy-genc/translator/formatter.py
   pypy/branch/pypy-genc/translator/genc.py
   pypy/branch/pypy-genc/translator/genc_class.h
   pypy/branch/pypy-genc/translator/genc_typeset.py
Log:
More messiness, but a lot of tests pass.  Checked in for reference before 
things get cleaned up in a different way.


Modified: pypy/branch/pypy-genc/translator/formatter.py
==============================================================================
--- pypy/branch/pypy-genc/translator/formatter.py	(original)
+++ pypy/branch/pypy-genc/translator/formatter.py	Mon Sep  6 14:41:50 2004
@@ -1,3 +1,4 @@
+from __future__ import generators
 import sys
 from StringIO import StringIO
 
@@ -11,7 +12,9 @@
     statements; they are executed and whatever they print is inserted back
     into the format string."""
     
-    def __init__(self, globals, locals):
+    def __init__(self, globals, locals=None):
+        if locals is None:
+            locals = globals
         self.globals = globals
         self.locals = locals
     

Modified: pypy/branch/pypy-genc/translator/genc.py
==============================================================================
--- pypy/branch/pypy-genc/translator/genc.py	(original)
+++ pypy/branch/pypy-genc/translator/genc.py	Mon Sep  6 14:41:50 2004
@@ -2,7 +2,8 @@
 Generate a C source file from the flowmodel.
 
 """
-import autopath, os, re
+from __future__ import generators
+import autopath, os
 from pypy.translator.typer import LLFunction, LLOp, LLConst
 from pypy.translator import genc_typeset, formatter
 
@@ -211,9 +212,33 @@
             'name': cclass.name,
             'cdef': cclass.cdef,
             'cls': cclass.cdef.cls,
+            'genc': self,
             'typeset': self.typeset,
             }
-        print >> f, self.C_CLASS % formatter.TemplateFormatter(globals(), loc)
+        print >> f, self.C_CLASS % formatter.TemplateFormatter(loc)
+
+    def copy(self, srcrepr, srcvars, dstrepr, dstvars, errlabel):
+        # write the code to copy a value from src to dst.
+        if srcrepr == dstrepr:
+            for s, d in zip(srcvars, dstvars):
+                yield '%s = %s;' % (d, s)
+            try:
+                sig = (dstrepr,)
+                llname, can_fail = self.typeset.lloperations['incref'][sig]
+            except KeyError:
+                pass   # no incref
+            else:
+                assert not can_fail
+                for codeline in llname(*dstvars).split('\n'):
+                    yield codeline
+        else:
+            sig = (srcrepr, dstrepr)
+            llname, can_fail = self.typeset.lloperations['convert'][sig]
+            args = srcvars + dstvars
+            if can_fail:
+                args.append(errlabel)
+            for codeline in llname(*args).split('\n'):
+                yield codeline
 
 # ____________________________________________________________
 

Modified: pypy/branch/pypy-genc/translator/genc_class.h
==============================================================================
--- pypy/branch/pypy-genc/translator/genc_class.h	(original)
+++ pypy/branch/pypy-genc/translator/genc_class.h	Mon Sep  6 14:41:50 2004
@@ -6,10 +6,22 @@
 %(
 # write here the definition of all fields
 # (see formatter.py for the definition of this small templating language)
+import re
+
 mainletters = [c.lower() for c in cls.__name__ if 'A' <= c <= 'Z']
 field_prefix = ''.join(mainletters or ['f'])
 pyobj_fields = []
 fields = []
+
+def llfield(field, hltype):
+    lltypes = typeset.represent(hltype)
+    for i in range(len(lltypes)):
+        if i:
+            suffix = '_%d' % i
+        else:
+            suffix = ''
+        yield field + suffix
+
 for attr, s_value in cdef.attrs.items():
     hltype = typeset.gethltype(s_value)
     lltypes = typeset.represent(hltype)
@@ -22,13 +34,9 @@
     fields.append((attr, field, hltype))
     if hltype is typeset.R_OBJECT:
         pyobj_fields.append(field)
-    for i, lltype in zip(range(len(lltypes)), lltypes):
-        if i:
-            suffix = '_%d' % i
-        else:
-            suffix = ''
-        print '\t%s %s%s;' % (lltype, field, suffix)
-
+    for lltype, llname in zip(lltypes, llfield(field, hltype)):
+        print '\t%s %s;' % (lltype, llname)
+# ----
 )s} %(name)s_Object;
 
 staticforward PyTypeObject %(name)s_Type;
@@ -36,16 +44,27 @@
 static PyObject* %(name)s_new(void)
 {
 	%(name)s_Object* op = PyObject_GC_New(%(name)s_Object, &%(name)s_Type);
-	if (op) {
+	if (op == NULL) goto err;
 %(
-# initialize PyObject* fields to NULL
+# initialize fields from the  PyObject* fields to NULL
 for field in pyobj_fields:
-    print '\t\top->%s = NULL;' % field
-
-)s		PyObject_GC_Track(op);
-		/* XXX call __init__ */
-	}
+    print '\top->%s = NULL;' % field
+# initialize fields using the class attributes as a default
+for attr, field, hltype in fields:
+    if hasattr(cls, attr):
+        r = typeset.constant_representation(getattr(cls, attr))
+        for codeline in genc.copy(r, [],
+                  hltype, ['op->%s' % f for f in llfield(field, hltype)],
+                  'err'):
+            print '\t' + codeline
+# ----
+)s	PyObject_GC_Track(op);
+	/* XXX call __init__ */
 	return (PyObject*) op;
+
+    err:
+        Py_XDECREF(op);
+        return NULL;
 }
 
 static void %(name)s_dealloc(%(name)s_Object* op)
@@ -55,7 +74,7 @@
 # release PyObject* fields   XXX should be more general
 for field in pyobj_fields:
     print '\tPy_XDECREF(op->%s);' % field
-
+# ----
 )s	op->ob_type->tp_free((PyObject *)op);
 }
 
@@ -68,7 +87,7 @@
     print '\t\tint err = visit(op->%s, arg);' % field
     print '\t\tif (err) return err;'
     print '\t}'
-
+# ----
 )s	return 0;
 }
 
@@ -82,7 +101,7 @@
     print '\t\top->%s = NULL;' % field
     print '\t\tPy_DECREF(tmp);'
     print '\t}'
-
+# ----
 )s	return 0;
 }
 
@@ -98,7 +117,7 @@
         continue   # ignored
     print '\t{"%s",\t%s,\toffsetof(%s_Object, %s)},' % (
         attr, t, name, field)
-
+# ----
 )s	{NULL}	/* Sentinel */
 };
 

Modified: pypy/branch/pypy-genc/translator/genc_typeset.py
==============================================================================
--- pypy/branch/pypy-genc/translator/genc_typeset.py	(original)
+++ pypy/branch/pypy-genc/translator/genc_typeset.py	Mon Sep  6 14:41:50 2004
@@ -52,6 +52,8 @@
                 return self.constant_representation(var.const)
             if issubclass(var.knowntype, int):
                 return self.R_INT
+            if isinstance(var, annmodel.SomeImpossibleValue):
+                return self.R_VOID
             # fall-back
             return self.R_OBJECT
         if isinstance(var, Constant):



More information about the Pypy-commit mailing list