[pypy-svn] r39819 - in pypy/dist/pypy: config doc/config interpreter module/__builtin__ objspace/std

cfbolz at codespeak.net cfbolz at codespeak.net
Sat Mar 3 17:07:28 CET 2007


Author: cfbolz
Date: Sat Mar  3 17:07:26 2007
New Revision: 39819

Added:
   pypy/dist/pypy/doc/config/objspace.honor__builtins__.txt
Modified:
   pypy/dist/pypy/config/pypyoption.py
   pypy/dist/pypy/interpreter/pyframe.py
   pypy/dist/pypy/interpreter/pyopcode.py
   pypy/dist/pypy/module/__builtin__/__init__.py
   pypy/dist/pypy/objspace/std/objspace.py
Log:
(arigo, pedronis, cfbolz): disable by default the jumping-through-hoops that
CPython does for picking the builtins a frame is using.


Modified: pypy/dist/pypy/config/pypyoption.py
==============================================================================
--- pypy/dist/pypy/config/pypyoption.py	(original)
+++ pypy/dist/pypy/config/pypyoption.py	Sat Mar  3 17:07:26 2007
@@ -99,6 +99,10 @@
     BoolOption("usepycfiles", "Write and read pyc files when importing",
                default=True),
    
+    BoolOption("honor__builtins__",
+               "Honor the __builtins__ key of a module dictionary",
+               default=False),
+
     OptionDescription("std", "Standard Object Space Options", [
         BoolOption("withtproxy", "support transparent proxies",
                    default=False, cmdline='--with-transparent-proxy'),

Added: pypy/dist/pypy/doc/config/objspace.honor__builtins__.txt
==============================================================================

Modified: pypy/dist/pypy/interpreter/pyframe.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyframe.py	(original)
+++ pypy/dist/pypy/interpreter/pyframe.py	Sat Mar  3 17:07:26 2007
@@ -52,12 +52,19 @@
         self.valuestack_w = [None] * code.co_stacksize
         self.valuestackdepth = 0
         self.blockstack = []
-        self.builtin = space.builtin.pick_builtin(w_globals)
+        if space.config.objspace.honor__builtins__:
+            self.builtin = space.builtin.pick_builtin(w_globals)
         # regular functions always have CO_OPTIMIZED and CO_NEWLOCALS.
         # class bodies only have CO_NEWLOCALS.
         self.initialize_frame_scopes(closure)
         self.fastlocals_w = [None]*self.numlocals
         self.f_lineno = self.pycode.co_firstlineno
+
+    def get_builtin(self):
+        if self.space.config.objspace.honor__builtins__:
+            return self.builtin
+        else:
+            return self.space.builtin
         
     def initialize_frame_scopes(self, closure): 
         # regular functions always have CO_OPTIMIZED and CO_NEWLOCALS.
@@ -187,7 +194,7 @@
         
         tup_state = [
             w(self.f_back),
-            w(self.builtin),
+            w(self.get_builtin()),
             w(self.pycode),
             w_valuestack,
             w_blockstack,
@@ -441,7 +448,7 @@
         return pytraceback.offset2lineno(self.pycode, self.last_instr)
 
     def fget_f_builtins(space, self):
-        return self.builtin.getdict()
+        return self.get_builtin().getdict()
 
     def fget_f_back(space, self):
         return self.space.wrap(self.f_back)
@@ -490,7 +497,9 @@
         return space.w_None
          
     def fget_f_restricted(space, self):
-        return space.wrap(self.builtin is not space.builtin)
+        if space.config.objspace.honor__builtins__:
+            return space.wrap(self.builtin is not space.builtin)
+        return space.w_False
 
 # ____________________________________________________________
 

Modified: pypy/dist/pypy/interpreter/pyopcode.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyopcode.py	(original)
+++ pypy/dist/pypy/interpreter/pyopcode.py	Sat Mar  3 17:07:26 2007
@@ -507,7 +507,8 @@
         w_compile_flags = f.space.wrap(flags)
         w_resulttuple = prepare_exec(f.space, f.space.wrap(f), w_prog,
                                      w_globals, w_locals,
-                                     w_compile_flags, f.space.wrap(f.builtin),
+                                     w_compile_flags,
+                                     f.space.wrap(f.get_builtin()),
                                      f.space.gettypeobject(PyCode.typedef))
         w_prog, w_globals, w_locals = f.space.unpacktuple(w_resulttuple, 3)
 
@@ -541,7 +542,7 @@
         w_name        = f.popvalue()
         w_metaclass = find_metaclass(f.space, w_bases,
                                      w_methodsdict, f.w_globals,
-                                     f.space.wrap(f.builtin)) 
+                                     f.space.wrap(f.get_builtin())) 
         w_newclass = f.space.call_function(w_metaclass, w_name,
                                            w_bases, w_methodsdict)
         f.pushvalue(w_newclass)
@@ -607,7 +608,7 @@
         w_value = f.space.finditem(f.w_globals, w_varname)
         if w_value is None:
             # not in the globals, now look in the built-ins
-            w_value = f.builtin.getdictvalue(f.space, w_varname)
+            w_value = f.get_builtin().getdictvalue(f.space, w_varname)
             if w_value is None:
                 varname = f.space.str_w(w_varname)
                 message = "global name '%s' is not defined" % varname
@@ -697,7 +698,7 @@
         w_modulename = f.getname_w(nameindex)
         modulename = f.space.str_w(w_modulename)
         w_fromlist = f.popvalue()
-        w_import = f.builtin.getdictvalue_w(f.space, '__import__')
+        w_import = f.get_builtin().getdictvalue_w(f.space, '__import__')
         if w_import is None:
             raise OperationError(space.w_ImportError,
                                  space.wrap("__import__ not found"))

Modified: pypy/dist/pypy/module/__builtin__/__init__.py
==============================================================================
--- pypy/dist/pypy/module/__builtin__/__init__.py	(original)
+++ pypy/dist/pypy/module/__builtin__/__init__.py	Sat Mar  3 17:07:26 2007
@@ -135,6 +135,8 @@
 
     def pick_builtin(self, w_globals):
        "Look up the builtin module to use from the __builtins__ global"
+       # pick the __builtins__ roughly in the same way CPython does it
+       # this is obscure and slow
        space = self.space
        try:
            w_builtin = space.getitem(w_globals, space.wrap('__builtins__'))

Modified: pypy/dist/pypy/objspace/std/objspace.py
==============================================================================
--- pypy/dist/pypy/objspace/std/objspace.py	(original)
+++ pypy/dist/pypy/objspace/std/objspace.py	Sat Mar  3 17:07:26 2007
@@ -95,9 +95,9 @@
                 assert isinstance(w_globals, W_DictMultiObject)
                 w_value = w_globals.implementation.get_builtin_indexed(num)
                 if w_value is None:
-                    w_builtins = f.builtin
-                    assert isinstance(w_builtins, Module)
-                    w_builtin_dict = w_builtins.w_dict
+                    builtins = f.get_builtin()
+                    assert isinstance(builtins, Module)
+                    w_builtin_dict = builtins.w_dict
                     assert isinstance(w_builtin_dict, W_DictMultiObject)
                     w_value = w_builtin_dict.implementation.get_builtin_indexed(num)
         ##                 if w_value is not None:



More information about the Pypy-commit mailing list