[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