def test_compile_tmp_callback(): from rpython.jit.backend.llgraph import runner from rpython.rtyper.lltypesystem import lltype, llmemory from rpython.rtyper.annlowlevel import llhelper from rpython.rtyper.llinterp import LLException # cpu = runner.LLGraphCPU(None) FUNC = lltype.FuncType([lltype.Signed] * 4, lltype.Signed) def ll_portal_runner(g1, g2, r3, r4): assert (g1, g2, r3, r4) == (12, 34, -156, -178) if raiseme: raise raiseme else: return 54321 # class FakeJitDriverSD: portal_runner_ptr = llhelper(lltype.Ptr(FUNC), ll_portal_runner) portal_runner_adr = llmemory.cast_ptr_to_adr(portal_runner_ptr) portal_calldescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, None) portal_finishtoken = compile.DoneWithThisFrameDescrInt() propagate_exc_descr = compile.PropagateExceptionDescr() num_red_args = 2 result_type = INT # loop_token = compile_tmp_callback( cpu, FakeJitDriverSD(), [ConstInt(12), ConstInt(34)], "ii") # raiseme = None # only two arguments must be passed in deadframe = cpu.execute_token(loop_token, -156, -178) fail_descr = cpu.get_latest_descr(deadframe) assert fail_descr is FakeJitDriverSD().portal_finishtoken # EXC = lltype.GcStruct('EXC') llexc = lltype.malloc(EXC) raiseme = LLException("exception class", llexc) deadframe = cpu.execute_token(loop_token, -156, -178) fail_descr = cpu.get_latest_descr(deadframe) assert isinstance(fail_descr, compile.PropagateExceptionDescr) got = cpu.grab_exc_value(deadframe) assert lltype.cast_opaque_ptr(lltype.Ptr(EXC), got) == llexc # class FakeMetaInterpSD: pass FakeMetaInterpSD.cpu = cpu deadframe = cpu.execute_token(loop_token, -156, -178) fail_descr = cpu.get_latest_descr(deadframe) try: fail_descr.handle_fail(deadframe, FakeMetaInterpSD(), None) except jitexc.ExitFrameWithExceptionRef as e: assert lltype.cast_opaque_ptr(lltype.Ptr(EXC), e.value) == llexc else: assert 0, "should have raised"
def test_compile_tmp_callback(): from rpython.jit.codewriter import heaptracker from rpython.jit.backend.llgraph import runner from rpython.rtyper.lltypesystem import lltype, llmemory from rpython.rtyper.annlowlevel import llhelper from rpython.rtyper.llinterp import LLException # cpu = runner.LLGraphCPU(None) FUNC = lltype.FuncType([lltype.Signed] * 4, lltype.Signed) def ll_portal_runner(g1, g2, r3, r4): assert (g1, g2, r3, r4) == (12, 34, -156, -178) if raiseme: raise raiseme else: return 54321 # class FakeJitDriverSD: portal_runner_ptr = llhelper(lltype.Ptr(FUNC), ll_portal_runner) portal_runner_adr = llmemory.cast_ptr_to_adr(portal_runner_ptr) portal_calldescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, None) portal_finishtoken = compile.DoneWithThisFrameDescrInt() propagate_exc_descr = compile.PropagateExceptionDescr() num_red_args = 2 result_type = INT # loop_token = compile_tmp_callback(cpu, FakeJitDriverSD(), [ConstInt(12), ConstInt(34)], "ii") # raiseme = None # only two arguments must be passed in deadframe = cpu.execute_token(loop_token, -156, -178) fail_descr = cpu.get_latest_descr(deadframe) assert fail_descr is FakeJitDriverSD().portal_finishtoken # EXC = lltype.GcStruct("EXC") llexc = lltype.malloc(EXC) raiseme = LLException("exception class", llexc) deadframe = cpu.execute_token(loop_token, -156, -178) fail_descr = cpu.get_latest_descr(deadframe) assert isinstance(fail_descr, compile.PropagateExceptionDescr) got = cpu.grab_exc_value(deadframe) assert lltype.cast_opaque_ptr(lltype.Ptr(EXC), got) == llexc # class FakeMetaInterpSD: pass FakeMetaInterpSD.cpu = cpu deadframe = cpu.execute_token(loop_token, -156, -178) fail_descr = cpu.get_latest_descr(deadframe) try: fail_descr.handle_fail(deadframe, FakeMetaInterpSD(), None) except jitexc.ExitFrameWithExceptionRef, e: assert lltype.cast_opaque_ptr(lltype.Ptr(EXC), e.value) == llexc
def get_assembler_token(greenkey): cell = JitCell.ensure_jit_cell_at_key(greenkey) procedure_token = cell.get_procedure_token() if procedure_token is None: from rpython.jit.metainterp.compile import compile_tmp_callback memmgr = warmrunnerdesc.memory_manager procedure_token = compile_tmp_callback(cpu, jd, greenkey, redargtypes, memmgr) cell.set_procedure_token(procedure_token, tmp=True) return procedure_token
def get_assembler_token(greenkey): cell = self.jit_cell_at_key(greenkey) procedure_token = cell.get_procedure_token() if procedure_token is None: from rpython.jit.metainterp.compile import compile_tmp_callback if cell.counter == -1: # used to be a valid entry bridge, cell.counter = 0 # but was freed in the meantime. memmgr = warmrunnerdesc.memory_manager procedure_token = compile_tmp_callback(cpu, jd, greenkey, redargtypes, memmgr) cell.set_procedure_token(procedure_token) return procedure_token