Author: Med Ismail Bennani Date: 2023-01-12T19:20:51-08:00 New Revision: 6b26e1dad9608ec188446dcdc0734a7b41cf145b
URL: https://github.com/llvm/llvm-project/commit/6b26e1dad9608ec188446dcdc0734a7b41cf145b DIFF: https://github.com/llvm/llvm-project/commit/6b26e1dad9608ec188446dcdc0734a7b41cf145b.diff LOG: [lldb/crashlog] Refactor CrashLogParser into a Factory pattern This patch should fix an undefined behaviour that's happening when parsing a crash report from an IDE. In the previous implementation, the CrashLogParser base class would use the `__new__` static class method to create the right parser instance depending on the crash report type. For some reasons, the derived parser initializer wouldn't be called when running the command from an IDE, so this patch refactors the CrashLogParser code to replace the use of the `__new__` method with a factory `create` static method. rdar://100527640 Differential Revision: https://reviews.llvm.org/D139951 Signed-off-by: Med Ismail Bennani <medismail.benn...@gmail.com> Added: Modified: lldb/examples/python/crashlog.py lldb/examples/python/scripted_process/crashlog_scripted_process.py Removed: ################################################################################ diff --git a/lldb/examples/python/crashlog.py b/lldb/examples/python/crashlog.py index b62ebd758f22..d9e037057e67 100755 --- a/lldb/examples/python/crashlog.py +++ b/lldb/examples/python/crashlog.py @@ -417,15 +417,15 @@ class InteractiveCrashLogException(Exception): pass class CrashLogParser: - "CrashLog parser base class and factory." - def __new__(cls, debugger, path, verbose): + @staticmethod + def create(debugger, path, verbose): data = JSONCrashLogParser.is_valid_json(path) if data: - self = object.__new__(JSONCrashLogParser) - self.data = data - return self + parser = JSONCrashLogParser(debugger, path, verbose) + parser.data = data + return parser else: - return object.__new__(TextCrashLogParser) + return TextCrashLogParser(debugger, path, verbose) def __init__(self, debugger, path, verbose): self.path = os.path.expanduser(path) @@ -1076,7 +1076,7 @@ def load_crashlog_in_scripted_process(debugger, crash_log_file, options, result) if not os.path.exists(crashlog_path): raise InteractiveCrashLogException("crashlog file %s does not exist" % crashlog_path) - crashlog = CrashLogParser(debugger, crashlog_path, False).parse() + crashlog = CrashLogParser.create(debugger, crashlog_path, False).parse() target = lldb.SBTarget() # 1. Try to use the user-provided target @@ -1332,7 +1332,7 @@ def should_run_in_interactive_mode(options, ci): except InteractiveCrashLogException as e: result.SetError(str(e)) else: - crash_log = CrashLogParser(debugger, crash_log_file, options.verbose).parse() + crash_log = CrashLogParser.create(debugger, crash_log_file, options.verbose).parse() SymbolicateCrashLog(crash_log, options) if __name__ == '__main__': diff --git a/lldb/examples/python/scripted_process/crashlog_scripted_process.py b/lldb/examples/python/scripted_process/crashlog_scripted_process.py index eddf96786d9e..dfb32aae6d3f 100644 --- a/lldb/examples/python/scripted_process/crashlog_scripted_process.py +++ b/lldb/examples/python/scripted_process/crashlog_scripted_process.py @@ -10,7 +10,7 @@ class CrashLogScriptedProcess(ScriptedProcess): def parse_crashlog(self): - crashlog_parser = CrashLogParser(self.dbg, self.crashlog_path, False) + crashlog_parser = CrashLogParser.create(self.dbg, self.crashlog_path, False) crash_log = crashlog_parser.parse() self.pid = crash_log.process_id _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits