[pypy-svn] r51282 - in pypy/branch/jit-refactoring/pypy/jit: rainbow rainbow/test timeshifter
cfbolz at codespeak.net
cfbolz at codespeak.net
Tue Feb 5 01:47:50 CET 2008
Author: cfbolz
Date: Tue Feb 5 01:47:50 2008
New Revision: 51282
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/hrtyper.py
pypy/branch/jit-refactoring/pypy/jit/timeshifter/rcontainer.py
pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py
Log:
support for getarraysize
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 Tue Feb 5 01:47:50 2008
@@ -43,6 +43,7 @@
self.structtypedescs = []
self.fielddescs = []
self.arrayfielddescs = []
+ self.interiordescs = []
self.called_bytecodes = []
self.num_mergepoints = 0
self.graph_color = self.graph_calling_color(graph)
@@ -87,6 +88,7 @@
self.structtypedescs,
self.fielddescs,
self.arrayfielddescs,
+ self.interiordescs,
self.called_bytecodes,
self.num_mergepoints,
self.graph_color,
@@ -384,6 +386,33 @@
self.nonrainbow_functions.append(call_normal_function)
self.nonrainbow_positions[fn] = result
return result
+
+ def interiordesc(self, op, PTRTYPE, nb_offsets):
+ path = []
+ CONTAINER = PTRTYPE.TO
+ indices_v = []
+ for i in range(1, 1 + nb_offsets):
+ varg = op.args[i]
+ T = varg.concretetype
+ if T is lltype.Void:
+ fieldname = varg.value
+ CONTAINER = getattr(CONTAINER, fieldname)
+ path.append(fieldname)
+ else:
+ assert T is lltype.Signed
+ CONTAINER = CONTAINER.OF
+ path.append(None) # placeholder for 'array index'
+ indices_v.append(varg)
+ if CONTAINER is lltype.Void: # Void field
+ return -1, None
+ else:
+ key = (PTRTYPE.TO, tuple(path))
+ if key in self.interiordesc_positions:
+ return self.interiordesc_positions[key]
+ desc = rcontainer.InteriorDesc(self.RGenOp, PTRTYPE.TO, tuple(path)),
+ result = len(self.interiordescs)
+ self.interiordescs.append(desc)
+ return (result, indices_v)
def emit(self, *stuff):
assert stuff is not None
@@ -482,7 +511,6 @@
self.register_redvar(op.result)
def serialize_op_malloc_varsize(self, op):
-
PTRTYPE = op.result.concretetype
TYPE = PTRTYPE.TO
v_size = op.args[2]
@@ -598,6 +626,16 @@
self.emit("red_setarrayitem", destboxindex, fielddescindex,
indexboxindex, valboxindex)
+ def serialize_op_getarraysize(self, op):
+ arrayvar, = op.args
+ PTRTYPE = arrayvar.concretetype
+ if PTRTYPE.TO.OF is lltype.Void:
+ return
+ fielddescindex = self.arrayfielddesc_position(PTRTYPE.TO)
+ arrayindex = self.serialize_oparg("red", arrayvar)
+ self.emit("red_getarraysize", arrayindex, fielddescindex)
+ self.register_redvar(op.result)
+
# call handling
def graphs_from(self, spaceop):
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 Tue Feb 5 01:47:50 2008
@@ -19,7 +19,7 @@
def __init__(self, name, code, constants, typekinds, redboxclasses,
keydescs, structtypedescs, fielddescs, arrayfielddescs,
- called_bytecodes, num_mergepoints, graph_color,
+ interiordescs, called_bytecodes, num_mergepoints, graph_color,
nonrainbow_functions, is_portal):
self.name = name
self.code = code
@@ -30,6 +30,7 @@
self.structtypedescs = structtypedescs
self.fielddescs = fielddescs
self.arrayfielddescs = arrayfielddescs
+ self.interiordescs = interiordescs
self.called_bytecodes = called_bytecodes
self.num_mergepoints = num_mergepoints
self.graph_color = graph_color
@@ -387,6 +388,12 @@
resbox = rtimeshift.gensetarrayitem(self.jitstate, fielddesc, destbox,
indexbox, valuebox)
+ def opimpl_red_getarraysize(self):
+ arraybox = self.get_redarg()
+ fielddesc = self.frame.bytecode.arrayfielddescs[self.load_2byte()]
+ resbox = rtimeshift.gengetarraysize(self.jitstate, fielddesc, arraybox)
+ 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 Tue Feb 5 01:47:50 2008
@@ -546,6 +546,28 @@
assert res == 24
self.check_insns({})
+ def test_arraysize(self):
+ A = lltype.GcArray(lltype.Signed)
+ def ll_function(a):
+ return len(a)
+
+ def int_array(string):
+ items = [int(x) for x in string.split(',')]
+ n = len(items)
+ a1 = lltype.malloc(A, n)
+ for i in range(n):
+ a1[i] = items[i]
+ return a1
+ ll_function.convert_arguments = [int_array]
+
+ res = self.interpret(ll_function, ["6,7"], [])
+ assert res == 2
+ self.check_insns({'getarraysize': 1})
+ res = self.interpret(ll_function, ["8,3,3,4,5"], [0])
+ assert res == 5
+ self.check_insns({})
+
+
def test_simple_struct_malloc(self):
py.test.skip("blue containers: to be reimplemented")
S = lltype.GcStruct('helloworld', ('hello', lltype.Signed),
Modified: pypy/branch/jit-refactoring/pypy/jit/timeshifter/hrtyper.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/timeshifter/hrtyper.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/timeshifter/hrtyper.py Tue Feb 5 01:47:50 2008
@@ -880,27 +880,6 @@
ts.s_RedBox)
- def _getinteriordesc(self, hop, PTRTYPE, nb_offsets):
- path = []
- CONTAINER = PTRTYPE.TO
- indices_v = []
- for i in range(1, 1 + nb_offsets):
- T = originalconcretetype(hop.args_s[i])
- if T is lltype.Void:
- fieldname = hop.args_v[i].value
- CONTAINER = getattr(CONTAINER, fieldname)
- path.append(fieldname)
- else:
- assert T is lltype.Signed
- CONTAINER = CONTAINER.OF
- path.append(None) # placeholder for 'array index'
- v_index = hop.inputarg(self.getredrepr(lltype.Signed), arg=i)
- indices_v.append(v_index)
- if CONTAINER is lltype.Void: # Void field
- return None, None
- else:
- return (rcontainer.InteriorDesc(self, PTRTYPE.TO, tuple(path)),
- indices_v)
def translate_op_getinteriorfield(self, hop):
ts = self
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 Tue Feb 5 01:47:50 2008
@@ -610,6 +610,12 @@
res = array[index]
return rvalue.ll_gv_fromvalue(jitstate, res)
self.getarrayitem_if_non_null = getarrayitem_if_non_null
+ def getarraysize_if_non_null(jitstate, genvar):
+ array = genvar.revealconst(self.PTRTYPE)
+ if array: # else don't constant-fold
+ res = len(array)
+ return rvalue.ll_gv_fromvalue(jitstate, res)
+ self.getarraysize_if_non_null = getarraysize_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 Tue Feb 5 01:47:50 2008
@@ -199,10 +199,10 @@
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...
- res = len(array)
- return rvalue.ll_fromvalue(jitstate, res)
+ resgv = fielddesc.getarraysize_if_non_null(
+ jitstate, argbox.getgenvar(jitstate))
+ if resgv is not None:
+ return fielddesc.makebox(jitstate, resgv)
genvar = jitstate.curbuilder.genop_getarraysize(
fielddesc.arraytoken,
argbox.getgenvar(jitstate))
More information about the Pypy-commit
mailing list