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

bob at codespeak.net bob at codespeak.net
Fri Nov 19 18:22:11 CET 2004


Author: bob
Date: Fri Nov 19 18:22:10 2004
New Revision: 7460

Modified:
   pypy/trunk/src/pypy/translator/genc.h
Log:
stuff the traceback object with c_args, c_signature and c_lineno(!!)



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:22:10 2004
@@ -13,7 +13,7 @@
 #define INSIDE_FUNCTION "<unknown>"
 
 #define op_richcmp(x,y,r,err,dir)   \
-                       if (!(r=PyObject_RichCompare(x,y,dir))) goto err;
+					   if (!(r=PyObject_RichCompare(x,y,dir))) goto err;
 #define OP_LT(x,y,r,err)  op_richcmp(x,y,r,err, Py_LT)
 #define OP_LE(x,y,r,err)  op_richcmp(x,y,r,err, Py_LE)
 #define OP_EQ(x,y,r,err)  op_richcmp(x,y,r,err, Py_EQ)
@@ -195,30 +195,49 @@
 
 static int callstack_depth = -1;
 #define OP_SIMPLE_CALL(args, r, err) do { \
-    callstack_depth++; \
-	PyCodeObject *c = getcode(INSIDE_FUNCTION " OP_SIMPLE_CALL" #args, __LINE__); \
+	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) { \
+	if (c == NULL || locals == NULL) { \
 		r = NULL; \
-        callstack_depth--; \
+		callstack_depth--; \
 		goto err; \
 	} \
-	f = PyFrame_New(tstate, c, PyEval_GetGlobals(), NULL); \
+	f = PyFrame_New(tstate, c, PyEval_GetGlobals(), locals); \
 	if (f == NULL) { \
 		r = NULL; \
-        callstack_depth--; \
+		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--; \
+		callstack_depth--; \
 		goto err; \
 	} \
 	r = PyObject_CallFunctionObjArgs args; \
-    callstack_depth--; \
+	callstack_depth--; \
 	if (r == NULL) { \
 		if (tstate->curexc_traceback == NULL) { \
 			PyTraceBack_Here(f); \
@@ -236,8 +255,8 @@
 	tstate->frame = f->f_back; \
 	Py_DECREF(f); \
 	if (r == NULL) { \
-        goto err; \
-    } \
+		goto err; \
+	} \
 } while (0);
 
 #else
@@ -247,6 +266,33 @@
 
 #endif
 
+static PyObject* PyList_CrazyPack(PyObject *begin, ...)
+{
+	int i;
+	PyObject *o;
+	PyObject *result;
+	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);
+	return result;
+}
+
+
 static PyObject* PyList_Pack(int n, ...)
 {
 	int i;
@@ -442,16 +488,16 @@
 	PyObject *nulltuple = NULL;
 	PyObject *filename = NULL;
 	PyCodeObject *tb_code = NULL;
-    int i;
+	int i;
 
 #if defined(OBNOXIOUS_PRINT_STATEMENTS)
-    printf("%5d: ", lineno);
-    assert(callstack_depth >= 0);
-    if (callstack_depth) {
-        for (i=0; i<callstack_depth; ++i) {
-            printf("  ");
-        }
-    }
+	printf("%5d: ", lineno);
+	assert(callstack_depth >= 0);
+	if (callstack_depth) {
+		for (i=0; i<callstack_depth; ++i) {
+			printf("  ");
+		}
+	}
 	printf("%s\n", func_name);
 #endif
 	code = PyString_FromString("");
@@ -486,7 +532,7 @@
 	Py_DECREF(filename);
 	Py_DECREF(name);
 	return tb_code;
- failed:
+failed:
 	Py_XDECREF(code);
 	Py_XDECREF(name);
 	return NULL;



More information about the Pypy-commit mailing list