17e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granatafrom __future__ import print_function
27e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataimport sys
37e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataimport os.path
47e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataimport inspect
57e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
67e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataclass NopLogger:
77e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def __init__(self):
87e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		pass
97e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
107e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def write(self,data):
117e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		pass
127e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
137e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def flush(self):
147e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		pass
157e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
167e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def close(self):
177e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		pass
187e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
197e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
207e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataclass StdoutLogger:
217e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def __init__(self):
227e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		pass
237e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
247e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def write(self,data):
257e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		print(data)
267e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
277e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def flush(self):
287e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		pass
297e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
307e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def close(self):
317e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		pass
327e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
337e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataclass FileLogger:
347e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def __init__(self, name):
357e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		self.file = None
367e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		try:
377e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			name = os.path.abspath(name)
387e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			self.file = open(name,'a')
397e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		except:
407e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			try:
417e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata				self.file = open('formatters.log','a')
427e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			except:
437e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata				pass
447e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
457e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def write(self,data):
467e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		if self.file != None:
477e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			print(data,file=self.file)
487e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		else:
497e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			print(data)
507e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
517e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def flush(self):
527e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		if self.file != None:
537e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			self.file.flush()
547e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
557e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def close(self):
567e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		if self.file != None:
577e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			self.file.close()
587e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			self.file = None
597e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
607e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata# to enable logging:
6117ab954036c40c0eddf28a45f20db4dfaf0d06efEnrico Granata# define lldb.formatters.Logger._lldb_formatters_debug_level to any number greater than 0
627e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata# if you define it to any value greater than 1, the log will be automatically flushed after each write (slower but should make sure most of the stuff makes it to the log even if we crash)
637e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata# if you define it to any value greater than 2, the calling function's details will automatically be logged (even slower, but provides additional details)
6417ab954036c40c0eddf28a45f20db4dfaf0d06efEnrico Granata# if you need the log to go to a file instead of on screen, define lldb.formatters.Logger._lldb_formatters_debug_filename to a valid filename
657e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataclass Logger:
667e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def __init__(self,autoflush=False,logcaller=False):
677e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		global _lldb_formatters_debug_level
687e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		global _lldb_formatters_debug_filename
697e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		self.autoflush = autoflush
707e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		want_log = False
717e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		try:
727e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			want_log = (_lldb_formatters_debug_level > 0)
737e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		except:
747e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			pass
757e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		if not (want_log):
767e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			self.impl = NopLogger()
777e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			return
787e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		want_file = False
797e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		try:
807e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			want_file = (_lldb_formatters_debug_filename != None and _lldb_formatters_debug_filename != '' and _lldb_formatters_debug_filename != 0)
817e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		except:
827e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			pass
837e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		if want_file:
847e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			self.impl = FileLogger(_lldb_formatters_debug_filename)
857e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		else:
867e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			self.impl = StdoutLogger()
877e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		try:
887e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			self.autoflush = (_lldb_formatters_debug_level > 1)
897e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		except:
907e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			self.autoflush = autoflush
917e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		want_caller_info = False
927e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		try:
937e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			want_caller_info = (_lldb_formatters_debug_level > 2)
947e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		except:
957e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			pass
967e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		if want_caller_info:
977e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			self._log_caller()
987e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
997e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def _log_caller(self):
1007e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		caller = inspect.stack()[2]
1017e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		try:
1027e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			if caller != None and len(caller) > 3:
1037e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata				self.write('Logging from function ' + str(caller))
1047e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			else:
1057e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata				self.write('Caller info not available - Required caller logging not possible')
1067e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		finally:
1077e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			del caller # needed per Python docs to avoid keeping objects alive longer than we care
1087e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
1097e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def write(self,data):
1107e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		self.impl.write(data)
1117e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		if self.autoflush:
1127e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata			self.flush()
1137e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
1147e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def __rshift__(self,data):
1157e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		self.write(data)
1167e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
1177e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def flush(self):
1187e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		self.impl.flush()
1197e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
1207e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata	def close(self):
1217e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata		self.impl.close()
1227e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata
123