Ver Fonte

LibDebug: Propagate errors around LineProgram

Found while playing Fixme-Roulette.
Ben Wiederhake há 2 anos atrás
pai
commit
c5d3de3f7d

+ 1 - 1
Userland/Libraries/LibDebug/Dwarf/DwarfInfo.cpp

@@ -59,7 +59,7 @@ ErrorOr<void> DwarfInfo::populate_compilation_units()
 
         u32 length_after_header = compilation_unit_header.length() - (compilation_unit_header.header_size() - offsetof(CompilationUnitHeader, common.version));
 
-        auto line_program = make<LineProgram>(*this, line_info_stream);
+        auto line_program = TRY(LineProgram::create(*this, line_info_stream));
 
         // HACK: Clang generates line programs for embedded resource assembly files, but not compile units.
         // Meaning that for graphical applications, some line info data would be unread, triggering the assertion below.

+ 13 - 6
Userland/Libraries/LibDebug/Dwarf/LineProgram.cpp

@@ -13,15 +13,22 @@
 
 namespace Debug::Dwarf {
 
-LineProgram::LineProgram(DwarfInfo& dwarf_info, SeekableStream& stream)
+LineProgram::LineProgram(DwarfInfo& dwarf_info, SeekableStream& stream, size_t unit_offset)
     : m_dwarf_info(dwarf_info)
     , m_stream(stream)
+    , m_unit_offset(unit_offset)
 {
-    m_unit_offset = m_stream.tell().release_value_but_fixme_should_propagate_errors();
-    parse_unit_header().release_value_but_fixme_should_propagate_errors();
-    parse_source_directories().release_value_but_fixme_should_propagate_errors();
-    parse_source_files().release_value_but_fixme_should_propagate_errors();
-    run_program().release_value_but_fixme_should_propagate_errors();
+}
+
+ErrorOr<NonnullOwnPtr<LineProgram>> LineProgram::create(DwarfInfo& dwarf_info, SeekableStream& stream)
+{
+    auto offset = TRY(stream.tell());
+    auto program = TRY(adopt_nonnull_own_or_enomem(new (nothrow) LineProgram(dwarf_info, stream, offset)));
+    TRY(program->parse_unit_header());
+    TRY(program->parse_source_directories());
+    TRY(program->parse_source_files());
+    TRY(program->run_program());
+    return program;
 }
 
 ErrorOr<void> LineProgram::parse_unit_header()

+ 4 - 1
Userland/Libraries/LibDebug/Dwarf/LineProgram.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/DeprecatedFlyString.h>
+#include <AK/NonnullOwnPtr.h>
 #include <AK/Vector.h>
 #include <LibDebug/Dwarf/DwarfTypes.h>
 
@@ -108,7 +109,7 @@ class LineProgram {
     AK_MAKE_NONMOVABLE(LineProgram);
 
 public:
-    explicit LineProgram(DwarfInfo& dwarf_info, SeekableStream& stream);
+    static ErrorOr<NonnullOwnPtr<LineProgram>> create(DwarfInfo& dwarf_info, SeekableStream& stream);
 
     struct LineInfo {
         FlatPtr address { 0 };
@@ -133,6 +134,8 @@ public:
     bool looks_like_embedded_resource() const;
 
 private:
+    LineProgram(DwarfInfo& dwarf_info, SeekableStream& stream, size_t unit_offset);
+
     ErrorOr<void> parse_unit_header();
     ErrorOr<void> parse_source_directories();
     ErrorOr<void> parse_source_files();