[pypy-svn] r51983 - in pypy/branch/jit-refactoring/pypy/jit/rainbow: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Sat Mar 1 12:24:55 CET 2008
Author: cfbolz
Date: Sat Mar 1 12:24:55 2008
New Revision: 51983
Modified:
pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/dump.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
Log:
some support for raising ops
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py Sat Mar 1 12:24:55 2008
@@ -116,6 +116,7 @@
self.fielddescs = []
self.arrayfielddescs = []
self.interiordescs = []
+ self.exceptioninstances = []
self.oopspecdescs = []
self.promotiondescs = []
self.called_bytecodes = []
@@ -146,6 +147,8 @@
self.arrayfielddesc_positions = {}
# mapping (TYPE, path) to index
self.interiordesc_positions = {}
+ # mapping exception class to index
+ self.exceptioninstance_positions = {}
# mapping (fnobj, can_raise) to index
self.oopspecdesc_positions = {}
# mapping (fnobj, can_raise) to index
@@ -176,6 +179,7 @@
self.fielddescs,
self.arrayfielddescs,
self.interiordescs,
+ self.exceptioninstances,
self.oopspecdescs,
self.promotiondescs,
self.called_bytecodes,
@@ -371,13 +375,17 @@
args = []
for arg in op.args:
args.append(self.serialize_oparg(color, arg))
- self.serialize_opcode(color, op)
+ opdesc = self.serialize_opcode(color, op)
self.emit(*args)
if self.hannotator.binding(op.result).is_green():
self.register_greenvar(op.result)
else:
self.register_redvar(op.result)
-
+ if (opdesc is not None and
+ opdesc.tryfold and not opdesc.canfold and opdesc.canraise):
+ exc_class = opdesc.llop.canraise[0]
+ self.emit("split_raisingop",
+ self.exceptioninstance_position(exc_class))
def serialize_opcode(self, color, op):
opname = op.opname
@@ -390,6 +398,7 @@
self.hannotator.binding(op.result), )
index = self.interpreter.make_opcode_implementation(color, opdesc)
self.emit(name)
+ return self.interpreter.opcode_descs[index]
def serialize_oparg(self, color, arg):
if color == "red":
@@ -504,6 +513,18 @@
self.arrayfielddesc_positions[TYPE] = result
return result
+ def exceptioninstance_position(self, exc_class):
+ if exc_class in self.exceptioninstance_positions:
+ return self.exceptioninstance_positions[exc_class]
+ bk = self.rtyper.annotator.bookkeeper
+ exc_classdef = bk.getuniqueclassdef(exc_class)
+ ll_exc = self.rtyper.exceptiondata.get_standard_ll_exc_instance(
+ self.rtyper, exc_classdef)
+ result = len(self.exceptioninstances)
+ self.exceptioninstances.append(ll_exc)
+ self.exceptioninstance_positions[exc_class] = result
+ return result
+
def oopspecdesc_position(self, fnobj, canraise):
key = fnobj, canraise
if key in self.oopspecdesc_positions:
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/dump.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/dump.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/dump.py Sat Mar 1 12:24:55 2008
@@ -149,6 +149,9 @@
elif argspec == "interiordesc":
d = jitcode.interiordescs[src.load_2byte()]
args.append(d)
+ elif argspec == "exception":
+ d = jitcode.exceptioninstances[src.load_2byte()]
+ args.append(d)
else:
assert 0, "unknown argtype declaration"
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py Sat Mar 1 12:24:55 2008
@@ -21,8 +21,8 @@
def __init__(self, name, code, constants, typekinds, redboxclasses,
keydescs, structtypedescs, fielddescs, arrayfielddescs,
- interiordescs, oopspecdescs, promotiondescs,
- called_bytecodes, num_mergepoints,
+ interiordescs, exceptioninstances, oopspecdescs,
+ promotiondescs, called_bytecodes, num_mergepoints,
graph_color, calldescs, indirectcalldescs, is_portal):
self.name = name
self.code = code
@@ -34,6 +34,7 @@
self.fielddescs = fielddescs
self.arrayfielddescs = arrayfielddescs
self.interiordescs = interiordescs
+ self.exceptioninstances = exceptioninstances
self.oopspecdescs = oopspecdescs
self.promotiondescs = promotiondescs
self.called_bytecodes = called_bytecodes
@@ -137,6 +138,9 @@
elif argspec == "interiordesc":
d = self.frame.bytecode.interiordescs[self.load_2byte()]
args += (d, )
+ elif argspec == "exception":
+ d = self.frame.bytecode.exceptioninstances[self.load_2byte()]
+ args += (d, )
else:
assert 0, "unknown argtype declaration"
val = func(*args)
@@ -364,16 +368,16 @@
@arguments("red", "jumptarget")
def opimpl_red_goto_iftrue(self, switchbox, target):
# XXX not sure about passing no green vars
- descision = rtimeshift.split(self.jitstate, switchbox, self.frame.pc)
- if descision:
+ decision = rtimeshift.split(self.jitstate, switchbox, self.frame.pc)
+ if decision:
self.frame.pc = target
@arguments("bool", "red", "red", "jumptarget")
def opimpl_red_goto_ifptrnonzero(self, reverse, ptrbox, switchbox, target):
# XXX not sure about passing no green vars
- descision = rtimeshift.split_ptr_nonzero(self.jitstate, switchbox,
+ decision = rtimeshift.split_ptr_nonzero(self.jitstate, switchbox,
self.frame.pc, ptrbox, reverse)
- if descision:
+ if decision:
self.frame.pc = target
@arguments("red", "jumptarget")
@@ -381,6 +385,16 @@
if valuebox.is_constant():
self.frame.pc = target
+ @arguments("exception")
+ def opimpl_split_raisingop(self, ll_evalue):
+ # XXX not sure about passing no green vars
+ decision = rtimeshift.split_raisingop(self.jitstate, self.frame.pc,
+ ll_evalue)
+ if decision:
+ self.frame.pc = target
+
+
+
@arguments("jumptarget")
def opimpl_goto_if_oopcall_was_virtual(self, target):
if not rtimeshift.oopspec_was_residual(self.jitstate):
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 Sat Mar 1 12:24:55 2008
@@ -1495,7 +1495,6 @@
def test_red_int_add_ovf(self):
- py.test.skip("not working yet")
def f(n, m):
try:
return ovfcheck(n + m)
More information about the pypy-svn
mailing list