[pypy-commit] pypy translation-cleanup: Move opcode decoding to new class HostCode
rlamy
noreply at buildbot.pypy.org
Thu Aug 30 18:38:14 CEST 2012
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: translation-cleanup
Changeset: r56994:e94ac64d748f
Date: 2012-08-11 21:14 +0100
http://bitbucket.org/pypy/pypy/changeset/e94ac64d748f/
Log: Move opcode decoding to new class HostCode
diff --git a/pypy/interpreter/pycode.py b/pypy/interpreter/pycode.py
--- a/pypy/interpreter/pycode.py
+++ b/pypy/interpreter/pycode.py
@@ -19,6 +19,10 @@
from pypy.rlib.objectmodel import compute_hash
from pypy.tool.stdlib_opcode import opcodedesc, HAVE_ARGUMENT
+
+class BytecodeCorruption(Exception):
+ """Detected bytecode corruption. Never caught; it's an error."""
+
# helper
def unpack_str_tuple(space,w_str_tuple):
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -8,7 +8,7 @@
from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.interpreter.baseobjspace import Wrappable
from pypy.interpreter import gateway, function, eval, pyframe, pytraceback
-from pypy.interpreter.pycode import PyCode
+from pypy.interpreter.pycode import PyCode, BytecodeCorruption
from pypy.tool.sourcetools import func_with_new_name
from pypy.rlib.objectmodel import we_are_translated
from pypy.rlib import jit, rstackovf
@@ -1172,9 +1172,6 @@
def __init__(self, operr):
self.operr = operr
-class BytecodeCorruption(Exception):
- """Detected bytecode corruption. Never caught; it's an error."""
-
### Frame Blocks ###
diff --git a/pypy/objspace/flow/bytecode.py b/pypy/objspace/flow/bytecode.py
new file mode 100644
--- /dev/null
+++ b/pypy/objspace/flow/bytecode.py
@@ -0,0 +1,42 @@
+"""
+Bytecode handling classes and functions for use by the flow space.
+"""
+from pypy.interpreter.pycode import PyCode, BytecodeCorruption
+from pypy.tool.stdlib_opcode import (host_bytecode_spec, EXTENDED_ARG,
+ HAVE_ARGUMENT)
+
+class HostCode(PyCode):
+ """
+ A wrapper around a native code object of the host interpreter
+ """
+ opnames = host_bytecode_spec.method_names
+
+ def read(self, pos):
+ """
+ Decode the instruction starting at position ``next_instr``.
+
+ Returns (next_instr, opname, oparg).
+ """
+ co_code = self.co_code
+ opcode = ord(co_code[pos])
+ next_instr = pos + 1
+
+ if opcode >= HAVE_ARGUMENT:
+ lo = ord(co_code[next_instr])
+ hi = ord(co_code[next_instr+1])
+ next_instr += 2
+ oparg = (hi * 256) | lo
+ else:
+ oparg = 0
+
+ while opcode == EXTENDED_ARG:
+ opcode = ord(co_code[next_instr])
+ if opcode < HAVE_ARGUMENT:
+ raise BytecodeCorruption
+ lo = ord(co_code[next_instr+1])
+ hi = ord(co_code[next_instr+2])
+ next_instr += 3
+ oparg = (oparg * 65536) | (hi * 256) | lo
+
+ opname = self.opnames[opcode]
+ return next_instr, opname, oparg
diff --git a/pypy/objspace/flow/flowcontext.py b/pypy/objspace/flow/flowcontext.py
--- a/pypy/objspace/flow/flowcontext.py
+++ b/pypy/objspace/flow/flowcontext.py
@@ -5,14 +5,13 @@
from pypy.interpreter import pyframe, nestedscope
from pypy.interpreter.argument import ArgumentsForTranslation
from pypy.interpreter.astcompiler.consts import CO_GENERATOR
-from pypy.interpreter.pycode import PyCode, cpython_code_signature
from pypy.interpreter.pyopcode import (Return, Yield, SuspendedUnroller,
SReturnValue, BytecodeCorruption)
from pypy.objspace.flow import operation
from pypy.objspace.flow.model import *
from pypy.objspace.flow.framestate import (FrameState, recursively_unflatten,
recursively_flatten)
-from pypy.tool.stdlib_opcode import host_bytecode_spec
+from pypy.objspace.flow.bytecode import HostCode
class StopFlowing(Exception):
pass
@@ -194,7 +193,7 @@
def build_flow(self, func, constargs={}):
space = self.space
- code = PyCode._from_code(space, func.func_code)
+ code = HostCode._from_code(space, func.func_code)
self.code = code
self.frame = frame = FlowSpaceFrame(self.space, code,
@@ -210,7 +209,7 @@
frame.frame_finished_execution = False
next_instr = frame.last_instr
while True:
- next_instr = frame.handle_bytecode(code.co_code,
+ next_instr = frame.handle_bytecode(code,
next_instr, self)
except operation.OperationThatShouldNotBePropagatedError, e:
@@ -435,33 +434,11 @@
prevblock = parent
return recorder
- def dispatch_bytecode(self, co_code, next_instr, ec):
- space = self.space
+ def dispatch_bytecode(self, code, next_instr, ec):
while True:
self.last_instr = next_instr
ec.bytecode_trace(self)
- opcode = ord(co_code[next_instr])
- next_instr += 1
-
- if opcode >= self.HAVE_ARGUMENT:
- lo = ord(co_code[next_instr])
- hi = ord(co_code[next_instr+1])
- next_instr += 2
- oparg = (hi * 256) | lo
- else:
- oparg = 0
-
- while opcode == self.opcodedesc.EXTENDED_ARG.index:
- opcode = ord(co_code[next_instr])
- 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 * 65536) | (hi * 256) | lo
-
-
- methodname = self.opcode_method_names[opcode]
+ next_instr, methodname, oparg = code.read(next_instr)
try:
meth = getattr(self, methodname)
except AttributeError:
More information about the pypy-commit
mailing list