Esempio n. 1
0
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"
Esempio n. 2
0
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
Esempio n. 3
0
 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
Esempio n. 4
0
 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
Esempio n. 5
0
 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