def compile_func(fn, inputtypes, t=None, gcpolicy="ref"): from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=True) config.translation.gc = gcpolicy config.translation.countmallocs = True if t is None: t = TranslationContext(config=config) if inputtypes is not None: t.buildannotator().build_types(fn, inputtypes) t.buildrtyper().specialize() builder = genc.CExtModuleBuilder(t, fn, config=config) builder.generate_source() builder.compile() if conftest.option.view: t.view() compiled_fn = builder.get_entry_point() malloc_counters = builder.get_malloc_counters() def checking_fn(*args, **kwds): try: return compiled_fn(*args, **kwds) finally: mallocs, frees = malloc_counters() assert mallocs == frees return checking_fn
def compilefunc(self, t, func): from pypy.translator.c import genc self.builder = builder = genc.CExtModuleBuilder(t, func, config=t.config) builder.generate_source() builder.compile() return builder.get_entry_point()
def compilefunc(self, t, func): from pypy.translator.c import genc self.builder = builder = genc.CExtModuleBuilder(t, func, config=t.config) if hasattr(self, 'include_also_eci'): builder.merge_eci(self.include_also_eci) builder.generate_source() builder.compile() return builder.get_entry_point()
def test_simple_lambda(): f = lambda x: x * 2 t = TranslationContext() t.buildannotator().build_types(f, [int]) t.buildrtyper().specialize() t.config.translation.countmallocs = True builder = genc.CExtModuleBuilder(t, f, config=t.config) builder.generate_source() builder.compile() f1 = builder.get_entry_point() assert f1(5) == 10
def test_dont_write_source_files(): def f(x): return x * 2 t = TranslationContext() t.buildannotator().build_types(f, [int]) t.buildrtyper().specialize() t.config.translation.countmallocs = True t.config.translation.dont_write_c_files = True builder = genc.CExtModuleBuilder(t, f, config=t.config) builder.generate_source() assert isinstance(builder.targetdir, NullPyPathLocal) assert builder.targetdir.listdir() == []
def test_simple(): def f(x): return x*2 t = TranslationContext() t.buildannotator().build_types(f, [int]) t.buildrtyper().specialize() t.config.translation.countmallocs = True builder = genc.CExtModuleBuilder(t, f, config=t.config) builder.generate_source() builder.compile() f1 = builder.get_entry_point() assert f1(5) == 10 assert f1(-123) == -246 assert builder.get_malloc_counters()() == (0, 0) py.test.raises(Exception, f1, "world") # check that it's really typed
def test_py_capi_exc(): def f(x): if x: l = None else: l = [2] x = x*2 return l[0] t = TranslationContext() t.buildannotator().build_types(f, [int]) t.buildrtyper().specialize() builder = genc.CExtModuleBuilder(t, f, config=t.config) builder.generate_source() builder.compile() f1 = builder.get_entry_point(isolated=True) x = py.test.raises(Exception, f1, "world") assert not isinstance(x.value, EOFError) # EOFError === segfault
def test_runtime_type_info(): S = GcStruct('s', ('is_actually_s1', Bool)) S1 = GcStruct('s1', ('sub', S)) attachRuntimeTypeInfo(S) attachRuntimeTypeInfo(S1) def rtti_S(p): if p.is_actually_s1: return getRuntimeTypeInfo(S1) else: return getRuntimeTypeInfo(S) def rtti_S1(p): return getRuntimeTypeInfo(S1) def does_stuff(): p = malloc(S) p.is_actually_s1 = False p1 = malloc(S1) p1.sub.is_actually_s1 = True # and no crash when p and p1 are decref'ed return None t = TranslationContext() t.buildannotator().build_types(does_stuff, []) rtyper = t.buildrtyper() rtyper.attachRuntimeTypeInfoFunc(S, rtti_S) rtyper.attachRuntimeTypeInfoFunc(S1, rtti_S1) rtyper.specialize() #t.view() from pypy.translator.c import genc t.config.translation.countmallocs = True builder = genc.CExtModuleBuilder(t, does_stuff, config=t.config) builder.generate_source() builder.compile() f1 = builder.get_entry_point() f1() mallocs, frees = builder.get_malloc_counters()() assert mallocs == frees