[pypy-svn] r52778 - in pypy/branch/jit-hotpath/pypy/jit: codegen/llgraph rainbow timeshifter

antocuni at codespeak.net antocuni at codespeak.net
Thu Mar 20 16:09:29 CET 2008


Author: antocuni
Date: Thu Mar 20 16:09:28 2008
New Revision: 52778

Modified:
   pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/llimpl.py
   pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
   pypy/branch/jit-hotpath/pypy/jit/rainbow/typesystem.py
   pypy/branch/jit-hotpath/pypy/jit/timeshifter/exception.py
   pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py
   pypy/branch/jit-hotpath/pypy/jit/timeshifter/rvalue.py
Log:
more refactoring towards a working rainbow for ootype



Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/llimpl.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/llimpl.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/llimpl.py	Thu Mar 20 16:09:28 2008
@@ -237,6 +237,8 @@
     elif isinstance(T, ootype.StaticMethod):
         fn = value._obj
         return ootype._static_meth(T, graph=fn.graph, _callable=fn._callable)
+    elif isinstance(T, ootype.Instance):
+        return ootype.ooupcast(T, value) # XXX: oodowncast?
     else:
         T1 = lltype.typeOf(value)
         if T1 is llmemory.Address:

Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py	Thu Mar 20 16:09:28 2008
@@ -152,7 +152,7 @@
         self.hannotator = hannotator
         etrafo = hannotator.exceptiontransformer
         type_system = self.rtyper.type_system.name
-        self.exceptiondesc = exception.ExceptionDesc(
+        self.exceptiondesc = self.ExceptionDesc(
             RGenOp, etrafo, type_system, True, self.rtyper)
         self.interpreter = self.create_interpreter(RGenOp)
         self.RGenOp = RGenOp
@@ -1567,12 +1567,16 @@
 
 class LLTypeBytecodeWriter(BytecodeWriter):
 
+    ExceptionDesc = exception.LLTypeExceptionDesc
+
     def create_interpreter(self, RGenOp):
         return LLTypeJitInterpreter(self.exceptiondesc, RGenOp)
 
 
 class OOTypeBytecodeWriter(BytecodeWriter):
 
+    ExceptionDesc = exception.OOTypeExceptionDesc
+    
     def create_interpreter(self, RGenOp):
         return OOTypeJitInterpreter(self.exceptiondesc, RGenOp)
 

Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/typesystem.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/typesystem.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/typesystem.py	Thu Mar 20 16:09:28 2008
@@ -1,3 +1,6 @@
+from pypy.rpython.lltypesystem import llmemory
+from pypy.rpython.ootypesystem import ootype
+
 class TypeSystemHelper(object):
 
     def _freeze_(self):
@@ -7,7 +10,8 @@
 class LLTypeHelper(TypeSystemHelper):
 
     name = 'lltype'
-    
+    ROOT_TYPE = llmemory.Address
+
     def get_typeptr(self, obj):
         return obj.typeptr
 
@@ -15,6 +19,8 @@
 class OOTypeHelper(TypeSystemHelper):
 
     name = 'ootype'
+    ROOT_TYPE = llmemory.Address # XXX: should be ootype.ROOT
+    #ROOT_TYPE = ootype.ROOT
 
     def get_typeptr(self, obj):
         return obj.meta

Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/exception.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/exception.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/exception.py	Thu Mar 20 16:09:28 2008
@@ -2,7 +2,7 @@
 from pypy.jit.timeshifter import rvalue, rtimeshift
 
 
-class ExceptionDesc:
+class AbstractExceptionDesc:
 
     def __init__(self, RGenOp, etrafo, type_system, lazy_exception_path,
                  rtyper=None):
@@ -25,18 +25,7 @@
         self.gv_null_exc_type = RGenOp.constPrebuiltGlobal(null_exc_type)
         self.gv_null_exc_value = RGenOp.constPrebuiltGlobal(null_exc_value)
 
-        if type_system == 'lltypesystem':
-            self.null_exc_type_box = rvalue.PtrRedBox(self.exc_type_kind,
-                                                      self.gv_null_exc_type)
-            self.null_exc_value_box = rvalue.PtrRedBox(self.exc_value_kind,
-                                                       self.gv_null_exc_value)
-        else:
-            # XXX: think more about exceptions
-            self.null_exc_type_box = rvalue.PtrRedBox(self.exc_type_kind,
-                                                      RGenOp.constPrebuiltGlobal(llmemory.NULL))
-            self.null_exc_value_box = rvalue.IntRedBox(self.exc_value_kind,
-                                                       RGenOp.constPrebuiltGlobal(llmemory.NULL))
-            
+        self._create_boxes(RGenOp)
         self.lazy_exception_path = lazy_exception_path
 
     def _freeze_(self):
@@ -71,7 +60,7 @@
         builder = jitstate.curbuilder
         etypebox = jitstate.exc_type_box
         if etypebox.is_constant():
-            ll_etype = rvalue.ll_getvalue(etypebox, llmemory.Address)
+            ll_etype = rvalue.ll_getvalue(etypebox, jitstate.ts.ROOT_TYPE)
             if not ll_etype:
                 return       # we know there is no exception set
         evaluebox = jitstate.exc_value_box
@@ -83,3 +72,22 @@
     def gen_exc_occurred(self, builder):
         gv_etype = self.genop_get_exc_type(builder)
         return builder.genop_ptr_nonzero(self.exc_type_kind, gv_etype)
+
+
+class LLTypeExceptionDesc(AbstractExceptionDesc):
+    
+    def _create_boxes(self, RGenOp):
+        self.null_exc_type_box = rvalue.PtrRedBox(self.exc_type_kind,
+                                                  self.gv_null_exc_type)
+        self.null_exc_value_box = rvalue.PtrRedBox(self.exc_value_kind,
+                                                   self.gv_null_exc_value)
+
+
+class OOTypeExceptionDesc(AbstractExceptionDesc):
+    def _create_boxes(self, RGenOp):
+        # XXX: think more about exceptions
+        self.null_exc_type_box = rvalue.PtrRedBox(self.exc_type_kind,
+                                                  RGenOp.constPrebuiltGlobal(llmemory.NULL))
+        self.null_exc_value_box = rvalue.PtrRedBox(self.exc_value_kind,
+                                                   RGenOp.constPrebuiltGlobal(llmemory.NULL))
+

Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/rtimeshift.py	Thu Mar 20 16:09:28 2008
@@ -958,7 +958,7 @@
             null1 = self.fz_exc_type_box.is_constant_nullptr()
             box = jitstate.exc_type_box
             null2 = (box.is_constant() and
-                     not rvalue.ll_getvalue(box, llmemory.Address))
+                     not rvalue.ll_getvalue(box, jitstate.ts.ROOT_TYPE))
             if null1 != null2:
                 raise rvalue.DontMerge # a jit-with-exc. and a jit-without-exc.
 

Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/rvalue.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/rvalue.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/rvalue.py	Thu Mar 20 16:09:28 2008
@@ -1,4 +1,5 @@
 from pypy.rpython.lltypesystem import lltype, llmemory
+from pypy.rpython.ootypesystem import ootype
 
 class Memo(object):
     _annspecialcase_ = 'specialize:ctr_location'
@@ -32,6 +33,19 @@
 class DontMerge(Exception):
     pass
 
+class LLTypeMixin(object):
+    _mixin_ = True
+
+    def _revealconst(self, gv):
+        return gv.revealconst(llmemory.Address)
+
+class OOTypeMixin(object):
+    _mixin_ = True
+
+    def _revealconst(self, gv):
+        return gv.revealconst(ootype.ROOT) # ???
+
+
 class RedBox(object):
     _attrs_ = ['kind', 'genvar']
 
@@ -87,6 +101,7 @@
 def redboxbuilder_int(kind, gv_value): return IntRedBox(kind, gv_value)
 def redboxbuilder_dbl(kind, gv_value): return DoubleRedBox(kind,gv_value)
 def redboxbuilder_ptr(kind, gv_value): return PtrRedBox(kind, gv_value)
+def redboxbuilder_inst(kind, gv_value): return InstanceRedBox(kind, gv_value)
 
 def ll_redboxbuilder(TYPE):
     if TYPE is lltype.Void:
@@ -95,6 +110,8 @@
         return redboxbuilder_ptr
     elif TYPE is lltype.Float:
         return redboxbuilder_dbl
+    elif isinstance(TYPE, ootype.Instance):
+        return redboxbuilder_inst
     else:
         assert isinstance(TYPE, lltype.Primitive)
         # XXX what about long longs?
@@ -184,20 +201,24 @@
             return result
 
 
-class PtrRedBox(RedBox):
+class AbstractPtrRedBox(RedBox):
+    """
+    Base class for PtrRedBox (lltype) and InstanceRedBox (ootype)
+    """
+
     content = None   # or an AbstractContainer
 
     def __init__(self, kind, genvar=None, known_nonzero=False):
         self.kind = kind
         self.genvar = genvar    # None or a genvar
         if genvar is not None and genvar.is_const:
-            known_nonzero = bool(genvar.revealconst(llmemory.Address))
+            known_nonzero = bool(self._revealconst(genvar))
         self.known_nonzero = known_nonzero
 
     def setgenvar(self, newgenvar):
         RedBox.setgenvar(self, newgenvar)
         self.known_nonzero = (newgenvar.is_const and
-                              bool(newgenvar.revealconst(llmemory.Address)))
+                              bool(self._revealconst(newgenvar)))
 
     def setgenvar_hint(self, newgenvar, known_nonzero):
         RedBox.setgenvar(self, newgenvar)
@@ -226,55 +247,16 @@
         else:
             return RedBox.__repr__(self)
 
-    def op_getfield(self, jitstate, fielddesc):
-        self.learn_nonzeroness(jitstate, True)
-        if self.content is not None:
-            box = self.content.op_getfield(jitstate, fielddesc)
-            if box is not None:
-                return box
-        gv_ptr = self.getgenvar(jitstate)
-        box = fielddesc.generate_get(jitstate, gv_ptr)
-        if fielddesc.immutable:
-            self.remember_field(fielddesc, box)
-        return box
-
-    def op_setfield(self, jitstate, fielddesc, valuebox):
-        self.learn_nonzeroness(jitstate, True)
-        gv_ptr = self.genvar
-        if gv_ptr:
-            fielddesc.generate_set(jitstate, gv_ptr,
-                                   valuebox.getgenvar(jitstate))
-        else:
-            assert self.content is not None
-            self.content.op_setfield(jitstate, fielddesc, valuebox)
-
-    def op_getsubstruct(self, jitstate, fielddesc):
-        self.learn_nonzeroness(jitstate, True)
-        gv_ptr = self.genvar
-        if gv_ptr:
-            return fielddesc.generate_getsubstruct(jitstate, gv_ptr)
-        else:
-            assert self.content is not None
-            return self.content.op_getsubstruct(jitstate, fielddesc)
-
-    def remember_field(self, fielddesc, box):
-        if self.genvar.is_const:
-            return      # no point in remembering field then
-        if self.content is None:
-            from pypy.jit.timeshifter import rcontainer
-            self.content = rcontainer.PartialDataStruct()
-        self.content.remember_field(fielddesc, box)
-
     def copy(self, memo):
         boxmemo = memo.boxes
         try:
             result = boxmemo[self]
         except KeyError:
-            result = PtrRedBox(self.kind, self.genvar, self.known_nonzero)
+            result = self.__class__(self.kind, self.genvar, self.known_nonzero)
             boxmemo[self] = result
             if self.content:
                 result.content = self.content.copy(memo)
-        assert isinstance(result, PtrRedBox)
+        assert isinstance(result, AbstractPtrRedBox)
         return result
 
     def replace(self, memo):
@@ -286,7 +268,7 @@
             if self.content:
                 self.content.replace(memo)
             result = self
-        assert isinstance(result, PtrRedBox)
+        assert isinstance(result, AbstractPtrRedBox)
         return result
 
     def freeze(self, memo):
@@ -298,20 +280,20 @@
             if not self.genvar:
                 from pypy.jit.timeshifter import rcontainer
                 assert isinstance(content, rcontainer.VirtualContainer)
-                result = FrozenPtrVirtual(self.kind)
+                result = self.FrozenPtrVirtual(self.kind)
                 boxmemo[self] = result
                 result.fz_content = content.freeze(memo)
                 return result
             elif self.genvar.is_const:
-                result = FrozenPtrConst(self.kind, self.genvar)
+                result = self.FrozenPtrConst(self.kind, self.genvar)
             elif content is None:
-                result = FrozenPtrVar(self.kind, self.known_nonzero)
+                result = self.FrozenPtrVar(self.kind, self.known_nonzero)
             else:
                 # if self.content is not None, it's a PartialDataStruct
                 from pypy.jit.timeshifter import rcontainer
                 assert isinstance(content, rcontainer.PartialDataStruct)
-                result = FrozenPtrVarWithPartialData(self.kind,
-                                                     known_nonzero=True)
+                result = self.FrozenPtrVarWithPartialData(self.kind,
+                                                          known_nonzero=True)
                 boxmemo[self] = result
                 result.fz_partialcontent = content.partialfreeze(memo)
                 return result
@@ -353,6 +335,54 @@
         if self.content:
             self.content.enter_block(incoming, memo)
 
+
+class PtrRedBox(AbstractPtrRedBox, LLTypeMixin):
+
+    def op_getfield(self, jitstate, fielddesc):
+        self.learn_nonzeroness(jitstate, True)
+        if self.content is not None:
+            box = self.content.op_getfield(jitstate, fielddesc)
+            if box is not None:
+                return box
+        gv_ptr = self.getgenvar(jitstate)
+        box = fielddesc.generate_get(jitstate, gv_ptr)
+        if fielddesc.immutable:
+            self.remember_field(fielddesc, box)
+        return box
+
+    def op_setfield(self, jitstate, fielddesc, valuebox):
+        self.learn_nonzeroness(jitstate, True)
+        gv_ptr = self.genvar
+        if gv_ptr:
+            fielddesc.generate_set(jitstate, gv_ptr,
+                                   valuebox.getgenvar(jitstate))
+        else:
+            assert self.content is not None
+            self.content.op_setfield(jitstate, fielddesc, valuebox)
+
+    def op_getsubstruct(self, jitstate, fielddesc):
+        self.learn_nonzeroness(jitstate, True)
+        gv_ptr = self.genvar
+        if gv_ptr:
+            return fielddesc.generate_getsubstruct(jitstate, gv_ptr)
+        else:
+            assert self.content is not None
+            return self.content.op_getsubstruct(jitstate, fielddesc)
+
+    def remember_field(self, fielddesc, box):
+        if self.genvar.is_const:
+            return      # no point in remembering field then
+        if self.content is None:
+            from pypy.jit.timeshifter import rcontainer
+            self.content = rcontainer.PartialDataStruct()
+        self.content.remember_field(fielddesc, box)
+
+
+class InstanceRedBox(AbstractPtrRedBox, OOTypeMixin):
+
+    def forcevar(self, jitstate, memo, forget_nonzeroness):
+        raise NotImplementedError
+
 # ____________________________________________________________
 
 class FrozenValue(object):
@@ -450,7 +480,7 @@
             return memo[self]
 
 
-class FrozenPtrConst(FrozenConst):
+class FrozenAbstractPtrConst(FrozenConst):
 
     def __init__(self, kind, gv_const):
         self.kind = kind
@@ -458,14 +488,14 @@
 
     def is_constant_equal(self, box):
         return (box.is_constant() and
-                self.gv_const.revealconst(llmemory.Address) ==
-                box.genvar.revealconst(llmemory.Address))
+                self._revealconst(self.gv_const) ==
+                self._revealconst(box.genvar))
 
     def is_constant_nullptr(self):
-        return not self.gv_const.revealconst(llmemory.Address)
+        return not self._revealconst(self.gv_const)
 
     def exactmatch(self, box, outgoingvarboxes, memo):
-        assert isinstance(box, PtrRedBox)
+        assert isinstance(box, AbstractPtrRedBox)
         memo.partialdatamatch[box] = None     # could do better
         if self.is_constant_nullptr():
             memo.forget_nonzeroness[box] = None
@@ -477,7 +507,14 @@
         return match
 
     def unfreeze(self, incomingvarboxes, memo):
-        return PtrRedBox(self.kind, self.gv_const)
+        return self.PtrRedBox(self.kind, self.gv_const)
+
+
+class FrozenPtrConst(FrozenAbstractPtrConst, LLTypeMixin):
+    PtrRedBox = PtrRedBox
+
+class FrozenInstanceConst(FrozenAbstractPtrConst, OOTypeMixin):
+    PtrRedBox = InstanceRedBox
 
 
 class FrozenPtrVar(FrozenVar):
@@ -558,3 +595,13 @@
 ##        else:
 ##            outgoingvarboxes.append(box)
 ##            return False
+
+PtrRedBox.FrozenPtrVirtual = FrozenPtrVirtual
+PtrRedBox.FrozenPtrConst = FrozenPtrConst
+PtrRedBox.FrozenPtrVar = FrozenPtrVar
+PtrRedBox.FrozenPtrVarWithPartialData = FrozenPtrVarWithPartialData
+
+InstanceRedBox.FrozenPtrVirtual = None
+InstanceRedBox.FrozenPtrConst = FrozenInstanceConst
+InstanceRedBox.FrozenPtrVar = None
+InstanceRedBox.FrozenPtrVarWithPartialData = None



More information about the Pypy-commit mailing list