[pypy-svn] r74565 - in pypy/trunk/pypy/module/cpyext: . test

afa at codespeak.net afa at codespeak.net
Wed May 19 09:58:18 CEST 2010


Author: afa
Date: Wed May 19 09:58:17 2010
New Revision: 74565

Modified:
   pypy/trunk/pypy/module/cpyext/eval.py
   pypy/trunk/pypy/module/cpyext/test/test_eval.py
Log:
Implement PyEval_GetBuiltins


Modified: pypy/trunk/pypy/module/cpyext/eval.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/eval.py	(original)
+++ pypy/trunk/pypy/module/cpyext/eval.py	Wed May 19 09:58:17 2010
@@ -1,12 +1,27 @@
 from pypy.interpreter.error import OperationError
 from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import (
-    cpython_api, PyObject, CANNOT_FAIL, CONST_STRING)
+from pypy.module.cpyext.api import cpython_api, CANNOT_FAIL, CONST_STRING
+from pypy.module.cpyext.pyobject import PyObject, borrow_from
 
 @cpython_api([PyObject, PyObject, PyObject], PyObject)
 def PyEval_CallObjectWithKeywords(space, w_obj, w_arg, w_kwds):
     return space.call(w_obj, w_arg, w_kwds)
 
+ at cpython_api([], PyObject)
+def PyEval_GetBuiltins(space):
+    """Return a dictionary of the builtins in the current execution
+    frame, or the interpreter of the thread state if no frame is
+    currently executing."""
+    caller = space.getexecutioncontext().gettopframe_nohidden()
+    if caller is not None:
+        w_globals = caller.w_globals
+        w_builtins = space.getitem(w_globals, space.wrap('__builtins__'))
+        if not space.isinstance_w(w_builtins, space.w_dict):
+            w_builtins = w_builtins.getdict()
+    else:
+        w_builtins = space.builtin.getdict()
+    return borrow_from(None, w_builtins)
+
 @cpython_api([PyObject, PyObject], PyObject)
 def PyObject_CallObject(space, w_obj, w_arg):
     """

Modified: pypy/trunk/pypy/module/cpyext/test/test_eval.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/test/test_eval.py	(original)
+++ pypy/trunk/pypy/module/cpyext/test/test_eval.py	Wed May 19 09:58:17 2010
@@ -76,6 +76,26 @@
         assert 42 * 43 == space.unwrap(
             api.PyObject_GetItem(w_globals, space.wrap("a")))
 
+    def test_getbuiltins(self, space, api):
+        assert api.PyEval_GetBuiltins() is space.builtin.w_dict
+
+        from pypy.interpreter.gateway import ObjSpace, interp2app
+        def cpybuiltins(space):
+            return api.PyEval_GetBuiltins()
+        cpybuiltins.unwrap_spec = [ObjSpace]
+        w_cpybuiltins = space.wrap(interp2app(cpybuiltins))
+
+        w_result = space.appexec([w_cpybuiltins], """(cpybuiltins):
+            return cpybuiltins() is __builtins__.__dict__
+        """)
+        assert space.is_true(w_result)
+
+        w_result = space.appexec([w_cpybuiltins], """(cpybuiltins):
+            d = dict(__builtins__={'len':len}, cpybuiltins=cpybuiltins)
+            return eval("cpybuiltins()", d, d)
+        """)
+        assert space.int_w(space.len(w_result)) == 1
+
 
 class AppTestCall(AppTestCpythonExtensionBase):
     def test_CallFunction(self):



More information about the Pypy-commit mailing list