[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