mirror of
https://github.com/SerenityOS/serenity
synced 2026-05-13 18:37:37 +02:00
Instead of one stack to hold frames, labels, and values, there is now three separate stacks. This speeds up fib(30) from 580ms to 480ms. (cherry picked from commit a3b077c6415e0f4038b8c8da1e1e9c9cc2df5f0a)
77 lines
2.3 KiB
C++
77 lines
2.3 KiB
C++
/*
|
|
* Copyright (c) 2021, Ali Mohammad Pur <mpfard@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibWasm/AbstractMachine/AbstractMachine.h>
|
|
|
|
namespace Wasm {
|
|
|
|
class Configuration {
|
|
public:
|
|
explicit Configuration(Store& store)
|
|
: m_store(store)
|
|
{
|
|
}
|
|
|
|
void set_frame(Frame frame)
|
|
{
|
|
Label label(frame.arity(), frame.expression().instructions().size(), m_value_stack.size());
|
|
frame.label_index() = m_label_stack.size();
|
|
m_frame_stack.append(move(frame));
|
|
m_label_stack.append(label);
|
|
}
|
|
ALWAYS_INLINE auto& frame() const { return m_frame_stack.last(); }
|
|
ALWAYS_INLINE auto& frame() { return m_frame_stack.last(); }
|
|
ALWAYS_INLINE auto& ip() const { return m_ip; }
|
|
ALWAYS_INLINE auto& ip() { return m_ip; }
|
|
ALWAYS_INLINE auto& depth() const { return m_depth; }
|
|
ALWAYS_INLINE auto& depth() { return m_depth; }
|
|
ALWAYS_INLINE auto& value_stack() const { return m_value_stack; }
|
|
ALWAYS_INLINE auto& value_stack() { return m_value_stack; }
|
|
ALWAYS_INLINE auto& label_stack() const { return m_label_stack; }
|
|
ALWAYS_INLINE auto& label_stack() { return m_label_stack; }
|
|
ALWAYS_INLINE auto& store() const { return m_store; }
|
|
ALWAYS_INLINE auto& store() { return m_store; }
|
|
|
|
struct CallFrameHandle {
|
|
explicit CallFrameHandle(Configuration& configuration)
|
|
: ip(configuration.ip())
|
|
, configuration(configuration)
|
|
{
|
|
configuration.depth()++;
|
|
}
|
|
|
|
~CallFrameHandle()
|
|
{
|
|
configuration.unwind({}, *this);
|
|
}
|
|
|
|
InstructionPointer ip { 0 };
|
|
Configuration& configuration;
|
|
};
|
|
|
|
void unwind(Badge<CallFrameHandle>, CallFrameHandle const&);
|
|
Result call(Interpreter&, FunctionAddress, Vector<Value> arguments);
|
|
Result execute(Interpreter&);
|
|
|
|
void enable_instruction_count_limit() { m_should_limit_instruction_count = true; }
|
|
bool should_limit_instruction_count() const { return m_should_limit_instruction_count; }
|
|
|
|
void dump_stack();
|
|
|
|
private:
|
|
Store& m_store;
|
|
Vector<Value> m_value_stack;
|
|
Vector<Label> m_label_stack;
|
|
Vector<Frame> m_frame_stack;
|
|
size_t m_depth { 0 };
|
|
InstructionPointer m_ip;
|
|
bool m_should_limit_instruction_count { false };
|
|
};
|
|
|
|
}
|