[pypy-svn] r51184 - in pypy/branch/jit-refactoring/pypy/jit/rainbow: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Fri Feb 1 15:20:44 CET 2008
Author: cfbolz
Date: Fri Feb 1 15:20:43 2008
New Revision: 51184
Modified:
pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py
Log:
converting green things into red things works
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py Fri Feb 1 15:20:43 2008
@@ -18,16 +18,20 @@
green consts are negative indexes
"""
- def __init__(self, code, constants):
+ def __init__(self, code, constants, typekinds, redboxclasses):
self.code = code
self.constants = constants
+ self.typekinds = typekinds
+ self.redboxclasses = redboxclasses
def _freeze_(self):
return True
SIGN_EXTEND2 = 1 << 15
-STOP = object()
+class STOP(object):
+ pass
+STOP = STOP()
class JitInterpreter(object):
def __init__(self):
@@ -58,6 +62,8 @@
result = self.opcode_implementations[bytecode](self)
if result is STOP:
return
+ else:
+ assert result is None
# operation helper functions
@@ -95,7 +101,11 @@
# operation implementations
def opimpl_make_redbox(self):
- XXX
+ genconst = self.get_greenarg()
+ typeindex = self.load_2byte()
+ kind = self.frame.bytecode.typekinds[typeindex]
+ redboxcls = self.frame.bytecode.redboxclasses[typeindex]
+ self.red_result(redboxcls(kind, genconst))
def opimpl_goto(self):
target = self.load_4byte()
@@ -123,7 +133,6 @@
newstate = rtimeshift.leave_graph_yellow(self.queue)
self.jitstate = newstate
return STOP
- return STOP # XXX wrong, of course
def opimpl_make_new_redvars(self):
# an opcode with a variable number of args
@@ -206,18 +215,29 @@
self.seen_blocks = {}
self.assembler = []
self.constants = []
+ self.typekinds = []
+ self.redboxclasses = []
+ # mapping constant -> index in constants
self.const_positions = {}
+ # mapping blocks to True
self.seen_blocks = {}
- self.additional_positions = {}
self.redvar_positions = {}
+ # mapping block to the free red index
self.free_red = {}
self.greenvar_positions = {}
+ # mapping block to the free green index
self.free_green = {}
+ # mapping TYPE to index
+ self.type_positions = {}
+
self.graph = graph
self.entrymap = flowmodel.mkentrymap(graph)
self.make_bytecode_block(graph.startblock)
assert self.current_block is None
- return JitCode(assemble(self.interpreter, *self.assembler), self.constants)
+ return JitCode(assemble(self.interpreter, *self.assembler),
+ self.constants,
+ self.typekinds,
+ self.redboxclasses)
def make_bytecode_block(self, block, insert_goto=False):
if block in self.seen_blocks:
@@ -330,6 +350,7 @@
resultindex = self.register_redvar((arg, block))
argindex = self.green_position(arg)
self.emit(argindex)
+ self.emit(self.type_position(arg.concretetype))
return resultindex
def opcolor(self, op):
@@ -377,6 +398,15 @@
self.constants.append(const)
self.const_positions[const] = result
return result
+
+ def type_position(self, TYPE):
+ if TYPE in self.type_positions:
+ return self.type_positions[TYPE]
+ self.typekinds.append(self.RGenOp.kindToken(TYPE))
+ self.redboxclasses.append(rvalue.ll_redboxcls(TYPE))
+ result = len(self.type_positions)
+ self.type_positions[TYPE] = result
+ return result
def emit(self, stuff):
assert stuff is not None
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py Fri Feb 1 15:20:43 2008
@@ -139,6 +139,12 @@
res = self.interpret(f, [1, 2])
assert res == 3
+ def test_convert_const_to_red(self):
+ def f(x):
+ return x + 1
+ res = self.interpret(f, [2])
+ assert res == 3
+
def test_green_switch(self):
def f(green, x, y):
green = hint(green, concrete=True)
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py Fri Feb 1 15:20:43 2008
@@ -63,18 +63,21 @@
"make_new_greenvars", 0,
"red_return", 0)
assert len(jitcode.constants) == 0
+ assert len(jitcode.typekinds) == 0
def test_constant(self):
def f(x):
return x + 1
writer, jitcode = self.serialize(f, [int])
assert jitcode.code == assemble(writer.interpreter,
- "make_redbox", -1,
+ "make_redbox", -1, 0,
"red_int_add", 0, 1,
"make_new_redvars", 1, 2,
"make_new_greenvars", 0,
"red_return", 0)
assert len(jitcode.constants) == 1
+ assert len(jitcode.typekinds) == 1
+ assert len(jitcode.redboxclasses) == 1
def test_green_switch(self):
def f(x, y, z):
@@ -98,6 +101,7 @@
)
assert jitcode.code == expected
assert len(jitcode.constants) == 0
+ assert len(jitcode.typekinds) == 0
def test_green_switch2(self):
def f(x, y, z):
@@ -129,7 +133,7 @@
)
assert jitcode.code == expected
assert len(jitcode.constants) == 0
-
+ assert len(jitcode.typekinds) == 0
class TestLLType(AbstractSerializationTest):
More information about the Pypy-commit
mailing list