Author: Alexander Hesse <[email protected]>
Branch: split-rpython
Changeset: r59901:da5f04dfa943
Date: 2013-01-09 21:47 +0100
http://bitbucket.org/pypy/pypy/changeset/da5f04dfa943/
Log: Forgot to add rpython/tool/stdlib_opcode.py
diff --git a/rpython/tool/stdlib_opcode.py b/rpython/tool/stdlib_opcode.py
new file mode 100644
--- /dev/null
+++ b/rpython/tool/stdlib_opcode.py
@@ -0,0 +1,87 @@
+class _BaseOpcodeDesc(object):
+ def __init__(self, bytecode_spec, name, index, methodname):
+ self.bytecode_spec = bytecode_spec
+ self.name = name
+ self.methodname = methodname
+ self.index = index
+ self.hasarg = index >= self.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()))
+
+ def __str__(self):
+ return "<OpcodeDesc code=%d name=%s at %x>" % (self.index, self.name,
id(self))
+
+ __repr__ = __str__
+
+class _baseopcodedesc:
+ """A namespace mapping OPCODE_NAME to _BaseOpcodeDescs."""
+ pass
+
+
+class BytecodeSpec(object):
+ """A bunch of mappings describing a bytecode instruction set."""
+
+ def __init__(self, name, opmap, HAVE_ARGUMENT):
+ """NOT_RPYTHON."""
+ class OpcodeDesc(_BaseOpcodeDesc):
+ HAVE_ARGUMENT = HAVE_ARGUMENT
+ class opcodedesc(_baseopcodedesc):
+ """A namespace mapping OPCODE_NAME to OpcodeDescs."""
+
+ self.name = name
+ self.OpcodeDesc = OpcodeDesc
+ self.opcodedesc = opcodedesc
+ self.HAVE_ARGUMENT = HAVE_ARGUMENT
+ # opname -> opcode
+ self.opmap = opmap
+ # opcode -> method name
+ self.method_names = tbl = ['MISSING_OPCODE'] * 256
+ # opcode -> opdesc
+ self.opdescmap = {}
+ for name, index in opmap.items():
+ tbl[index] = methodname = name.replace('+', '_')
+ desc = OpcodeDesc(self, name, index, methodname)
+ setattr(self.opcodedesc, name, desc)
+ self.opdescmap[index] = desc
+ # fill the ordered opdesc list
+ self.ordered_opdescs = lst = self.opdescmap.values()
+ lst.sort()
+
+ def to_globals(self):
+ """NOT_RPYTHON. Add individual opcodes to the module constants."""
+ g = globals()
+ g.update(self.opmap)
+ g['SLICE'] = self.opmap["SLICE+0"]
+ g['STORE_SLICE'] = self.opmap["STORE_SLICE+0"]
+ g['DELETE_SLICE'] = self.opmap["DELETE_SLICE+0"]
+
+ def __str__(self):
+ return "<%s bytecode>" % (self.name,)
+
+ __repr__ = __str__
+
+from opcode import opmap, HAVE_ARGUMENT
+
+host_bytecode_spec = BytecodeSpec('host', opmap, HAVE_ARGUMENT)
\ No newline at end of file
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit