[pypy-commit] pypy default: Kill history.Const.__eq__ to get consistant behaviour before and after translation
hakanardo
noreply at buildbot.pypy.org
Wed Oct 12 21:04:12 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch:
Changeset: r47970:80901cc39f5d
Date: 2011-10-12 21:03 +0200
http://bitbucket.org/pypy/pypy/changeset/80901cc39f5d/
Log: Kill history.Const.__eq__ to get consistant behaviour before and
after translation
diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py
--- a/pypy/jit/metainterp/history.py
+++ b/pypy/jit/metainterp/history.py
@@ -9,6 +9,7 @@
from pypy.jit.metainterp.resoperation import ResOperation, rop
from pypy.jit.codewriter import heaptracker, longlong
+from pypy.rlib.objectmodel import compute_identity_hash
# ____________________________________________________________
@@ -104,7 +105,7 @@
getref._annspecialcase_ = 'specialize:arg(1)'
def _get_hash_(self):
- raise NotImplementedError
+ return compute_identity_hash(self)
def clonebox(self):
raise NotImplementedError
@@ -133,6 +134,9 @@
def _get_str(self):
raise NotImplementedError
+ def same_box(self, other):
+ return self is other
+
class AbstractDescr(AbstractValue):
__slots__ = ()
@@ -241,32 +245,15 @@
def constbox(self):
return self
+ def same_box(self, other):
+ return self.same_constant(other)
+
def same_constant(self, other):
raise NotImplementedError
def __repr__(self):
return 'Const(%s)' % self._getrepr_()
- def __eq__(self, other):
- "NOT_RPYTHON"
- # Remember that you should not compare Consts with '==' in RPython.
- # Consts have no special __hash__, in order to force different Consts
- # from being considered as different keys when stored in dicts
- # (as they always are after translation). Use a dict_equal_consts()
- # to get the other behavior (i.e. using this __eq__).
- if self.__class__ is not other.__class__:
- return False
- try:
- return self.value == other.value
- except TypeError:
- if (isinstance(self.value, Symbolic) and
- isinstance(other.value, Symbolic)):
- return self.value is other.value
- raise
-
- def __ne__(self, other):
- return not (self == other)
-
class ConstInt(Const):
type = INT
@@ -688,33 +675,6 @@
# ____________________________________________________________
-def dict_equal_consts():
- "NOT_RPYTHON"
- # Returns a dict in which Consts that compare as equal
- # are identified when used as keys.
- return r_dict(dc_eq, dc_hash)
-
-def dc_eq(c1, c2):
- return c1 == c2
-
-def dc_hash(c):
- "NOT_RPYTHON"
- # This is called during translation only. Avoid using identityhash(),
- # to avoid forcing a hash, at least on lltype objects.
- if not isinstance(c, Const):
- return hash(c)
- if isinstance(c.value, Symbolic):
- return id(c.value)
- try:
- if isinstance(c, ConstPtr):
- p = lltype.normalizeptr(c.value)
- if p is not None:
- return hash(p._obj)
- else:
- return 0
- return c._get_hash_()
- except lltype.DelayedPointer:
- return -2 # xxx risk of changing hash...
def make_hashable_int(i):
from pypy.rpython.lltypesystem.ll2ctypes import NotCtypesAllocatedStructure
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -2329,7 +2329,7 @@
def _variables_equal(box, varname, strict):
if varname not in virtuals:
if strict:
- assert box == oparse.getvar(varname)
+ assert box.same_box(oparse.getvar(varname))
else:
assert box.value == oparse.getvar(varname).value
else:
diff --git a/pypy/jit/metainterp/optimizeopt/util.py b/pypy/jit/metainterp/optimizeopt/util.py
--- a/pypy/jit/metainterp/optimizeopt/util.py
+++ b/pypy/jit/metainterp/optimizeopt/util.py
@@ -90,14 +90,11 @@
for i in range(len(args1)):
arg1 = args1[i]
arg2 = args2[i]
- if isinstance(arg1, history.Const):
- if arg1.__class__ is not arg2.__class__:
+ if arg1 is None:
+ if arg2 is not None:
return False
- if not arg1.same_constant(arg2):
- return False
- else:
- if not arg1 is arg2:
- return False
+ elif not arg1.same_box(arg2):
+ return False
return True
def args_hash(args):
@@ -106,10 +103,8 @@
for arg in args:
if arg is None:
y = 17
- elif isinstance(arg, history.Const):
+ else:
y = arg._get_hash_()
- else:
- y = compute_identity_hash(arg)
res = intmask((1000003 * res) ^ y)
return res
@@ -145,9 +140,12 @@
for i in range(op1.numargs()):
x = op1.getarg(i)
y = op2.getarg(i)
- assert x == remap.get(y, y)
+ assert x.same_box(remap.get(y, y))
if op2.result in remap:
- assert op1.result == remap[op2.result]
+ if op2.result is None:
+ assert op1.result == remap[op2.result]
+ else:
+ assert op1.result.same_box(remap[op2.result])
else:
remap[op2.result] = op1.result
if op1.getopnum() != rop.JUMP: # xxx obscure
@@ -156,11 +154,20 @@
assert len(op1.getfailargs()) == len(op2.getfailargs())
if strict_fail_args:
for x, y in zip(op1.getfailargs(), op2.getfailargs()):
- assert x == remap.get(y, y)
+ if x is None:
+ assert remap.get(y, y) is None
+ else:
+ assert x.same_box(remap.get(y, y))
else:
fail_args1 = set(op1.getfailargs())
fail_args2 = set([remap.get(y, y) for y in op2.getfailargs()])
- assert fail_args1 == fail_args2
+ for x in fail_args1:
+ for y in fail_args2:
+ if x.same_box(y):
+ fail_args2.remove(y)
+ break
+ else:
+ assert False
assert len(oplist1) == len(oplist2)
print '-'*totwidth
return True
diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py b/pypy/jit/metainterp/optimizeopt/vstring.py
--- a/pypy/jit/metainterp/optimizeopt/vstring.py
+++ b/pypy/jit/metainterp/optimizeopt/vstring.py
@@ -587,10 +587,7 @@
return True
#
if v1.is_nonnull() and v2.is_nonnull():
- if l1box is not None and l2box is not None and (
- l1box == l2box or (isinstance(l1box, ConstInt) and
- isinstance(l2box, ConstInt) and
- l1box.value == l2box.value)):
+ if l1box is not None and l2box is not None and l1box.same_box(l2box):
do = EffectInfo.OS_STREQ_LENGTHOK
else:
do = EffectInfo.OS_STREQ_NONNULL
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -162,7 +162,9 @@
if registers[i] is oldbox:
registers[i] = newbox
if not we_are_translated():
- assert oldbox not in registers[count:]
+ for b in registers[count:]:
+ assert not oldbox.same_box(b)
+
def make_result_of_lastop(self, resultbox):
got_type = resultbox.type
diff --git a/pypy/jit/metainterp/test/test_resume.py b/pypy/jit/metainterp/test/test_resume.py
--- a/pypy/jit/metainterp/test/test_resume.py
+++ b/pypy/jit/metainterp/test/test_resume.py
@@ -180,22 +180,27 @@
reader.consume_boxes(info, bi, br, bf)
b1s = reader.liveboxes[0]
b2s = reader.liveboxes[1]
- assert bi == [b1s, ConstInt(111), b1s]
- assert br == [ConstPtr(gcrefnull), b2s]
+ assert_same(bi, [b1s, ConstInt(111), b1s])
+ assert_same(br, [ConstPtr(gcrefnull), b2s])
bi, br, bf = [None]*2, [None]*0, [None]*0
info = MyBlackholeInterp([lltype.Signed,
lltype.Signed]).get_current_position_info()
reader.consume_boxes(info, bi, br, bf)
- assert bi == [ConstInt(222), ConstInt(333)]
+ assert_same(bi, [ConstInt(222), ConstInt(333)])
bi, br, bf = [None]*2, [None]*1, [None]*0
info = MyBlackholeInterp([lltype.Signed, llmemory.GCREF,
lltype.Signed]).get_current_position_info()
reader.consume_boxes(info, bi, br, bf)
b3s = reader.liveboxes[2]
- assert bi == [b1s, b3s]
- assert br == [b2s]
+ assert_same(bi, [b1s, b3s])
+ assert_same(br, [b2s])
#
+def assert_same(list1, list2):
+ assert len(list1) == len(list2)
+ for b1, b2 in zip(list1, list2):
+ assert b1.same_box(b2)
+
def test_simple_read_tagged_ints():
storage = Storage()
storage.rd_consts = []
@@ -1023,11 +1028,11 @@
metainterp = MyMetaInterp()
reader = ResumeDataFakeReader(storage, newboxes, metainterp)
lst = reader.consume_boxes()
- assert lst == [b1t, b1t, b3t]
+ assert_same(lst, [b1t, b1t, b3t])
lst = reader.consume_boxes()
- assert lst == [ConstInt(2), ConstInt(3)]
+ assert_same(lst, [ConstInt(2), ConstInt(3)])
lst = reader.consume_boxes()
- assert lst == [b1t, ConstInt(1), b1t, b1t]
+ assert_same(lst, [b1t, ConstInt(1), b1t, b1t])
assert metainterp.trace == []
@@ -1044,11 +1049,11 @@
reader = ResumeDataFakeReader(storage, newboxes, metainterp)
lst = reader.consume_boxes()
c1t = ConstInt(111)
- assert lst == [c1t, b2t, b3t]
+ assert_same(lst, [c1t, b2t, b3t])
lst = reader.consume_boxes()
- assert lst == [ConstInt(2), ConstInt(3)]
+ assert_same(lst, [ConstInt(2), ConstInt(3)])
lst = reader.consume_boxes()
- assert lst == [c1t, ConstInt(1), c1t, b2t]
+ assert_same(lst, [c1t, ConstInt(1), c1t, b2t])
assert metainterp.trace == []
@@ -1114,9 +1119,11 @@
# check that we get the operations in 'expected', in a possibly different
# order.
assert len(trace) == len(expected)
- for x in trace:
- assert x in expected
- expected.remove(x)
+ with CompareableConsts():
+ for x in trace:
+ assert x in expected
+ expected.remove(x)
+
ptr = b2t.value._obj.container._as_ptr()
assert lltype.typeOf(ptr) == lltype.Ptr(LLtypeMixin.NODE)
assert ptr.value == 111
@@ -1126,6 +1133,18 @@
assert ptr2.parent.value == 33
assert ptr2.parent.next == ptr
+class CompareableConsts(object):
+ def __init__(self):
+ self.oldeq = None
+
+ def __enter__(self):
+ assert self.oldeq is None
+ self.oldeq = Const.__eq__
+ Const.__eq__ = Const.same_box
+
+ def __exit__(self, type, value, traceback):
+ Const.__eq__ = self.oldeq
+
def test_virtual_adder_make_varray():
b2s, b4s = [BoxPtr(), BoxInt(4)]
c1s = ConstInt(111)
@@ -1163,8 +1182,9 @@
(rop.SETARRAYITEM_GC, [b2t,ConstInt(1), c1s], None,
LLtypeMixin.arraydescr),
]
- for x, y in zip(expected, trace):
- assert x == y
+ with CompareableConsts():
+ for x, y in zip(expected, trace):
+ assert x == y
#
ptr = b2t.value._obj.container._as_ptr()
assert lltype.typeOf(ptr) == lltype.Ptr(lltype.GcArray(lltype.Signed))
@@ -1207,8 +1227,9 @@
(rop.SETFIELD_GC, [b2t, c1s], None, LLtypeMixin.adescr),
(rop.SETFIELD_GC, [b2t, b4t], None, LLtypeMixin.bdescr),
]
- for x, y in zip(expected, trace):
- assert x == y
+ with CompareableConsts():
+ for x, y in zip(expected, trace):
+ assert x == y
#
ptr = b2t.value._obj.container._as_ptr()
assert lltype.typeOf(ptr) == lltype.Ptr(LLtypeMixin.S)
More information about the pypy-commit
mailing list