[pypy-commit] pypy virtual-dicts: it... all seems to work
alex_gaynor
noreply at buildbot.pypy.org
Tue Oct 25 03:18:47 CEST 2011
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: virtual-dicts
Changeset: r48403:912afce3954e
Date: 2011-10-24 21:18 -0400
http://bitbucket.org/pypy/pypy/changeset/912afce3954e/
Log: it... all seems to work
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -157,11 +157,7 @@
bad[other] = True
return False
renum[self.position] = other.position
- if not isinstance(other, VArrayStateInfo):
- bad[self] = True
- bad[other] = True
- return False
- if self.arraydescr is not other.arraydescr:
+ if not self._generalization_of(other):
bad[self] = True
bad[other] = True
return False
@@ -177,6 +173,10 @@
return False
return True
+ def _generalization_of(self, other):
+ return (isinstance(other, VArrayStateInfo) and
+ self.arraydescr is other.arraydescr)
+
def enum_forced_boxes(self, boxes, value, optimizer):
assert isinstance(value, virtualize.VArrayValue)
assert value.is_virtual()
@@ -198,6 +198,48 @@
self.arraydescr = arraydescr
self.fielddescrs = fielddescrs
+ def generalization_of(self, other, renum, bad):
+ assert self.position != -1
+ if self.position in renum:
+ if renum[self.position] == other.position:
+ return True
+ bad[self] = True
+ bad[other] = True
+ return False
+ renum[self.position] = other.position
+ if not self._generalization_of(other):
+ bad[self] = True
+ bad[other] = True
+ return False
+
+ if len(self.fielddescrs) != len(other.fielddescrs):
+ bad[self] = True
+ bad[other] = True
+ return False
+
+ p = 0
+ for i in range(len(self.fielddescrs)):
+ if len(self.fielddescrs[i]) != len(other.fielddescrs[i]):
+ bad[self] = True
+ bad[other] = True
+ return False
+ for j in range(len(self.fielddescrs[i])):
+ if self.fielddescrs[i][j] is not other.fielddescrs[i][j]:
+ bad[self] = True
+ bad[other] = True
+ return False
+ if not self.fieldstate[p].generalization_of(other.fieldstate[p],
+ renum, bad):
+ bad[self] = True
+ bad[other] = True
+ return False
+ p += 1
+ return True
+
+ def _generalization_of(self, other):
+ return (isinstance(other, VArrayStructStateInfo) and
+ self.arraydescr is other.arraydescr)
+
def _enum(self, virtual_state):
for s in self.fieldstate:
s.enum(virtual_state)
diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -540,6 +540,7 @@
for i in self.fieldnums:
debug_print("\t\t", str(untag(i)))
+
class VArrayStructInfo(AbstractVirtualInfo):
def __init__(self, arraydescr, fielddescrs):
self.arraydescr = arraydescr
@@ -550,6 +551,18 @@
for i in self.fieldnums:
debug_print("\t\t", str(untag(i)))
+ @specialize.argtype(1)
+ def allocate(self, decoder, index):
+ array = decoder.allocate_array(self.arraydescr, len(self.fielddescrs))
+ decoder.virtuals_cache[index] = array
+ p = 0
+ for i in range(len(self.fielddescrs)):
+ for j in range(len(self.fielddescrs[i])):
+ decoder.setinteriorfield(i, self.fielddescrs[i][j], array, self.fieldnums[p])
+ p += 1
+ return array
+
+
class VStrPlainInfo(AbstractVirtualInfo):
"""Stands for the string made out of the characters of all fieldnums."""
@@ -897,6 +910,17 @@
self.metainterp.execute_and_record(rop.SETFIELD_GC, descr,
structbox, fieldbox)
+ def setinteriorfield(self, index, descr, array, fieldnum):
+ if descr.is_pointer_field():
+ kind = REF
+ elif descr.is_float_field():
+ kind = FLOAT
+ else:
+ kind = INT
+ fieldbox = self.decode_box(fieldnum, kind)
+ self.metainterp.execute_and_record(rop.SETINTERIORFIELD_GC, descr,
+ array, ConstInt(index), fieldbox)
+
def setarrayitem_int(self, arraydescr, arraybox, index, fieldnum):
self._setarrayitem(arraydescr, arraybox, index, fieldnum, INT)
@@ -1177,6 +1201,17 @@
newvalue = self.decode_int(fieldnum)
self.cpu.bh_setfield_gc_i(struct, descr, newvalue)
+ def setinteriorfield(self, index, descr, array, fieldnum):
+ if descr.is_pointer_field():
+ newvalue = self.decode_ref(fieldnum)
+ self.cpu.bh_setinteriorfield_gc_r(array, index, descr, newvalue)
+ elif descr.is_float_field():
+ newvalue = self.decode_float(fieldnum)
+ self.cpu.bh_setinteriorfield_gc_f(array, index, descr, newvalue)
+ else:
+ newvalue = self.decode_int(fieldnum)
+ self.cpu.bh_setinteriorfield_gc_i(array, index, descr, newvalue)
+
def setarrayitem_int(self, arraydescr, array, index, fieldnum):
newvalue = self.decode_int(fieldnum)
self.cpu.bh_setarrayitem_gc_i(arraydescr, array, index, newvalue)
diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py
--- a/pypy/jit/metainterp/test/test_ajit.py
+++ b/pypy/jit/metainterp/test/test_ajit.py
@@ -3494,12 +3494,12 @@
d = None
while n > 0:
myjitdriver.jit_merge_point(n=n, d=d)
- d = {}
+ d = {"q": 1}
if n % 2:
d["k"] = n
else:
d["z"] = n
- n -= len(d)
+ n -= len(d) - d["q"]
return n
res = self.meta_interp(f, [10])
assert res == 0
More information about the pypy-commit
mailing list