[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