def test_dynamic_deallocator(): class A(object): pass class B(A): pass def f(x): a = A() a.x = 1 b = B() b.x = 2 b.y = 3 if x: c = a else: c = b return c.x t, transformer = rtype_and_transform(f, [int], RefcountingGCTransformer, check=False) fgraph = graphof(t, f) s_instance = t.annotator.bookkeeper.valueoftype(A) TYPE = t.rtyper.getrepr(s_instance).lowleveltype.TO p = transformer.dynamic_deallocation_funcptr_for_type(TYPE) t.rtyper.specialize_more_blocks()
def test_recursive_structure(): F = lltype.GcForwardReference() S = lltype.GcStruct('abc', ('x', lltype.Ptr(F))) F.become(S) def f(): s1 = lltype.malloc(S) s2 = lltype.malloc(S) s1.x = s2 t, transformer = rtype_and_transform( f, [], RefcountingGCTransformer, check=False)
def test_protect_unprotect(): def p(): llop.gc_protect(lltype.Void, 'this is an object') def u(): llop.gc_unprotect(lltype.Void, 'this is an object') rgc = RefcountingGCTransformer bgc = BoehmGCTransformer expected = [1, 1, 0, 0] gcs = [rgc, rgc, bgc, bgc] fs = [p, u, p, u] for ex, f, gc in zip(expected, fs, gcs): t, transformer = rtype_and_transform(f, [], gc, check=False) ops = getops(graphof(t, f)) assert len(ops.get('direct_call', [])) == ex
def test_boehm_simple(): class C: pass def f(): c = C() c.x = 1 return c.x t, transformer = rtype_and_transform( f, [], BoehmGCTransformer, check=False) ops = getops(graphof(t, f)) assert len(ops.get('direct_call', [])) <= 1 gcs = [k for k in ops if k.startswith('gc')] assert len(gcs) == 0
def test_boehm_simple(): class C: pass def f(): c = C() c.x = 1 return c.x t, transformer = rtype_and_transform(f, [], BoehmGCTransformer, check=False) ops = getops(graphof(t, f)) assert len(ops.get('direct_call', [])) <= 1 gcs = [k for k in ops if k.startswith('gc')] assert len(gcs) == 0
def test_arraybarrier(): S = lltype.GcStruct("S", ('x', lltype.Signed)) A = lltype.GcArray(lltype.Ptr(S)) def f(): s1 = lltype.malloc(S) s1.x = 1 s2 = lltype.malloc(S) s2.x = 2 a = lltype.malloc(A, 1) a[0] = s1 a[0] = s2 t, transformer = rtype_and_transform(f, [], RefcountingGCTransformer, check=False) graph = graphof(t, f) ops = getops(graph) assert len(ops['getarrayitem']) == 2 assert len(ops['bare_setarrayitem']) == 2 assert len(ops['bare_setfield']) == 2
def test_simple_barrier(): S = lltype.GcStruct("S", ('x', lltype.Signed)) T = lltype.GcStruct("T", ('s', lltype.Ptr(S))) def f(): s1 = lltype.malloc(S) s1.x = 1 s2 = lltype.malloc(S) s2.x = 2 t = lltype.malloc(T) t.s = s1 t.s = s2 return t t, transformer = rtype_and_transform(f, [], RefcountingGCTransformer, check=False) graph = graphof(t, f) ops = getops(graph) assert len(ops['getfield']) == 2 assert len(ops['bare_setfield']) == 4
def test_dynamic_deallocator(): class A(object): pass class B(A): pass def f(x): a = A() a.x = 1 b = B() b.x = 2 b.y = 3 if x: c = a else: c = b return c.x t, transformer = rtype_and_transform( f, [int], RefcountingGCTransformer, check=False) fgraph = graphof(t, f) s_instance = t.annotator.bookkeeper.valueoftype(A) TYPE = t.rtyper.getrepr(s_instance).lowleveltype.TO p = transformer.dynamic_deallocation_funcptr_for_type(TYPE) t.rtyper.specialize_more_blocks()