mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-21 02:08:12 +03:00
1414c7b049
This commit adds a bunch of passes, the most interesting of which is a pass that merges blocks together, and a pass that places blocks that flow into each other next to each other, and a very simply pass that removes duplicate basic blocks. Note that this does not remove the jump at the end of each block in that pass to avoid scope creep in the passes.
102 lines
2.8 KiB
C++
102 lines
2.8 KiB
C++
/*
|
|
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Forward.h>
|
|
#include <LibJS/Forward.h>
|
|
|
|
#define ENUMERATE_BYTECODE_OPS(O) \
|
|
O(Load) \
|
|
O(LoadImmediate) \
|
|
O(Store) \
|
|
O(Add) \
|
|
O(Sub) \
|
|
O(Mul) \
|
|
O(Div) \
|
|
O(Mod) \
|
|
O(Exp) \
|
|
O(GreaterThan) \
|
|
O(GreaterThanEquals) \
|
|
O(LessThan) \
|
|
O(LessThanEquals) \
|
|
O(AbstractInequals) \
|
|
O(AbstractEquals) \
|
|
O(TypedInequals) \
|
|
O(TypedEquals) \
|
|
O(NewBigInt) \
|
|
O(NewArray) \
|
|
O(NewString) \
|
|
O(NewObject) \
|
|
O(GetVariable) \
|
|
O(SetVariable) \
|
|
O(PutById) \
|
|
O(GetById) \
|
|
O(PutByValue) \
|
|
O(GetByValue) \
|
|
O(Jump) \
|
|
O(JumpConditional) \
|
|
O(JumpNullish) \
|
|
O(Call) \
|
|
O(NewFunction) \
|
|
O(Return) \
|
|
O(BitwiseAnd) \
|
|
O(BitwiseOr) \
|
|
O(BitwiseXor) \
|
|
O(BitwiseNot) \
|
|
O(Not) \
|
|
O(UnaryPlus) \
|
|
O(UnaryMinus) \
|
|
O(Typeof) \
|
|
O(LeftShift) \
|
|
O(RightShift) \
|
|
O(UnsignedRightShift) \
|
|
O(In) \
|
|
O(InstanceOf) \
|
|
O(ConcatString) \
|
|
O(Increment) \
|
|
O(Decrement) \
|
|
O(Throw) \
|
|
O(PushLexicalEnvironment) \
|
|
O(LoadArgument) \
|
|
O(EnterUnwindContext) \
|
|
O(LeaveUnwindContext) \
|
|
O(ContinuePendingUnwind) \
|
|
O(Yield)
|
|
|
|
namespace JS::Bytecode {
|
|
|
|
class Instruction {
|
|
public:
|
|
constexpr static bool IsTerminator = false;
|
|
|
|
enum class Type {
|
|
#define __BYTECODE_OP(op) \
|
|
op,
|
|
ENUMERATE_BYTECODE_OPS(__BYTECODE_OP)
|
|
#undef __BYTECODE_OP
|
|
};
|
|
|
|
bool is_terminator() const;
|
|
Type type() const { return m_type; }
|
|
size_t length() const;
|
|
String to_string(Bytecode::Executable const&) const;
|
|
void execute(Bytecode::Interpreter&) const;
|
|
void replace_references(BasicBlock const&, BasicBlock const&);
|
|
static void destroy(Instruction&);
|
|
|
|
protected:
|
|
explicit Instruction(Type type)
|
|
: m_type(type)
|
|
{
|
|
}
|
|
|
|
private:
|
|
Type m_type {};
|
|
};
|
|
|
|
}
|