[pypy-svn] r6877 - pypy/trunk/src/pypy/translator
arigo at codespeak.net
arigo at codespeak.net
Sat Oct 9 12:49:32 CEST 2004
Author: arigo
Date: Sat Oct 9 12:49:31 2004
New Revision: 6877
Modified:
pypy/trunk/src/pypy/translator/genc.h
pypy/trunk/src/pypy/translator/genc.py
Log:
Made typeless tests work.
Modified: pypy/trunk/src/pypy/translator/genc.h
==============================================================================
--- pypy/trunk/src/pypy/translator/genc.h (original)
+++ pypy/trunk/src/pypy/translator/genc.h Sat Oct 9 12:49:31 2004
@@ -31,13 +31,13 @@
#define OP_GETITEM(x,y,r,err) if (!(r=PyObject_GetItem(x,y))) goto err;
#define OP_SETITEM(x,y,z,r,err) if ((PyObject_SetItem(x,y,z))<0) goto err; \
- r = NULL;
+ r=Py_None; Py_INCREF(r);
#define OP_GETATTR(x,y,r,err) if (!(r=PyObject_GetAttr(x,y))) goto err;
#define OP_SETATTR(x,y,z,r,err) if ((PyObject_SetAttr(x,y,z))<0) goto err; \
- r = NULL;
+ r=Py_None; Py_INCREF(r);
#define OP_DELATTR(x,y,r,err) if ((PyObject_SetAttr(x,y,NULL))<0)goto err; \
- r = NULL;
+ r=Py_None; Py_INCREF(r);
#define OP_NEWSLICE(x,y,z,r,err) if (!(r=PySlice_New(x,y,z))) goto err;
@@ -52,10 +52,64 @@
/*** misc ***/
-#define OP_EXCEPTION(x,r,err) r = NULL; /* XXX exceptions not implemented */
+ /* XXX exceptions not implemented */
+#define OP_EXCEPTION(x,r,err) r=Py_None; Py_INCREF(r);
#define MOVE(x, y) y = x;
+/*** operations with a variable number of arguments ***/
+
+#define OP_NEWLIST0(r,err) if (!(r=PyList_New(0))) goto err;
+#define OP_NEWLIST(args,r,err) if (!(r=PyList_Pack args)) goto err;
+#define OP_NEWTUPLE(args,r,err) if (!(r=PyTuple_Pack args)) goto err;
+#define OP_SIMPLE_CALL(args,r,err) if (!(r=PyObject_CallFunctionObjArgs args)) \
+ goto err;
+
+static PyObject* PyList_Pack(int n, ...)
+{
+ int i;
+ PyObject *o;
+ PyObject *result;
+ va_list vargs;
+
+ va_start(vargs, n);
+ result = PyList_New(n);
+ if (result == NULL)
+ return NULL;
+ for (i = 0; i < n; i++) {
+ o = va_arg(vargs, PyObject *);
+ Py_INCREF(o);
+ PyList_SET_ITEM(result, i, o);
+ }
+ va_end(vargs);
+ return result;
+}
+
+#if PY_VERSION_HEX < 0x02040000 /* 2.4 */
+static PyObject* PyTuple_Pack(int n, ...)
+{
+ int i;
+ PyObject *o;
+ PyObject *result;
+ PyObject **items;
+ va_list vargs;
+
+ va_start(vargs, n);
+ result = PyTuple_New(n);
+ if (result == NULL)
+ return NULL;
+ items = ((PyTupleObject *)result)->ob_item;
+ for (i = 0; i < n; i++) {
+ o = va_arg(vargs, PyObject *);
+ Py_INCREF(o);
+ items[i] = o;
+ }
+ va_end(vargs);
+ return result;
+}
+#endif
+
+
/************************************************************/
/*** The rest is produced by genc.py ***/
Modified: pypy/trunk/src/pypy/translator/genc.py
==============================================================================
--- pypy/trunk/src/pypy/translator/genc.py (original)
+++ pypy/trunk/src/pypy/translator/genc.py Sat Oct 9 12:49:31 2004
@@ -29,7 +29,10 @@
self.translator = translator
self.modname = (modname or
uniquemodulename(translator.functions[0].__name__))
- self.cnames = {}
+ self.cnames = {(type(None), None): 'Py_None',
+ ( bool, False): 'Py_False',
+ ( bool, True): 'Py_True',
+ }
self.seennames = {}
self.initcode = []
self.globaldecl = []
@@ -69,6 +72,25 @@
self.initcode.append('%s = PyInt_FromLong(%d);' % (name, value))
return name
+ def nameof_str(self, value):
+ chrs = [c for c in value if ('a' <= c <='z' or
+ 'A' <= c <='Z' or
+ '0' <= c <='9' or
+ '_' == c )]
+ name = self.uniquename('gstr_' + ''.join(chrs))
+ self.globaldecl.append('static PyObject* %s;' % name)
+ if [c for c in value if not (' '<=c<='~')]:
+ # non-printable string
+ s = 'chr_%s' % name
+ self.globaldecl.append('static char %s[] = { %s };' % (
+ s, ', '.join(['%d' % ord(c) for c in value])))
+ else:
+ # printable string
+ s = '"%s"' % value
+ self.initcode.append('%s = PyString_FromStringAndSize(%s, %d);' % (
+ name, s, len(value)))
+ return name
+
def nameof_function(self, func):
name = self.uniquename('gfunc_' + func.__name__)
self.globaldecl.append('static PyObject* %s;' % name)
@@ -77,6 +99,17 @@
self.pendingfunctions.append(func)
return name
+ def nameof_builtin_function_or_method(self, func):
+ import __builtin__
+ assert func is getattr(__builtin__, func.__name__, None), (
+ '%r is not from __builtin__' % (func,))
+ name = self.uniquename('gbltin_' + func.__name__)
+ self.globaldecl.append('static PyObject* %s;' % name)
+ self.initcode.append('%s = PyMapping_GetItemString('
+ 'PyEval_GetBuiltins(), "%s");' % (
+ name, func.__name__))
+ return name
+
def gen_source(self):
f = self.f
info = {
@@ -117,7 +150,7 @@
print >> f, '{'
# collect and print all the local variables
- graph = self.translator.flowgraphs[func]
+ graph = self.translator.getflowgraph(func)
localslst = []
def visit(node):
if isinstance(node, Block):
@@ -128,9 +161,13 @@
print >> f
# argument unpacking
- lst = ['"' + 'O'*len(graph.getargs()) + '"']
+ lst = ['args',
+ '"%s"' % func.__name__,
+ '%d' % len(graph.getargs()),
+ '%d' % len(graph.getargs()),
+ ]
lst += ['&' + a.name for a in graph.getargs()]
- print >> f, '\tif (!PyArg_ParseTuple(args, %s))' % ', '.join(lst)
+ print >> f, '\tif (!PyArg_UnpackTuple(%s))' % ', '.join(lst)
print >> f, '\t\treturn NULL;'
# print the body
@@ -148,7 +185,7 @@
print >> f
def cfunction_body(self, func):
- graph = self.translator.flowgraphs[func]
+ graph = self.translator.getflowgraph(func)
blocknum = {}
allblocks = []
@@ -174,7 +211,7 @@
yield line
for v in to_release:
if v in has_ref:
- yield 'Py_XDECREF(%s);' % v.name
+ yield 'Py_DECREF(%s);' % v.name
yield 'goto block%d;' % blocknum[link.target]
# collect all blocks
@@ -197,7 +234,12 @@
lst = [expr(v) for v in op.args]
lst.append(op.result.name)
lst.append('err%d_%d' % (blocknum[block], len(to_release)))
- yield 'OP_%s(%s)' % (op.opname.upper(), ', '.join(lst))
+ macro = 'OP_%s' % op.opname.upper()
+ meth = getattr(self, macro, None)
+ if meth:
+ yield meth(lst[:-2], lst[-2], lst[-1])
+ else:
+ yield '%s(%s)' % (macro, ', '.join(lst))
to_release.append(op.result)
if len(block.exits) == 0:
@@ -221,8 +263,8 @@
while to_release:
n = len(to_release)
v = to_release.pop()
- yield 'err%d_%d: Py_XDECREF(%s);' % (blocknum[block], n, v.name)
- yield 'return NULL;'
+ yield 'err%d_%d: Py_DECREF(%s);' % (blocknum[block], n, v.name)
+ yield 'err%d_0: return NULL;' % blocknum[block]
# ____________________________________________________________
@@ -241,6 +283,24 @@
\tPyModule_AddObject(m, "%(entrypointname)s", %(entrypoint)s);
}'''
+ # the C preprocessor cannot handle operations taking a variable number
+ # of arguments, so here are Python methods that do it
+
+ def OP_NEWLIST(self, args, r, err):
+ if len(args) == 0:
+ return 'OP_NEWLIST0(%s, %s)' % (r, err)
+ else:
+ args.insert(0, '%d' % len(args))
+ return 'OP_NEWLIST((%s), %s, %s)' % (', '.join(args), r, err)
+
+ def OP_NEWTUPLE(self, args, r, err):
+ args.insert(0, '%d' % len(args))
+ return 'OP_NEWTUPLE((%s), %s, %s)' % (', '.join(args), r, err)
+
+ def OP_SIMPLE_CALL(self, args, r, err):
+ args.append('NULL')
+ return 'OP_SIMPLE_CALL((%s), %s, %s)' % (', '.join(args), r, err)
+
# ____________________________________________________________
def cdecl(type, name):
More information about the Pypy-commit
mailing list