[pypy-svn] r7464 - pypy/trunk/src/pypy/translator

bob at codespeak.net bob at codespeak.net
Fri Nov 19 18:59:10 CET 2004


Author: bob
Date: Fri Nov 19 18:59:10 2004
New Revision: 7464

Modified:
   pypy/trunk/src/pypy/translator/genc.h
Log:
possibly working nicer genc.h



Modified: pypy/trunk/src/pypy/translator/genc.h
==============================================================================
--- pypy/trunk/src/pypy/translator/genc.h	(original)
+++ pypy/trunk/src/pypy/translator/genc.h	Fri Nov 19 18:59:10 2004
@@ -194,70 +194,101 @@
 #if defined(USE_CALL_TRACE)
 
 static int callstack_depth = -1;
-#define OP_SIMPLE_CALL(args, r, err) do { \
-	char *c_signature = INSIDE_FUNCTION " OP_SIMPLE_CALL" #args; \
-	PyCodeObject *c; \
-	PyObject *locals = PyDict_New(); \
-	PyObject *locals_list = PyList_CrazyPack args; \
-	PyObject *locals_signature = PyString_FromString(c_signature); \
-	PyObject *locals_lineno = PyInt_FromLong(__LINE__); \
-	callstack_depth++; \
-	c = getcode(c_signature, __LINE__); \
-	if (locals_list != NULL && locals_signature != NULL && locals_lineno != NULL && locals != NULL) { \
-		PyDict_SetItemString(locals, "c_args", locals_list); \
-		PyDict_SetItemString(locals, "c_signature", locals_signature); \
-		PyDict_SetItemString(locals, "c_lineno", locals_lineno); \
-		Py_DECREF(locals_list); \
-	} else { \
-		Py_XDECREF(locals); \
-		Py_XDECREF(locals_list); \
-		Py_XDECREF(locals_signature); \
-		Py_XDECREF(locals_lineno); \
-		locals = NULL; \
-	} \
-	{ PyThreadState *tstate = PyThreadState_GET(); \
-	PyFrameObject *f; \
-	if (c == NULL || locals == NULL) { \
-		r = NULL; \
-		callstack_depth--; \
-		goto err; \
-	} \
-	f = PyFrame_New(tstate, c, PyEval_GetGlobals(), locals); \
-	if (f == NULL) { \
-		r = NULL; \
-		callstack_depth--; \
-		goto err; \
-	} \
-	Py_DECREF(c); \
-	Py_DECREF(locals); \
-	tstate->frame = f; \
-	if (trace_frame(tstate, f, PyTrace_CALL, Py_None) < 0) { \
-		r = NULL; \
-		callstack_depth--; \
-		goto err; \
-	} \
-	r = PyObject_CallFunctionObjArgs args; \
-	callstack_depth--; \
-	if (r == NULL) { \
-		if (tstate->curexc_traceback == NULL) { \
-			PyTraceBack_Here(f); \
-		} \
-		if (trace_frame_exc(tstate, f) < 0) { \
-			goto err; \
-		} \
-	} \
-	else { \
-		if (trace_frame(tstate, f, PyTrace_RETURN, r) < 0) { \
-			Py_XDECREF(r); \
-			r = NULL; \
-		} \
-	} \
-	tstate->frame = f->f_back; \
-	Py_DECREF(f); \
-	if (r == NULL) { \
-		goto err; \
-	} } \
-} while (0);
+
+static PyObject *traced_function_call(PyObject *allargs, char *c_signature, char *filename, int c_lineno) {
+	/*
+		STEALS a reference to allargs
+	*/
+	PyCodeObject *c;
+	PyFrameObject *f;
+	PyObject *rval;
+	PyThreadState *tstate;
+	PyObject *locals;
+	PyObject *function;
+	PyObject *args;
+	PyObject *locals_signature;
+	PyObject *locals_lineno;
+	PyObject *locals_filename;
+
+	if (allargs == NULL) {
+		return NULL;
+	}
+	tstate = PyThreadState_GET();
+	locals = PyDict_New();
+	args = PyTuple_GetSlice(allargs, 1, PyTuple_Size(allargs));
+	function = PyTuple_GetItem(allargs, 0);
+	Py_INCREF(function)
+	Py_DECREF(allargs);
+	locals_signature = PyString_FromString(c_signature);
+	locals_lineno = PyInt_FromLong(c_lineno);
+	locals_filename = PyString_FromString(filename);
+	if (locals == NULL || function == NULL || args == NULL || 
+		locals_signature == NULL || locals_lineno == NULL ||
+		locals_filename == NULL) {
+		Py_XDECREF(locals);
+		Py_XDECREF(args);
+		Py_XDECREF(locals_signature);
+		Py_XDECREF(locals_lineno);
+		Py_XDECREF(locals_filename);
+		return NULL;
+	}
+	PyDict_SetItemString(locals, "function", function);
+	PyDict_SetItemString(locals, "args", args);
+	PyDict_SetItemString(locals, "signature", locals_signature);
+	PyDict_SetItemString(locals, "lineno", locals_lineno);
+	PyDict_SetItemString(locals, "filename", locals_filename);
+	Py_DECREF(locals);
+	Py_DECREF(locals_signature);
+	Py_DECREF(locals_lineno);
+	Py_DECREF(locals_filename);
+	callstack_depth++;
+	c = getcode(c_signature, c_lineno);
+	if (c == NULL) {
+		callstack_depth--;
+		Py_DECREF(args);
+		Py_DECREF(locals);
+		return NULL;
+	}
+	f = PyFrame_New(tstate, c, PyEval_GetGlobals(), locals);
+	if (f == NULL) {
+		callstack_depth--;
+		Py_DECREF(c);
+		Py_DECREF(locals);
+		Py_DECREF(args);
+		return NULL;
+	}
+	Py_DECREF(c);
+	Py_DECREF(locals);
+	tstate->frame = f;
+	
+	if (trace_frame(tstate, f, PyTrace_CALL, Py_None) < 0) {
+		callstack_depth--;
+		Py_DECREF(args);
+		return NULL;
+	}
+	rval = PyObject_Call(function, args, NULL);
+	PyObject_DECREF(args);
+	callstack_depth--;
+	if (rval == NULL) {
+		if (tstate->curexc_traceback == NULL) {
+			PyTraceBack_Here(f);
+		}
+		if (trace_frame_exc(tstate, f) < 0) {
+			return NULL;
+		}
+	} else {
+		if (trace_frame(tstate, f, PyTrace_RETURN, rval) < 0) {
+			Py_DECREF(rval);
+			rval = NULL;
+		}
+	}
+	tstate->frame = f->f_back;
+	Py_DECREF(f);
+	return rval;
+}
+
+#define OP_SIMPLE_CALL(args, r, err) if ((r = traced_function_call(PyTuple_CrazyPack args, INSIDE_FUNCTION " OP_SIMPLE_CALL" #arg, __FILE__, __LINE__)) == NULL) \
+					goto err;
 
 #else
 
@@ -266,6 +297,38 @@
 
 #endif
 
+static PyObject* PyTuple_CrazyPack(PyObject *begin, ...)
+{
+	int i;
+	PyObject *o;
+	PyObject *result;
+	PyObject *tuple;
+	va_list vargs;
+
+	result = PyList_New(0);
+	if (result == NULL || begin == NULL) {
+		return result;
+	}
+	va_start(vargs, begin);
+	if (PyList_Append(result, begin) == -1) {
+		Py_XDECREF(result);
+		return result;
+	}
+	while ((o = va_arg(vargs, PyObject *)) != NULL) {
+		if (PyList_Append(result, o) == -1) {
+			Py_XDECREF(result);
+			return NULL;
+		}
+	}
+	va_end(vargs);
+	if ((tuple = PySequence_Tuple(result)) == NULL) {
+		Py_DECREF(result);
+		return NULL;
+	}
+	Py_DECREF(result);
+	return tuple;
+}
+
 static PyObject* PyList_CrazyPack(PyObject *begin, ...)
 {
 	int i;



More information about the Pypy-commit mailing list