def tb_lineno(tb):
	"""Calculate the correct line number of the traceback given in tb
	(even with -O on)."""

	# Coded by Marc-Andre Lemburg from the example of PyCode_Addr2Line()
	# in compile.c.
	# Revised version by Jim Hugunin to work with JPython too.

	c = tb.tb_frame.f_code
	if not hasattr(c, 'co_lnotab'):
		return tb.tb_lineno

	tab = c.co_lnotab
	line = c.co_firstlineno
	stopat = tb.tb_lasti
	addr = 0
	for i in range(0, len(tab), 2):
		addr = addr + ord(tab[i])
		if addr > stopat:
			break
		line = line + ord(tab[i+1])
	return line