def test_annotate_1(self): """ Verify that annotation works as expected with one lifted loop """ from numba import jit # dummy function to force objmode def bar(): pass def foo(x): bar() # force obj for i in range(x.size): x[i] += 1 return x cfoo = jit(foo) x = np.arange(10) xcopy = x.copy() r = cfoo(x) np.testing.assert_equal(r, xcopy + 1) buf = utils.StringIO() cfoo.inspect_types(file=buf) annotation = buf.getvalue() buf.close() self.assertIn("The function contains lifted loops", annotation) line = foo.__code__.co_firstlineno + 2 # 2 lines down from func head self.assertIn("Loop at line {line}".format(line=line), annotation) self.assertIn("Has 1 overloads", annotation)
def test_delete(self): @numba.njit def foo(appleorange, berrycherry): return appleorange + berrycherry foo(1, 2) # Exercise the method strbuf = utils.StringIO() foo.inspect_types(strbuf) # Ensure deletion show up after their use lines = strbuf.getvalue().splitlines() def findpatloc(pat): for i, ln in enumerate(lines): if pat in ln: return i raise ValueError("can't find {!r}".format(pat)) sa = findpatloc('appleorange = arg(0, name=appleorange)') sb = findpatloc('berrycherry = arg(1, name=berrycherry)') ea = findpatloc('del appleorange') eb = findpatloc('del berrycherry') self.assertLess(sa, ea) self.assertLess(sb, eb)
def test_inspect_types_pretty(self): @jit def foo(a, b): return a + b foo(1, 2) # Exercise the method, dump the output with captured_stdout(): ann = foo.inspect_types(pretty=True) # ensure HTML <span> is found in the annotation output for k, v in ann.ann.items(): span_found = False for line in v['pygments_lines']: if 'span' in line[2]: span_found = True self.assertTrue(span_found) # check that file+pretty kwarg combo raises with self.assertRaises(ValueError) as raises: foo.inspect_types(file=utils.StringIO(), pretty=True) self.assertIn("`file` must be None if `pretty=True`", str(raises.exception))
def compare_ir(self, ir_list): outputs = [] for func_ir in ir_list: remove_dead(func_ir.blocks, func_ir.arg_names, func_ir) output = utils.StringIO() func_ir.dump(file=output) outputs.append(output.getvalue()) self.assertTrue(len(set(outputs)) == 1) # assert all outputs are equal
def test_inspect_types(self): @jit def foo(a, b): return a + b foo(1, 2) # Exercise the method foo.inspect_types(utils.StringIO())
def captured_output(stream_name): """Return a context manager used by captured_stdout/stdin/stderr that temporarily replaces the sys stream *stream_name* with a StringIO.""" orig_stdout = getattr(sys, stream_name) setattr(sys, stream_name, utils.StringIO()) try: yield getattr(sys, stream_name) finally: setattr(sys, stream_name, orig_stdout)
def interpret(func): bc = bytecode.ByteCode(func=func) bc.dump() interp = interpreter.Interpreter(bytecode=bc) interp.interpret() interp.dump(utils.StringIO()) return interp
def test_annotations(self): """ Type annotation of array expressions with disambiguated variable names (issue #1466). """ cfunc = njit(variable_name_reuse) a = np.linspace(0, 1, 10) cfunc(a, a, a, a) buf = utils.StringIO() cfunc.inspect_types(buf) res = buf.getvalue() self.assertIn("# u.1 = ", res) self.assertIn("# u.2 = ", res)
def test_annotate_2(self): """ Verify that annotation works as expected with two lifted loops """ from numba import jit # dummy function to force objmode def bar(): pass def foo(x): bar() # force obj # first lifted loop for i in range(x.size): x[i] += 1 # second lifted loop for j in range(x.size): x[j] *= 2 return x cfoo = jit(foo) x = np.arange(10) xcopy = x.copy() r = cfoo(x) np.testing.assert_equal(r, (xcopy + 1) * 2) buf = utils.StringIO() cfoo.inspect_types(file=buf) annotation = buf.getvalue() buf.close() self.assertIn("The function contains lifted loops", annotation) line1 = foo.__code__.co_firstlineno + 3 # 3 lines down from func head line2 = foo.__code__.co_firstlineno + 6 # 6 lines down from func head self.assertIn("Loop at line {line}".format(line=line1), annotation) self.assertIn("Loop at line {line}".format(line=line2), annotation)