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
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
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
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)
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)
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)
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)