def test_custom_trace_function_no_collect(): from rpython.rlib import rgc from rpython.translator.c.genc import CStandaloneBuilder S = lltype.GcStruct("MyStructure") class Glob: pass glob = Glob() def trace_func(gc, obj, callback, arg): glob.foo = (gc, obj) lambda_trace_func = lambda: trace_func def entrypoint(argv): lltype.malloc(S) rgc.register_custom_trace_hook(S, lambda_trace_func) return 0 t = rtype(entrypoint, [s_list_of_strings]) t.config.translation.gc = "minimark" cbuild = CStandaloneBuilder(t, entrypoint, t.config, gcpolicy=FrameworkGcPolicy2) cbuild.make_entrypoint_wrapper = False with py.test.raises(Exception) as f: cbuild.build_database() assert 'can cause the GC to be called' in str(f.value) assert 'trace_func' in str(f.value) assert 'MyStructure' in str(f.value)
def test_custom_trace_function_no_collect(): from rpython.rlib import rgc from rpython.translator.c.genc import CStandaloneBuilder S = lltype.GcStruct("MyStructure") class Glob: pass glob = Glob() def trace_func(gc, obj, callback, arg): glob.foo = (gc, obj) lambda_trace_func = lambda: trace_func def entrypoint(argv): lltype.malloc(S) rgc.register_custom_trace_hook(S, lambda_trace_func) return 0 t = rtype(entrypoint, [s_list_of_strings]) t.config.translation.gc = "minimark" cbuild = CStandaloneBuilder(t, entrypoint, t.config, gcpolicy=FrameworkGcPolicy2) with py.test.raises(Exception) as f: cbuild.build_database() assert 'can cause the GC to be called' in str(f.value) assert 'trace_func' in str(f.value) assert 'MyStructure' in str(f.value)
def test_no_collect_detection(): from rpython.rlib import rgc from rpython.translator.c.genc import CStandaloneBuilder class A(object): def __init__(self, x): self.x = x @rgc.no_collect def g(): return A(1).x assert g._dont_inline_ assert g._gc_no_collect_ def entrypoint(argv): return g() + 2 t = rtype(entrypoint, [s_list_of_strings]) t.config.translation.gc = "minimark" cbuild = CStandaloneBuilder(t, entrypoint, t.config, gcpolicy=FrameworkGcPolicy2) with py.test.raises(Exception) as f: cbuild.build_database() expected = "'no_collect' function can trigger collection: <function g at " assert str(f.value).startswith(expected)
def test_no_collect_detection(): from rpython.rlib import rgc from rpython.translator.c.genc import CStandaloneBuilder class A(object): def __init__(self, x): self.x = x @rgc.no_collect def g(): return A(1).x assert g._dont_inline_ assert g._gc_no_collect_ def entrypoint(argv): return g() + 2 t = rtype(entrypoint, [s_list_of_strings]) t.config.translation.gc = "minimark" cbuild = CStandaloneBuilder(t, entrypoint, t.config, gcpolicy=FrameworkGcPolicy2) cbuild.make_entrypoint_wrapper = False with py.test.raises(Exception) as f: cbuild.build_database() expected = "'no_collect' function can trigger collection: <function g at " assert str(f.value).startswith(expected)
def run_rtyper(fn): t = rtype(fn, [s_list_of_strings]) t.config.translation.gc = "minimark" cbuild = CStandaloneBuilder(t, fn, t.config, gcpolicy=FrameworkGcPolicy2) cbuild.make_entrypoint_wrapper = False cbuild.build_database() return True
def test_framework_simple(): def g(x): return x + 1 class A(object): pass def entrypoint(argv): a = A() a.b = g(1) return str(a.b) from rpython.rtyper.llinterp import LLInterpreter from rpython.translator.c.genc import CStandaloneBuilder t = rtype(entrypoint, [s_list_of_strings]) t.config.translation.gc = "minimark" cbuild = CStandaloneBuilder(t, entrypoint, t.config, gcpolicy=FrameworkGcPolicy2) cbuild.make_entrypoint_wrapper = False db = cbuild.build_database() entrypointptr = cbuild.getentrypointptr() entrygraph = entrypointptr._obj.graph r_list_of_strings = t.rtyper.getrepr(s_list_of_strings) ll_argv = r_list_of_strings.convert_const([]) llinterp = LLInterpreter(t.rtyper) # FIIIIISH setupgraph = db.gctransformer.frameworkgc_setup_ptr.value._obj.graph llinterp.eval_graph(setupgraph, []) res = llinterp.eval_graph(entrygraph, [ll_argv]) assert ''.join(res.chars) == "2"
def test_remove_duplicate_write_barrier(): from rpython.translator.c.genc import CStandaloneBuilder from rpython.flowspace.model import summary class A(object): pass glob_a_1 = A() glob_a_2 = A() def f(a, cond): a.x = a a.z = a if cond: a.y = a def g(): f(glob_a_1, 5) f(glob_a_2, 0) t = rtype(g, []) t.config.translation.gc = "minimark" cbuild = CStandaloneBuilder(t, g, t.config, gcpolicy=FrameworkGcPolicy2) cbuild.make_entrypoint_wrapper = False db = cbuild.build_database() ff = graphof(t, f) #ff.show() assert summary(ff)['direct_call'] == 1 # only one remember_young_pointer
def task_database_c(self): """ Create a database for further backend generation """ translator = self.translator if translator.annotator is not None: translator.frozen = True standalone = self.standalone if standalone: from rpython.translator.c.genc import CStandaloneBuilder cbuilder = CStandaloneBuilder( self.translator, self.entry_point, config=self.config, secondary_entrypoints=self.secondary_entrypoints + annotated_jit_entrypoints) else: from rpython.translator.c.dlltool import CLibraryBuilder functions = [ (self.entry_point, None) ] + self.secondary_entrypoints + annotated_jit_entrypoints cbuilder = CLibraryBuilder(self.translator, self.entry_point, functions=functions, name='libtesting', config=self.config) if not standalone: # xxx more messy cbuilder.modulename = self.extmod_name database = cbuilder.build_database() self.log.info("database for generating C source was created") self.cbuilder = cbuilder self.database = database
def task_database_c(self): """ Create a database for further backend generation """ translator = self.translator if translator.annotator is not None: translator.frozen = True standalone = self.standalone if standalone: from rpython.translator.c.genc import CStandaloneBuilder cbuilder = CStandaloneBuilder(self.translator, self.entry_point, config=self.config, secondary_entrypoints=self.secondary_entrypoints) else: from rpython.translator.c.dlltool import CLibraryBuilder functions = [(self.entry_point, None)] + self.secondary_entrypoints cbuilder = CLibraryBuilder(self.translator, self.entry_point, functions=functions, name='libtesting', config=self.config) if not standalone: # xxx more messy cbuilder.modulename = self.extmod_name database = cbuilder.build_database() self.log.info("database for generating C source was created") self.cbuilder = cbuilder self.database = database
def test_remove_duplicate_write_barrier(): from rpython.translator.c.genc import CStandaloneBuilder from rpython.flowspace.model import summary class A(object): pass glob_a_1 = A() glob_a_2 = A() def f(a, cond): a.x = a a.z = a if cond: a.y = a def g(): f(glob_a_1, 5) f(glob_a_2, 0) t = rtype(g, []) t.config.translation.gc = "minimark" cbuild = CStandaloneBuilder(t, g, t.config, gcpolicy=FrameworkGcPolicy2) db = cbuild.build_database() ff = graphof(t, f) #ff.show() assert summary(ff)['direct_call'] == 1 # only one remember_young_pointer
def test_framework_simple(): def g(x): return x + 1 class A(object): pass def entrypoint(argv): a = A() a.b = g(1) return str(a.b) from rpython.rtyper.llinterp import LLInterpreter from rpython.translator.c.genc import CStandaloneBuilder t = rtype(entrypoint, [s_list_of_strings]) t.config.translation.gc = "minimark" cbuild = CStandaloneBuilder(t, entrypoint, t.config, gcpolicy=FrameworkGcPolicy2) db = cbuild.build_database() entrypointptr = cbuild.getentrypointptr() entrygraph = entrypointptr._obj.graph r_list_of_strings = t.rtyper.getrepr(s_list_of_strings) ll_argv = r_list_of_strings.convert_const([]) llinterp = LLInterpreter(t.rtyper) # FIIIIISH setupgraph = db.gctransformer.frameworkgc_setup_ptr.value._obj.graph llinterp.eval_graph(setupgraph, []) res = llinterp.eval_graph(entrygraph, [ll_argv]) assert ''.join(res.chars) == "2"
def llinterpreter_for_transformed_graph(self, f, args_s): from rpython.rtyper.llinterp import LLInterpreter from rpython.translator.c.genc import CStandaloneBuilder t = rtype(f, args_s) # XXX we shouldn't need an actual gcpolicy here. cbuild = CStandaloneBuilder(t, f, t.config, gcpolicy=self.gcpolicy) cbuild.build_database() graph = cbuild.getentrypointptr()._obj.graph # arguments cannot be GC objects because nobody would put a # proper header on them for v in graph.getargs(): if isinstance(v.concretetype, lltype.Ptr): assert v.concretetype.TO._gckind != 'gc', "fix the test!" llinterp = LLInterpreter(t.rtyper) if option.view: t.view() return llinterp, graph
def test_no_collect(): from rpython.rlib import rgc from rpython.translator.c.genc import CStandaloneBuilder @rgc.no_collect def g(): return 1 assert g._dont_inline_ assert g._gc_no_collect_ def entrypoint(argv): return g() + 2 t = rtype(entrypoint, [s_list_of_strings]) t.config.translation.gc = "minimark" cbuild = CStandaloneBuilder(t, entrypoint, t.config, gcpolicy=FrameworkGcPolicy2) db = cbuild.build_database()
def test_no_collect(): from rpython.rlib import rgc from rpython.translator.c.genc import CStandaloneBuilder @rgc.no_collect def g(): return 1 assert g._dont_inline_ assert g._gc_no_collect_ def entrypoint(argv): return g() + 2 t = rtype(entrypoint, [s_list_of_strings]) t.config.translation.gc = "minimark" cbuild = CStandaloneBuilder(t, entrypoint, t.config, gcpolicy=FrameworkGcPolicy2) cbuild.make_entrypoint_wrapper = False db = cbuild.build_database()
def setup_class(cls): cls.marker = lltype.malloc(rffi.CArray(lltype.Signed), 1, flavor='raw', zero=True) funcs0 = [] funcs2 = [] cleanups = [] name_to_func = {} mixlevelstuff = [] for fullname in dir(cls): if not fullname.startswith('define'): continue definefunc = getattr(cls, fullname) _, name = fullname.split('_', 1) func_fixup = definefunc.im_func(cls) cleanup = None if isinstance(func_fixup, tuple): func, cleanup, fixup = func_fixup mixlevelstuff.append(fixup) else: func = func_fixup func.func_name = "f_%s" % name if cleanup: cleanup.func_name = "clean_%s" % name nargs = len(inspect.getargspec(func)[0]) name_to_func[name] = len(funcs0) if nargs == 2: funcs2.append(func) funcs0.append(None) elif nargs == 0: funcs0.append(func) funcs2.append(None) else: raise NotImplementedError( "defined test functions should have 0/2 arguments") # used to let test cleanup static root pointing to runtime # allocated stuff cleanups.append(cleanup) def entrypoint(args): num = args[0] func = funcs0[num] if func: res = func() else: func = funcs2[num] res = func(args[1], args[2]) cleanup = cleanups[num] if cleanup: cleanup() return res from rpython.translator.c.genc import CStandaloneBuilder s_args = SomePtr(lltype.Ptr(ARGS)) t = rtype(entrypoint, [s_args], gcname=cls.gcname, taggedpointers=cls.taggedpointers) for fixup in mixlevelstuff: if fixup: fixup(t) cbuild = CStandaloneBuilder(t, entrypoint, config=t.config, gcpolicy=cls.gcpolicy) cbuild.make_entrypoint_wrapper = False db = cbuild.build_database() entrypointptr = cbuild.getentrypointptr() entrygraph = entrypointptr._obj.graph if option.view: t.viewcg() cls.name_to_func = name_to_func cls.entrygraph = entrygraph cls.rtyper = t.rtyper cls.db = db