mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 18:18:12 +00:00
LibJS: Make Bytecode::Executable GC-allocated
This is a step towards making ExecutionContext easier to allocate.
This commit is contained in:
parent
ece961f882
commit
ecfcc9aef3
13 changed files with 34 additions and 19 deletions
|
@ -13,6 +13,8 @@
|
|||
|
||||
namespace JS::Bytecode {
|
||||
|
||||
JS_DEFINE_ALLOCATOR(Executable);
|
||||
|
||||
Executable::Executable(
|
||||
NonnullOwnPtr<IdentifierTable> identifier_table,
|
||||
NonnullOwnPtr<StringTable> string_table,
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
#include <LibJS/Bytecode/Label.h>
|
||||
#include <LibJS/Bytecode/StringTable.h>
|
||||
#include <LibJS/Forward.h>
|
||||
#include <LibJS/Heap/Cell.h>
|
||||
#include <LibJS/Heap/CellAllocator.h>
|
||||
#include <LibJS/Runtime/EnvironmentCoordinate.h>
|
||||
|
||||
namespace JS::JIT {
|
||||
|
@ -46,7 +48,10 @@ struct SourceRecord {
|
|||
u32 source_end_offset {};
|
||||
};
|
||||
|
||||
class Executable final : public RefCounted<Executable> {
|
||||
class Executable final : public Cell {
|
||||
JS_CELL(Executable, Cell);
|
||||
JS_DECLARE_ALLOCATOR(Executable);
|
||||
|
||||
public:
|
||||
Executable(
|
||||
NonnullOwnPtr<IdentifierTable>,
|
||||
|
@ -60,7 +65,7 @@ public:
|
|||
Vector<NonnullOwnPtr<BasicBlock>>,
|
||||
bool is_strict_mode);
|
||||
|
||||
~Executable();
|
||||
virtual ~Executable() override;
|
||||
|
||||
DeprecatedFlyString name;
|
||||
Vector<PropertyLookupCache> property_lookup_caches;
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <LibJS/Bytecode/Instruction.h>
|
||||
#include <LibJS/Bytecode/Op.h>
|
||||
#include <LibJS/Bytecode/Register.h>
|
||||
#include <LibJS/Runtime/VM.h>
|
||||
|
||||
namespace JS::Bytecode {
|
||||
|
||||
|
@ -21,7 +22,7 @@ Generator::Generator()
|
|||
{
|
||||
}
|
||||
|
||||
CodeGenerationErrorOr<NonnullRefPtr<Executable>> Generator::generate(ASTNode const& node, FunctionKind enclosing_function_kind)
|
||||
CodeGenerationErrorOr<NonnullGCPtr<Executable>> Generator::generate(VM& vm, ASTNode const& node, FunctionKind enclosing_function_kind)
|
||||
{
|
||||
Generator generator;
|
||||
generator.switch_to_basic_block(generator.make_block());
|
||||
|
@ -57,7 +58,7 @@ CodeGenerationErrorOr<NonnullRefPtr<Executable>> Generator::generate(ASTNode con
|
|||
else if (is<FunctionExpression>(node))
|
||||
is_strict_mode = static_cast<FunctionExpression const&>(node).is_strict_mode();
|
||||
|
||||
auto executable = adopt_ref(*new Executable(
|
||||
auto executable = vm.heap().allocate_without_realm<Executable>(
|
||||
move(generator.m_identifier_table),
|
||||
move(generator.m_string_table),
|
||||
move(generator.m_regex_table),
|
||||
|
@ -67,7 +68,7 @@ CodeGenerationErrorOr<NonnullRefPtr<Executable>> Generator::generate(ASTNode con
|
|||
generator.m_next_environment_variable_cache,
|
||||
generator.m_next_register,
|
||||
move(generator.m_root_basic_blocks),
|
||||
is_strict_mode));
|
||||
is_strict_mode);
|
||||
|
||||
return executable;
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ public:
|
|||
Function,
|
||||
Block,
|
||||
};
|
||||
static CodeGenerationErrorOr<NonnullRefPtr<Executable>> generate(ASTNode const&, FunctionKind = FunctionKind::Normal);
|
||||
static CodeGenerationErrorOr<NonnullGCPtr<Executable>> generate(VM&, ASTNode const&, FunctionKind = FunctionKind::Normal);
|
||||
|
||||
Register allocate_register();
|
||||
|
||||
|
|
|
@ -187,7 +187,7 @@ private:
|
|||
u8 const* m_begin { nullptr };
|
||||
u8 const* m_end { nullptr };
|
||||
u8 const* m_ptr { nullptr };
|
||||
RefPtr<Executable const> m_executable;
|
||||
GCPtr<Executable const> m_executable;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -105,7 +105,7 @@ ThrowCompletionOr<Value> Interpreter::run(Script& script_record, JS::GCPtr<Envir
|
|||
|
||||
// 13. If result.[[Type]] is normal, then
|
||||
if (result.type() == Completion::Type::Normal) {
|
||||
auto executable_result = JS::Bytecode::Generator::generate(script);
|
||||
auto executable_result = JS::Bytecode::Generator::generate(vm, script);
|
||||
|
||||
if (executable_result.is_error()) {
|
||||
if (auto error_string = executable_result.error().to_string(); error_string.is_error())
|
||||
|
@ -451,9 +451,9 @@ void Interpreter::enter_object_environment(Object& object)
|
|||
vm().running_execution_context().lexical_environment = new_object_environment(object, true, old_environment);
|
||||
}
|
||||
|
||||
ThrowCompletionOr<NonnullRefPtr<Bytecode::Executable>> compile(VM& vm, ASTNode const& node, FunctionKind kind, DeprecatedFlyString const& name)
|
||||
ThrowCompletionOr<NonnullGCPtr<Bytecode::Executable>> compile(VM& vm, ASTNode const& node, FunctionKind kind, DeprecatedFlyString const& name)
|
||||
{
|
||||
auto executable_result = Bytecode::Generator::generate(node, kind);
|
||||
auto executable_result = Bytecode::Generator::generate(vm, node, kind);
|
||||
if (executable_result.is_error())
|
||||
return vm.throw_completion<InternalError>(ErrorType::NotImplemented, TRY_OR_THROW_OOM(vm, executable_result.error().to_string()));
|
||||
|
||||
|
|
|
@ -115,6 +115,6 @@ private:
|
|||
|
||||
extern bool g_dump_bytecode;
|
||||
|
||||
ThrowCompletionOr<NonnullRefPtr<Bytecode::Executable>> compile(VM&, ASTNode const& no, JS::FunctionKind kind, DeprecatedFlyString const& name);
|
||||
ThrowCompletionOr<NonnullGCPtr<Bytecode::Executable>> compile(VM&, ASTNode const& no, JS::FunctionKind kind, DeprecatedFlyString const& name);
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue