Example #1
0
 def produce_short_preamble_ops(self, structbox, descr, index, optimizer, shortboxes):
     if self._fields is None:
         return
     if descr.get_index() >= len(self._fields):
         # we don't know about this item
         return
     op = optimizer.get_box_replacement(self._fields[descr.get_index()])
     opnum = OpHelpers.getfield_for_descr(descr)
     getfield_op = ResOperation(opnum, [structbox], descr=descr)
     shortboxes.add_heap_op(op, getfield_op)
Example #2
0
 def produce_short_preamble_ops(self, structbox, fielddescr, index, optimizer,
                                shortboxes):
     if self._fields is None:
         return
     if fielddescr.get_index() >= len(self._fields):
         # we don't know about this item
         return
     op = optimizer.get_box_replacement(self._fields[fielddescr.get_index()])
     opnum = OpHelpers.getfield_for_descr(fielddescr)
     getfield_op = ResOperation(opnum, [structbox], descr=fielddescr)
     shortboxes.add_heap_op(op, getfield_op)
Example #3
0
 def produce_short_preamble_ops(self, structbox, fielddescr, index,
                                optimizer, shortboxes):
     if self._fields is None:
         return
     if fielddescr.get_index() >= len(self._fields):
         # we don't know about this item
         return
     op = get_box_replacement(self._fields[fielddescr.get_index()])
     if op is None:
         # XXX same bug as in serialize_opt:
         # op should never be None, because that's an invariant violation in
         # AbstractCachedEntry. But it still seems to happen when the info
         # is attached to a Constant. At least we shouldn't crash.
         return
     opnum = OpHelpers.getfield_for_descr(fielddescr)
     getfield_op = ResOperation(opnum, [structbox], descr=fielddescr)
     shortboxes.add_heap_op(op, getfield_op)
Example #4
0
def patch_new_loop_to_load_virtualizable_fields(loop, jitdriver_sd, vable):
    # XXX merge with rewriting
    vinfo = jitdriver_sd.virtualizable_info
    extra_ops = []
    inputargs = loop.inputargs
    vable_box = inputargs[jitdriver_sd.index_of_virtualizable]
    i = jitdriver_sd.num_red_args
    loop.inputargs = inputargs[:i]
    for descr in vinfo.static_field_descrs:
        assert i < len(inputargs)
        box = inputargs[i]
        opnum = OpHelpers.getfield_for_descr(descr)
        emit_op(extra_ops,
                ResOperation(opnum, [vable_box], descr))
        box.set_forwarded(extra_ops[-1])
        i += 1
    arrayindex = 0
    for descr in vinfo.array_field_descrs:
        arraylen = vinfo.get_array_length(vable, arrayindex)
        arrayop = ResOperation(rop.GETFIELD_GC_R, [vable_box], descr)
        emit_op(extra_ops, arrayop)
        arraydescr = vinfo.array_descrs[arrayindex]
        assert i + arraylen <= len(inputargs)
        for index in range(arraylen):
            opnum = OpHelpers.getarrayitem_for_descr(arraydescr)
            box = inputargs[i]
            emit_op(extra_ops,
                ResOperation(opnum,
                             [arrayop, ConstInt(index)],
                             descr=arraydescr))
            i += 1
            box.set_forwarded(extra_ops[-1])
        arrayindex += 1
    assert i == len(inputargs)
    for op in loop.operations:
        emit_op(extra_ops, op)
    loop.operations = extra_ops
Example #5
0
def patch_new_loop_to_load_virtualizable_fields(loop, jitdriver_sd, vable):
    # XXX merge with rewriting
    vinfo = jitdriver_sd.virtualizable_info
    extra_ops = []
    inputargs = loop.inputargs
    vable_box = inputargs[jitdriver_sd.index_of_virtualizable]
    i = jitdriver_sd.num_red_args
    loop.inputargs = inputargs[:i]
    for descr in vinfo.static_field_descrs:
        assert i < len(inputargs)
        box = inputargs[i]
        opnum = OpHelpers.getfield_for_descr(descr)
        emit_op(extra_ops,
                ResOperation(opnum, [vable_box], descr=descr))
        box.set_forwarded(extra_ops[-1])
        i += 1
    arrayindex = 0
    for descr in vinfo.array_field_descrs:
        arraylen = vinfo.get_array_length(vable, arrayindex)
        arrayop = ResOperation(rop.GETFIELD_GC_R, [vable_box], descr=descr)
        emit_op(extra_ops, arrayop)
        arraydescr = vinfo.array_descrs[arrayindex]
        assert i + arraylen <= len(inputargs)
        for index in range(arraylen):
            opnum = OpHelpers.getarrayitem_for_descr(arraydescr)
            box = inputargs[i]
            emit_op(extra_ops,
                ResOperation(opnum,
                             [arrayop, ConstInt(index)],
                             descr=arraydescr))
            i += 1
            box.set_forwarded(extra_ops[-1])
        arrayindex += 1
    assert i == len(inputargs)
    for op in loop.operations:
        emit_op(extra_ops, op)
    loop.operations = extra_ops