Author: Manuel Jacob Branch: Changeset: r68934:040c55b8ecee Date: 2014-01-25 16:08 +0100 http://bitbucket.org/pypy/pypy/changeset/040c55b8ecee/
Log: Move test functions in test_refcount.py in a class. The LLVM subclasses this test class. diff --git a/rpython/translator/c/test/test_refcount.py b/rpython/translator/c/test/test_refcount.py --- a/rpython/translator/c/test/test_refcount.py +++ b/rpython/translator/c/test/test_refcount.py @@ -1,191 +1,189 @@ import py -import os +from rpython.rtyper.lltypesystem import lltype from rpython.translator.translator import TranslationContext -from rpython.translator.c import genc from rpython.translator.c.test.test_genc import compile -from rpython.rtyper.lltypesystem import lltype -from rpython.conftest import option -def compile_func(func, args): - return compile(func, args, gcpolicy='ref') -def test_something(): - def f(): - return 1 - fn = compile_func(f, []) - assert fn() == 1 +class TestRefcount(object): + def compile_func(self, func, args): + return compile(func, args, gcpolicy='ref') -def test_something_more(): - S = lltype.GcStruct("S", ('x', lltype.Signed)) - def f(x): - s = lltype.malloc(S) - s.x = x - return s.x - fn = compile_func(f, [int]) - assert fn(1) == 1 + def test_something(self): + def f(): + return 1 + fn = self.compile_func(f, []) + assert fn() == 1 -def test_call_function(): - class C: - pass - def f(): - c = C() - c.x = 1 - return c - def g(): - return f().x - fn = compile_func(g, []) - assert fn() == 1 + def test_something_more(self): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + def f(x): + s = lltype.malloc(S) + s.x = x + return s.x + fn = self.compile_func(f, [int]) + assert fn(1) == 1 -def test_multiple_exits(): - S = lltype.GcStruct("S", ('x', lltype.Signed)) - T = lltype.GcStruct("T", ('y', lltype.Signed)) - def f(n): - c = lltype.malloc(S) - d = lltype.malloc(T) - d.y = 1 - e = lltype.malloc(T) - e.y = 2 - if n: - x = d - else: - x = e - return x.y - fn = compile_func(f, [int]) - assert fn(1) == 1 - assert fn(0) == 2 + def test_call_function(self): + class C: + pass + def f(): + c = C() + c.x = 1 + return c + def g(): + return f().x + fn = self.compile_func(g, []) + assert fn() == 1 + def test_multiple_exits(self): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + T = lltype.GcStruct("T", ('y', lltype.Signed)) + def f(n): + c = lltype.malloc(S) + d = lltype.malloc(T) + d.y = 1 + e = lltype.malloc(T) + e.y = 2 + if n: + x = d + else: + x = e + return x.y + fn = self.compile_func(f, [int]) + assert fn(1) == 1 + assert fn(0) == 2 -def test_cleanup_vars_on_call(): - S = lltype.GcStruct("S", ('x', lltype.Signed)) - def f(): - return lltype.malloc(S) - def g(): - s1 = f() - s1.x = 42 - s2 = f() - s3 = f() - return s1.x - fn = compile_func(g, []) - assert fn() == 42 -def test_multiply_passed_var(): - S = lltype.GcStruct("S", ('x', lltype.Signed)) - def f(x): - if x: - a = lltype.malloc(S) - a.x = 1 - b = a - else: - a = lltype.malloc(S) - a.x = 1 - b = lltype.malloc(S) - b.x = 2 - return a.x + b.x - fn = compile_func(f, [int]) - fn(1) == 2 - fn(0) == 3 + def test_cleanup_vars_on_call(self): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + def f(): + return lltype.malloc(S) + def g(): + s1 = f() + s1.x = 42 + s2 = f() + s3 = f() + return s1.x + fn = self.compile_func(g, []) + assert fn() == 42 -def test_write_barrier(): - S = lltype.GcStruct("S", ('x', lltype.Signed)) - T = lltype.GcStruct("T", ('s', lltype.Ptr(S))) - def f(x): - s = lltype.malloc(S) - s.x = 0 - s1 = lltype.malloc(S) - s1.x = 1 - s2 = lltype.malloc(S) - s2.x = 2 - t = lltype.malloc(T) - t.s = s - if x: - t.s = s1 - else: - t.s = s2 - return t.s.x + s.x + s1.x + s2.x - fn = compile_func(f, [int]) - assert fn(1) == 4 - assert fn(0) == 5 + def test_multiply_passed_var(self): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + def f(x): + if x: + a = lltype.malloc(S) + a.x = 1 + b = a + else: + a = lltype.malloc(S) + a.x = 1 + b = lltype.malloc(S) + b.x = 2 + return a.x + b.x + fn = self.compile_func(f, [int]) + fn(1) == 2 + fn(0) == 3 -def test_del_basic(): - py.test.skip("xxx fix or kill") - S = lltype.GcStruct('S', ('x', lltype.Signed), rtti=True) - TRASH = lltype.GcStruct('TRASH', ('x', lltype.Signed)) - GLOBAL = lltype.Struct('GLOBAL', ('x', lltype.Signed)) - glob = lltype.malloc(GLOBAL, immortal=True) - def destructor(s): - glob.x = s.x + 1 - def type_info_S(s): - return lltype.getRuntimeTypeInfo(S) + def test_write_barrier(self): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + T = lltype.GcStruct("T", ('s', lltype.Ptr(S))) + def f(x): + s = lltype.malloc(S) + s.x = 0 + s1 = lltype.malloc(S) + s1.x = 1 + s2 = lltype.malloc(S) + s2.x = 2 + t = lltype.malloc(T) + t.s = s + if x: + t.s = s1 + else: + t.s = s2 + return t.s.x + s.x + s1.x + s2.x + fn = self.compile_func(f, [int]) + assert fn(1) == 4 + assert fn(0) == 5 - def g(n): - s = lltype.malloc(S) - s.x = n - # now 's' should go away - def entrypoint(n): - g(n) - # llop.gc__collect(lltype.Void) - return glob.x + def test_del_basic(self): + py.test.skip("xxx fix or kill") + S = lltype.GcStruct('S', ('x', lltype.Signed), rtti=True) + TRASH = lltype.GcStruct('TRASH', ('x', lltype.Signed)) + GLOBAL = lltype.Struct('GLOBAL', ('x', lltype.Signed)) + glob = lltype.malloc(GLOBAL, immortal=True) + def destructor(s): + glob.x = s.x + 1 + def type_info_S(s): + return lltype.getRuntimeTypeInfo(S) - t = TranslationContext() - t.buildannotator().build_types(entrypoint, [int]) - rtyper = t.buildrtyper() - destrptr = rtyper.annotate_helper_fn(destructor, [lltype.Ptr(S)]) - rtyper.attachRuntimeTypeInfoFunc(S, type_info_S, destrptr=destrptr) - rtyper.specialize() - fn = compile_func(entrypoint, None, t) + def g(n): + s = lltype.malloc(S) + s.x = n + # now 's' should go away + def entrypoint(n): + g(n) + # llop.gc__collect(lltype.Void) + return glob.x - res = fn(123) - assert res == 124 + t = TranslationContext() + t.buildannotator().build_types(entrypoint, [int]) + rtyper = t.buildrtyper() + destrptr = rtyper.annotate_helper_fn(destructor, [lltype.Ptr(S)]) + rtyper.attachRuntimeTypeInfoFunc(S, type_info_S, destrptr=destrptr) + rtyper.specialize() + fn = self.compile_func(entrypoint, None, t) -def test_del_catches(): - import os - def g(): - pass - class A(object): - def __del__(self): - try: - g() - except: - os.write(1, "hallo") - def f1(i): - if i: - raise TypeError - def f(i): + res = fn(123) + assert res == 124 + + def test_del_catches(self): + import os + def g(): + pass + class A(object): + def __del__(self): + try: + g() + except: + os.write(1, "hallo") + def f1(i): + if i: + raise TypeError + def f(i): + a = A() + f1(i) + a.b = 1 + return a.b + fn = self.compile_func(f, [int]) + assert fn(0) == 1 + fn(1, expected_exception_name="TypeError") + + def test_del_raises(self): + class B(object): + def __del__(self): + raise TypeError + def func(): + b = B() + fn = self.compile_func(func, []) + # does not crash + fn() + + def test_wrong_order_setitem(self): + class A(object): + pass a = A() - f1(i) - a.b = 1 - return a.b - fn = compile_func(f, [int]) - assert fn(0) == 1 - fn(1, expected_exception_name="TypeError") - -def test_del_raises(): - class B(object): - def __del__(self): - raise TypeError - def func(): - b = B() - fn = compile_func(func, []) - # does not crash - fn() - -def test_wrong_order_setitem(): - import os - class A(object): - pass - a = A() - a.b = None - class B(object): - def __del__(self): - a.freed += 1 - a.b = None - def f(n): - a.freed = 0 - a.b = B() - if n: - a.b = None - return a.freed - fn = compile_func(f, [int]) - res = fn(1) - assert res == 1 + a.b = None + class B(object): + def __del__(self): + a.freed += 1 + a.b = None + def f(n): + a.freed = 0 + a.b = B() + if n: + a.b = None + return a.freed + fn = self.compile_func(f, [int]) + res = fn(1) + assert res == 1 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit