mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-05-12 01:46:46 +02:00
Split Rust program compilation so code generation and assembly finish before the main thread materializes GC-backed executable objects. The new CompiledProgram handle owns the parsed program, generator state, and bytecode until C++ consumes it on the main thread. Wire WebContent script fetching through that handle for classic scripts and modules. Syntax-error paths still return ParsedProgram, so existing error reporting stays in place. Successful fetches now do top-level codegen on the thread pool before deferred_invoke hands control back to the main thread. Executable creation, SharedFunctionInstanceData materialization, module metadata extraction, and declaration data extraction still run on the main thread where VM and GC access is valid.
58 lines
2.0 KiB
C++
58 lines
2.0 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);
|
|
|
|
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(); }
|