Beispiel #1
0
 def force_box(self, op, optforce):
     if not self.is_virtual():
         return op
     optforce.forget_numberings()
     if self.mode is mode_string:
         s = self.get_constant_string_spec(optforce, mode_string)
         if s is not None:
             c_s = get_const_ptr_for_string(s)
             optforce.get_box_replacement(op).set_forwarded(c_s)
             return c_s
     else:
         s = self.get_constant_string_spec(optforce, mode_unicode)
         if s is not None:
             c_s = get_const_ptr_for_unicode(s)
             optforce.get_box_replacement(op).set_forwarded(c_s)
             return c_s
     self._is_virtual = False
     lengthbox = self.getstrlen(op, optforce.optimizer.optstring, self.mode)
     newop = ResOperation(self.mode.NEWSTR, [lengthbox])
     if not we_are_translated():
         newop.name = 'FORCE'
     optforce.emit_operation(newop)
     newop = optforce.getlastop()
     newop.set_forwarded(self)
     op = optforce.get_box_replacement(op)
     op.set_forwarded(newop)
     optstring = optforce.optimizer.optstring
     self.initialize_forced_string(op, optstring, op, CONST_0, self.mode)
     return newop
Beispiel #2
0
 def getstrlen(self, op, optstring, mode):
     assert op is not None
     if self.lgtop is not None:
         return self.lgtop
     assert not self.is_virtual()
     lengthop = ResOperation(mode.STRLEN, [op])
     lengthop.set_forwarded(self.getlenbound(mode))
     self.lgtop = lengthop
     optstring.emit_extra(lengthop)
     return lengthop
Beispiel #3
0
 def getstrlen(self, op, string_optimizer, mode, create_ops=True):
     if self.lgtop is not None:
         return self.lgtop
     assert not self.is_virtual()
     if not create_ops:
         return None
     lengthop = ResOperation(mode.STRLEN, [op])
     lengthop.set_forwarded(self.getlenbound(mode))
     self.lgtop = lengthop
     string_optimizer.emit_operation(lengthop)
     return lengthop
Beispiel #4
0
 def optimize_VIRTUAL_REF(self, op):
     # get some constants
     vrefinfo = self.optimizer.metainterp_sd.virtualref_info
     c_cls = vrefinfo.jit_virtual_ref_const_class
     vref_descr = vrefinfo.descr
     descr_virtual_token = vrefinfo.descr_virtual_token
     descr_forced = vrefinfo.descr_forced
     #
     # Replace the VIRTUAL_REF operation with a virtual structure of type
     # 'jit_virtual_ref'.  The jit_virtual_ref structure may be forced soon,
     # but the point is that doing so does not force the original structure.
     newop = ResOperation(rop.NEW_WITH_VTABLE, [], descr=vref_descr)
     vrefvalue = self.make_virtual(c_cls, newop, vref_descr)
     op.set_forwarded(newop)
     newop.set_forwarded(vrefvalue)
     token = ResOperation(rop.FORCE_TOKEN, [])
     vrefvalue.setfield(descr_virtual_token, newop, token)
     vrefvalue.setfield(descr_forced, newop, CONST_NULL)
     return self.emit(token)
Beispiel #5
0
 def optimize_VIRTUAL_REF(self, op):
     # get some constants
     vrefinfo = self.optimizer.metainterp_sd.virtualref_info
     c_cls = vrefinfo.jit_virtual_ref_const_class
     vref_descr = vrefinfo.descr
     descr_virtual_token = vrefinfo.descr_virtual_token
     descr_forced = vrefinfo.descr_forced
     #
     # Replace the VIRTUAL_REF operation with a virtual structure of type
     # 'jit_virtual_ref'.  The jit_virtual_ref structure may be forced soon,
     # but the point is that doing so does not force the original structure.
     newop = ResOperation(rop.NEW_WITH_VTABLE, [], descr=vref_descr)
     vrefvalue = self.make_virtual(c_cls, newop, vref_descr)
     op.set_forwarded(newop)
     newop.set_forwarded(vrefvalue)
     token = ResOperation(rop.FORCE_TOKEN, [])
     self.emit_operation(token)
     vrefvalue.setfield(descr_virtual_token, newop, token)
     vrefvalue.setfield(descr_forced, newop,
                        self.optimizer.cpu.ts.CONST_NULLREF)
Beispiel #6
0
 def pure_from_args(self, opnum, args, op, descr=None):
     newop = ResOperation(opnum,
                          [self.get_box_replacement(arg) for arg in args],
                          descr=descr)
     newop.set_forwarded(op)
     self.pure(opnum, newop)
Beispiel #7
0
 def pure_from_args(self, opnum, args, op, descr=None):
     newop = ResOperation(opnum, [get_box_replacement(arg) for arg in args],
                          descr=descr)
     newop.set_forwarded(op)
     self.pure(opnum, newop)