summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibJS/Bytecode/Instruction.h
blob: 58139ffd4b2d54e9cb3106f1a50ceece4aee3bea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
 * 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(IteratorToArray)                  \
    O(NewString)                        \
    O(NewObject)                        \
    O(NewRegExp)                        \
    O(CopyObjectExcludingProperties)    \
    O(GetVariable)                      \
    O(SetVariable)                      \
    O(PutById)                          \
    O(GetById)                          \
    O(PutByValue)                       \
    O(GetByValue)                       \
    O(Jump)                             \
    O(JumpConditional)                  \
    O(JumpNullish)                      \
    O(JumpUndefined)                    \
    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(PushDeclarativeEnvironmentRecord) \
    O(LoadArgument)                     \
    O(EnterUnwindContext)               \
    O(LeaveUnwindContext)               \
    O(ContinuePendingUnwind)            \
    O(Yield)                            \
    O(GetIterator)                      \
    O(IteratorNext)                     \
    O(IteratorResultDone)               \
    O(IteratorResultValue)

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 {};
};
}