From 2069a5a2a0304eda75acc9f0318607aaf46a0825 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 29 Dec 2022 17:31:34 +0000 Subject: [PATCH] Snake: Make initialization from GML fallible Replace the C_OBJECT factory functions with a custom try_create() which loads the various bitmaps. Any failures there are now propagated. --- Userland/Games/Snake/Game.cpp | 12 ++++++------ Userland/Games/Snake/Game.h | 6 ++++-- Userland/Games/Snake/main.cpp | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Userland/Games/Snake/Game.cpp b/Userland/Games/Snake/Game.cpp index d3350339e3..e9a36c8673 100644 --- a/Userland/Games/Snake/Game.cpp +++ b/Userland/Games/Snake/Game.cpp @@ -19,7 +19,7 @@ REGISTER_WIDGET(Snake, Game); namespace Snake { -static NonnullRefPtrVector load_food_bitmaps() +ErrorOr> Game::try_create() { static constexpr auto food_bitmaps_files = Array { "/res/emoji/U+1F41F.png"sv, @@ -54,23 +54,23 @@ static NonnullRefPtrVector load_food_bitmaps() }; NonnullRefPtrVector food_bitmaps; - food_bitmaps.ensure_capacity(food_bitmaps_files.size()); + TRY(food_bitmaps.try_ensure_capacity(food_bitmaps_files.size())); for (auto file : food_bitmaps_files) { auto bitmap = Gfx::Bitmap::try_load_from_file(file); if (bitmap.is_error()) { dbgln("\033[31;1mCould not load bitmap file\033[0m '{}': {}", file, bitmap.error()); - VERIFY_NOT_REACHED(); + return bitmap.release_error(); } food_bitmaps.unchecked_append(bitmap.release_value()); } - return food_bitmaps; + return adopt_nonnull_ref_or_enomem(new (nothrow) Game(move(food_bitmaps))); } -Game::Game() - : m_food_bitmaps(load_food_bitmaps()) +Game::Game(NonnullRefPtrVector food_bitmaps) + : m_food_bitmaps(move(food_bitmaps)) { set_font(Gfx::FontDatabase::default_fixed_width_font().bold_variant()); reset(); diff --git a/Userland/Games/Snake/Game.h b/Userland/Games/Snake/Game.h index 0c512813b3..5244fadc7c 100644 --- a/Userland/Games/Snake/Game.h +++ b/Userland/Games/Snake/Game.h @@ -14,9 +14,11 @@ namespace Snake { class Game : public GUI::Frame { - C_OBJECT(Game); + C_OBJECT_ABSTRACT(Game); public: + static ErrorOr> try_create(); + virtual ~Game() override = default; void start(); @@ -28,7 +30,7 @@ public: Function on_score_update; private: - Game(); + explicit Game(NonnullRefPtrVector food_bitmaps); virtual void paint_event(GUI::PaintEvent&) override; virtual void keydown_event(GUI::KeyEvent&) override; diff --git a/Userland/Games/Snake/main.cpp b/Userland/Games/Snake/main.cpp index c363643e02..ecbdaa08c1 100644 --- a/Userland/Games/Snake/main.cpp +++ b/Userland/Games/Snake/main.cpp @@ -49,7 +49,7 @@ ErrorOr serenity_main(Main::Arguments arguments) window->resize(324, 345); auto widget = TRY(window->try_set_main_widget()); - widget->load_from_gml(snake_gml); + TRY(widget->try_load_from_gml(snake_gml)); auto& game = *widget->find_descendant_of_type_named("game"); game.set_focus(true);