mirror of
https://github.com/RGBCube/serenity
synced 2025-05-28 10:55:06 +00:00
LibJS: Lazily collect stack trace information
The previous implementation was calling `backtrace()` for every function call, which is quite slow. Instead, this implementation provides VM::stack_trace() which unwinds the native stack, maps it through NativeExecutable::get_source_range and combines it with source ranges from interpreted call frames.
This commit is contained in:
parent
77dc7c4d36
commit
68f4d21de2
11 changed files with 96 additions and 46 deletions
|
@ -56,13 +56,6 @@ void Interpreter::visit_edges(Cell::Visitor& visitor)
|
|||
}
|
||||
}
|
||||
|
||||
Optional<InstructionStreamIterator const&> Interpreter::instruction_stream_iterator() const
|
||||
{
|
||||
if (m_current_executable && m_current_executable->native_executable())
|
||||
return m_current_executable->native_executable()->instruction_stream_iterator(*m_current_executable);
|
||||
return m_pc;
|
||||
}
|
||||
|
||||
// 16.1.6 ScriptEvaluation ( scriptRecord ), https://tc39.es/ecma262/#sec-runtime-semantics-scriptevaluation
|
||||
ThrowCompletionOr<Value> Interpreter::run(Script& script_record, JS::GCPtr<Environment> lexical_environment_override)
|
||||
{
|
||||
|
@ -371,6 +364,8 @@ Interpreter::ValueAndFrame Interpreter::run_and_return_frame(Executable& executa
|
|||
else
|
||||
push_call_frame(make<CallFrame>(), executable.number_of_registers);
|
||||
|
||||
vm().execution_context_stack().last()->executable = &executable;
|
||||
|
||||
if (auto native_executable = executable.get_or_create_native_executable()) {
|
||||
native_executable->run(vm());
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue