From 8b449214aff2f5a9ee17f42bb0a6049f2173aba0 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 3 Jun 2021 12:43:38 +0200 Subject: [PATCH] LibJS: Optimize insertion order in the Exception constructor By inserting the stack frames in the correct order we can improve the runtime for the test-js test suite by about 20%. --- Userland/Libraries/LibJS/Runtime/Exception.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/Exception.cpp b/Userland/Libraries/LibJS/Runtime/Exception.cpp index fa59a07e54..a3fd15a1f2 100644 --- a/Userland/Libraries/LibJS/Runtime/Exception.cpp +++ b/Userland/Libraries/LibJS/Runtime/Exception.cpp @@ -18,18 +18,18 @@ Exception::Exception(Value value) { auto& vm = this->vm(); m_traceback.ensure_capacity(vm.call_stack().size()); - for (auto* call_frame : vm.call_stack()) { + for (ssize_t i = vm.call_stack().size() - 1; i >= 0; i--) { + auto* call_frame = vm.call_stack()[i]; auto function_name = call_frame->function_name; if (function_name.is_empty()) function_name = ""; - m_traceback.prepend({ - .function_name = move(function_name), + m_traceback.empend( + move(function_name), // We might not have an AST node associated with the call frame, e.g. in promise // reaction jobs (which aren't called anywhere from the source code). // They're not going to generate any _unhandled_ exceptions though, so a meaningless // source range is fine. - .source_range = call_frame->current_node ? call_frame->current_node->source_range() : SourceRange {}, - }); + call_frame->current_node ? call_frame->current_node->source_range() : SourceRange {}); } }