Produce JS-visible string results as UTF-16 at their source, including numeric formatting, BigInt and BigFraction formatting, URI encoding, console formatting, parser errors, regular expression errors, Intl and Temporal records, LibUnicode locale boundaries, and LibWeb bindings. Handle fractional radix formatting through the UTF-16 builder view.
65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
# Copyright (c) 2026-present, the Ladybird developers.
|
|
#
|
|
# SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
|
|
from typing import TextIO
|
|
|
|
from Generators.libweb_bindings.constants import define_the_constants
|
|
from Generators.libweb_bindings.context import GenerationContext
|
|
from Generators.libweb_bindings.includes import GeneratedIncludes
|
|
from Utils.webidl_parser import Interface
|
|
|
|
|
|
def write_callback_interface_declaration(
|
|
out: TextIO, includes: GeneratedIncludes, context: GenerationContext, interface: Interface
|
|
) -> None:
|
|
if not interface.constants:
|
|
return
|
|
|
|
includes.add("LibJS/Runtime/NativeFunction.h")
|
|
includes.add("LibJS/Runtime/Object.h")
|
|
|
|
out.write(f"""struct {interface.constructor_class} {{
|
|
public:
|
|
static void initialize(JS::Realm&, JS::NativeFunction&);
|
|
}};
|
|
|
|
struct {interface.prototype_class} {{
|
|
public:
|
|
static void initialize(JS::Realm&, JS::Object&);
|
|
}};
|
|
|
|
""")
|
|
|
|
|
|
def write_callback_interface_implementation(
|
|
out: TextIO, context: GenerationContext, includes: GeneratedIncludes, interface: Interface
|
|
) -> None:
|
|
if not interface.constants:
|
|
return
|
|
|
|
includes.add("LibJS/Runtime/Realm.h")
|
|
includes.add("LibJS/Runtime/ValueInlines.h")
|
|
includes.add("LibJS/Runtime/VM.h")
|
|
includes.add_binding(interface.implemented_name)
|
|
|
|
out.write(f"""void {interface.constructor_class}::initialize(JS::Realm& realm, JS::NativeFunction& object)
|
|
{{
|
|
auto& vm = realm.vm();
|
|
[[maybe_unused]] u8 default_attributes = JS::Attribute::Enumerable;
|
|
|
|
object.define_direct_property(vm.names.length, JS::Value(0), JS::Attribute::Configurable);
|
|
object.define_direct_property(vm.names.name, JS::PrimitiveString::create(vm, "{interface.name}"_utf16), JS::Attribute::Configurable);
|
|
""")
|
|
define_the_constants(out, context, includes, interface)
|
|
out.write(
|
|
f"""}}
|
|
|
|
void {interface.prototype_class}::initialize(JS::Realm& realm, JS::Object& object)
|
|
{{
|
|
object.set_prototype(realm.intrinsics().object_prototype());
|
|
}}
|
|
|
|
"""
|
|
)
|