mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2026-06-18 15:52:21 +00:00
Add a ref-counted decoded bytecode cache backing so bytecode cache materialization can create fresh script or module records from a shared decoded sidecar without passing around one-shot raw blob ownership. Keep that backing in ExecutableBacking for records materialized from bytecode cache sidecars, so the immutable decoded data stays alive for as long as the installed record needs it. Cover the shared backing path with a bytecode-cache test that materializes and runs two scripts from one decoded backing.
58 lines
2.3 KiB
C++
58 lines
2.3 KiB
C++
/*
|
|
* Copyright (c) 2021, Andreas Kling <andreas@ladybird.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibJS/Script.h>
|
|
#include <LibWeb/Export.h>
|
|
#include <LibWeb/Forward.h>
|
|
#include <LibWeb/HTML/Scripting/Script.h>
|
|
|
|
namespace Web::HTML {
|
|
|
|
// https://html.spec.whatwg.org/multipage/webappapis.html#classic-script
|
|
class WEB_API ClassicScript final : public Script {
|
|
GC_CELL(ClassicScript, Script);
|
|
GC_DECLARE_ALLOCATOR(ClassicScript);
|
|
|
|
public:
|
|
virtual ~ClassicScript() override;
|
|
|
|
enum class MutedErrors {
|
|
No,
|
|
Yes,
|
|
};
|
|
static GC::Ref<ClassicScript> create(ByteString filename, StringView source, EnvironmentSettingsObject&, URL::URL base_url, size_t source_line_number = 1, MutedErrors = MutedErrors::No);
|
|
static GC::Ref<ClassicScript> create_from_pre_parsed(ByteString filename, NonnullRefPtr<JS::SourceCode const> source_code, EnvironmentSettingsObject&, URL::URL base_url, JS::FFI::ParsedProgram* parsed, MutedErrors = MutedErrors::No);
|
|
static GC::Ref<ClassicScript> create_from_pre_compiled(ByteString filename, NonnullRefPtr<JS::SourceCode const> source_code, EnvironmentSettingsObject&, URL::URL base_url, JS::FFI::CompiledProgram* compiled, MutedErrors = MutedErrors::No);
|
|
static GC::Ref<ClassicScript> create_from_bytecode_cache(ByteString filename, NonnullRefPtr<JS::SourceCode const> source_code, EnvironmentSettingsObject&, URL::URL base_url, NonnullRefPtr<JS::RustIntegration::DecodedBytecodeCache>, MutedErrors = MutedErrors::No);
|
|
|
|
JS::Script* script_record() { return m_script_record; }
|
|
JS::Script const* script_record() const { return m_script_record; }
|
|
|
|
enum class RethrowErrors {
|
|
No,
|
|
Yes,
|
|
};
|
|
JS::Completion run(RethrowErrors = RethrowErrors::No, GC::Ptr<JS::Environment> lexical_environment_override = {});
|
|
|
|
MutedErrors muted_errors() const { return m_muted_errors; }
|
|
|
|
private:
|
|
ClassicScript(URL::URL base_url, ByteString filename, EnvironmentSettingsObject&);
|
|
|
|
virtual bool is_classic_script() const final { return true; }
|
|
|
|
virtual void visit_edges(Cell::Visitor&) override;
|
|
|
|
GC::Ptr<JS::Script> m_script_record;
|
|
MutedErrors m_muted_errors { MutedErrors::No };
|
|
};
|
|
|
|
}
|
|
|
|
template<>
|
|
inline bool JS::Script::HostDefined::fast_is<Web::HTML::ClassicScript>() const { return is_classic_script(); }
|