1 // Copyright Antony Polukhin, 2016-2020. 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See 4 // accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 7 #ifndef BOOST_STACKTRACE_DETAIL_FRAME_DECL_HPP 8 #define BOOST_STACKTRACE_DETAIL_FRAME_DECL_HPP 9 10 #include <boost/config.hpp> 11 #ifdef BOOST_HAS_PRAGMA_ONCE 12 # pragma once 13 #endif 14 15 #include <iosfwd> 16 #include <string> 17 18 #include <boost/core/explicit_operator_bool.hpp> 19 20 #include <boost/stacktrace/safe_dump_to.hpp> // boost::stacktrace::detail::native_frame_ptr_t 21 #include <boost/stacktrace/detail/void_ptr_cast.hpp> 22 23 #include <boost/stacktrace/detail/push_options.h> 24 25 /// @file boost/stacktrace/detail/frame_decl.hpp 26 /// Use <boost/stacktrace/frame.hpp> header instead of this one! 27 28 namespace boost { namespace stacktrace { 29 30 /// @class boost::stacktrace::frame boost/stacktrace/detail/frame_decl.hpp <boost/stacktrace/frame.hpp> 31 /// @brief Class that stores frame/function address and can get information about it at runtime. 32 class frame { 33 public: 34 typedef boost::stacktrace::detail::native_frame_ptr_t native_frame_ptr_t; 35 36 private: 37 /// @cond 38 native_frame_ptr_t addr_; 39 /// @endcond 40 41 public: 42 /// @brief Constructs frame that references NULL address. 43 /// Calls to source_file() and source_line() will return empty string. 44 /// Calls to source_line() will return 0. 45 /// 46 /// @b Complexity: O(1). 47 /// 48 /// @b Async-Handler-Safety: Safe. 49 /// @throws Nothing. frame()50 BOOST_CONSTEXPR frame() BOOST_NOEXCEPT 51 : addr_(0) 52 {} 53 54 #ifdef BOOST_STACKTRACE_DOXYGEN_INVOKED 55 /// @brief Copy constructs frame. 56 /// 57 /// @b Complexity: O(1). 58 /// 59 /// @b Async-Handler-Safety: Safe. 60 /// @throws Nothing. 61 constexpr frame(const frame&) = default; 62 63 /// @brief Copy assigns frame. 64 /// 65 /// @b Complexity: O(1). 66 /// 67 /// @b Async-Handler-Safety: Safe. 68 /// @throws Nothing. 69 constexpr frame& operator=(const frame&) = default; 70 #endif 71 72 /// @brief Constructs frame that references addr and could later generate information about that address using platform specific features. 73 /// 74 /// @b Complexity: O(1). 75 /// 76 /// @b Async-Handler-Safety: Safe. 77 /// @throws Nothing. frame(native_frame_ptr_t addr)78 BOOST_CONSTEXPR explicit frame(native_frame_ptr_t addr) BOOST_NOEXCEPT 79 : addr_(addr) 80 {} 81 82 /// @brief Constructs frame that references function_addr and could later generate information about that function using platform specific features. 83 /// 84 /// @b Complexity: O(1). 85 /// 86 /// @b Async-Handler-Safety: Safe. 87 /// @throws Nothing. 88 template <class T> frame(T * function_addr)89 explicit frame(T* function_addr) BOOST_NOEXCEPT 90 : addr_(boost::stacktrace::detail::void_ptr_cast<native_frame_ptr_t>(function_addr)) 91 {} 92 93 /// @returns Name of the frame (function name in a human readable form). 94 /// 95 /// @b Complexity: unknown (lots of platform specific work). 96 /// 97 /// @b Async-Handler-Safety: Unsafe. 98 /// @throws std::bad_alloc if not enough memory to construct resulting string. 99 BOOST_STACKTRACE_FUNCTION std::string name() const; 100 101 /// @returns Address of the frame function. 102 /// 103 /// @b Complexity: O(1). 104 /// 105 /// @b Async-Handler-Safety: Safe. 106 /// @throws Nothing. address() const107 BOOST_CONSTEXPR native_frame_ptr_t address() const BOOST_NOEXCEPT { 108 return addr_; 109 } 110 111 /// @returns Path to the source file, were the function of the frame is defined. Returns empty string 112 /// if this->source_line() == 0. 113 /// @throws std::bad_alloc if not enough memory to construct resulting string. 114 /// 115 /// @b Complexity: unknown (lots of platform specific work). 116 /// 117 /// @b Async-Handler-Safety: Unsafe. 118 BOOST_STACKTRACE_FUNCTION std::string source_file() const; 119 120 /// @returns Code line in the source file, were the function of the frame is defined. 121 /// @throws std::bad_alloc if not enough memory to construct string for internal needs. 122 /// 123 /// @b Complexity: unknown (lots of platform specific work). 124 /// 125 /// @b Async-Handler-Safety: Unsafe. 126 BOOST_STACKTRACE_FUNCTION std::size_t source_line() const; 127 128 /// @brief Checks that frame is not references NULL address. 129 /// @returns `true` if `this->address() != 0` 130 /// 131 /// @b Complexity: O(1) 132 /// 133 /// @b Async-Handler-Safety: Safe. BOOST_EXPLICIT_OPERATOR_BOOL()134 BOOST_EXPLICIT_OPERATOR_BOOL() 135 136 /// @brief Checks that frame references NULL address. 137 /// @returns `true` if `this->address() == 0` 138 /// 139 /// @b Complexity: O(1) 140 /// 141 /// @b Async-Handler-Safety: Safe. 142 BOOST_CONSTEXPR bool empty() const BOOST_NOEXCEPT { return !address(); } 143 144 /// @cond operator !() const145 BOOST_CONSTEXPR bool operator!() const BOOST_NOEXCEPT { return !address(); } 146 /// @endcond 147 }; 148 149 150 namespace detail { 151 BOOST_STACKTRACE_FUNCTION std::string to_string(const frame* frames, std::size_t size); 152 } // namespace detail 153 154 }} // namespace boost::stacktrace 155 156 157 #include <boost/stacktrace/detail/pop_options.h> 158 159 #endif // BOOST_STACKTRACE_DETAIL_FRAME_DECL_HPP 160