Author: Spenser Bauman <saba...@gmail.com> Branch: value-classes Changeset: r87403:e927b403b073 Date: 2016-09-26 13:05 -0400 http://bitbucket.org/pypy/pypy/changeset/e927b403b073/
Log: Cleanup 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 @@ -132,7 +132,6 @@ def debug_header(self, indent): raise NotImplementedError - class AbstractVirtualStructStateInfo(AbstractVirtualStateInfo): _attrs_ = ('typedescr', 'fielddescrs') @@ -141,6 +140,9 @@ self.fielddescrs = fielddescrs def _generate_guards(self, other, box, runtime_box, state): + if isinstance(other, NotVirtualStateInfo): + return self._generate_guards_non_virtual(other, box, runtime_box, state) + if not self._generalization_of_structpart(other): raise VirtualStatesCantMatch("different kinds of structs") @@ -178,7 +180,13 @@ fieldbox_runtime, state) def _generate_guards_non_virtual(self, other, box, runtime_box, state): - pass + """ + Generate guards for the case where a virtual object is expected, but + a non-virtual is given. When the underlying type is a value class, + the non-virtual may be virtualized by unpacking it and forwarding the + components elementwise. + """ + raise VirtualStatesCantMatch("different kinds of structs") def enum_forced_boxes(self, boxes, box, optimizer, force_boxes=False): box = optimizer.get_box_replacement(box) @@ -227,6 +235,7 @@ debug_print(indent + 'VStructStateInfo(%d):' % self.position) class VArrayStateInfo(AbstractVirtualStateInfo): + _attrs_ = ('arraydescr',) def __init__(self, arraydescr): self.arraydescr = arraydescr @@ -277,6 +286,8 @@ class VArrayStructStateInfo(AbstractVirtualStateInfo): + _attrs_ = ('arraydescr', 'fielddescrs', 'length') + def __init__(self, arraydescr, fielddescrs, length): self.arraydescr = arraydescr self.fielddescrs = fielddescrs @@ -355,10 +366,12 @@ return NotVirtualStateInfoInt(cpu, type, info) if type == 'r': return NotVirtualStateInfoPtr(cpu, type, info) + assert type == 'f' return NotVirtualStateInfo(cpu, type, info) class NotVirtualStateInfo(AbstractVirtualStateInfo): + _attrs_ = ('level', 'constbox', 'position_in_notvirtuals') level = LEVEL_UNKNOWN constbox = None @@ -458,6 +471,7 @@ debug_print(result) class NotVirtualStateInfoInt(NotVirtualStateInfo): + _attrs_ = ('intbound') intbound = None def __init__(self, cpu, type, info): @@ -492,6 +506,7 @@ class NotVirtualStateInfoPtr(NotVirtualStateInfo): + _attrs_ = ('lenbound', 'known_class') lenbound = None known_class = None diff --git a/rpython/jit/metainterp/test/test_virtual.py b/rpython/jit/metainterp/test/test_virtual.py --- a/rpython/jit/metainterp/test/test_virtual.py +++ b/rpython/jit/metainterp/test/test_virtual.py @@ -1048,12 +1048,7 @@ # virtual X object. The side exit in this case will contain a non-virtual # value class, which should be unpacked into the - # self.check_resops(jump=3, label=2, new_with_vtable=2) - # self.check_target_token_count(2) - # self.check_trace_count(3) - - - def test_conflated_virtual_states(self): + def test_aliased_virtual_states(self): # All cases are covered when forcing one component of the virtual state # also forces an as yet unseen component. # i.e. expect [NotVirtual, Virtual] and given a pair of aliasing virtual _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit