[pypy-svn] r51260 - in pypy/branch/jit-refactoring/pypy/jit: rainbow rainbow/test timeshifter
cfbolz at codespeak.net
cfbolz at codespeak.net
Mon Feb 4 16:47:15 CET 2008
Author: cfbolz
Date: Mon Feb 4 16:47:13 2008
New Revision: 51260
Modified:
pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
pypy/branch/jit-refactoring/pypy/jit/timeshifter/rcontainer.py
pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py
Log:
the first very very simple struct test passes
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 Mon Feb 4 16:47:13 2008
@@ -3,7 +3,7 @@
from pypy.rpython.lltypesystem import lltype
from pypy.jit.hintannotator.model import originalconcretetype
from pypy.jit.hintannotator import model as hintmodel
-from pypy.jit.timeshifter import rtimeshift, rvalue, exception
+from pypy.jit.timeshifter import rtimeshift, rvalue, rcontainer, exception
from pypy.jit.timeshifter.greenkey import KeyDesc
from pypy.jit.rainbow.interpreter import JitCode, JitInterpreter
from pypy.translator.backendopt.removenoops import remove_same_as
@@ -40,6 +40,8 @@
self.typekinds = []
self.redboxclasses = []
self.keydescs = []
+ self.structtypedescs = []
+ self.fielddescs = []
self.called_bytecodes = []
self.num_mergepoints = 0
self.graph_color = self.graph_calling_color(graph)
@@ -57,8 +59,12 @@
self.free_green = {}
# mapping TYPE to index
self.type_positions = {}
- # mapping tuple of green TYPES to index
+ # mapping tuples of green TYPES to index
self.keydesc_positions = {}
+ # mapping STRUCTS to index
+ self.structtypedesc_positions = {}
+ # mapping tuples of STRUCT, name to index
+ self.fielddesc_positions = {}
# mapping graphs to index
self.graph_positions = {}
# mapping fnobjs to index
@@ -75,6 +81,8 @@
self.typekinds,
self.redboxclasses,
self.keydescs,
+ self.structtypedescs,
+ self.fielddescs,
self.called_bytecodes,
self.num_mergepoints,
self.graph_color,
@@ -179,7 +187,7 @@
result.append(self.serialize_oparg(color, v))
self.emit("make_new_%svars" % (color, ))
self.emit(len(args))
- self.emit(result)
+ self.emit(*result)
def serialize_op(self, op):
specialcase = getattr(self, "serialize_op_%s" % (op.opname, ), None)
@@ -190,7 +198,7 @@
for arg in op.args:
args.append(self.serialize_oparg(color, arg))
self.serialize_opcode(color, op)
- self.emit(args)
+ self.emit(*args)
if self.hannotator.binding(op.result).is_green():
self.register_greenvar(op.result)
else:
@@ -287,6 +295,28 @@
self.type_positions[TYPE] = result
return result
+ def structtypedesc_position(self, TYPE):
+ if TYPE in self.structtypedesc_positions:
+ return self.structtypedesc_positions[TYPE]
+ self.structtypedescs.append(
+ rcontainer.StructTypeDesc(self.RGenOp, TYPE))
+ result = len(self.structtypedesc_positions)
+ self.structtypedesc_positions[TYPE] = result
+ return result
+
+ def fielddesc_position(self, TYPE, fieldname):
+ if (fieldname, TYPE) in self.fielddesc_positions:
+ return self.fielddesc_positions[fieldname, TYPE]
+ structtypedesc = rcontainer.StructTypeDesc(self.RGenOp, TYPE)
+ fielddesc = structtypedesc.getfielddesc(fieldname)
+ if fielddesc is None:
+ self.fielddesc_positions[fieldname, TYPE] = -1
+ return -1
+ result = len(self.fielddescs)
+ self.fielddescs.append(fielddesc)
+ self.fielddesc_positions[fieldname, TYPE] = result
+ return result
+
def graph_position(self, graph):
if graph in self.graph_positions:
return self.graph_positions[graph]
@@ -324,12 +354,11 @@
self.nonrainbow_positions[fn] = result
return result
- def emit(self, stuff):
+ def emit(self, *stuff):
assert stuff is not None
- if isinstance(stuff, list):
- self.assembler.extend(stuff)
- else:
- self.assembler.append(stuff)
+ for x in stuff:
+ assert not isinstance(x, list)
+ self.assembler.append(x)
def sort_by_color(self, vars, by_color_of_vars=None):
reds = []
@@ -417,7 +446,37 @@
XXX
def serialize_op_getfield(self, op):
- XXX
+ assert self.opcolor(op) == "red"
+ args = op.args
+ if args[0] == self.exceptiondesc.cexcdata:
+ # reading one of the exception boxes (exc_type or exc_value)
+ fieldname = args[1].value
+ if fieldname == 'exc_type':
+ self.emit("read_exctype")
+ elif fieldname == 'exc_value':
+ self.emit("read_excvalue")
+ else:
+ raise Exception("getfield(exc_data, %r)" % (fieldname,))
+ self.register_redvar(op.result)
+ return
+
+ # virtualizable access read
+ PTRTYPE = args[0].concretetype
+ if PTRTYPE.TO._hints.get('virtualizable', False):
+ XXX
+
+ # non virtual case
+ index = self.serialize_oparg("red", args[0])
+ fieldname = args[1].value
+ s_struct = self.hannotator.binding(args[0])
+ deepfrozen = s_struct.deepfrozen
+
+ fielddescindex = self.fielddesc_position(PTRTYPE.TO, fieldname)
+ if fielddescindex == -1: # Void field
+ return
+ self.emit("red_getfield", index, fielddescindex, deepfrozen)
+ self.register_redvar(op.result)
+
# call handling
@@ -521,6 +580,8 @@
opcode = interpreter.find_opcode(arg)
assert opcode >= 0, "unknown opcode %s" % (arg, )
emit_2byte(opcode)
+ elif isinstance(arg, bool):
+ result.append(chr(int(arg)))
elif isinstance(arg, int):
emit_2byte(arg)
elif isinstance(arg, label):
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 Mon Feb 4 16:47:13 2008
@@ -18,7 +18,8 @@
"""
def __init__(self, name, code, constants, typekinds, redboxclasses,
- keydescs, called_bytecodes, num_mergepoints, graph_color,
+ keydescs, structtypedescs, fielddescs, called_bytecodes,
+ num_mergepoints, graph_color,
nonrainbow_functions, is_portal):
self.name = name
self.code = code
@@ -26,6 +27,8 @@
self.typekinds = typekinds
self.redboxclasses = redboxclasses
self.keydescs = keydescs
+ self.structtypedescs = structtypedescs
+ self.fielddescs = fielddescs
self.called_bytecodes = called_bytecodes
self.num_mergepoints = num_mergepoints
self.graph_color = graph_color
@@ -103,6 +106,12 @@
self.frame.pc = resumepoint
# operation helper functions
+ def load_byte(self):
+ pc = self.frame.pc
+ assert pc >= 0
+ result = ord(self.frame.bytecode.code[pc])
+ self.frame.pc = pc + 1
+ return result
def load_2byte(self):
pc = self.frame.pc
@@ -122,6 +131,9 @@
self.frame.pc = pc + 4
return intmask(result)
+ def load_bool(self):
+ return bool(self.load_byte())
+
def get_greenarg(self):
i = self.load_2byte()
if i < 0:
@@ -276,6 +288,25 @@
self.green_result(self.jitstate.greens[0])
+ # exceptions
+
+ def opimpl_read_exctype(self):
+ XXX
+
+ def opimpl_read_excvalue(self):
+ XXX
+
+ # structs and arrays
+
+ def opimpl_red_getfield(self):
+ structbox = self.get_redarg()
+ fielddesc = self.frame.bytecode.fielddescs[self.load_2byte()]
+ deepfrozen = self.load_bool()
+ resbox = rtimeshift.gengetfield(self.jitstate, deepfrozen, fielddesc,
+ structbox)
+ self.red_result(resbox)
+
+
# ____________________________________________________________
# construction-time interface
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 Mon Feb 4 16:47:13 2008
@@ -46,10 +46,6 @@
del cls._cache_order
def serialize(self, func, values, backendoptimize=False):
- if hasattr(func, 'convert_arguments'):
- assert len(func.convert_arguments) == len(values)
- values = [decoder(value) for decoder, value in zip(
- func.convert_arguments, values)]
key = func, backendoptimize
try:
cache, argtypes = self._cache[key]
@@ -115,7 +111,10 @@
return writer, jitcode, argcolors
def interpret(self, ll_function, values, opt_consts=[], *args, **kwds):
- # XXX clean this mess up
+ if hasattr(ll_function, 'convert_arguments'):
+ assert len(ll_function.convert_arguments) == len(values)
+ values = [decoder(value) for decoder, value in zip(
+ ll_function.convert_arguments, values)]
writer, jitcode, argcolors = self.serialize(ll_function, values)
rgenop = writer.RGenOp()
sigtoken = rgenop.sigToken(self.RESIDUAL_FUNCTYPE)
@@ -501,7 +500,6 @@
def test_simple_struct(self):
- py.test.skip("arrays and structs are not working")
S = lltype.GcStruct('helloworld', ('hello', lltype.Signed),
('world', lltype.Signed),
hints={'immutable': True})
Modified: pypy/branch/jit-refactoring/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/timeshifter/rcontainer.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/timeshifter/rcontainer.py Mon Feb 4 16:47:13 2008
@@ -70,14 +70,13 @@
firstsubstructdesc = None
materialize = None
- def __new__(cls, hrtyper, TYPE):
+ def __new__(cls, RGenOp, TYPE):
if TYPE._hints.get('virtualizable', False):
return object.__new__(VirtualizableStructTypeDesc)
else:
return object.__new__(StructTypeDesc)
- def __init__(self, hrtyper, TYPE):
- RGenOp = hrtyper.RGenOp
+ def __init__(self, RGenOp, TYPE):
self.TYPE = TYPE
self.PTRTYPE = lltype.Ptr(TYPE)
self.ptrkind = RGenOp.kindToken(self.PTRTYPE)
@@ -93,7 +92,7 @@
self.null = self.PTRTYPE._defl()
self.gv_null = RGenOp.constPrebuiltGlobal(self.null)
- self._compute_fielddescs(hrtyper)
+ self._compute_fielddescs(RGenOp)
if self.immutable and self.noidentity:
self._define_materialize()
@@ -102,8 +101,7 @@
self._define_devirtualize()
- def _compute_fielddescs(self, hrtyper):
- RGenOp = hrtyper.RGenOp
+ def _compute_fielddescs(self, RGenOp):
TYPE = self.TYPE
innermostdesc = self
fielddescs = []
@@ -112,10 +110,10 @@
FIELDTYPE = getattr(TYPE, name)
if isinstance(FIELDTYPE, lltype.ContainerType):
if isinstance(FIELDTYPE, lltype.Array):
- self.arrayfielddesc = ArrayFieldDesc(hrtyper, FIELDTYPE)
+ self.arrayfielddesc = ArrayFieldDesc(RGenOp, FIELDTYPE)
self.varsizealloctoken = RGenOp.varsizeAllocToken(TYPE)
continue
- substructdesc = StructTypeDesc(hrtyper, FIELDTYPE)
+ substructdesc = StructTypeDesc(RGenOp, FIELDTYPE)
assert name == TYPE._names[0], (
"unsupported: inlined substructures not as first field")
fielddescs.extend(substructdesc.fielddescs)
@@ -126,7 +124,7 @@
if FIELDTYPE is lltype.Void:
desc = None
else:
- desc = StructFieldDesc(hrtyper, self.PTRTYPE, name, index)
+ desc = StructFieldDesc(RGenOp, self.PTRTYPE, name, index)
fielddescs.append(desc)
fielddesc_by_name[name] = desc
@@ -212,8 +210,8 @@
get_rti set_rti
""".split()
- def __init__(self, hrtyper, TYPE):
- RGenOp = hrtyper.RGenOp
+ def __init__(self, RGenOp, TYPE):
+ XXX
StructTypeDesc.__init__(self, hrtyper, TYPE)
ACCESS = self.TYPE.ACCESS
redirected_fields = ACCESS.redirected_fields
@@ -231,8 +229,6 @@
TOPPTR = self.access_desc.PTRTYPE
self.s_structtype = annmodel.lltype_to_annotation(TOPPTR)
- annhelper = hrtyper.annhelper
-
self.my_redirected_getsetters_untouched = {}
self.my_redirected_getsetters_touched = {}
self.my_redirected_names = my_redirected_names = []
@@ -264,6 +260,7 @@
pass
def _define_getset_field_ptr(self, hrtyper, fielddesc, j):
+ XXX
annhelper = hrtyper.annhelper
s_lltype = annmodel.lltype_to_annotation(fielddesc.RESTYPE)
@@ -326,6 +323,7 @@
def _define_access_is_null(self, hrtyper):
+ XXX
RGenOp = hrtyper.RGenOp
annhelper = hrtyper.annhelper
def access_is_null(struc):
@@ -353,7 +351,7 @@
class InteriorDesc(object):
__metaclass__ = cachedtype
- def __init__(self, hrtyper, TOPCONTAINER, path):
+ def __init__(self, RGenOp, TOPCONTAINER, path):
self.TOPCONTAINER = TOPCONTAINER
self.path = path
PTRTYPE = lltype.Ptr(TOPCONTAINER)
@@ -362,10 +360,10 @@
for offset in path:
LASTCONTAINER = TYPE
if offset is None: # array substruct
- fielddescs.append(ArrayFieldDesc(hrtyper, TYPE))
+ fielddescs.append(ArrayFieldDesc(RGenOp, TYPE))
TYPE = TYPE.OF
else:
- fielddescs.append(NamedFieldDesc(hrtyper, lltype.Ptr(TYPE),
+ fielddescs.append(NamedFieldDesc(RGenOp, lltype.Ptr(TYPE),
offset))
TYPE = getattr(TYPE, offset)
unroll_path = unrolling_iterable(path)
@@ -426,7 +424,7 @@
else:
assert isinstance(TYPE, lltype.Array)
- arrayfielddesc = ArrayFieldDesc(hrtyper, TYPE)
+ arrayfielddesc = ArrayFieldDesc(RGenOp, TYPE)
getinterior_all = make_interior_getter(fielddescs)
def gengetinteriorarraysize(jitstate, argbox, *indexboxes):
@@ -504,8 +502,7 @@
gcref = False
fieldnonnull = False
- def __init__(self, hrtyper, PTRTYPE, RESTYPE):
- RGenOp = hrtyper.RGenOp
+ def __init__(self, RGenOp, PTRTYPE, RESTYPE):
self.PTRTYPE = PTRTYPE
T = None
if isinstance(RESTYPE, lltype.ContainerType):
@@ -534,7 +531,7 @@
pass # no redboxcls at all
else:
if self.virtualizable:
- self.structdesc = StructTypeDesc(hrtyper, T)
+ self.structdesc = StructTypeDesc(RGenOp, T)
self.redboxcls = rvalue.ll_redboxcls(RESTYPE)
self.immutable = PTRTYPE.TO._hints.get('immutable', False)
@@ -561,11 +558,17 @@
class NamedFieldDesc(FieldDesc):
- def __init__(self, hrtyper, PTRTYPE, name):
- FieldDesc.__init__(self, hrtyper, PTRTYPE, getattr(PTRTYPE.TO, name))
+ def __init__(self, RGenOp, PTRTYPE, name):
+ FieldDesc.__init__(self, RGenOp, PTRTYPE, getattr(PTRTYPE.TO, name))
T = self.PTRTYPE.TO
self.fieldname = name
- self.fieldtoken = hrtyper.RGenOp.fieldToken(T, name)
+ self.fieldtoken = RGenOp.fieldToken(T, name)
+ def getfield_if_non_null(jitstate, genvar):
+ ptr = genvar.revealconst(PTRTYPE)
+ if ptr:
+ res = getattr(ptr, name)
+ return rvalue.ll_gv_fromvalue(jitstate, res)
+ self.getfield_if_non_null = getfield_if_non_null
def compact_repr(self): # goes in ll helper names
return "Fld_%s_in_%s" % (self.fieldname, self.PTRTYPE._short_name())
@@ -586,17 +589,16 @@
class StructFieldDesc(NamedFieldDesc):
- def __init__(self, hrtyper, PTRTYPE, name, index):
- NamedFieldDesc.__init__(self, hrtyper, PTRTYPE, name)
+ def __init__(self, RGenOp, PTRTYPE, name, index):
+ NamedFieldDesc.__init__(self, RGenOp, PTRTYPE, name)
self.fieldindex = index
class ArrayFieldDesc(FieldDesc):
allow_void = True
- def __init__(self, hrtyper, TYPE):
+ def __init__(self, RGenOp, TYPE):
assert isinstance(TYPE, lltype.Array)
- FieldDesc.__init__(self, hrtyper, lltype.Ptr(TYPE), TYPE.OF)
- RGenOp = hrtyper.RGenOp
+ FieldDesc.__init__(self, RGenOp, lltype.Ptr(TYPE), TYPE.OF)
self.arraytoken = RGenOp.arrayToken(TYPE)
self.varsizealloctoken = RGenOp.varsizeAllocToken(TYPE)
self.indexkind = RGenOp.kindToken(lltype.Signed)
Modified: pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py Mon Feb 4 16:47:13 2008
@@ -140,15 +140,15 @@
# XXX MemoryError handling
return rvalue.PtrRedBox(contdesc.ptrkind, genvar, known_nonzero=True)
-def ll_gengetfield(jitstate, deepfrozen, fielddesc, argbox):
+def gengetfield(jitstate, deepfrozen, fielddesc, argbox):
if (fielddesc.immutable or deepfrozen) and argbox.is_constant():
- ptr = rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE)
- if ptr: # else don't constant-fold the segfault...
- res = getattr(ptr, fielddesc.fieldname)
- return rvalue.ll_fromvalue(jitstate, res)
+ resgv = fielddesc.getfield_if_non_null(
+ jitstate, argbox.getgenvar(jitstate))
+ if resgv is not None:
+ return fielddesc.makebox(jitstate, resgv)
return argbox.op_getfield(jitstate, fielddesc)
-def ll_gensetfield(jitstate, fielddesc, destbox, valuebox):
+def gensetfield(jitstate, fielddesc, destbox, valuebox):
destbox.op_setfield(jitstate, fielddesc, valuebox)
def ll_gengetsubstruct(jitstate, fielddesc, argbox):
More information about the Pypy-commit
mailing list