diff --git a/Libraries/LibJS/Runtime/Exception.cpp b/Libraries/LibJS/Runtime/Exception.cpp index a11116a602..99f7fbd789 100644 --- a/Libraries/LibJS/Runtime/Exception.cpp +++ b/Libraries/LibJS/Runtime/Exception.cpp @@ -24,6 +24,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include namespace JS { @@ -31,6 +32,13 @@ namespace JS { Exception::Exception(Value value) : m_value(value) { + auto call_stack = interpreter().call_stack(); + for (ssize_t i = call_stack.size() - 1; i >= 0; --i) { + auto function_name = call_stack[i].function_name; + if (function_name.is_empty()) + function_name = ""; + m_trace.append(function_name); + } } Exception::~Exception() diff --git a/Libraries/LibJS/Runtime/Exception.h b/Libraries/LibJS/Runtime/Exception.h index 00201585bb..2d9f23d01a 100644 --- a/Libraries/LibJS/Runtime/Exception.h +++ b/Libraries/LibJS/Runtime/Exception.h @@ -37,12 +37,14 @@ public: virtual ~Exception() override; Value value() const { return m_value; } + const Vector& trace() const { return m_trace; } private: virtual const char* class_name() const override { return "Exception"; } virtual void visit_children(Visitor&) override; Value m_value; + Vector m_trace; }; }