Author: Amaury Forgeot d'Arc <amaur...@gmail.com>
Branch: py3.5
Changeset: r83885:55f9c52f86f4
Date: 2016-04-25 23:20 +0200
http://bitbucket.org/pypy/pypy/changeset/55f9c52f86f4/

Log:    Hack until the objspace can start and pass some tests.

diff --git a/lib-python/3/importlib/_bootstrap.py 
b/lib-python/3/importlib/_bootstrap.py
--- a/lib-python/3/importlib/_bootstrap.py
+++ b/lib-python/3/importlib/_bootstrap.py
@@ -1137,6 +1137,6 @@
     sys.meta_path.append(FrozenImporter)
 
     global _bootstrap_external
-    import _frozen_importlib_external
+    _frozen_importlib_external = sys.modules['_frozen_importlib_external']
     _bootstrap_external = _frozen_importlib_external
     _frozen_importlib_external._install(sys.modules[__name__])
diff --git a/pypy/interpreter/astcompiler/assemble.py 
b/pypy/interpreter/astcompiler/assemble.py
--- a/pypy/interpreter/astcompiler/assemble.py
+++ b/pypy/interpreter/astcompiler/assemble.py
@@ -557,7 +557,6 @@
     ops.LIST_APPEND: -1,
     ops.SET_ADD: -1,
     ops.MAP_ADD: -2,
-    ops.STORE_MAP: -2,
 
     ops.BINARY_POWER: -1,
     ops.BINARY_MULTIPLY: -1,
@@ -597,9 +596,9 @@
 
     ops.PRINT_EXPR: -1,
 
-    ops.WITH_CLEANUP: -1,
+    ops.WITH_CLEANUP_START: -1,
+    ops.WITH_CLEANUP_FINISH: -1,  # XXX Sometimes more
     ops.LOAD_BUILD_CLASS: 1,
-    ops.STORE_LOCALS: -1,
     ops.POP_BLOCK: 0,
     ops.POP_EXCEPT: -1,
     ops.END_FINALLY: -4,     # assume always 4: we pretend that SETUP_FINALLY
@@ -612,7 +611,6 @@
     ops.RETURN_VALUE: -1,
     ops.YIELD_VALUE: 0,
     ops.YIELD_FROM: -1,
-    ops.BUILD_MAP: 1,
     ops.COMPARE_OP: -1,
 
     ops.LOOKUP_METHOD: 1,
@@ -672,6 +670,12 @@
 def _compute_BUILD_SET(arg):
     return 1 - arg
 
+def _compute_BUILD_MAP(arg):
+    return 1 - 2 * arg
+
+def _compute_BUILD_MAP_UNPACK(arg):
+    return 1 - arg
+
 def _compute_MAKE_CLOSURE(arg):
     return -2 - _num_args(arg) - ((arg >> 16) & 0xFFFF)
 
diff --git a/pypy/interpreter/astcompiler/codegen.py 
b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -274,8 +274,7 @@
             return False
 
     def _get_code_flags(self):
-        # Default for everything but module scopes.
-        return consts.CO_NEWLOCALS
+        return 0
 
     def _handle_body(self, body):
         """Compile a list of statements, handling doc strings if needed."""
@@ -865,7 +864,8 @@
         self.load_const(self.space.w_None)
         self.use_next_block(cleanup)
         self.push_frame_block(F_BLOCK_FINALLY_END, cleanup)
-        self.emit_op(ops.WITH_CLEANUP)
+        self.emit_op(ops.WITH_CLEANUP_START)
+        self.emit_op(ops.WITH_CLEANUP_FINISH)
         self.emit_op(ops.END_FINALLY)
         self.pop_frame_block(F_BLOCK_FINALLY_END, cleanup)
 
@@ -1062,12 +1062,26 @@
 
     def visit_Dict(self, d):
         self.update_position(d.lineno)
-        self.emit_op_arg(ops.BUILD_MAP, 0)
+        containers = 0
+        elements = 0
         if d.values:
             for i in range(len(d.values)):
+                if elements == 0xFFFF:
+                    self.emit_op_arg(ops.BUILD_MAP, elements)
+                    containers += 1
+                    elements = 0
                 d.values[i].walkabout(self)
                 d.keys[i].walkabout(self)
-                self.emit_op(ops.STORE_MAP)
+                elements += 1
+        if elements or containers == 0:
+            self.emit_op_arg(ops.BUILD_MAP, elements)
+            containers += 1
+        # If there is more than one dict, they need to be merged into
+        # a new dict.
+        while containers > 1:
+            oparg = max(containers, 255)
+            self.emit_op_arg(ops.BUILD_MAP_UNPACK, oparg)
+            containers -= (oparg - 1)
 
     def visit_Set(self, s):
         self.update_position(s.lineno)
@@ -1289,7 +1303,7 @@
     def _get_code_flags(self):
         scope = self.scope
         assert isinstance(scope, symtable.FunctionScope)
-        flags = 0
+        flags = consts.CO_NEWLOCALS
         if scope.optimized:
             flags |= consts.CO_OPTIMIZED
         if scope.nested:
@@ -1372,10 +1386,6 @@
         self.ensure_docstring_constant(cls.body)
         self.lineno = self.first_lineno
         self.argcount = 1
-        # load the first argument (__locals__) ...
-        self.emit_op_arg(ops.LOAD_FAST, 0)
-        # ...and store it into f_locals.
-        self.emit_op(ops.STORE_LOCALS)
         # load (global) __name__ ...
         self.name_op("__name__", ast.Load)
         # ... and store it as __module__
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -380,10 +380,6 @@
                 self.STORE_FAST(oparg, next_instr)
             elif opcode == opcodedesc.STORE_GLOBAL.index:
                 self.STORE_GLOBAL(oparg, next_instr)
-            elif opcode == opcodedesc.STORE_LOCALS.index:
-                self.STORE_LOCALS(oparg, next_instr)
-            elif opcode == opcodedesc.STORE_MAP.index:
-                self.STORE_MAP(oparg, next_instr)
             elif opcode == opcodedesc.STORE_NAME.index:
                 self.STORE_NAME(oparg, next_instr)
             elif opcode == opcodedesc.STORE_SUBSCR.index:
@@ -400,8 +396,10 @@
                 self.UNPACK_EX(oparg, next_instr)
             elif opcode == opcodedesc.UNPACK_SEQUENCE.index:
                 self.UNPACK_SEQUENCE(oparg, next_instr)
-            elif opcode == opcodedesc.WITH_CLEANUP.index:
-                self.WITH_CLEANUP(oparg, next_instr)
+            elif opcode == opcodedesc.WITH_CLEANUP_START.index:
+                self.WITH_CLEANUP_START(oparg, next_instr)
+            elif opcode == opcodedesc.WITH_CLEANUP_FINISH.index:
+                self.WITH_CLEANUP_FINISH(oparg, next_instr)
             elif opcode == opcodedesc.YIELD_VALUE.index:
                 self.YIELD_VALUE(oparg, next_instr)
             elif opcode == opcodedesc.YIELD_FROM.index:
@@ -692,9 +690,6 @@
     def LOAD_LOCALS(self, oparg, next_instr):
         self.pushvalue(self.getorcreatedebug().w_locals)
 
-    def STORE_LOCALS(self, oparg, next_instr):
-        self.getorcreatedebug().w_locals = self.popvalue()
-
     def exec_(self, w_prog, w_globals, w_locals):
         """The builtins.exec function."""
         space = self.space
@@ -1138,7 +1133,7 @@
         self.lastblock = block
         self.pushvalue(w_result)
 
-    def WITH_CLEANUP(self, oparg, next_instr):
+    def WITH_CLEANUP_START(self, oparg, next_instr):
         # see comment in END_FINALLY for stack state
         w_unroller = self.popvalue()
         w_exitfunc = self.popvalue()
@@ -1149,21 +1144,28 @@
             old_last_exception = self.last_exception
             self.last_exception = operr
             w_traceback = self.space.wrap(operr.get_traceback())
-            w_suppress = self.call_contextmanager_exit_function(
+            w_res = self.call_contextmanager_exit_function(
                 w_exitfunc,
                 operr.w_type,
                 operr.get_w_value(self.space),
                 w_traceback)
             self.last_exception = old_last_exception
+        else:
+            w_res = self.call_contextmanager_exit_function(
+                w_exitfunc,
+                self.space.w_None,
+                self.space.w_None,
+                self.space.w_None)
+        self.pushvalue(w_res)
+        self.pushvalue(w_unroller)
+
+    def WITH_CLEANUP_FINISH(self, oparg, next_instr):
+        w_unroller = self.popvalue()
+        w_suppress = self.popvalue()
+        if isinstance(w_unroller, SApplicationException):
             if self.space.is_true(w_suppress):
                 # __exit__() returned True -> Swallow the exception.
                 self.settopvalue(self.space.w_None)
-        else:
-            self.call_contextmanager_exit_function(
-                w_exitfunc,
-                self.space.w_None,
-                self.space.w_None,
-                self.space.w_None)
 
     @jit.unroll_safe
     def call_function(self, oparg, w_star=None, w_starstar=None):
@@ -1309,6 +1311,10 @@
 
     def BUILD_MAP(self, itemcount, next_instr):
         w_dict = self.space.newdict()
+        for i in range(itemcount):
+            w_key = self.popvalue()
+            w_value = self.popvalue()
+            self.space.setitem(w_dict, w_key, w_value)
         self.pushvalue(w_dict)
 
     @jit.unroll_safe
@@ -1319,12 +1325,6 @@
             self.space.call_method(w_set, 'add', w_item)
         self.pushvalue(w_set)
 
-    def STORE_MAP(self, oparg, next_instr):
-        w_key = self.popvalue()
-        w_value = self.popvalue()
-        w_dict = self.peekvalue()
-        self.space.setitem(w_dict, w_key, w_value)
-
 
 ### ____________________________________________________________ ###
 
diff --git a/pypy/module/__builtin__/compiling.py 
b/pypy/module/__builtin__/compiling.py
--- a/pypy/module/__builtin__/compiling.py
+++ b/pypy/module/__builtin__/compiling.py
@@ -3,11 +3,12 @@
 """
 
 from pypy.interpreter.pycode import PyCode
-from pypy.interpreter.error import OperationError
+from pypy.interpreter.error import OperationError, oefmt
 from pypy.interpreter.astcompiler import consts, ast
 from pypy.interpreter.gateway import unwrap_spec
 from pypy.interpreter.argument import Arguments
 from pypy.interpreter.nestedscope import Cell
+from pypy.interpreter.function import Function
 
 @unwrap_spec(filename='fsencode', mode=str, flags=int, dont_inherit=int,
              optimize=int)
@@ -94,6 +95,8 @@
     frame.exec_(w_prog, w_globals, w_locals)
 
 def build_class(space, w_func, w_name, __args__):
+    if not isinstance(w_func, Function):
+        raise oefmt(space.w_TypeError, "__build_class__: func must be a 
function")
     bases_w, kwds_w = __args__.unpack()
     w_bases = space.newtuple(bases_w)
     w_meta = kwds_w.pop('metaclass', None)
@@ -124,7 +127,7 @@
                          keywords=keywords,
                          keywords_w=kwds_w.values())
         w_namespace = space.call_args(w_prep, args)
-    w_cell = space.call_function(w_func, w_namespace)
+    w_cell = w_func.getcode().exec_code(space, w_func.w_func_globals, 
w_namespace)
     keywords = kwds_w.keys()
     args = Arguments(space,
                      args_w=[w_name, w_bases, w_namespace],
diff --git a/pypy/module/_frozen_importlib/__init__.py 
b/pypy/module/_frozen_importlib/__init__.py
--- a/pypy/module/_frozen_importlib/__init__.py
+++ b/pypy/module/_frozen_importlib/__init__.py
@@ -13,22 +13,33 @@
     appleveldefs = {
         }
 
+    @staticmethod
+    def _compile_bootstrap_module(space, name, w_name, w_dict):
+        """NOT_RPYTHON"""
+        ec = space.getexecutioncontext()
+        with open(os.path.join(lib_python, 'importlib', name + '.py')) as fp:
+            source = fp.read()
+        pathname = "<frozen importlib.%s>" % name
+        code_w = ec.compiler.compile(source, pathname, 'exec', 0)
+        space.setitem(w_dict, space.wrap('__name__'), w_name)
+        space.setitem(w_dict, space.wrap('__builtins__'),
+                      space.wrap(space.builtin))
+        code_w.exec_code(space, w_dict, w_dict)
+
     def install(self):
         """NOT_RPYTHON"""
         super(Module, self).install()
         space = self.space
+        # "import importlib/_boostrap_external.py"
+        w_mod = Module(space, space.wrap("_frozen_importlib_external"))
+        self._compile_bootstrap_module(
+            space, '_bootstrap_external', w_mod.w_name, w_mod.w_dict)
+        space.sys.setmodule(w_mod)
         # "from importlib/_boostrap.py import *"
         # It's not a plain "import importlib._boostrap", because we
         # don't want to freeze importlib.__init__.
-        ec = space.getexecutioncontext()
-        with open(os.path.join(lib_python, 'importlib', '_bootstrap.py')) as 
fp:
-            source = fp.read()
-        pathname = "<frozen importlib._bootstrap>"
-        code_w = ec.compiler.compile(source, pathname, 'exec', 0)
-        space.setitem(self.w_dict, space.wrap('__name__'), self.w_name)
-        space.setitem(self.w_dict, space.wrap('__builtins__'),
-                      space.wrap(space.builtin))
-        code_w.exec_code(space, self.w_dict, self.w_dict)
+        self._compile_bootstrap_module(
+            space, '_bootstrap', self.w_name, self.w_dict)
 
         self.w_import = space.wrap(interp_import.import_with_frames_removed)
 
diff --git a/pypy/module/imp/__init__.py b/pypy/module/imp/__init__.py
--- a/pypy/module/imp/__init__.py
+++ b/pypy/module/imp/__init__.py
@@ -13,10 +13,12 @@
         'get_magic':       'interp_imp.get_magic',
         'get_tag':         'interp_imp.get_tag',
         'load_dynamic':    'interp_imp.load_dynamic',
-        'init_builtin':    'interp_imp.init_builtin',
+        'create_builtin':  'interp_imp.create_builtin',
         'init_frozen':     'interp_imp.init_frozen',
         'is_builtin':      'interp_imp.is_builtin',
         'is_frozen':       'interp_imp.is_frozen',
+        'exec_builtin':    'interp_imp.exec_builtin',
+        'exec_dynamic':    'interp_imp.exec_builtin',
         'get_frozen_object': 'interp_imp.get_frozen_object',
         'is_frozen_package': 'interp_imp.is_frozen_package',
 
diff --git a/pypy/module/imp/interp_imp.py b/pypy/module/imp/interp_imp.py
--- a/pypy/module/imp/interp_imp.py
+++ b/pypy/module/imp/interp_imp.py
@@ -64,10 +64,9 @@
 
     return importing.check_sys_modules(space, w_modulename)
 
-def init_builtin(space, w_name):
+def create_builtin(space, w_spec):
+    w_name = space.getattr(w_spec, space.wrap("name"))
     name = space.str0_w(w_name)
-    if name not in space.builtin_modules:
-        return
     # force_init is needed to make reload actually reload instead of just
     # using the already-present module in sys.modules.
 
@@ -76,6 +75,9 @@
     reuse = space.finditem(space.sys.get('modules'), w_name) is not None
     return space.getbuiltinmodule(name, force_init=True, reuse=reuse)
 
+def exec_builtin(space, w_mod):
+    return  # Until we really support ModuleDef
+
 def init_frozen(space, w_name):
     return None
 
diff --git a/pypy/module/posix/__init__.py b/pypy/module/posix/__init__.py
--- a/pypy/module/posix/__init__.py
+++ b/pypy/module/posix/__init__.py
@@ -193,7 +193,10 @@
 
     def startup(self, space):
         from pypy.module.posix import interp_posix
+        from pypy.module.imp import importing
         interp_posix.get(space).startup(space)
+        # Import structseq before the full importlib is ready
+        importing.importhook(space, '_structseq')
 
 for constant in dir(os):
     value = getattr(os, constant)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to