Author: Spenser Bauman <[email protected]>
Branch: value-classes
Changeset: r87331:770b5b1dda6b
Date: 2016-09-22 14:40 -0400
http://bitbucket.org/pypy/pypy/changeset/770b5b1dda6b/
Log: Clean up for virtualstate.py
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -29,6 +29,14 @@
self.optearlyforce = None
self.optimizer = Optimizer
+
+class FakeDescr(object):
+ def __init__(self, vtable):
+ self.vtable = vtable
+ def get_vtable(self):
+ return self.vtable
+FakeDescr.value = FakeDescr(42)
+
class BaseTestGenerateGuards(BaseTest):
def setup_class(self):
classbox = self.cpu.ts.cls_of_box(InputArgRef(self.nodeaddr))
@@ -158,7 +166,8 @@
info1.fieldstate = info2.fieldstate = []
postest(info1, info2)
- info1, info2 = VirtualStateInfo(ConstInt(42), []),
VirtualStateInfo(ConstInt(42), [])
+ fakedescr = FakeDescr.value
+ info1, info2 = VirtualStateInfo(fakedescr, []),
VirtualStateInfo(fakedescr, [])
info1.fieldstate = info2.fieldstate = []
postest(info1, info2)
@@ -222,10 +231,10 @@
def get_index(self):
return 0
fielddescr = FieldDescr()
- fakedescr = object()
+ fakedescr = FakeDescr.value
fldtst(VArrayStateInfo(fakedescr), VArrayStateInfo(fakedescr))
fldtst(VStructStateInfo(fakedescr, [fielddescr]),
VStructStateInfo(fakedescr, [fielddescr]))
- fldtst(VirtualStateInfo(ConstInt(42), [fielddescr]),
VirtualStateInfo(ConstInt(42), [fielddescr]))
+ fldtst(VirtualStateInfo(fakedescr, [fielddescr]),
VirtualStateInfo(fakedescr, [fielddescr]))
fldtst(VArrayStructStateInfo(fakedescr, [fielddescr], 1),
VArrayStructStateInfo(fakedescr, [fielddescr], 1))
def test_known_class_generalization(self):
@@ -249,7 +258,7 @@
def test_circular_generalization(self):
for info in (VArrayStateInfo(42), VStructStateInfo(42, [7]),
- VirtualStateInfo(ConstInt(42), [7])):
+ VirtualStateInfo(FakeDescr.value, [7])):
info.position = 0
info.fieldstate = [info]
self.check_no_guards(info, info)
@@ -568,10 +577,10 @@
innerinfo2 = not_virtual(self.cpu, 'r', None)
innerinfo2.position = 1
- info1 = VirtualStateInfo(ConstInt(42), [self.nextdescr])
+ info1 = VirtualStateInfo(FakeDescr.value, [self.nextdescr])
info1.fieldstate = [innerinfo1]
- info2 = VirtualStateInfo(ConstInt(42), [self.nextdescr])
+ info2 = VirtualStateInfo(FakeDescr.value, [self.nextdescr])
info2.fieldstate = [innerinfo2]
value1 = info.InstancePtrInfo(self.nodesize, classbox, is_virtual=True)
@@ -660,12 +669,12 @@
# the below tests don't really have anything to do with guard generation
def test_virtuals_with_equal_fields(self):
- info1 = VirtualStateInfo(ConstInt(42), [1, 2])
+ info1 = VirtualStateInfo(FakeDescr.value, [1, 2])
info1.fieldstate = [self.knownclass_info, self.knownclass_info]
vstate1 = VirtualState([info1])
assert vstate1.generalization_of(vstate1, FakeOptimizer(self.cpu))
- info2 = VirtualStateInfo(ConstInt(42), [1, 2])
+ info2 = VirtualStateInfo(FakeDescr.value, [1, 2])
unknown_info1 = not_virtual(self.cpu, 'r',
info.InstancePtrInfo())
info2.fieldstate = [unknown_info1, unknown_info1]
@@ -674,7 +683,7 @@
assert not vstate1.generalization_of(vstate2, FakeOptimizer(self.cpu))
assert vstate2.generalization_of(vstate1, FakeOptimizer(self.cpu))
- info3 = VirtualStateInfo(ConstInt(42), [1, 2])
+ info3 = VirtualStateInfo(FakeDescr.value, [1, 2])
unknown_info1 = not_virtual(self.cpu, 'r',
info.InstancePtrInfo())
unknown_info2 = not_virtual(self.cpu, 'r',
@@ -687,7 +696,7 @@
assert not vstate1.generalization_of(vstate3, FakeOptimizer(self.cpu))
def test_virtuals_with_nonmatching_fields(self):
- info1 = VirtualStateInfo(ConstInt(42), [1, 2])
+ info1 = VirtualStateInfo(FakeDescr.value, [1, 2])
classbox = self.cpu.ts.cls_of_box(InputArgRef(self.nodeaddr))
value = info.InstancePtrInfo(None, classbox)
knownclass_info = not_virtual(self.cpu, 'r', value)
@@ -695,7 +704,7 @@
vstate1 = VirtualState([info1])
assert vstate1.generalization_of(vstate1, FakeOptimizer(self.cpu))
- info2 = VirtualStateInfo(ConstInt(42), [1, 2])
+ info2 = VirtualStateInfo(FakeDescr.value, [1, 2])
classbox = self.cpu.ts.cls_of_box(InputArgRef(self.node2addr))
value = info.InstancePtrInfo(None, classbox)
knownclass_info = not_virtual(self.cpu, 'r', value)
@@ -707,7 +716,7 @@
assert not vstate1.generalization_of(vstate2, FakeOptimizer(self.cpu))
def test_virtuals_with_nonmatching_descrs(self):
- info1 = VirtualStateInfo(ConstInt(42), [10, 20])
+ info1 = VirtualStateInfo(FakeDescr.value, [10, 20])
classbox = self.cpu.ts.cls_of_box(InputArgRef(self.nodeaddr))
value = info.InstancePtrInfo(None, classbox)
knownclass_info = not_virtual(self.cpu, 'r', value)
@@ -715,7 +724,7 @@
vstate1 = VirtualState([info1])
assert vstate1.generalization_of(vstate1, FakeOptimizer(self.cpu))
- info2 = VirtualStateInfo(ConstInt(42), [1, 2])
+ info2 = VirtualStateInfo(FakeDescr.value, [1, 2])
classbox = self.cpu.ts.cls_of_box(InputArgRef(self.node2addr))
value = info.InstancePtrInfo(None, classbox)
knownclass_info = not_virtual(self.cpu, 'r', value)
@@ -727,7 +736,7 @@
assert not vstate1.generalization_of(vstate2, FakeOptimizer(self.cpu))
def test_virtuals_with_nonmatching_classes(self):
- info1 = VirtualStateInfo(ConstInt(42), [1, 2])
+ info1 = VirtualStateInfo(FakeDescr.value, [1, 2])
classbox = self.cpu.ts.cls_of_box(InputArgRef(self.nodeaddr))
value = info.InstancePtrInfo(None, classbox)
knownclass_info = not_virtual(self.cpu, 'r', value)
@@ -735,7 +744,7 @@
vstate1 = VirtualState([info1])
assert vstate1.generalization_of(vstate1, FakeOptimizer(self.cpu))
- info2 = VirtualStateInfo(ConstInt(7), [1, 2])
+ info2 = VirtualStateInfo(FakeDescr(7), [1, 2])
classbox = self.cpu.ts.cls_of_box(InputArgRef(self.node2addr))
value = info.InstancePtrInfo(None, classbox)
knownclass_info = not_virtual(self.cpu, 'r', value)
@@ -747,7 +756,7 @@
assert not vstate1.generalization_of(vstate2, FakeOptimizer(self.cpu))
def test_nonvirtual_is_not_virtual(self):
- info1 = VirtualStateInfo(ConstInt(42), [1, 2])
+ info1 = VirtualStateInfo(FakeDescr.value, [1, 2])
classbox = self.cpu.ts.cls_of_box(InputArgRef(self.nodeaddr))
value = info.InstancePtrInfo(None, classbox)
knownclass_info = not_virtual(self.cpu, 'r', value)
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -65,6 +65,7 @@
descr))
class AbstractVirtualStateInfo(object):
+ _attrs_ = ('position',)
position = -1
def generate_guards(self, other, op, runtime_op, state):
@@ -133,7 +134,10 @@
class AbstractVirtualStructStateInfo(AbstractVirtualStateInfo):
- def __init__(self, fielddescrs):
+ _attrs_ = ('typedescr', 'fielddescrs')
+
+ def __init__(self, typedescr, fielddescrs):
+ self.typedescr = typedescr
self.fielddescrs = fielddescrs
def _generate_guards(self, other, box, runtime_box, state):
@@ -173,9 +177,8 @@
fieldbox,
fieldbox_runtime, state)
-
def _generalization_of_structpart(self, other):
- raise NotImplementedError
+ return type(self) is type(other) and self.typedescr is other.typedescr
def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False):
box = optimizer.get_box_replacement(box)
@@ -202,30 +205,17 @@
class VirtualStateInfo(AbstractVirtualStructStateInfo):
- def is_virtual(self):
- return True
+ _attrs_ = ('known_class',)
- def __init__(self, known_class, fielddescrs):
- AbstractVirtualStructStateInfo.__init__(self, fielddescrs)
- self.known_class = known_class
-
- def _generalization_of_structpart(self, other):
- return (isinstance(other, VirtualStateInfo) and
- self.known_class.same_constant(other.known_class))
-
+ def __init__(self, typedescr, fielddescrs):
+ AbstractVirtualStructStateInfo.__init__(self, typedescr, fielddescrs)
+ self.known_class = ConstInt(typedescr.get_vtable())
def debug_header(self, indent):
debug_print(indent + 'VirtualStateInfo(%d):' % self.position)
class VStructStateInfo(AbstractVirtualStructStateInfo):
- def __init__(self, typedescr, fielddescrs):
- AbstractVirtualStructStateInfo.__init__(self, fielddescrs)
- self.typedescr = typedescr
-
- def _generalization_of_structpart(self, other):
- return (isinstance(other, VStructStateInfo) and
- self.typedescr is other.typedescr)
def debug_header(self, indent):
debug_print(indent + 'VStructStateInfo(%d):' % self.position)
@@ -372,12 +362,6 @@
self.level = LEVEL_CONSTANT
self.constbox = info.getconst()
- def is_const(self):
- return self.constbox is not None
-
- def is_virtual(self):
- return False
-
def _generate_guards(self, other, box, runtime_box, state):
# XXX This will always retrace instead of forcing anything which
# might be what we want sometimes?
@@ -745,11 +729,12 @@
return not_virtual(self.optimizer.cpu, box.type,
self.optimizer.getinfo(box))
- def visit_virtual(self, descr, fielddescrs):
- known_class = ConstInt(descr.get_vtable())
- return VirtualStateInfo(known_class, fielddescrs)
+ def visit_virtual(self, typedescr, fielddescrs):
+ assert typedescr.is_object()
+ return VirtualStateInfo(typedescr, fielddescrs)
def visit_vstruct(self, typedescr, fielddescrs):
+ assert not typedescr.is_object()
return VStructStateInfo(typedescr, fielddescrs)
def visit_varray(self, arraydescr, clear):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit