diff options
author | Andreas Kling <kling@serenityos.org> | 2021-06-03 10:46:30 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-06-07 18:11:59 +0200 |
commit | 69dddd4ef58e51fb0db881b3b6801492b5f86285 (patch) | |
tree | 48d9f883a18b820e96551fcfe566b7bbbc12fa84 /Userland/Libraries/LibJS/Bytecode/Op.cpp | |
parent | f9395efaac11550d46ce6f73753e0cafc4519c57 (diff) | |
download | serenity-69dddd4ef58e51fb0db881b3b6801492b5f86285.zip |
LibJS: Start fleshing out a bytecode for the JavaScript engine :^)
This patch begins the work of implementing JavaScript execution in a
bytecode VM instead of an AST tree-walk interpreter.
It's probably quite naive, but we have to start somewhere.
The basic idea is that you call Bytecode::Generator::generate() on an
AST node and it hands you back a Bytecode::Block filled with
instructions that can then be interpreted by a Bytecode::Interpreter.
This first version only implements two instructions: Load and Add. :^)
Each bytecode block has infinity registers, and the interpreter resizes
its register file to fit the block being executed.
Two new `js` options are added in this patch as well:
`-d` will dump the generated bytecode
`-b` will execute the generated bytecode
Note that unless `-d` and/or `-b` are specified, none of the bytecode
related stuff in LibJS runs at all. This is implemented in parallel
with the existing AST interpreter. :^)
Diffstat (limited to 'Userland/Libraries/LibJS/Bytecode/Op.cpp')
-rw-r--r-- | Userland/Libraries/LibJS/Bytecode/Op.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp new file mode 100644 index 0000000000..52564e6be8 --- /dev/null +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <LibJS/Bytecode/Interpreter.h> +#include <LibJS/Bytecode/Op.h> +#include <LibJS/Runtime/Value.h> + +namespace JS::Bytecode::Op { + +void Load::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = m_value; +} + +void Add::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = add(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); +} + +String Load::to_string() const +{ + return String::formatted("Load dst:r{}, value:{}", m_dst.index(), m_value.to_string_without_side_effects()); +} + +String Add::to_string() const +{ + return String::formatted("Add dst:r{}, src1:r{}, src2:r{}", m_dst.index(), m_src1.index(), m_src2.index()); +} + +} |