def test_specialize_value(): assert specialize_value(lltype.Char, 0x41) == '\x41' if longlong.supports_longlong: import sys value = longlong.r_float_storage(sys.maxint*17) assert specialize_value(lltype.SignedLongLong, value) == sys.maxint*17 sfval = r_singlefloat(42.5) ival = longlong.singlefloat2int(sfval) assert specialize_value(rffi.FLOAT, ival) == sfval
def test_specialize_value(): assert specialize_value(lltype.Char, 0x41) == '\x41' if longlong.supports_longlong: import sys value = longlong.r_float_storage(sys.maxint * 17) assert specialize_value(lltype.SignedLongLong, value) == sys.maxint * 17 sfval = r_singlefloat(42.5) ival = longlong.singlefloat2int(sfval) assert specialize_value(rffi.FLOAT, ival) == sfval
def load_value_of_type(self, TYPE, tagged): from pypy.jit.metainterp.warmstate import specialize_value kind = getkind(TYPE) if kind == 'int': x = self.decode_int(tagged) elif kind == 'ref': x = self.decode_ref(tagged) elif kind == 'float': x = self.decode_float(tagged) else: raise AssertionError(kind) return specialize_value(TYPE, x)
def handle_jitexception(e): # XXX the bulk of this function is mostly a copy-paste from above try: raise e except self.ContinueRunningNormally, e: args = () for ARGTYPE, attrname, count in portalfunc_ARGS: x = getattr(e, attrname)[count] x = specialize_value(ARGTYPE, x) args = args + (x,) result = ll_portal_runner(*args) if result_kind != 'void': result = unspecialize_value(result) return result
def ll_portal_runner(*args): start = True while 1: try: if start: jd._maybe_enter_from_start_fn(*args) return support.maybe_on_top_of_llinterp(rtyper, portal_ptr)(*args) except self.ContinueRunningNormally, e: args = () for ARGTYPE, attrname, count in portalfunc_ARGS: x = getattr(e, attrname)[count] x = specialize_value(ARGTYPE, x) args = args + (x,) start = False continue except self.DoneWithThisFrameVoid: assert result_kind == 'void' return
def rewrite_jit_merge_point(self, jd, policy): # # Mutate the original portal graph from this: # # def original_portal(..): # stuff # while 1: # jit_merge_point(*args) # more stuff # # to that: # # def original_portal(..): # stuff # return portal_runner(*args) # # def portal_runner(*args): # while 1: # try: # return portal(*args) # except ContinueRunningNormally, e: # *args = *e.new_args # except DoneWithThisFrame, e: # return e.return # except ExitFrameWithException, e: # raise Exception, e.value # # def portal(*args): # while 1: # more stuff # origportalgraph = jd._jit_merge_point_pos[0] portalgraph = jd.portal_graph PORTALFUNC = jd._PORTAL_FUNCTYPE # ____________________________________________________________ # Prepare the portal_runner() helper # from pypy.jit.metainterp.warmstate import specialize_value from pypy.jit.metainterp.warmstate import unspecialize_value portal_ptr = self.cpu.ts.functionptr(PORTALFUNC, 'portal', graph = portalgraph) jd._portal_ptr = portal_ptr # portalfunc_ARGS = [] nums = {} for i, ARG in enumerate(PORTALFUNC.ARGS): if i < len(jd.jitdriver.greens): color = 'green' else: color = 'red' attrname = '%s_%s' % (color, history.getkind(ARG)) count = nums.get(attrname, 0) nums[attrname] = count + 1 portalfunc_ARGS.append((ARG, attrname, count)) portalfunc_ARGS = unrolling_iterable(portalfunc_ARGS) # rtyper = self.translator.rtyper RESULT = PORTALFUNC.RESULT result_kind = history.getkind(RESULT) ts = self.cpu.ts def ll_portal_runner(*args): start = True while 1: try: if start: jd._maybe_enter_from_start_fn(*args) return support.maybe_on_top_of_llinterp(rtyper, portal_ptr)(*args) except self.ContinueRunningNormally, e: args = () for ARGTYPE, attrname, count in portalfunc_ARGS: x = getattr(e, attrname)[count] x = specialize_value(ARGTYPE, x) args = args + (x,) start = False continue except self.DoneWithThisFrameVoid: assert result_kind == 'void' return except self.DoneWithThisFrameInt, e: assert result_kind == 'int' return specialize_value(RESULT, e.result)
args = () for ARGTYPE, attrname, count in portalfunc_ARGS: x = getattr(e, attrname)[count] x = specialize_value(ARGTYPE, x) args = args + (x,) start = False continue except self.DoneWithThisFrameVoid: assert result_kind == 'void' return except self.DoneWithThisFrameInt, e: assert result_kind == 'int' return specialize_value(RESULT, e.result) except self.DoneWithThisFrameRef, e: assert result_kind == 'ref' return specialize_value(RESULT, e.result) except self.DoneWithThisFrameFloat, e: assert result_kind == 'float' return specialize_value(RESULT, e.result) except self.ExitFrameWithExceptionRef, e: value = ts.cast_to_baseclass(e.value) if not we_are_translated(): raise LLException(ts.get_typeptr(value), value) else: value = cast_base_ptr_to_instance(Exception, value) raise Exception, value def handle_jitexception(e): # XXX the bulk of this function is mostly a copy-paste from above try: raise e
def rewrite_jit_merge_point(self, jd, policy): # # Mutate the original portal graph from this: # # def original_portal(..): # stuff # while 1: # jit_merge_point(*args) # more stuff # # to that: # # def original_portal(..): # stuff # return portal_runner(*args) # # def portal_runner(*args): # while 1: # try: # return portal(*args) # except ContinueRunningNormally, e: # *args = *e.new_args # except DoneWithThisFrame, e: # return e.return # except ExitFrameWithException, e: # raise Exception, e.value # # def portal(*args): # while 1: # more stuff # origportalgraph = jd._jit_merge_point_in portalgraph = jd.portal_graph PORTALFUNC = jd._PORTAL_FUNCTYPE # ____________________________________________________________ # Prepare the portal_runner() helper # from pypy.jit.metainterp.warmstate import specialize_value from pypy.jit.metainterp.warmstate import unspecialize_value portal_ptr = self.cpu.ts.functionptr(PORTALFUNC, 'portal', graph = portalgraph) jd._portal_ptr = portal_ptr # portalfunc_ARGS = [] nums = {} for i, ARG in enumerate(PORTALFUNC.ARGS): kind = history.getkind(ARG) assert kind != 'void' if i < len(jd.jitdriver.greens): color = 'green' else: color = 'red' attrname = '%s_%s' % (color, kind) count = nums.get(attrname, 0) nums[attrname] = count + 1 portalfunc_ARGS.append((ARG, attrname, count)) portalfunc_ARGS = unrolling_iterable(portalfunc_ARGS) # rtyper = self.translator.rtyper RESULT = PORTALFUNC.RESULT result_kind = history.getkind(RESULT) ts = self.cpu.ts def ll_portal_runner(*args): start = True while 1: try: if start: jd._maybe_enter_from_start_fn(*args) return support.maybe_on_top_of_llinterp(rtyper, portal_ptr)(*args) except self.ContinueRunningNormally, e: args = () for ARGTYPE, attrname, count in portalfunc_ARGS: x = getattr(e, attrname)[count] x = specialize_value(ARGTYPE, x) args = args + (x,) start = False continue except self.DoneWithThisFrameVoid: assert result_kind == 'void' return except self.DoneWithThisFrameInt, e: assert result_kind == 'int' return specialize_value(RESULT, e.result)