Author: Aaron Tubbs <tu...@google.com>
Branch: 
Changeset: r82039:3280ef85d9b7
Date: 2016-02-01 15:44 -0800
http://bitbucket.org/pypy/pypy/changeset/3280ef85d9b7/

Log:    Adding support for f_locals to frameobject in CPyExt.

diff --git a/pypy/module/cpyext/frameobject.py 
b/pypy/module/cpyext/frameobject.py
--- a/pypy/module/cpyext/frameobject.py
+++ b/pypy/module/cpyext/frameobject.py
@@ -17,6 +17,7 @@
 PyFrameObjectFields = (PyObjectFields +
     (("f_code", PyCodeObject),
      ("f_globals", PyObject),
+     ("f_locals", PyObject),
      ("f_lineno", rffi.INT),
      ))
 cpython_struct("PyFrameObject", PyFrameObjectFields, PyFrameObjectStruct)
@@ -35,6 +36,7 @@
     py_frame = rffi.cast(PyFrameObject, py_obj)
     py_frame.c_f_code = rffi.cast(PyCodeObject, make_ref(space, frame.pycode))
     py_frame.c_f_globals = make_ref(space, frame.get_w_globals())
+    py_frame.c_f_locals = make_ref(space, frame.get_w_locals())
     rffi.setintfield(py_frame, 'c_f_lineno', frame.getorcreatedebug().f_lineno)
 
 @cpython_api([PyObject], lltype.Void, external=False)
@@ -43,6 +45,7 @@
     py_code = rffi.cast(PyObject, py_frame.c_f_code)
     Py_DecRef(space, py_code)
     Py_DecRef(space, py_frame.c_f_globals)
+    Py_DecRef(space, py_frame.c_f_locals)
     from pypy.module.cpyext.object import PyObject_dealloc
     PyObject_dealloc(space, py_obj)
 
@@ -72,6 +75,7 @@
     space.interp_w(PyCode, w_code) # sanity check
     py_frame.c_f_code = rffi.cast(PyCodeObject, make_ref(space, w_code))
     py_frame.c_f_globals = make_ref(space, w_globals)
+    py_frame.c_f_locals = make_ref(space, w_locals)
     return py_frame
 
 @cpython_api([PyFrameObject], rffi.INT_real, error=-1)
diff --git a/pypy/module/cpyext/include/frameobject.h 
b/pypy/module/cpyext/include/frameobject.h
--- a/pypy/module/cpyext/include/frameobject.h
+++ b/pypy/module/cpyext/include/frameobject.h
@@ -8,6 +8,7 @@
     PyObject_HEAD
     PyCodeObject *f_code;
     PyObject *f_globals;
+    PyObject *f_locals;
     int f_lineno;
 } PyFrameObject;
 
diff --git a/pypy/module/cpyext/test/test_frameobject.py 
b/pypy/module/cpyext/test/test_frameobject.py
--- a/pypy/module/cpyext/test/test_frameobject.py
+++ b/pypy/module/cpyext/test/test_frameobject.py
@@ -9,6 +9,7 @@
                  PyObject *py_srcfile = PyString_FromString("filename");
                  PyObject *py_funcname = PyString_FromString("funcname");
                  PyObject *py_globals = PyDict_New();
+                 PyObject *py_locals = PyDict_New();
                  PyObject *empty_string = PyString_FromString("");
                  PyObject *empty_tuple = PyTuple_New(0);
                  PyCodeObject *py_code;
@@ -39,7 +40,7 @@
                      PyThreadState_Get(), /*PyThreadState *tstate,*/
                      py_code,             /*PyCodeObject *code,*/
                      py_globals,          /*PyObject *globals,*/
-                     0                    /*PyObject *locals*/
+                     py_locals            /*PyObject *locals*/
                  );
                  if (!py_frame) goto bad;
                  py_frame->f_lineno = 48; /* Does not work with CPython */
@@ -51,6 +52,7 @@
                  Py_XDECREF(empty_string);
                  Py_XDECREF(empty_tuple);
                  Py_XDECREF(py_globals);
+                 Py_XDECREF(py_locals);
                  Py_XDECREF(py_code);
                  Py_XDECREF(py_frame);
                  return NULL;
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to