[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