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
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)
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)
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)
# 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):