def test_counters(self): from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.lltypesystem.lloperation import llop def entry_point(argv): llop.instrument_count(lltype.Void, 'test', 2) llop.instrument_count(lltype.Void, 'test', 1) llop.instrument_count(lltype.Void, 'test', 1) llop.instrument_count(lltype.Void, 'test', 2) llop.instrument_count(lltype.Void, 'test', 1) return 0 t = TranslationContext(self.config) t.config.translation.instrument = True t.buildannotator().build_types(entry_point, [s_list_of_strings]) t.buildrtyper().specialize() cbuilder = CStandaloneBuilder(t, entry_point, config=t.config) # xxx cbuilder.generate_source() cbuilder.compile() counters_fname = udir.join("_counters_") os.environ['PYPY_INSTRUMENT_COUNTERS'] = str(counters_fname) try: data = cbuilder.cmdexec() finally: del os.environ['PYPY_INSTRUMENT_COUNTERS'] f = counters_fname.open('rb') counters_data = f.read() f.close() import struct counters = struct.unpack("LLL", counters_data) assert counters == (0,3,2)
def compile(self, entry_point, debug=True, shared=False, stackcheck=False, entrypoints=None): t = TranslationContext(self.config) ann = t.buildannotator() ann.build_types(entry_point, [s_list_of_strings]) if entrypoints is not None: anns = {} for func, annotation in secondary_entrypoints['test']: anns[func] = annotation for item in entrypoints: ann.build_types(item, anns[item]) t.buildrtyper().specialize() if stackcheck: from rpython.translator.transform import insert_ll_stackcheck insert_ll_stackcheck(t) t.config.translation.shared = shared if entrypoints is not None: kwds = {'secondary_entrypoints': [(i, None) for i in entrypoints]} else: kwds = {} cbuilder = CStandaloneBuilder(t, entry_point, t.config, **kwds) if debug: cbuilder.generate_source(defines=cbuilder.DEBUG_DEFINES) else: cbuilder.generate_source() cbuilder.compile() if option is not None and option.view: t.view() return t, cbuilder
def _compile_and_run(self, t, entry_point, entry_point_graph, args): from rpython.translator.c.genc import CStandaloneBuilder as CBuilder # XXX patch exceptions cbuilder = CBuilder(t, entry_point, config=t.config) cbuilder.generate_source() self._check_cbuilder(cbuilder) exe_name = cbuilder.compile() debug_print('---------- Test starting ----------') stdout = cbuilder.cmdexec(" ".join([str(arg) for arg in args])) res = int(stdout) debug_print('---------- Test done (%d) ----------' % (res, )) return res
def _compile_and_run(self, t, entry_point, entry_point_graph, args): from rpython.translator.c.genc import CStandaloneBuilder as CBuilder # XXX patch exceptions cbuilder = CBuilder(t, entry_point, config=t.config) cbuilder.generate_source() self._check_cbuilder(cbuilder) exe_name = cbuilder.compile() debug_print('---------- Test starting ----------') stdout = cbuilder.cmdexec(" ".join([str(arg) for arg in args])) res = int(stdout) debug_print('---------- Test done (%d) ----------' % (res,)) return res
def translates(self, func=None, argtypes=None, seeobj_w=[], extra_func=None, c_compile=False, **kwds): config = make_config(None, **kwds) if func is not None: if argtypes is None: nb_args = func.func_code.co_argcount argtypes = [W_Root] * nb_args # t = TranslationContext(config=config) self.t = t # for debugging ann = t.buildannotator() def entry_point(argv): self.threadlocals.enter_thread(self) W_SliceObject(w_some_obj(), w_some_obj(), w_some_obj()) if extra_func: extra_func(self) return 0 ann.build_types(entry_point, [s_list_of_strings], complete_now=False) if func is not None: ann.build_types(func, argtypes, complete_now=False) if seeobj_w: def seeme(n): return seeobj_w[n] ann.build_types(seeme, [int], complete_now=False) # # annotate all _seen_extras, knowing that annotating some may # grow the list done = 0 while done < len(self._seen_extras): #print self._seen_extras ann.build_types(self._seen_extras[done], [], complete_now=False) ann.complete_pending_blocks() done += 1 ann.complete() assert done == len(self._seen_extras) #t.viewcg() t.buildrtyper().specialize() t.checkgraphs() if c_compile: cbuilder = CStandaloneBuilder(t, entry_point, t.config) cbuilder.generate_source(defines=cbuilder.DEBUG_DEFINES) cbuilder.compile() return t, cbuilder
def compile(self, entry_point): t = TranslationContext(self.config) t.config.translation.gc = "semispace" t.config.translation.gcrootfinder = self.gcrootfinder t.config.translation.thread = True t.buildannotator().build_types(entry_point, [s_list_of_strings]) t.buildrtyper().specialize() # cbuilder = CStandaloneBuilder(t, entry_point, t.config) cbuilder.generate_source(defines=cbuilder.DEBUG_DEFINES) cbuilder.compile() # return t, cbuilder
def compile(self, entry_point, no__thread=True): t = TranslationContext(self.config) t.config.translation.gc = "semispace" t.config.translation.gcrootfinder = self.gcrootfinder t.config.translation.thread = True t.config.translation.no__thread = no__thread t.buildannotator().build_types(entry_point, [s_list_of_strings]) t.buildrtyper().specialize() # cbuilder = CStandaloneBuilder(t, entry_point, t.config) cbuilder.generate_source(defines=cbuilder.DEBUG_DEFINES) cbuilder.compile() # return t, cbuilder
def test_build(): def entry_point(argv): parser = interp_pyexpat.XML_ParserCreate("test") interp_pyexpat.XML_ParserFree(parser) res = interp_pyexpat.XML_ErrorString(3) os.write(1, rffi.charp2str(res)) return 0 t = TranslationContext() t.buildannotator().build_types(entry_point, [s_list_of_strings]) t.buildrtyper().specialize() builder = CStandaloneBuilder(t, entry_point, t.config) builder.generate_source() builder.compile() data = builder.cmdexec() assert data == pyexpat.ErrorString(3)
def test_build(): def entry_point(argv): parser = interp_pyexpat.XML_ParserCreate("test") interp_pyexpat.XML_ParserFree(parser) res = interp_pyexpat.XML_ErrorString(3) os.write(1, rffi.charp2str(res)) return 0 t = TranslationContext() t.buildannotator().build_types(entry_point, [s_list_of_strings]) t.buildrtyper().specialize() builder = CStandaloneBuilder(t, entry_point, t.config) builder.generate_source() builder.compile() data = builder.cmdexec() assert data == pyexpat.ErrorString(3)
def compile(self, entry_point, debug=True, shared=False, stackcheck=False, entrypoints=None): t = TranslationContext(self.config) ann = t.buildannotator() ann.build_types(entry_point, [s_list_of_strings]) if entrypoints is not None: anns = {} for func, annotation in secondary_entrypoints['test']: anns[func] = annotation for item in entrypoints: ann.build_types(item, anns[item]) t.buildrtyper().specialize() if stackcheck: from rpython.translator.transform import insert_ll_stackcheck insert_ll_stackcheck(t) t.config.translation.shared = shared if entrypoints is not None: kwds = {'secondary_entrypoints': [(i, None) for i in entrypoints]} else: kwds = {} cbuilder = CStandaloneBuilder(t, entry_point, t.config, **kwds) if debug: cbuilder.generate_source(defines=cbuilder.DEBUG_DEFINES) else: cbuilder.generate_source() cbuilder.compile() if option is not None and option.view: t.view() return t, cbuilder
def test_separate_files(self): # One file in translator/c/src fname = py.path.local(cdir).join('src', 'll_strtod.c') # One file in (another) subdir of the temp directory dirname = udir.join("test_dir").ensure(dir=1) fname2 = dirname.join("test_genc.c") fname2.write(""" void f() { LL_strtod_formatd(12.3, 'f', 5); }""") files = [fname, fname2] def entry_point(argv): return 0 t = TranslationContext(self.config) t.buildannotator().build_types(entry_point, [s_list_of_strings]) t.buildrtyper().specialize() cbuilder = CStandaloneBuilder(t, entry_point, t.config) cbuilder.eci = cbuilder.eci.merge( ExternalCompilationInfo(separate_module_files=files)) cbuilder.generate_source() makefile = udir.join(cbuilder.modulename, 'Makefile').read() # generated files are compiled in the same directory assert " ../test_dir/test_genc.c" in makefile assert " ../test_dir/test_genc.o" in makefile # but files from pypy source dir must be copied assert "translator/c/src" not in makefile assert " ll_strtod.c" in makefile assert " ll_strtod.o" in makefile
def test_counters(self): from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.lltypesystem.lloperation import llop def entry_point(argv): llop.instrument_count(lltype.Void, 'test', 2) llop.instrument_count(lltype.Void, 'test', 1) llop.instrument_count(lltype.Void, 'test', 1) llop.instrument_count(lltype.Void, 'test', 2) llop.instrument_count(lltype.Void, 'test', 1) return 0 t = TranslationContext(self.config) t.config.translation.instrument = True t.buildannotator().build_types(entry_point, [s_list_of_strings]) t.buildrtyper().specialize() cbuilder = CStandaloneBuilder(t, entry_point, config=t.config) # xxx cbuilder.generate_source() cbuilder.compile() counters_fname = udir.join("_counters_") os.environ['PYPY_INSTRUMENT_COUNTERS'] = str(counters_fname) try: data = cbuilder.cmdexec() finally: del os.environ['PYPY_INSTRUMENT_COUNTERS'] f = counters_fname.open('rb') counters_data = f.read() f.close() import struct counters = struct.unpack("LLL", counters_data) assert counters == (0, 3, 2)
def test_separate_files(self): # One file in translator/c/src fname = py.path.local(cdir).join('src', 'll_strtod.c') # One file in (another) subdir of the temp directory dirname = udir.join("test_dir").ensure(dir=1) fname2 = dirname.join("test_genc.c") fname2.write(""" void f() { LL_strtod_formatd(12.3, 'f', 5); }""") files = [fname, fname2] def entry_point(argv): return 0 t = TranslationContext(self.config) t.buildannotator().build_types(entry_point, [s_list_of_strings]) t.buildrtyper().specialize() cbuilder = CStandaloneBuilder(t, entry_point, t.config) cbuilder.eci = cbuilder.eci.merge( ExternalCompilationInfo(separate_module_files=files)) cbuilder.generate_source() makefile = udir.join(cbuilder.modulename, 'Makefile').read() # generated files are compiled in the same directory assert " ../test_dir/test_genc.c" in makefile assert " ../test_dir/test_genc.o" in makefile # but files from pypy source dir must be copied assert "translator/c/src" not in makefile assert " ll_strtod.c" in makefile assert " ll_strtod.o" in makefile
def _makefunc_str_int(cls, func): def main(argv): arg0 = argv[1] arg1 = int(argv[2]) try: res = func(arg0, arg1) except MemoryError: print 'Result: MemoryError' else: print 'Result: "%s"' % (res,) return 0 config = cls.make_config() t = TranslationContext(config=config) a = t.buildannotator() sec_ep = getattr(cls, 'secondary_entrypoints', []) for f, inputtypes in sec_ep: a.build_types(f, inputtypes, False) a.build_types(main, [s_list_of_strings]) t.buildrtyper().specialize() t.checkgraphs() cbuilder = CStandaloneBuilder(t, main, config=config, secondary_entrypoints=sec_ep) c_source_filename = cbuilder.generate_source( defines = cbuilder.DEBUG_DEFINES) cls._patch_makefile(cbuilder.targetdir) if option.view: t.view() exe_name = cbuilder.compile() def run(arg0, arg1): lines = [] print >> sys.stderr, 'RUN: starting', exe_name, arg0, arg1 if sys.platform == 'win32': redirect = ' 2> NUL' else: redirect = '' if config.translation.shared and os.name == 'posix': library_path = exe_name.dirpath() if sys.platform == 'darwin': env = 'DYLD_LIBRARY_PATH="%s" ' % library_path else: env = 'LD_LIBRARY_PATH="%s" ' % library_path else: env = '' cwd = os.getcwd() try: os.chdir(str(exe_name.dirpath())) g = os.popen( '%s"%s" %s %d%s' % (env, exe_name, arg0, arg1, redirect), 'r') finally: os.chdir(cwd) for line in g: print >> sys.stderr, 'RUN:', line.rstrip() lines.append(line) g.close() if not lines: py.test.fail("no output from subprocess") if not lines[-1].startswith('Result:'): py.test.fail("unexpected output from subprocess") result = lines[-1][len('Result:'):].strip() if result == 'MemoryError': raise MemoryError("subprocess got an RPython MemoryError") if result.startswith('"') and result.endswith('"'): return result[1:-1] else: return int(result) return run
def _makefunc_str_int(cls, func): def main(argv): arg0 = argv[1] arg1 = int(argv[2]) try: res = func(arg0, arg1) except MemoryError: print 'Result: MemoryError' else: print 'Result: "%s"' % (res,) return 0 config = cls.make_config() t = TranslationContext(config=config) a = t.buildannotator() sec_ep = getattr(cls, 'secondary_entrypoints', []) for f, inputtypes in sec_ep: a.build_types(f, inputtypes, False) a.build_types(main, [s_list_of_strings]) t.buildrtyper().specialize() t.checkgraphs() cbuilder = CStandaloneBuilder(t, main, config=config, secondary_entrypoints=sec_ep) c_source_filename = cbuilder.generate_source( defines = cbuilder.DEBUG_DEFINES) cls._patch_makefile(cbuilder.targetdir) if option.view: t.view() exe_name = cbuilder.compile() def run(arg0, arg1, runner=None): if runner is not None: py.test.skip("unsupported test: runner=%r" % (runner,)) lines = [] print >> sys.stderr, 'RUN: starting', exe_name, arg0, arg1 if sys.platform == 'win32': redirect = ' 2> NUL' else: redirect = '' if config.translation.shared and os.name == 'posix': library_path = exe_name.dirpath() if sys.platform == 'darwin': env = 'DYLD_LIBRARY_PATH="%s" ' % library_path else: env = 'LD_LIBRARY_PATH="%s" ' % library_path else: env = '' cwd = os.getcwd() try: os.chdir(str(exe_name.dirpath())) g = os.popen( '%s"%s" %s %d%s' % (env, exe_name, arg0, arg1, redirect), 'r') finally: os.chdir(cwd) for line in g: print >> sys.stderr, 'RUN:', line.rstrip() lines.append(line) g.close() if not lines: py.test.fail("no output from subprocess") if not lines[-1].startswith('Result:'): py.test.fail("unexpected output from subprocess") result = lines[-1][len('Result:'):].strip() if result == 'MemoryError': raise MemoryError("subprocess got an RPython MemoryError") if result.startswith('"') and result.endswith('"'): return result[1:-1] else: return int(result) return run