Пример #1
0
def reraise(lle):
    if we_are_translated():
        e = cast_base_ptr_to_instance(Exception, lle)
        raise e
    else:
        etype = rclass.ll_type(lle)
        raise LLException(etype, lle)
Пример #2
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"
Пример #3
0
 def handle_jitexception(e):
     # XXX there are too many exceptions all around...
     while True:
         if isinstance(e, EnterJitAssembler):
             try:
                 return e.execute()
             except jitexc.JitException as e:
                 continue
         #
         if isinstance(e, jitexc.ContinueRunningNormally):
             args = ()
             for ARGTYPE, attrname, count in portalfunc_ARGS:
                 x = getattr(e, attrname)[count]
                 x = specialize_value(ARGTYPE, x)
                 args = args + (x, )
             try:
                 result = support.maybe_on_top_of_llinterp(
                     rtyper, portal_ptr)(*args)
             except jitexc.JitException as e:
                 continue
             if result_kind != 'void':
                 result = unspecialize_value(result)
             return result
         #
         if result_kind == 'void':
             if isinstance(e, jitexc.DoneWithThisFrameVoid):
                 return None
         if result_kind == 'int':
             if isinstance(e, jitexc.DoneWithThisFrameInt):
                 return e.result
         if result_kind == 'ref':
             if isinstance(e, jitexc.DoneWithThisFrameRef):
                 return e.result
         if result_kind == 'float':
             if isinstance(e, jitexc.DoneWithThisFrameFloat):
                 return e.result
         #
         if isinstance(e, jitexc.ExitFrameWithExceptionRef):
             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)
                 assert value is not None
                 raise value
         #
         raise AssertionError("all cases should have been handled")
Пример #4
0
                except jitexc.DoneWithThisFrameVoid:
                    assert result_kind == 'void'
                    return
                except jitexc.DoneWithThisFrameInt, e:
                    assert result_kind == 'int'
                    return specialize_value(RESULT, e.result)
                except jitexc.DoneWithThisFrameRef, e:
                    assert result_kind == 'ref'
                    return specialize_value(RESULT, e.result)
                except jitexc.DoneWithThisFrameFloat, e:
                    assert result_kind == 'float'
                    return specialize_value(RESULT, e.result)
                except jitexc.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
            except jitexc.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)
Пример #5
0
 def bh_call_i(self, func, args_i, args_r, args_f, calldescr):
     assert func == 321
     assert calldescr == "<calldescr>"
     if args_i[0] < 0:
         raise LLException("etype", "evalue")
     return args_i[0] * 2
Пример #6
0
 def f(*args):
     raise LLException(vtableptr, xptr)