[pypy-svn] r51277 - in pypy/branch/jit-refactoring/pypy/jit: rainbow rainbow/test timeshifter
cfbolz at codespeak.net
cfbolz at codespeak.net
Mon Feb 4 23:51:26 CET 2008
Author: cfbolz
Date: Mon Feb 4 23:51:25 2008
New Revision: 51277
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:
first getarrayitem test passing
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 23:51:25 2008
@@ -42,6 +42,7 @@
self.keydescs = []
self.structtypedescs = []
self.fielddescs = []
+ self.arrayfielddescs = []
self.called_bytecodes = []
self.num_mergepoints = 0
self.graph_color = self.graph_calling_color(graph)
@@ -65,6 +66,8 @@
self.structtypedesc_positions = {}
# mapping tuples of STRUCT, name to index
self.fielddesc_positions = {}
+ # mapping ARRAYS to index
+ self.arrayfielddesc_positions = {}
# mapping graphs to index
self.graph_positions = {}
# mapping fnobjs to index
@@ -83,6 +86,7 @@
self.keydescs,
self.structtypedescs,
self.fielddescs,
+ self.arrayfielddescs,
self.called_bytecodes,
self.num_mergepoints,
self.graph_color,
@@ -335,6 +339,15 @@
self.fielddesc_positions[fieldname, TYPE] = result
return result
+ def arrayfielddesc_position(self, TYPE):
+ if TYPE in self.fielddesc_positions:
+ return self.fielddesc_positions[TYPE]
+ arrayfielddesc = rcontainer.ArrayFieldDesc(self.RGenOp, TYPE)
+ result = len(self.arrayfielddescs)
+ self.arrayfielddescs.append(arrayfielddesc)
+ self.arrayfielddesc_positions[TYPE] = result
+ return result
+
def graph_position(self, graph):
if graph in self.graph_positions:
return self.graph_positions[graph]
@@ -541,6 +554,18 @@
return
self.emit("red_setfield", destboxindex, fielddescindex, valboxindex)
+ def serialize_op_getarrayitem(self, op):
+ arrayvar, indexvar = op.args
+ PTRTYPE = arrayvar.concretetype
+ if PTRTYPE.TO.OF is lltype.Void:
+ return
+ deepfrozen = self.hannotator.binding(arrayvar).deepfrozen
+ fielddescindex = self.arrayfielddesc_position(PTRTYPE.TO)
+ arrayindex = self.serialize_oparg("red", arrayvar)
+ index = self.serialize_oparg("red", indexvar)
+ self.emit("red_getarrayitem", arrayindex, fielddescindex, index,
+ deepfrozen)
+ self.register_redvar(op.result)
# call handling
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 23:51:25 2008
@@ -18,8 +18,8 @@
"""
def __init__(self, name, code, constants, typekinds, redboxclasses,
- keydescs, structtypedescs, fielddescs, called_bytecodes,
- num_mergepoints, graph_color,
+ keydescs, structtypedescs, fielddescs, arrayfielddescs,
+ called_bytecodes, num_mergepoints, graph_color,
nonrainbow_functions, is_portal):
self.name = name
self.code = code
@@ -29,6 +29,7 @@
self.keydescs = keydescs
self.structtypedescs = structtypedescs
self.fielddescs = fielddescs
+ self.arrayfielddescs = arrayfielddescs
self.called_bytecodes = called_bytecodes
self.num_mergepoints = num_mergepoints
self.graph_color = graph_color
@@ -355,6 +356,14 @@
resbox = rtimeshift.gensetfield(self.jitstate, fielddesc, destbox,
valuebox)
+ def opimpl_red_getarrayitem(self):
+ arraybox = self.get_redarg()
+ fielddesc = self.frame.bytecode.arrayfielddescs[self.load_2byte()]
+ indexbox = self.get_redarg()
+ deepfrozen = self.load_bool()
+ resbox = rtimeshift.gengetarrayitem(self.jitstate, deepfrozen, fielddesc,
+ arraybox, indexbox)
+ 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 23:51:25 2008
@@ -525,7 +525,6 @@
self.check_insns({})
def test_simple_array(self):
- py.test.skip("arrays and structs are not working")
A = lltype.GcArray(lltype.Signed,
hints={'immutable': True})
def ll_function(a):
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 23:51:25 2008
@@ -603,6 +603,13 @@
self.varsizealloctoken = RGenOp.varsizeAllocToken(TYPE)
self.indexkind = RGenOp.kindToken(lltype.Signed)
+ def getarrayitem_if_non_null(jitstate, genvar, gv_index):
+ array = genvar.revealconst(self.PTRTYPE)
+ index = gv_index.revealconst(lltype.Signed)
+ if array and 0 <= index < len(array): # else don't constant-fold
+ res = array[index]
+ return rvalue.ll_gv_fromvalue(jitstate, res)
+ self.getarrayitem_if_non_null = getarrayitem_if_non_null
# ____________________________________________________________
class FrozenVirtualStruct(FrozenContainer):
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 23:51:25 2008
@@ -159,14 +159,14 @@
return rvalue.ll_fromvalue(jitstate, res)
return argbox.op_getsubstruct(jitstate, fielddesc)
-def ll_gengetarrayitem(jitstate, deepfrozen, fielddesc, argbox, indexbox):
+def gengetarrayitem(jitstate, deepfrozen, fielddesc, argbox, indexbox):
if ((fielddesc.immutable or deepfrozen) and argbox.is_constant()
and indexbox.is_constant()):
- array = rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE)
- index = rvalue.ll_getvalue(indexbox, lltype.Signed)
- if array and 0 <= index < len(array): # else don't constant-fold
- res = array[index]
- return rvalue.ll_fromvalue(jitstate, res)
+ resgv = fielddesc.getarrayitem_if_non_null(
+ jitstate, argbox.getgenvar(jitstate),
+ indexbox.getgenvar(jitstate))
+ if resgv is not None:
+ return fielddesc.makebox(jitstate, resgv)
genvar = jitstate.curbuilder.genop_getarrayitem(
fielddesc.arraytoken,
argbox.getgenvar(jitstate),
@@ -197,7 +197,7 @@
valuebox.getgenvar(jitstate)
)
-def ll_gengetarraysize(jitstate, fielddesc, argbox):
+def gengetarraysize(jitstate, fielddesc, argbox):
if argbox.is_constant():
array = rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE)
if array: # else don't constant-fold the segfault...
More information about the Pypy-commit
mailing list