[Python-checkins] r67902 - in python/trunk: Lib/test/test_py3kwarn.py Objects/frameobject.c

benjamin.peterson python-checkins at python.org
Mon Dec 22 21:16:25 CET 2008


Author: benjamin.peterson
Date: Mon Dec 22 21:16:25 2008
New Revision: 67902

Log:
add py3k warnings to frame.f_exc_*

Modified:
   python/trunk/Lib/test/test_py3kwarn.py
   python/trunk/Objects/frameobject.c

Modified: python/trunk/Lib/test/test_py3kwarn.py
==============================================================================
--- python/trunk/Lib/test/test_py3kwarn.py	(original)
+++ python/trunk/Lib/test/test_py3kwarn.py	Mon Dec 22 21:16:25 2008
@@ -126,6 +126,16 @@
             w.reset()
             self.assertWarning(meth >= func, w, expected)
 
+    def test_frame_attributes(self):
+        template = "%s has been removed in 3.x"
+        f = sys._getframe(0)
+        for attr in ("f_exc_traceback", "f_exc_value", "f_exc_type"):
+            expected = template % attr
+            with check_warnings() as w:
+                self.assertWarning(getattr(f, attr), w, expected)
+                w.reset()
+                self.assertWarning(setattr(f, attr, None), w, expected)
+
     def test_sort_cmp_arg(self):
         expected = "the cmp argument is not supported in 3.x"
         lst = range(5)

Modified: python/trunk/Objects/frameobject.c
==============================================================================
--- python/trunk/Objects/frameobject.c	(original)
+++ python/trunk/Objects/frameobject.c	Mon Dec 22 21:16:25 2008
@@ -20,12 +20,38 @@
 	{"f_builtins",	T_OBJECT,	OFF(f_builtins),RO},
 	{"f_globals",	T_OBJECT,	OFF(f_globals),	RO},
 	{"f_lasti",	T_INT,		OFF(f_lasti),	RO},
-	{"f_exc_type",	T_OBJECT,	OFF(f_exc_type)},
-	{"f_exc_value",	T_OBJECT,	OFF(f_exc_value)},
-	{"f_exc_traceback", T_OBJECT,	OFF(f_exc_traceback)},
 	{NULL}	/* Sentinel */
 };
 
+#define WARN_GET_SET(NAME) \
+static PyObject * frame_get_ ## NAME(PyFrameObject *f) { \
+	if (PyErr_WarnPy3k(#NAME " has been removed in 3.x", 2) < 0) \
+		return NULL; \
+	if (f->NAME) { \
+		Py_INCREF(f->NAME); \
+		return f->NAME; \
+	} \
+        Py_RETURN_NONE;	\
+} \
+static int frame_set_ ## NAME(PyFrameObject *f, PyObject *new) { \
+	if (PyErr_WarnPy3k(#NAME " has been removed in 3.x", 2) < 0) \
+		return -1; \
+	if (f->NAME) { \
+		Py_CLEAR(f->NAME); \
+	} \
+        if (new == Py_None) \
+            new = NULL; \
+	Py_XINCREF(new); \
+	f->NAME = new; \
+	return 0; \
+}
+
+
+WARN_GET_SET(f_exc_traceback)
+WARN_GET_SET(f_exc_type)
+WARN_GET_SET(f_exc_value)
+
+
 static PyObject *
 frame_getlocals(PyFrameObject *f, void *closure)
 {
@@ -352,6 +378,12 @@
 			(setter)frame_setlineno, NULL},
 	{"f_trace",	(getter)frame_gettrace, (setter)frame_settrace, NULL},
 	{"f_restricted",(getter)frame_getrestricted,NULL, NULL},
+	{"f_exc_traceback", (getter)frame_get_f_exc_traceback,
+	                (setter)frame_set_f_exc_traceback, NULL},
+        {"f_exc_type",  (getter)frame_get_f_exc_type,
+                        (setter)frame_set_f_exc_type, NULL},
+        {"f_exc_value", (getter)frame_get_f_exc_value,
+                        (setter)frame_set_f_exc_value, NULL},
 	{0}
 };
 


More information about the Python-checkins mailing list