コード例 #1
0
def test_cast_opaque_ptr():
    O = lltype.GcOpaqueType('O')
    Q = lltype.GcOpaqueType('Q')
    S = lltype.GcStruct('S', ('x', lltype.Signed))

    def fn():
        s = lltype.malloc(S)
        o = lltype.cast_opaque_ptr(lltype.Ptr(O), s)
        q = lltype.cast_opaque_ptr(lltype.Ptr(Q), o)
        p = lltype.cast_opaque_ptr(lltype.Ptr(S), q)
        return p == s

    res = interpret(fn, [])
    assert res is True

    O1 = lltype.OpaqueType('O')
    S1 = lltype.Struct('S1', ('x', lltype.Signed))
    s1 = lltype.malloc(S1, immortal=True)

    def fn1():
        o1 = lltype.cast_opaque_ptr(lltype.Ptr(O1), s1)
        p1 = lltype.cast_opaque_ptr(lltype.Ptr(S1), o1)
        return p1 == s1

    res = interpret(fn1, [])
    assert res is True
コード例 #2
0
ファイル: test_malloc.py プロジェクト: Mu-L/pypy
    def test_wrapper_cannot_be_removed(self):
        SMALL = lltype.OpaqueType('SMALL')
        BIG = lltype.GcStruct('BIG', ('z', lltype.Signed), ('s', SMALL))

        def g(small):
            return -1
        def fn():
            b = lltype.malloc(BIG)
            g(b.s)

        self.check(fn, [], [], None, must_be_removed=False)
コード例 #3
0
ファイル: test_mallocv.py プロジェクト: sota/pypy-old
    def test_wrapper_cannot_be_removed(self):
        SMALL = lltype.OpaqueType('SMALL')
        BIG = lltype.GcStruct('BIG', ('z', lltype.Signed), ('s', SMALL))

        def g(small):
            return -1

        def fn():
            b = lltype.malloc(BIG)
            g(b.s)

        self.check(
            fn,
            [],
            [],
            None,
            expected_mallocs=1,  # no support for interior opaques
            expected_calls=1)
コード例 #4
0
ファイル: rffi.py プロジェクト: sota/pypy-old
def COpaque(name=None, ptr_typedef=None, hints=None, compilation_info=None):
    if compilation_info is None:
        compilation_info = ExternalCompilationInfo()
    if hints is None:
        hints = {}
    else:
        hints = hints.copy()
    hints['external'] = 'C'
    if name is not None:
        hints['c_name'] = name
    if ptr_typedef is not None:
        hints['c_pointer_typedef'] = ptr_typedef
    def lazy_getsize(cache={}):
        from rpython.rtyper.tool import rffi_platform
        try:
            return cache[name]
        except KeyError:
            val = rffi_platform.sizeof(name, compilation_info)
            cache[name] = val
            return val

    hints['getsize'] = lazy_getsize
    return lltype.OpaqueType(name, hints)
コード例 #5
0
ファイル: llmemory.py プロジェクト: sczfaker/pypy
    #     cast back to an address later.
    # * mode="forced": uses rffi.cast() to return a real number.
    assert mode in ("emulated", "symbolic", "forced")
    res = adr._cast_to_int(symbolic=(mode != "emulated"))
    if mode == "forced":
        from rpython.rtyper.lltypesystem.rffi import cast
        res = cast(lltype.Signed, res)
    return res


@analyzer_for(cast_adr_to_int)
def ann_cast_adr_to_int(s, s_mode=None):
    return SomeInteger()  # xxx


_NONGCREF = lltype.Ptr(lltype.OpaqueType('NONGCREF'))


def cast_int_to_adr(int):
    if isinstance(int, AddressAsInt):
        return int.adr
    try:
        ptr = lltype.cast_int_to_ptr(_NONGCREF, int)
    except ValueError:
        from rpython.rtyper.lltypesystem import ll2ctypes
        ptr = ll2ctypes._int2obj[int]._as_ptr()
    return cast_ptr_to_adr(ptr)


@analyzer_for(cast_int_to_adr)
def ann_cast_int_to_adr(s):