summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Persch <chpe@src.gnome.org>2022-03-01 21:12:12 +0100
committerChristian Persch <chpe@src.gnome.org>2022-03-01 21:12:12 +0100
commit7a0a7f3c5dd1b9c798bfa0f1f0a13661167f54a3 (patch)
tree00c11a2221d37ea9ec0c36c5b73b32aa8dafeb41
parent5770e39b5a908952237bc8288e5342eb08c1d5bb (diff)
downloadvte-7a0a7f3c5dd1b9c798bfa0f1f0a13661167f54a3.tar.gz
lib: Move glib glue code to glib-glue.cc
-rw-r--r--src/glib-glue.cc180
-rw-r--r--src/meson.build1
-rw-r--r--src/vtegtk.cc145
3 files changed, 181 insertions, 145 deletions
diff --git a/src/glib-glue.cc b/src/glib-glue.cc
new file mode 100644
index 00000000..ee25edc9
--- /dev/null
+++ b/src/glib-glue.cc
@@ -0,0 +1,180 @@
+/*
+ * Copyright © 2020, 2021 Christian Persch
+ *
+ * This library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "glib-glue.hh"
+
+#include <exception>
+#include <stdexcept>
+
+#include "debug.h"
+
+#define VTE_EXCEPTION_ERROR g_quark_from_static_string("std::exception")
+
+typedef enum {
+ VTE_EXCEPTION_GENERIC,
+} VteException;
+
+namespace vte {
+
+using namespace std::literals;
+
+static void
+exception_append_to_string(std::exception const& e,
+ std::string& what,
+ int level = 0)
+{
+ if (level > 0)
+ what += ": "sv;
+ what += e.what();
+
+ try {
+ std::rethrow_if_nested(e);
+ } catch (std::bad_alloc const& en) {
+ g_error("Allocation failure: %s\n", what.c_str());
+ } catch (std::exception const& en) {
+ exception_append_to_string(en, what, level + 1);
+ } catch (...) {
+ what += ": Unknown nested exception"sv;
+ }
+}
+
+#ifdef VTE_DEBUG
+
+void log_exception(char const* func,
+ char const* filename,
+ int const line) noexcept
+try
+{
+ auto what = std::string{};
+
+ try {
+ throw; // rethrow current exception
+ } catch (std::bad_alloc const& e) {
+ g_error("Allocation failure: %s\n", e.what());
+ } catch (std::exception const& e) {
+ exception_append_to_string(e, what);
+ } catch (...) {
+ what = "Unknown exception"sv;
+ }
+
+ _vte_debug_print(VTE_DEBUG_EXCEPTIONS,
+ "Caught exception in %s [%s:%d]: %s\n",
+ func, filename, line, what.c_str());
+}
+catch (...)
+{
+ _vte_debug_print(VTE_DEBUG_EXCEPTIONS,
+ "Caught exception while logging an exception in %s [%s:%d]\n",
+ func, filename, line);
+}
+
+#else
+
+static void
+log_exception(std::exception const& e)
+{
+ try {
+ std::rethrow_if_nested(e);
+ } catch (std::bad_alloc const& en) {
+ g_error("Allocation failure: %s\n", e.what());
+ } catch (std::exception const& en) {
+ log_exception(en);
+ } catch (...) {
+ }
+}
+
+void
+log_exception() noexcept
+try
+{
+ try {
+ throw; // rethrow current exception
+ } catch (std::bad_alloc const& e) {
+ g_error("Allocation failure: %s\n", e.what());
+ } catch (std::exception const& e) {
+ log_exception(e);
+ } catch (...) {
+ }
+}
+catch (...)
+{
+}
+
+#endif /* VTE_DEBUG */
+
+namespace glib {
+
+bool set_error_from_exception(GError** error
+#ifdef VTE_DEBUG
+ , char const* func
+ , char const* filename
+ , int const line
+#endif
+ ) noexcept
+try
+{
+ auto what = std::string{};
+
+ try {
+ throw; // rethrow current exception
+ } catch (std::bad_alloc const& e) {
+ g_error("Allocation failure: %s\n", e.what());
+ } catch (std::exception const& e) {
+ exception_append_to_string(e, what);
+ } catch (...) {
+ what = "Unknown exception"sv;
+ }
+
+#ifdef VTE_DEBUG
+ auto msg = vte::glib::take_string(g_strdup_printf("Caught exception in %s [%s:%d]: %s",
+ func, filename, line,
+ what.c_str()));
+#else
+ auto msg = vte::glib::take_string(g_strdup_printf("Caught exception: %s",
+ what.c_str()));
+#endif
+ auto msg_str = vte::glib::take_string(g_utf8_make_valid(msg.get(), -1));
+ g_set_error_literal(error,
+ VTE_EXCEPTION_ERROR,
+ VTE_EXCEPTION_GENERIC,
+ msg_str.get());
+ _vte_debug_print(VTE_DEBUG_EXCEPTIONS, "%s", msg_str.get());
+
+ return false;
+}
+catch (...)
+{
+ vte::log_exception();
+#ifdef VTE_DEBUG
+ g_set_error(error,
+ VTE_EXCEPTION_ERROR,
+ VTE_EXCEPTION_GENERIC,
+ "Caught exception while logging an exception in %s [%s:%d]\n",
+ func, filename, line);
+#else
+ g_set_error_literal(error,
+ VTE_EXCEPTION_ERROR,
+ VTE_EXCEPTION_GENERIC,
+ "Caught exception while logging an exception");
+#endif
+ return false;
+}
+
+} // namespace glib
+} // namespace vte
diff --git a/src/meson.build b/src/meson.build
index 165ed000..89f52985 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -29,6 +29,7 @@ debug_sources = files(
)
glib_glue_sources = files(
+ 'glib-glue.cc',
'glib-glue.hh',
)
diff --git a/src/vtegtk.cc b/src/vtegtk.cc
index 2165cd86..f94b8121 100644
--- a/src/vtegtk.cc
+++ b/src/vtegtk.cc
@@ -6491,148 +6491,3 @@ catch (...)
vte::log_exception();
return true;
}
-
-namespace vte {
-
-using namespace std::literals;
-
-static void
-exception_append_to_string(std::exception const& e,
- std::string& what,
- int level = 0)
-{
- if (level > 0)
- what += ": "sv;
- what += e.what();
-
- try {
- std::rethrow_if_nested(e);
- } catch (std::bad_alloc const& en) {
- g_error("Allocation failure: %s\n", what.c_str());
- } catch (std::exception const& en) {
- exception_append_to_string(en, what, level + 1);
- } catch (...) {
- what += ": Unknown nested exception"sv;
- }
-}
-
-#ifdef VTE_DEBUG
-
-void log_exception(char const* func,
- char const* filename,
- int const line) noexcept
-try
-{
- auto what = std::string{};
-
- try {
- throw; // rethrow current exception
- } catch (std::bad_alloc const& e) {
- g_error("Allocation failure: %s\n", e.what());
- } catch (std::exception const& e) {
- exception_append_to_string(e, what);
- } catch (...) {
- what = "Unknown exception"sv;
- }
-
- _vte_debug_print(VTE_DEBUG_EXCEPTIONS,
- "Caught exception in %s [%s:%d]: %s\n",
- func, filename, line, what.c_str());
-}
-catch (...)
-{
- _vte_debug_print(VTE_DEBUG_EXCEPTIONS,
- "Caught exception while logging an exception in %s [%s:%d]\n",
- func, filename, line);
-}
-
-#else
-
-static void
-log_exception(std::exception const& e)
-{
- try {
- std::rethrow_if_nested(e);
- } catch (std::bad_alloc const& en) {
- g_error("Allocation failure: %s\n", e.what());
- } catch (std::exception const& en) {
- log_exception(en);
- } catch (...) {
- }
-}
-
-void
-log_exception() noexcept
-try
-{
- try {
- throw; // rethrow current exception
- } catch (std::bad_alloc const& e) {
- g_error("Allocation failure: %s\n", e.what());
- } catch (std::exception const& e) {
- log_exception(e);
- } catch (...) {
- }
-}
-catch (...)
-{
-}
-
-#endif /* VTE_DEBUG */
-
-namespace glib {
-
-bool set_error_from_exception(GError** error
-#ifdef VTE_DEBUG
- , char const* func
- , char const* filename
- , int const line
-#endif
- ) noexcept
-try
-{
- auto what = std::string{};
-
- try {
- throw; // rethrow current exception
- } catch (std::bad_alloc const& e) {
- g_error("Allocation failure: %s\n", e.what());
- } catch (std::exception const& e) {
- exception_append_to_string(e, what);
- } catch (...) {
- what = "Unknown exception"sv;
- }
-
-#ifdef VTE_DEBUG
- auto msg = vte::glib::take_string(g_strdup_printf("Caught exception in %s [%s:%d]: %s",
- func, filename, line,
- what.c_str()));
-#else
- auto msg = vte::glib::take_string(g_strdup_printf("Caught exception: %s",
- what.c_str()));
-#endif
- auto msg_str = vte::glib::take_string(g_utf8_make_valid(msg.get(), -1));
- g_set_error_literal(error,
- G_IO_ERROR,
- G_IO_ERROR_FAILED,
- msg_str.get());
- _vte_debug_print(VTE_DEBUG_EXCEPTIONS, "%s", msg_str.get());
-
- return false;
-}
-catch (...)
-{
- vte::log_exception();
-#ifdef VTE_DEBUG
- g_set_error(error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Caught exception while logging an exception in %s [%s:%d]\n",
- func, filename, line);
-#else
- g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Caught exception while logging an exception");
-#endif
- return false;
-}
-
-} // namespace glib
-} // namespace vte