[pypy-svn] r73394 - in pypy/branch/decouple-host-opcodes/pypy: . interpreter objspace/flow objspace/flow/test objspace/std tool

Maciej Fijalkowski fijall at gmail.com
Mon Apr 5 04:24:16 CEST 2010


Does this pass objspace/flow tests? I wonder if you can decouple them.

On Sun, Apr 4, 2010 at 6:16 PM,  <antoine at codespeak.net> wrote:
> Author: antoine
> Date: Mon Apr  5 02:16:09 2010
> New Revision: 73394
>
> Modified:
>   pypy/branch/decouple-host-opcodes/pypy/   (props changed)
>   pypy/branch/decouple-host-opcodes/pypy/interpreter/baseobjspace.py
>   pypy/branch/decouple-host-opcodes/pypy/interpreter/function.py
>   pypy/branch/decouple-host-opcodes/pypy/interpreter/pyframe.py
>   pypy/branch/decouple-host-opcodes/pypy/interpreter/pyopcode.py
>   pypy/branch/decouple-host-opcodes/pypy/objspace/flow/flowcontext.py
>   pypy/branch/decouple-host-opcodes/pypy/objspace/flow/test/test_objspace.py
>   pypy/branch/decouple-host-opcodes/pypy/objspace/std/frame.py
>   pypy/branch/decouple-host-opcodes/pypy/objspace/std/objspace.py
>   pypy/branch/decouple-host-opcodes/pypy/tool/stdlib_opcode.py
> Log:
> Initial draft, using separate subclasses for pypy bytecode frames
> and host bytecode frames.
> Not sure it translates properly, although I've already fixed a
> couple of issues.
>
>
>
> Modified: pypy/branch/decouple-host-opcodes/pypy/interpreter/baseobjspace.py
> ==============================================================================
> --- pypy/branch/decouple-host-opcodes/pypy/interpreter/baseobjspace.py  (original)
> +++ pypy/branch/decouple-host-opcodes/pypy/interpreter/baseobjspace.py  Mon Apr  5 02:16:09 2010
> @@ -257,8 +257,13 @@
>         self.actionflag.register_action(self.user_del_action)
>         self.actionflag.register_action(self.frame_trace_action)
>
> -        from pypy.interpreter.pyframe import PyFrame
> -        self.FrameClass = PyFrame    # can be overridden to a subclass
> +        from pypy.interpreter.pycode import cpython_magic, default_magic
> +        from pypy.interpreter.pyframe import PyPyFrame, HostPyFrame
> +        self.our_magic = default_magic
> +        self.host_magic = cpython_magic
> +        # can be overridden to a subclass
> +        self.FrameClass = PyPyFrame
> +        self.HostFrameClass = HostPyFrame
>
>         if self.config.objspace.logbytecodes:
>             self.bytecodecounts = [0] * 256
> @@ -589,7 +594,12 @@
>
>     def createframe(self, code, w_globals, closure=None):
>         "Create an empty PyFrame suitable for this code object."
> -        return self.FrameClass(self, code, w_globals, closure)
> +        magic = code.magic
> +        if magic == self.host_magic:
> +            return self.HostFrameClass(self, code, w_globals, closure)
> +        elif magic == self.our_magic:
> +            return self.FrameClass(self, code, w_globals, closure)
> +        raise ValueError("bad magic %s" % magic)
>
>     def allocate_lock(self):
>         """Return an interp-level Lock object if threads are enabled,
>
> Modified: pypy/branch/decouple-host-opcodes/pypy/interpreter/function.py
> ==============================================================================
> --- pypy/branch/decouple-host-opcodes/pypy/interpreter/function.py      (original)
> +++ pypy/branch/decouple-host-opcodes/pypy/interpreter/function.py      Mon Apr  5 02:16:09 2010
> @@ -236,9 +236,9 @@
>         from pypy.interpreter.gateway import BuiltinCode
>         if isinstance(self.code, BuiltinCode):
>             identifier = self.code.identifier
> -            if Function._all.get(identifier, self) is not self:
> -                print "builtin code identifier %s used twice: %s and %s" % (
> -                    identifier, self, Function._all[identifier])
> +            #if Function._all.get(identifier, self) is not self:
> +                #print "builtin code identifier %s used twice: %s and %s" % (
> +                    #identifier, self, Function._all[identifier])
>             # we have been seen by other means so rtyping should not choke
>             # on us
>             Function._all[identifier] = self
>
> Modified: pypy/branch/decouple-host-opcodes/pypy/interpreter/pyframe.py
> ==============================================================================
> --- pypy/branch/decouple-host-opcodes/pypy/interpreter/pyframe.py       (original)
> +++ pypy/branch/decouple-host-opcodes/pypy/interpreter/pyframe.py       Mon Apr  5 02:16:09 2010
> @@ -135,8 +135,9 @@
>         from pypy.rlib import rstack
>         # the following 'assert' is an annotation hint: it hides from
>         # the annotator all methods that are defined in PyFrame but
> -        # overridden in the FrameClass subclass of PyFrame.
> -        assert isinstance(self, self.space.FrameClass)
> +        # overridden in the {,Host}FrameClass subclasses of PyFrame.
> +        assert (isinstance(self, self.space.FrameClass)
> +             or isinstance(self, self.space.HostFrameClass))
>         executioncontext = self.space.getexecutioncontext()
>         executioncontext.enter(self)
>         try:
> @@ -628,6 +629,13 @@
>             return space.wrap(self.builtin is not space.builtin)
>         return space.w_False
>
> +
> +class PyPyFrame(PyFrame):
> +    pass
> +
> +class HostPyFrame(PyFrame):
> +    pass
> +
>  # ____________________________________________________________
>
>  def get_block_class(opname):
>
> Modified: pypy/branch/decouple-host-opcodes/pypy/interpreter/pyopcode.py
> ==============================================================================
> --- pypy/branch/decouple-host-opcodes/pypy/interpreter/pyopcode.py      (original)
> +++ pypy/branch/decouple-host-opcodes/pypy/interpreter/pyopcode.py      Mon Apr  5 02:16:09 2010
> @@ -14,9 +14,9 @@
>  from pypy.rlib import jit, rstackovf
>  from pypy.rlib.rarithmetic import r_uint, intmask
>  from pypy.rlib.unroll import unrolling_iterable
> -from pypy.tool.stdlib_opcode import (opcodedesc, HAVE_ARGUMENT,
> -                                     unrolling_opcode_descs,
> -                                     opcode_method_names)
> +from pypy.tool.stdlib_opcode import (unrolling_opcode_descs,
> +    HAVE_ARGUMENT, host_HAVE_ARGUMENT, opcodedesc, host_opcodedesc,
> +    opcode_method_names, host_opcode_method_names, )
>
>  def unaryoperation(operationname):
>     """NOT_RPYTHON"""
> @@ -180,7 +180,7 @@
>                 probs[opcode] = probs.get(opcode, 0) + 1
>                 self.last_opcode = opcode
>
> -            if opcode >= HAVE_ARGUMENT:
> +            if opcode >= self.HAVE_ARGUMENT:
>                 lo = ord(co_code[next_instr])
>                 hi = ord(co_code[next_instr+1])
>                 next_instr += 2
> @@ -188,16 +188,16 @@
>             else:
>                 oparg = 0
>
> -            while opcode == opcodedesc.EXTENDED_ARG.index:
> +            while opcode == self.opcodedesc.EXTENDED_ARG.index:
>                 opcode = ord(co_code[next_instr])
> -                if opcode < HAVE_ARGUMENT:
> +                if opcode < self.HAVE_ARGUMENT:
>                     raise BytecodeCorruption
>                 lo = ord(co_code[next_instr+1])
>                 hi = ord(co_code[next_instr+2])
>                 next_instr += 3
>                 oparg = (oparg << 16) | (hi << 8) | lo
>
> -            if opcode == opcodedesc.RETURN_VALUE.index:
> +            if opcode == self.opcodedesc.RETURN_VALUE.index:
>                 w_returnvalue = self.popvalue()
>                 block = self.unrollstack(SReturnValue.kind)
>                 if block is None:
> @@ -208,11 +208,11 @@
>                     next_instr = block.handle(self, unroller)
>                     return next_instr    # now inside a 'finally' block
>
> -            if opcode == opcodedesc.YIELD_VALUE.index:
> +            if opcode == self.opcodedesc.YIELD_VALUE.index:
>                 #self.last_instr = intmask(next_instr - 1) XXX clean up!
>                 raise Yield
>
> -            if opcode == opcodedesc.END_FINALLY.index:
> +            if opcode == self.opcodedesc.END_FINALLY.index:
>                 unroller = self.end_finally()
>                 if isinstance(unroller, SuspendedUnroller):
>                     # go on unrolling the stack
> @@ -225,7 +225,7 @@
>                         next_instr = block.handle(self, unroller)
>                 return next_instr
>
> -            if opcode == opcodedesc.JUMP_ABSOLUTE.index:
> +            if opcode == self.opcodedesc.JUMP_ABSOLUTE.index:
>                 return self.jump_absolute(oparg, next_instr, ec)
>
>             if we_are_translated():
> @@ -242,7 +242,7 @@
>                         # dispatch to the opcode method
>                         meth = getattr(self, opdesc.methodname)
>                         res = meth(oparg, next_instr)
> -                        if opdesc.index == opcodedesc.CALL_FUNCTION.index:
> +                        if opdesc.index == self.opcodedesc.CALL_FUNCTION.index:
>                             rstack.resume_point("dispatch_call", self, co_code, next_instr, ec)
>                         # !! warning, for the annotator the next line is not
>                         # comparing an int and None - you can't do that.
> @@ -254,7 +254,7 @@
>                     self.MISSING_OPCODE(oparg, next_instr)
>
>             else:  # when we are not translated, a list lookup is much faster
> -                methodname = opcode_method_names[opcode]
> +                methodname = self.opcode_method_names[opcode]
>                 res = getattr(self, methodname)(oparg, next_instr)
>                 if res is not None:
>                     next_instr = res
> @@ -690,26 +690,6 @@
>         w_list = self.space.newlist(items)
>         self.pushvalue(w_list)
>
> -    def BUILD_MAP(self, itemcount, next_instr):
> -        if not we_are_translated() and sys.version_info >= (2, 6):
> -            # We could pre-allocate a dict here
> -            # but for the moment this code is not translated.
> -            pass
> -        else:
> -            if itemcount != 0:
> -                raise BytecodeCorruption
> -        w_dict = self.space.newdict()
> -        self.pushvalue(w_dict)
> -
> -    def STORE_MAP(self, zero, next_instr):
> -        if not we_are_translated() and sys.version_info >= (2, 6):
> -            w_key = self.popvalue()
> -            w_value = self.popvalue()
> -            w_dict = self.peekvalue()
> -            self.space.setitem(w_dict, w_key, w_value)
> -        else:
> -            raise BytecodeCorruption
> -
>     def LOAD_ATTR(self, nameindex, next_instr):
>         "obj.attributename"
>         w_attributename = self.getname_w(nameindex)
> @@ -1020,6 +1000,48 @@
>     STOP_CODE = MISSING_OPCODE
>
>
> +class __extend__(pyframe.PyPyFrame):
> +    opcode_method_names = opcode_method_names
> +    opcodedesc = opcodedesc
> +    HAVE_ARGUMENT = HAVE_ARGUMENT
> +
> +    def BUILD_MAP(self, itemcount, next_instr):
> +        if itemcount != 0:
> +            raise BytecodeCorruption
> +        w_dict = self.space.newdict()
> +        self.pushvalue(w_dict)
> +
> +    def STORE_MAP(self, zero, next_instr):
> +        raise BytecodeCorruption
> +
> +host_version_info = sys.version_info
> +
> +class __extend__(pyframe.HostPyFrame):
> +    opcode_method_names = host_opcode_method_names
> +    opcodedesc = host_opcodedesc
> +    HAVE_ARGUMENT = host_HAVE_ARGUMENT
> +
> +    def BUILD_MAP(self, itemcount, next_instr):
> +        if host_version_info >= (2, 6):
> +            # We could pre-allocate a dict here
> +            # but for the moment this code is not translated.
> +            pass
> +        else:
> +            if itemcount != 0:
> +                raise BytecodeCorruption
> +        w_dict = self.space.newdict()
> +        self.pushvalue(w_dict)
> +
> +    def STORE_MAP(self, zero, next_instr):
> +        if host_version_info >= (2, 6):
> +            w_key = self.popvalue()
> +            w_value = self.popvalue()
> +            w_dict = self.peekvalue()
> +            self.space.setitem(w_dict, w_key, w_value)
> +        else:
> +            raise BytecodeCorruption
> +
> +
>  ### ____________________________________________________________ ###
>
>  class ExitFrame(Exception):
>
> Modified: pypy/branch/decouple-host-opcodes/pypy/objspace/flow/flowcontext.py
> ==============================================================================
> --- pypy/branch/decouple-host-opcodes/pypy/objspace/flow/flowcontext.py (original)
> +++ pypy/branch/decouple-host-opcodes/pypy/objspace/flow/flowcontext.py Mon Apr  5 02:16:09 2010
> @@ -1,7 +1,7 @@
>  import collections
>  from pypy.interpreter.executioncontext import ExecutionContext
>  from pypy.interpreter.error import OperationError
> -from pypy.interpreter import pyframe
> +from pypy.interpreter import pyframe, pycode
>  from pypy.interpreter.argument import ArgumentsForTranslation
>  from pypy.objspace.flow.model import *
>  from pypy.objspace.flow.framestate import FrameState
> @@ -219,8 +219,12 @@
>         # create an empty frame suitable for the code object
>         # while ignoring any operation like the creation of the locals dict
>         self.recorder = []
> -        frame = FlowSpaceFrame(self.space, self.code,
> -                               self.w_globals, self.closure)
> +        if self.code.magic == pycode.cpython_magic:
> +            frame = FlowSpaceHostPyFrame(self.space, self.code,
> +                                         self.w_globals, self.closure)
> +        else:
> +            frame = FlowSpacePyPyFrame(self.space, self.code,
> +                                       self.w_globals, self.closure)
>         frame.last_instr = 0
>         return frame
>
> @@ -398,7 +402,7 @@
>                 if w_v.value is oldvalue:
>                     stack_items_w[i] = w_new
>
> -class FlowSpaceFrame(pyframe.PyFrame):
> +class FlowSpaceFrameBase(object):
>     def make_arguments(self, nargs):
>         return ArgumentsForTranslation(self.space, self.peekvalues(nargs))
>     def argument_factory(self, *args):
> @@ -410,3 +414,10 @@
>             raise operr
>         return pyframe.PyFrame.handle_operation_error(self, ec, operr,
>                                                       *args, **kwds)
> +
> +class FlowSpacePyPyFrame(FlowSpaceFrameBase, pyframe.PyPyFrame):
> +    pass
> +
> +class FlowSpaceHostPyFrame(FlowSpaceFrameBase, pyframe.HostPyFrame):
> +    pass
> +
>
> Modified: pypy/branch/decouple-host-opcodes/pypy/objspace/flow/test/test_objspace.py
> ==============================================================================
> --- pypy/branch/decouple-host-opcodes/pypy/objspace/flow/test/test_objspace.py  (original)
> +++ pypy/branch/decouple-host-opcodes/pypy/objspace/flow/test/test_objspace.py  Mon Apr  5 02:16:09 2010
> @@ -826,23 +826,34 @@
>         """ Tests code generated by pypy-c compiled with CALL_METHOD
>         bytecode
>         """
> -        class X:
> -            def m(self):
> -                return 3
> -
> -        def f():
> -            x = X()
> -            return x.m()
> -
> -        # this code is generated by pypy-c when compiling above f
> -        pypy_code = 't\x00\x00\x83\x00\x00}\x00\x00|\x00\x00\x91\x02\x00\x92\x00\x00Sd\x00\x00S'
> -        new_c = self.monkey_patch_code(f.func_code, 3, 3, pypy_code, ('X', 'x', 'm'), ('x',))
> -        f2 = new.function(new_c, locals(), 'f')
> -
> -        graph = self.codetest(f2)
> -        all_ops = self.all_operations(graph)
> -        assert all_ops['simple_call'] == 2
> -        assert all_ops['getattr'] == 1
> +        from pypy.objspace.flow import flowcontext
> +        old_class = flowcontext.FlowSpaceHostPyFrame
> +        try:
> +            # HACK: we will replace a host-generated code object with a
> +            # pypy-generated code object, but it will carry the host's
> +            # magic number (since it's generated with the host's code.new).
> +            flowcontext.FlowSpaceHostPyFrame = flowcontext.FlowSpacePyPyFrame
> +            class X:
> +                def m(self):
> +                    return 3
> +
> +            def f():
> +                x = X()
> +                return x.m()
> +
> +            # this code is generated by pypy-c when compiling above f
> +            pypy_code = 't\x00\x00\x83\x00\x00}\x00\x00|\x00\x00\x91\x02\x00\x92\x00\x00Sd\x00\x00S'
> +            new_c = self.monkey_patch_code(f.func_code, 3, 3, pypy_code, ('X', 'x', 'm'), ('x',))
> +            f2 = new.function(new_c, locals(), 'f')
> +            import dis
> +            dis.dis(f2)
> +
> +            graph = self.codetest(f2)
> +            all_ops = self.all_operations(graph)
> +            assert all_ops['simple_call'] == 2
> +            assert all_ops['getattr'] == 1
> +        finally:
> +            flowcontext.FlowSpaceHostPyFrame = old_class
>
>     def test_generator(self):
>         def f():
>
> Modified: pypy/branch/decouple-host-opcodes/pypy/objspace/std/frame.py
> ==============================================================================
> --- pypy/branch/decouple-host-opcodes/pypy/objspace/std/frame.py        (original)
> +++ pypy/branch/decouple-host-opcodes/pypy/objspace/std/frame.py        Mon Apr  5 02:16:09 2010
> @@ -3,14 +3,16 @@
>  import operator
>
>  from pypy.rlib.unroll import unrolling_iterable
> -from pypy.interpreter import pyframe, pyopcode, function
> +from pypy.interpreter import pyopcode, function
>  from pypy.interpreter.error import OperationError, operationerrfmt
>  from pypy.module.__builtin__ import OPTIMIZED_BUILTINS, Module
>  from pypy.objspace.std.multimethod import FailedToImplement
>
>
> -class BaseFrame(pyframe.PyFrame):
> +
> +class BaseFrame(object):
>     """These opcodes are always overridden."""
> +    _mixin_ = True
>
>     def LIST_APPEND(f, oparg, next_instr):
>         from pypy.objspace.std.listobject import W_ListObject
> @@ -135,9 +137,9 @@
>     f.pushvalue(w_result)
>
>
> -def build_frame(space):
> +def build_frame(space, baseclass):
>     """Consider the objspace config and return a patched frame object."""
> -    class StdObjSpaceFrame(BaseFrame):
> +    class StdObjSpaceFrame(baseclass, BaseFrame):
>         pass
>     if space.config.objspace.std.optimized_int_add:
>         if space.config.objspace.std.withsmallint:
>
> Modified: pypy/branch/decouple-host-opcodes/pypy/objspace/std/objspace.py
> ==============================================================================
> --- pypy/branch/decouple-host-opcodes/pypy/objspace/std/objspace.py     (original)
> +++ pypy/branch/decouple-host-opcodes/pypy/objspace/std/objspace.py     Mon Apr  5 02:16:09 2010
> @@ -47,7 +47,9 @@
>         # setup all the object types and implementations
>         self.model = model.StdTypeModel(self.config)
>
> -        self.FrameClass = frame.build_frame(self)
> +        from pypy.interpreter.pyframe import PyPyFrame, HostPyFrame
> +        self.FrameClass = frame.build_frame(self, PyPyFrame)
> +        self.HostFrameClass = frame.build_frame(self, HostPyFrame)
>
>         if self.config.objspace.std.withrope:
>             self.StringObjectCls = W_RopeObject
> @@ -133,7 +135,7 @@
>         if not we_are_translated() and isinstance(code, CPythonFakeCode):
>             return CPythonFakeFrame(self, code, w_globals)
>         else:
> -            return self.FrameClass(self, code, w_globals, closure)
> +            return ObjSpace.createframe(self, code, w_globals, closure)
>
>     def gettypefor(self, cls):
>         return self.gettypeobject(cls.typedef)
>
> Modified: pypy/branch/decouple-host-opcodes/pypy/tool/stdlib_opcode.py
> ==============================================================================
> --- pypy/branch/decouple-host-opcodes/pypy/tool/stdlib_opcode.py        (original)
> +++ pypy/branch/decouple-host-opcodes/pypy/tool/stdlib_opcode.py        Mon Apr  5 02:16:09 2010
> @@ -4,6 +4,9 @@
>            'hasconst', 'hasname', 'hasjrel', 'hasjabs',
>            'haslocal', 'hascompare', 'hasfree', 'cmp_op']
>
> +from opcode import (
> +    opmap as host_opmap, HAVE_ARGUMENT as host_HAVE_ARGUMENT)
> +
>  def load_opcode():
>     import py
>     opcode_path = py.path.local(__file__).dirpath().dirpath().dirpath('lib-python/modified-2.5.2/opcode.py')
> @@ -23,65 +26,83 @@
>  STORE_SLICE = opmap["STORE_SLICE+0"]
>  DELETE_SLICE = opmap["DELETE_SLICE+0"]
>
> -opcode_method_names = ['MISSING_OPCODE'] * 256
> -for name, index in opmap.items():
> -    opcode_method_names[index] = name.replace('+', '_')
> +def make_method_names(opmap):
> +    tbl = ['MISSING_OPCODE'] * 256
> +    for name, index in opmap.items():
> +        tbl[index] = name.replace('+', '_')
> +    return tbl
> +
> +opcode_method_names = make_method_names(opmap)
> +host_opcode_method_names = make_method_names(host_opmap)
> +#print (
> +    #set(enumerate(opcode_method_names)) ^ set(enumerate(host_opcode_method_names))
> +#)
> +del make_method_names
>
>  # ____________________________________________________________
>  # RPython-friendly helpers and structures
>
>  from pypy.rlib.unroll import unrolling_iterable
>
> +def make_opcode_desc(HAVE_ARGUMENT):
> +    class OpcodeDesc(object):
> +        def __init__(self, name, index):
> +            self.name = name
> +            self.methodname = opcode_method_names[index]
> +            self.index = index
> +            self.hasarg = index >= HAVE_ARGUMENT
> +
> +        def _freeze_(self):
> +            return True
> +
> +        def is_enabled(self, space):
> +            """Check if the opcode should be enabled in the space's configuration.
> +            (Returns True for all standard opcodes.)"""
> +            opt = space.config.objspace.opcodes
> +            return getattr(opt, self.name, True)
> +        is_enabled._annspecialcase_ = 'specialize:memo'
> +
> +        # for predictable results, we try to order opcodes most-used-first
> +        opcodeorder = [124, 125, 100, 105, 1, 131, 116, 111, 106, 83, 23, 93, 113, 25, 95, 64, 112, 66, 102, 110, 60, 92, 62, 120, 68, 87, 32, 136, 4, 103, 24, 63, 18, 65, 15, 55, 121, 3, 101, 22, 12, 80, 86, 135, 126, 90, 140, 104, 2, 33, 20, 108, 107, 31, 134, 132, 88, 30, 133, 130, 137, 141, 61, 122, 11, 40, 74, 73, 51, 96, 21, 42, 56, 85, 82, 89, 142, 77, 78, 79, 91, 76, 97, 57, 19, 43, 84, 50, 41, 99, 53, 26]
> +
> +        def sortkey(self):
> +            try:
> +                i = self.opcodeorder.index(self.index)
> +            except ValueError:
> +                i = 1000000
> +            return i, self.index
> +
> +        def __cmp__(self, other):
> +            return (cmp(self.__class__, other.__class__) or
> +                    cmp(self.sortkey(), other.sortkey()))
>
> -class OpcodeDesc(object):
> -    def __init__(self, name, index):
> -        self.name = name
> -        self.methodname = opcode_method_names[index]
> -        self.index = index
> -        self.hasarg = index >= HAVE_ARGUMENT
> -
> -    def _freeze_(self):
> -        return True
> -
> -    def is_enabled(self, space):
> -        """Check if the opcode should be enabled in the space's configuration.
> -        (Returns True for all standard opcodes.)"""
> -        opt = space.config.objspace.opcodes
> -        return getattr(opt, self.name, True)
> -    is_enabled._annspecialcase_ = 'specialize:memo'
> -
> -    # for predictable results, we try to order opcodes most-used-first
> -    opcodeorder = [124, 125, 100, 105, 1, 131, 116, 111, 106, 83, 23, 93, 113, 25, 95, 64, 112, 66, 102, 110, 60, 92, 62, 120, 68, 87, 32, 136, 4, 103, 24, 63, 18, 65, 15, 55, 121, 3, 101, 22, 12, 80, 86, 135, 126, 90, 140, 104, 2, 33, 20, 108, 107, 31, 134, 132, 88, 30, 133, 130, 137, 141, 61, 122, 11, 40, 74, 73, 51, 96, 21, 42, 56, 85, 82, 89, 142, 77, 78, 79, 91, 76, 97, 57, 19, 43, 84, 50, 41, 99, 53, 26]
> -
> -    def sortkey(self):
> -        try:
> -            i = self.opcodeorder.index(self.index)
> -        except ValueError:
> -            i = 1000000
> -        return i, self.index
> -
> -    def __cmp__(self, other):
> -        return (cmp(self.__class__, other.__class__) or
> -                cmp(self.sortkey(), other.sortkey()))
> +    return OpcodeDesc
> +
> +OpcodeDesc = make_opcode_desc(HAVE_ARGUMENT)
> +HostOpcodeDesc = make_opcode_desc(host_HAVE_ARGUMENT)
>
>  opdescmap = {}
>
> -class opcodedesc:
> +class _baseopcodedesc:
> +    pass
> +
> +class opcodedesc(_baseopcodedesc):
>     """A namespace mapping OPCODE_NAME to OpcodeDescs."""
>
> +class host_opcodedesc(_baseopcodedesc):
> +    """A namespace mapping OPCODE_NAME to HostOpcodeDescs."""
> +
>  for name, index in opmap.items():
>     desc = OpcodeDesc(name, index)
>     setattr(opcodedesc, name, desc)
>     opdescmap[index] = desc
>
> +for name, index in host_opmap.items():
> +    desc = HostOpcodeDesc(name, index)
> +    setattr(host_opcodedesc, name, desc)
> +
>  lst = opdescmap.values()
>  lst.sort()
>  unrolling_opcode_descs = unrolling_iterable(lst)
>
> -# Allow non-translated code to interpret the new 2.6 bytecodes
> -import sys
> -if sys.version_info >= (2, 6):
> -    import opcode
> -    opcode_method_names[opcode.opmap['STORE_MAP']] = 'STORE_MAP'
> -
>  del name, index, desc, lst
> _______________________________________________
> pypy-svn mailing list
> pypy-svn at codespeak.net
> http://codespeak.net/mailman/listinfo/pypy-svn
>



More information about the Pypy-commit mailing list