[pypy-svn] r10576 - in pypy/dist/pypy/module: builtin test

pedronis at codespeak.net pedronis at codespeak.net
Wed Apr 13 15:06:49 CEST 2005


Author: pedronis
Date: Wed Apr 13 15:06:49 2005
New Revision: 10576

Modified:
   pypy/dist/pypy/module/builtin/compiling.py
   pypy/dist/pypy/module/test/test_builtin.py
Log:
fix eval builtins access; eval("len([])") now works



Modified: pypy/dist/pypy/module/builtin/compiling.py
==============================================================================
--- pypy/dist/pypy/module/builtin/compiling.py	(original)
+++ pypy/dist/pypy/module/builtin/compiling.py	Wed Apr 13 15:06:49 2005
@@ -58,10 +58,13 @@
         raise OperationError(space.w_TypeError,
               w('eval() arg 1 must be a string or code object'))
 
+    try:
+        caller = space.getexecutioncontext().framestack.top()
+    except IndexError:
+        caller = None
+
     if w_globals is None:
-        try:
-            caller = space.getexecutioncontext().framestack.top()
-        except IndexError:
+        if caller is None:
             w_globals = w_locals = space.newdict([])
         else:
             w_globals = caller.w_globals
@@ -69,4 +72,12 @@
     elif w_locals is None:
         w_locals = w_globals
 
+    try:
+        space.getitem(w_globals, space.wrap('__builtins__'))
+    except OperationError, e:
+        if not e.match(space, space.w_KeyError):
+            raise
+        if caller is not None:
+            space.setitem(w_globals, space.wrap('__builtins__'), caller.builtin)
+
     return space.interpclass_w(w_codeobj).exec_code(space, w_globals, w_locals)

Modified: pypy/dist/pypy/module/test/test_builtin.py
==============================================================================
--- pypy/dist/pypy/module/test/test_builtin.py	(original)
+++ pypy/dist/pypy/module/test/test_builtin.py	Wed Apr 13 15:06:49 2005
@@ -320,6 +320,8 @@
     def test_eval(self):
         assert eval("1+2") == 3
         assert eval(" \t1+2\n") == 3
+        assert eval("len([])") == 0
+        assert eval("len([])", {}) == 0        
 
     def test_compile(self):
         co = compile('1+2', '?', 'eval')



More information about the Pypy-commit mailing list