#
# Copyright (C) 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
# Copyright (C) 2006 Anders Carlsson <andersca@mac.com>
# Copyright (C) 2006, 2007 Samuel Weinig <sam@webkit.org>
# Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org>
# Copyright (C) 2006-2021 Apple Inc. All rights reserved.
# Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au>
# Copyright (C) Research In Motion Limited 2010. All rights reserved.
# Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
# Copyright (C) 2011 Patrick Gansterer <paroga@webkit.org>
# Copyright (C) 2012 Ericsson AB. All rights reserved.
# Copyright (C) 2007, 2008, 2009, 2012 Google Inc.
# Copyright (C) 2013 Samsung Electronics. All rights reserved.
# Copyright (C) 2015, 2016 Canon Inc. All rights reserved.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public License
# along with this library; see the file COPYING.LIB.  If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.


package CodeGeneratorJS;

use strict;
use constant FileNamePrefix => "JS";
use Carp qw<longmess>;
use Data::Dumper;
use Hasher;

my $codeGenerator;
my $writeDependencies;

my @headerContentHeader = ();
my @headerContent = ();
my %headerIncludes = ();
my %headerTrailingIncludes = ();

my @implContentHeader = ();
my @implContent = ();
my %implIncludes = ();
my @depsContent = ();
my $numCachedAttributes = 0;

my $beginAppleCopyrightForHeaderFiles = <<END;
// ------- Begin Apple Copyright -------
/*
 * Copyright (C) 2008 Apple Inc. All rights reserved.
 *
 * Permission is granted by Apple to use this file to the extent
 * necessary to relink with LGPL WebKit files.
 *
 * No license or rights are granted by Apple expressly or by
 * implication, estoppel, or otherwise, to Apple patents and
 * trademarks. For the sake of clarity, no license or rights are
 * granted by Apple expressly or by implication, estoppel, or otherwise,
 * under any Apple patents, copyrights and trademarks to underlying
 * implementations of any application programming interfaces (APIs)
 * or to any functionality that is invoked by calling any API.
 */

END
my $beginAppleCopyrightForSourceFiles = <<END;
// ------- Begin Apple Copyright -------
/*
 * Copyright (C) 2008 Apple Inc. All rights reserved.
 *
 * No license or rights are granted by Apple expressly or by implication,
 * estoppel, or otherwise, to Apple copyrights, patents, trademarks, trade
 * secrets or other rights.
 */

END
my $endAppleCopyright   = <<END;
// ------- End Apple Copyright   -------

END

# Default .h template
my $headerTemplate = << "EOF";
/*
    This file is part of the WebKit open source project.
    This file has been generated by generate-bindings.pl. DO NOT MODIFY!

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/
EOF

sub assert
{
    my $message = shift;

    my $mess = longmess();
    print Dumper($mess);

    die $message;
}

# Default constructor
sub new
{
    my $object = shift;
    my $reference = { };

    $codeGenerator = shift;
    $writeDependencies = shift;

    bless($reference, $object);
    return $reference;
}

sub GenerateEnumeration
{
    my ($object, $enumeration) = @_;

    my $className = GetEnumerationClassName($enumeration->type);
    $object->GenerateEnumerationHeader($enumeration, $className);
    $object->GenerateEnumerationImplementation($enumeration, $className);
}

sub GenerateDictionary
{
    my ($object, $dictionary, $enumerations, $otherDictionaries) = @_;

    my $className = GetDictionaryClassName($dictionary->type);
    $object->GenerateDictionaryHeader($dictionary, $className, $enumerations, $otherDictionaries);
    $object->GenerateDictionaryImplementation($dictionary, $className, $enumerations, $otherDictionaries);
}

sub GenerateCallbackFunction
{
    my ($object, $callbackFunction, $enumerations, $dictionaries) = @_;

    $object->GenerateCallbackFunctionHeader($callbackFunction, $enumerations, $dictionaries);
    $object->GenerateCallbackFunctionImplementation($callbackFunction, $enumerations, $dictionaries);
}

sub GenerateInterface
{
    my ($object, $interface, $defines, $enumerations, $dictionaries) = @_;

    $codeGenerator->LinkOverloadedOperations($interface);

    AddIterableOperationIfNeeded($interface);
    AddMapLikeAttributesAndOperationIfNeeded($interface);
    AddSetLikeAttributesAndOperationIfNeeded($interface);
    AddStringifierOperationIfNeeded($interface);
    AddSharedSyntheticAttributesIfNeeded($interface);

    if ($interface->isCallback) {
        $object->GenerateCallbackInterfaceHeader($interface, $enumerations, $dictionaries);
        $object->GenerateCallbackInterfaceImplementation($interface, $enumerations, $dictionaries);
    } else {
        $object->GenerateHeader($interface, $enumerations, $dictionaries);
        $object->GenerateImplementation($interface, $enumerations, $dictionaries);
    }
}

sub AddIterableOperationIfNeeded
{
    my $interface = shift;

    return unless $interface->iterable;

    $interface->iterable->extendedAttributes->{FromIterable} = 1;

    my $symbolIteratorOperation = IDLOperation->new();
    $symbolIteratorOperation->name("[Symbol.Iterator]");
    IDLParser::copyExtendedAttributes($symbolIteratorOperation->extendedAttributes, $interface->iterable->extendedAttributes);
    push(@{$interface->iterable->operations}, $symbolIteratorOperation);
    push(@{$interface->operations}, $symbolIteratorOperation) if IsKeyValueIterableInterface($interface);

    my $entriesOperation = IDLOperation->new();
    $entriesOperation->name("entries");
    IDLParser::copyExtendedAttributes($entriesOperation->extendedAttributes, $interface->iterable->extendedAttributes);
    push(@{$interface->iterable->operations}, $entriesOperation);
    push(@{$interface->operations}, $entriesOperation) if IsKeyValueIterableInterface($interface);

    my $keysOperation = IDLOperation->new();
    $keysOperation->name("keys");
    IDLParser::copyExtendedAttributes($keysOperation->extendedAttributes, $interface->iterable->extendedAttributes);
    push(@{$interface->iterable->operations}, $keysOperation);
    push(@{$interface->operations}, $keysOperation) if IsKeyValueIterableInterface($interface);

    my $valuesOperation = IDLOperation->new();
    $valuesOperation->name("values");
    IDLParser::copyExtendedAttributes($valuesOperation->extendedAttributes, $interface->iterable->extendedAttributes);
    push(@{$interface->iterable->operations}, $valuesOperation);
    push(@{$interface->operations}, $valuesOperation) if IsKeyValueIterableInterface($interface);

    my $forEachOperation = IDLOperation->new();
    $forEachOperation->name("forEach");
    my $forEachArgument = IDLArgument->new();
    $forEachArgument->name("callback");
    $forEachArgument->type(IDLParser::makeSimpleType("any"));
    push(@{$forEachOperation->arguments}, ($forEachArgument));
    IDLParser::copyExtendedAttributes($forEachOperation->extendedAttributes, $interface->iterable->extendedAttributes);
    push(@{$interface->iterable->operations}, $forEachOperation);
    push(@{$interface->operations}, $forEachOperation) if IsKeyValueIterableInterface($interface);
}

sub AddMapLikeAttributesAndOperationIfNeeded
{
    my $interface = shift;

    return unless $interface->mapLike;

    $interface->mapLike->extendedAttributes->{ForwardToMapLike} = 1;

    # https://webidl.spec.whatwg.org/#es-map-size
    my $sizeAttribute = IDLAttribute->new();
    $sizeAttribute->name("size");
    $sizeAttribute->isReadOnly(1);
    $sizeAttribute->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($sizeAttribute->extendedAttributes, $interface->mapLike->extendedAttributes);
    $sizeAttribute->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->attributes}, $sizeAttribute);

    # https://webidl.spec.whatwg.org/#es-map-get-has
    my $getOperation = IDLOperation->new();
    $getOperation->name("get");
    my $getArgument = IDLArgument->new();
    $getArgument->name("key");
    $getArgument->type(IDLParser::cloneType($interface->mapLike->keyType));
    push(@{$getOperation->arguments}, ($getArgument));
    $getOperation->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($getOperation->extendedAttributes, $interface->mapLike->extendedAttributes);
    $getOperation->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->operations}, $getOperation);

    my $hasOperation = IDLOperation->new();
    $hasOperation->name("has");
    my $hasArgument = IDLArgument->new();
    $hasArgument->name("key");
    $hasArgument->type(IDLParser::cloneType($interface->mapLike->keyType));
    push(@{$hasOperation->arguments}, ($hasArgument));
    $hasOperation->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($hasOperation->extendedAttributes, $interface->mapLike->extendedAttributes);
    $hasOperation->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->operations}, $hasOperation);

    # https://webidl.spec.whatwg.org/#es-map-entries
    my $entriesOperation = IDLOperation->new();
    $entriesOperation->name("entries");
    $entriesOperation->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($entriesOperation->extendedAttributes, $interface->mapLike->extendedAttributes);
    $entriesOperation->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->operations}, $entriesOperation);

    # https://webidl.spec.whatwg.org/#es-map-keys-values
    my $keysOperation = IDLOperation->new();
    $keysOperation->name("keys");
    $keysOperation->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($keysOperation->extendedAttributes, $interface->mapLike->extendedAttributes);
    $keysOperation->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->operations}, $keysOperation);

    my $valuesOperation = IDLOperation->new();
    $valuesOperation->name("values");
    $valuesOperation->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($valuesOperation->extendedAttributes, $interface->mapLike->extendedAttributes);
    $valuesOperation->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->operations}, $valuesOperation);

    # https://webidl.spec.whatwg.org/#es-forEach
    my $forEachOperation = IDLOperation->new();
    $forEachOperation->name("forEach");
    $forEachOperation->type(IDLParser::makeSimpleType("any"));
    my $forEachArgument = IDLArgument->new();
    $forEachArgument->name("callback");
    $forEachArgument->type(IDLParser::makeSimpleType("any"));
    push(@{$forEachOperation->arguments}, ($forEachArgument));
    IDLParser::copyExtendedAttributes($forEachOperation->extendedAttributes, $interface->mapLike->extendedAttributes);
    push(@{$interface->operations}, $forEachOperation);

    return if $interface->mapLike->isReadOnly;

    # https://webidl.spec.whatwg.org/#es-map-set
    unless (grep { $_->name eq "set" } (@{$interface->attributes}, @{$interface->operations}, @{$interface->constants})) {
        my $setOperation = IDLOperation->new();
        $setOperation->name("set");
        my $setKeyArgument = IDLArgument->new();
        $setKeyArgument->name("key");
        $setKeyArgument->type(IDLParser::cloneType($interface->mapLike->keyType));
        my $setValueArgument = IDLArgument->new();
        $setValueArgument->name("value");
        $setValueArgument->type(IDLParser::cloneType($interface->mapLike->valueType));
        push(@{$setOperation->arguments}, ($setKeyArgument));
        push(@{$setOperation->arguments}, ($setValueArgument));
        $setOperation->type(IDLParser::makeSimpleType("any"));
        IDLParser::copyExtendedAttributes($setOperation->extendedAttributes, $interface->mapLike->extendedAttributes);
        $setOperation->extendedAttributes->{NotEnumerable} = 1;
        push(@{$interface->operations}, $setOperation);
    }

    # https://webidl.spec.whatwg.org/#es-map-clear
    unless (grep { $_->name eq "clear" } (@{$interface->attributes}, @{$interface->operations}, @{$interface->constants})) {
        my $clearOperation = IDLOperation->new();
        $clearOperation->name("clear");
        $clearOperation->type(IDLParser::makeSimpleType("any"));
        IDLParser::copyExtendedAttributes($clearOperation->extendedAttributes, $interface->mapLike->extendedAttributes);
        $clearOperation->extendedAttributes->{NotEnumerable} = 1;
        push(@{$interface->operations}, $clearOperation);
    }

    # https://webidl.spec.whatwg.org/#es-map-delete
    unless (grep { $_->name eq "delete" } (@{$interface->attributes}, @{$interface->operations}, @{$interface->constants})) {
        my $deleteOperation = IDLOperation->new();
        $deleteOperation->name("delete");
        my $deleteArgument = IDLArgument->new();
        $deleteArgument->name("key");
        $deleteArgument->type(IDLParser::cloneType($interface->mapLike->keyType));
        push(@{$deleteOperation->arguments}, ($deleteArgument));
        $deleteOperation->type(IDLParser::makeSimpleType("any"));
        IDLParser::copyExtendedAttributes($deleteOperation->extendedAttributes, $interface->mapLike->extendedAttributes);
        $deleteOperation->extendedAttributes->{NotEnumerable} = 1;
        push(@{$interface->operations}, $deleteOperation);
    }
}

sub AddSetLikeAttributesAndOperationIfNeeded
{
    my $interface = shift;

    return unless $interface->setLike;

    $interface->setLike->extendedAttributes->{ForwardToSetLike} = 1;

    # https://webidl.spec.whatwg.org/#es-set-size
    my $sizeAttribute = IDLAttribute->new();
    $sizeAttribute->name("size");
    $sizeAttribute->isReadOnly(1);
    $sizeAttribute->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($sizeAttribute->extendedAttributes, $interface->setLike->extendedAttributes);
    $sizeAttribute->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->attributes}, $sizeAttribute);

    # https://webidl.spec.whatwg.org/#es-set-has
    my $hasOperation = IDLOperation->new();
    $hasOperation->name("has");
    my $hasArgument = IDLArgument->new();
    $hasArgument->name("key");
    $hasArgument->type(IDLParser::cloneType($interface->setLike->itemType));
    push(@{$hasOperation->arguments}, ($hasArgument));
    $hasOperation->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($hasOperation->extendedAttributes, $interface->setLike->extendedAttributes);
    $hasOperation->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->operations}, $hasOperation);

    # https://webidl.spec.whatwg.org/#es-set-entries-keys
    my $entriesOperation = IDLOperation->new();
    $entriesOperation->name("entries");
    $entriesOperation->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($entriesOperation->extendedAttributes, $interface->setLike->extendedAttributes);
    $entriesOperation->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->operations}, $entriesOperation);

    my $keysOperation = IDLOperation->new();
    $keysOperation->name("keys");
    $keysOperation->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($keysOperation->extendedAttributes, $interface->setLike->extendedAttributes);
    $keysOperation->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->operations}, $keysOperation);

    # https://webidl.spec.whatwg.org/#es-set-values
    my $valuesOperation = IDLOperation->new();
    $valuesOperation->name("values");
    $valuesOperation->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($valuesOperation->extendedAttributes, $interface->setLike->extendedAttributes);
    $valuesOperation->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->operations}, $valuesOperation);

    # https://webidl.spec.whatwg.org/#es-forEach
    my $forEachOperation = IDLOperation->new();
    $forEachOperation->name("forEach");
    my $forEachArgument = IDLArgument->new();
    $forEachArgument->name("callback");
    $forEachArgument->type(IDLParser::makeSimpleType("any"));
    push(@{$forEachOperation->arguments}, ($forEachArgument));
    $forEachOperation->type(IDLParser::makeSimpleType("any"));
    IDLParser::copyExtendedAttributes($forEachOperation->extendedAttributes, $interface->setLike->extendedAttributes);
    # FIXME: The WebIDL spec says that the forEach operation should be enumerable.
    $forEachOperation->extendedAttributes->{NotEnumerable} = 1;
    push(@{$interface->operations}, $forEachOperation);

    return if $interface->setLike->isReadOnly;

    # https://webidl.spec.whatwg.org/#es-add-delete
    unless (grep { $_->name eq "add" } (@{$interface->attributes}, @{$interface->operations}, @{$interface->constants})) {
        my $addOperation = IDLOperation->new();
        $addOperation->name("add");
        my $addArgument = IDLArgument->new();
        $addArgument->name("key");
        $addArgument->type(IDLParser::cloneType($interface->setLike->itemType));
        push(@{$addOperation->arguments}, ($addArgument));
        $addOperation->type(IDLParser::makeSimpleType("any"));
        IDLParser::copyExtendedAttributes($addOperation->extendedAttributes, $interface->setLike->extendedAttributes);
        $addOperation->extendedAttributes->{NotEnumerable} = 1;
        push(@{$interface->operations}, $addOperation);
    }

    # https://webidl.spec.whatwg.org/#es-set-clear
    unless (grep { $_->name eq "clear" } (@{$interface->attributes}, @{$interface->operations}, @{$interface->constants})) {
        my $clearOperation = IDLOperation->new();
        $clearOperation->name("clear");
        $clearOperation->type(IDLParser::makeSimpleType("any"));
        IDLParser::copyExtendedAttributes($clearOperation->extendedAttributes, $interface->setLike->extendedAttributes);
        $clearOperation->extendedAttributes->{NotEnumerable} = 1;
        push(@{$interface->operations}, $clearOperation);
    }

    unless (grep { $_->name eq "delete" } (@{$interface->attributes}, @{$interface->operations}, @{$interface->constants})) {
        my $deleteOperation = IDLOperation->new();
        $deleteOperation->name("delete");
        my $deleteArgument = IDLArgument->new();
        $deleteArgument->name("key");
        $deleteArgument->type(IDLParser::cloneType($interface->setLike->itemType));
        push(@{$deleteOperation->arguments}, ($deleteArgument));
        $deleteOperation->type(IDLParser::makeSimpleType("any"));
        IDLParser::copyExtendedAttributes($deleteOperation->extendedAttributes, $interface->setLike->extendedAttributes);
        $deleteOperation->extendedAttributes->{NotEnumerable} = 1;
        push(@{$interface->operations}, $deleteOperation);
    }
}

sub AddStringifierOperationIfNeeded
{
    my $interface = shift;

    foreach my $property (@{$interface->attributes}, @{$interface->operations}, @{$interface->anonymousOperations}) {
        next unless $property->isStringifier;

        if (ref($property) eq "IDLAttribute") {
            assert("stringifier can only be used on attributes with type DOMString or USVString") unless $property->type->name eq "DOMString" || $property->type->name eq "USVString";
        }

        if (ref($property) eq "IDLOperation") {
            assert("stringifier can only be used on operations with a return type of DOMString") unless $property->type->name eq "DOMString";
            assert("stringifier can only be used on operations with zero arguments") unless scalar(@{$property->arguments}) == 0;

            # Don't duplicate the operation if it was declared with the name 'toString'.
            return if $property->name eq "toString";
        }

        my $stringifier = IDLOperation->new();
        $stringifier->name("toString");
        $stringifier->type(IDLParser::cloneType($property->type));
        $stringifier->isStringifier(1);

        IDLParser::copyExtendedAttributes($stringifier->extendedAttributes, $property->extendedAttributes);

        if ($property->name && !$stringifier->extendedAttributes->{ImplementedAs}) {
            $stringifier->extendedAttributes->{ImplementedAs} = $property->name;
        }

        # If the stringifier was declared as read-write attribute and had [CEReactions], we need to remove
        # it from the operation, as the operation should act like attribute getter, which doesn't respect
        # [CEReactions].
        if (ref($property) eq "IDLAttribute" && !$property->isReadOnly && $stringifier->extendedAttributes->{CEReactions}) {
             delete $stringifier->extendedAttributes->{CEReactions};
        }

        push(@{$interface->operations}, $stringifier);
        return;
    }
}

sub EventHandlerAttributeShortEventName
{
    my $attribute = shift;
    my $eventType = $attribute->extendedAttributes->{ImplementedAs} || $attribute->name;

    # Remove the "on" prefix.
    $eventType = substr($eventType, 2);

    return "${eventType}Event";
}

sub EventHandlerAttributeEventName
{
    my $attribute = shift;
    return "eventNames()." . EventHandlerAttributeShortEventName($attribute);
}

sub GetParentClassName
{
    my $interface = shift;

    return $interface->extendedAttributes->{JSLegacyParent} if $interface->extendedAttributes->{JSLegacyParent};
    return "JSDOMObject" unless NeedsImplementationClass($interface);
    return "JSDOMWrapper<" . GetImplClassName($interface) . ">" unless $interface->parentType;
    return "JS" . $interface->parentType->name;
}

sub GetCallbackClassName
{
    my $className = shift;

    return "JS$className";
}

sub GetExportMacroForJSClass
{
    my $interface = shift;

    return $interface->extendedAttributes->{ExportMacro} . " " if $interface->extendedAttributes->{ExportMacro};
    return "";
}

sub AddIncludesForImplementationTypeInImpl
{
    my $implementationType = shift;
    
    AddIncludesForImplementationType($implementationType, \%implIncludes);
}

sub AddIncludesForImplementationTypeInHeader
{
    my $implementationType = shift;
    
    AddIncludesForImplementationType($implementationType, \%headerIncludes);
}

sub AddIncludesForImplementationType
{
    my ($implementationType, $includesRef) = @_;

    $includesRef->{"${implementationType}.h"} = 1;
}

sub AddToImplIncludesForIDLType
{
    my ($type, $conditional) = @_;

    return AddToIncludesForIDLType($type, \%implIncludes, $conditional)
}

sub AddToIncludesForIDLType
{
    my ($type, $includesRef, $conditional) = @_;

    if ($type->isNullable) {
        AddToIncludes("JSDOMConvertNullable.h", $includesRef, $conditional);
    }

    if ($type->extendedAttributes->{OverrideIDLType}) {
        my $overrideTypeName = $type->extendedAttributes->{OverrideIDLType};
        if ($overrideTypeName eq "IDLIDBKey") {
            AddToIncludes("JSDOMConvertIndexedDB.h", $includesRef, $conditional);
            return;
        }

        if ($overrideTypeName eq "IDLWebGLAny" || $overrideTypeName eq "IDLWebGLExtension") {
            AddToIncludes("JSDOMConvertWebGL.h", $includesRef, $conditional);
            return;
        }
    }

    if ($type->name eq "undefined") {
        AddToIncludes("IDLTypes.h", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertBase.h", $includesRef, $conditional);
        return;
    }

    if ($type->name eq "any") {
        AddToIncludes("JSDOMConvertAny.h", $includesRef, $conditional);
        return;
    }

    if ($type->name eq "boolean") {
        AddToIncludes("JSDOMConvertBoolean.h", $includesRef, $conditional);
        return;
    }

    if ($codeGenerator->IsBufferSourceType($type)) {
        AddToIncludes("JSDOMConvertBufferSource.h", $includesRef, $conditional);
        return;
    }

    if ($codeGenerator->IsCallbackFunction($type) || $codeGenerator->IsCallbackInterface($type)) {
        AddToIncludes("JS" . $type->name . ".h", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertCallbacks.h", $includesRef, $conditional);
        return;
    }

    if ($type->name eq "Date") {
        AddToIncludes("JSDOMConvertDate.h", $includesRef, $conditional);
        return;
    }

    if ($codeGenerator->IsExternalDictionaryType($type)) {
        AddToIncludes("JS" . $type->name . ".h", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertDictionary.h", $includesRef, $conditional);
        return;
    }

    if ($codeGenerator->IsExternalEnumType($type)) {
        AddToIncludes("JS" . $type->name . ".h", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertEnumeration.h", $includesRef, $conditional);
        return;
    }

    if ($type->name eq "EventListener") {
        AddToIncludes("JSEventListener.h", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertEventListener.h", $includesRef, $conditional);
        return;
    }

    if ($type->name eq "ReadableStream") {
        AddToIncludes("ReadableStream.h", $includesRef, $conditional);
        return;
    }

    if ($type->name eq "XPathNSResolver") {
        AddToIncludes("JSXPathNSResolver.h", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertXPathNSResolver.h", $includesRef, $conditional);
        return;
    }

    if ($codeGenerator->IsInterfaceType($type)) {
        AddToIncludes("JS" . $type->name . ".h", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertInterface.h", $includesRef, $conditional);
        return;
    }

    if ($type->name eq "JSON") {
        AddToIncludes("JSDOMConvertJSON.h", $includesRef, $conditional);
        return;
    }

    if ($codeGenerator->IsNumericType($type)) {
        AddToIncludes("JSDOMConvertNumbers.h", $includesRef, $conditional);
        return;
    }

    if ($type->name eq "object") {
        AddToIncludes("JSDOMConvertObject.h", $includesRef, $conditional);
        return;
    }

    if ($codeGenerator->IsPromiseType($type)) {
        AddToIncludes("DOMPromiseProxy.h", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertPromise.h", $includesRef, $conditional);

        AddToIncludesForIDLType(@{$type->subtypes}[0], $includesRef, $conditional);
        return;
    }

    if ($codeGenerator->IsRecordType($type)) {
        AddToIncludes("<wtf/Vector.h>", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertRecord.h", $includesRef, $conditional);

        AddToIncludesForIDLType(@{$type->subtypes}[0], $includesRef, $conditional);
        AddToIncludesForIDLType(@{$type->subtypes}[1], $includesRef, $conditional);
        return;
    }

    if ($codeGenerator->IsSequenceOrFrozenArrayType($type)) {
        AddToIncludes("<JavaScriptCore/JSArray.h>", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertSequences.h", $includesRef, $conditional);

        AddToIncludesForIDLType(@{$type->subtypes}[0], $includesRef, $conditional);
        return;
    }

    if ($type->name eq "ScheduledAction") {
        AddToIncludes("JSDOMConvertScheduledAction.h", $includesRef, $conditional);
        return;
    }

    if ($type->name eq "SerializedScriptValue") {
        AddToIncludes("SerializedScriptValue.h", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertSerializedScriptValue.h", $includesRef, $conditional);
        return;
    }

    if ($codeGenerator->IsStringType($type)) {
        AddToIncludes("JSDOMConvertStrings.h", $includesRef, $conditional);
        return;
    }

    if ($type->isUnion) {
        AddToIncludes("<variant>", $includesRef, $conditional);
        AddToIncludes("JSDOMConvertUnion.h", $includesRef, $conditional);

        foreach my $memberType (@{$type->subtypes}) {
            AddToIncludesForIDLType($memberType, $includesRef, $conditional);
        }

        return;
    }
}

sub AddToImplIncludes
{
    my ($header, $conditional) = @_;

    AddToIncludes($header, \%implIncludes, $conditional);
}

sub AddToIncludes
{
    my ($header, $includesRef, $conditional) = @_;

    if (not $conditional) {
        $includesRef->{$header} = 1;
    } elsif (not exists($includesRef->{$header})) {
        $includesRef->{$header} = $conditional;
    } else {
        my $oldValue = $includesRef->{$header};
        $includesRef->{$header} = "$oldValue|$conditional" if $oldValue ne 1;
    }
}

sub IsReadonly
{
    my $attribute = shift;
    return $attribute->isReadOnly && !$attribute->extendedAttributes->{Replaceable} && !$attribute->extendedAttributes->{PutForwards};
}

sub AddClassForwardIfNeeded
{
    my $type = shift;

    # SVGAnimatedLength/Number/etc. are not classes so they can't be forward declared as classes.
    return if $codeGenerator->IsSVGAnimatedType($type);
    return if $codeGenerator->IsBufferSourceType($type);

    push(@headerContent, "class " . $type->name . ";\n\n");
}

sub GetGenerateIsReachable
{
    my $interface = shift;
    return $interface->extendedAttributes->{GenerateIsReachable};
}

sub GetCustomIsReachable
{
    my $interface = shift;
    return $interface->extendedAttributes->{CustomIsReachable};
}

sub IsDOMGlobalObject
{
    my $interface = shift;
    return $interface->type->name eq "DOMWindow" || $interface->type->name eq "RemoteDOMWindow" || $codeGenerator->InheritsInterface($interface, "WorkerGlobalScope") || $codeGenerator->InheritsInterface($interface, "WorkletGlobalScope") || $interface->type->name eq "ShadowRealmGlobalScope" || $interface->type->name eq "TestGlobalObject";
}

sub ShouldUseGlobalObjectPrototype
{
    my $interface = shift;

    # For workers, the global object is a DedicatedWorkerGlobalScope.
    return 0 if $interface->type->name eq "WorkerGlobalScope";
    # For worklets, the global object is a PaintWorkletGlobalScope or a AudioWorkletGlobalScope.
    return 0 if $interface->type->name eq "WorkletGlobalScope";

    return IsDOMGlobalObject($interface);
}

sub ShouldUseOrdinaryObjectPrototype
{
    my $interface = shift;

    return $interface->isNamespaceObject() || $interface->type->name eq "ShadowRealmGlobalScope";
}

sub ShouldCreateWithJSProxy
{
    my ($codeGenerator, $interface) = @_;

    return $interface->type->name eq "ShadowRealmGlobalScope" || $codeGenerator->InheritsInterface($interface, "WorkerGlobalScope") || $codeGenerator->InheritsInterface($interface, "WorkletGlobalScope");
}

sub GenerateIndexedGetter
{
    my ($interface, $indexedGetterOperation, $indexExpression) = @_;
    
    # NOTE: This abstractly implements steps 1.2.1 - 1.2.8 of the LegacyPlatformObjectGetOwnProperty
    #       algorithm. Returing the conversion expression and attributes expression for use
    #       by the caller.
    
    # 1.2.1 Let operation be the operation used to declare the indexed property getter.
    # 1.2.2 Let value be an uninitialized variable.
    # 1.2.3 If operation was defined without an identifier, then set value to the result
    #       of performing the steps listed in the interface description to determine the
    #       value of an indexed property with index as the index.
    # 1.2.4 Otherwise, operation was defined with an identifier. Set value to the result
    #       of performing the steps listed in the description of operation with index as
    #       the only argument value.
    # 1.2.5 Let desc be a newly created Property Descriptor with no fields.
    # 1.2.6 Set desc.[[Value]] to the result of converting value to an ECMAScript value.
    # 1.2.7 If O implements an interface with an indexed property setter, then set
    #       desc.[[Writable]] to true, otherwise set it to false.
    # 1.2.8 Return desc.
    
    my @attributes = ();
    push(@attributes, "JSC::PropertyAttribute::ReadOnly") if !GetIndexedSetterOperation($interface) && !$interface->extendedAttributes->{Plugin};
    
    my $attributeString = "static_cast<unsigned>(" . ((@attributes > 0) ? join(" | ", @attributes) : "0") . ")";

    my $indexedGetterFunctionName = $indexedGetterOperation->extendedAttributes->{ImplementedAs} || $indexedGetterOperation->name || "item";
    my $nativeToJSConversion = NativeToJSValueUsingPointers($indexedGetterOperation, $interface, "thisObject->wrapped().${indexedGetterFunctionName}(${indexExpression})", "*thisObject->globalObject()");
    
    return ($nativeToJSConversion, $attributeString);
}

sub GenerateNamedGetter
{
    my ($interface, $namedGetterOperation, $namedPropertyExpression) = @_;
    
    # NOTE: This abstractly implements steps 2.1 - 2.10 of the LegacyPlatformObjectGetOwnProperty
    #       algorithm. Returing the conversion expression and attributes expression for use
    #       by the caller.
    
    # 2.1  Let operation be the operation used to declare the named property getter.
    # 2.2  Let value be an uninitialized variable.
    # 2.3  If operation was defined without an identifier, then set value to the result
    #      of performing the steps listed in the interface description to determine the
    #      value of a named property with P as the name.
    # 2.4  Otherwise, operation was defined with an identifier. Set value to the result
    #      of performing the steps listed in the description of operation with P as the
    #      only argument value..
    # 2.5  Let desc be a newly created Property Descriptor with no fields.
    # 2.6  Set desc.[[Value]] to the result of converting value to an ECMAScript value.
    # 2.7  If O implements an interface with a named property setter, then set desc.[[Writable]]
    #      to true, otherwise set it to false.
    # 2.8  If O implements an interface with the [LegacyUnenumerableNamedProperties]
    #      extended attribute, then set desc.[[Enumerable]] to false, otherwise set it
    #      to true.
    # 2.9  Set desc.[[Configurable]] to true.
    # 2.10 Return desc.
    
    my @attributes = ();
    push(@attributes, "JSC::PropertyAttribute::ReadOnly") if !GetNamedSetterOperation($interface) && !$interface->extendedAttributes->{Plugin};
    push(@attributes, "JSC::PropertyAttribute::DontEnum") if $interface->extendedAttributes->{LegacyUnenumerableNamedProperties};
    
    my $attributeString = "static_cast<unsigned>(" . ((@attributes > 0) ? join(" | ", @attributes) : "0") . ")";
    my $nativeToJSConversion = NativeToJSValueUsingPointers($namedGetterOperation, $interface, $namedPropertyExpression, "*thisObject->globalObject()");
    
    return ($nativeToJSConversion, $attributeString);
}

sub GenerateNamedGetterLambda
{
    my ($outputArray, $interface, $className, $namedGetterOperation, $namedGetterFunctionName, $IDLType) = @_;
    
    my @arguments = GenerateCallWithUsingReferences($namedGetterOperation->extendedAttributes->{CallWith}, $outputArray, "std::nullopt", "thisObject", "", "        ");
    push(@arguments, "propertyNameToAtomString(propertyName)");

    push(@$outputArray, "    auto getterFunctor = visibleNamedPropertyItemAccessorFunctor<${IDLType}, ${className}>([] (${className}& thisObject, PropertyName propertyName) -> decltype(auto) {\n");
    push(@$outputArray, "        return thisObject.wrapped().${namedGetterFunctionName}(" . join(", ", @arguments) . ");\n");
    push(@$outputArray, "    });\n");
}

# https://webidl.spec.whatwg.org/#legacy-platform-object-getownproperty
sub GenerateGetOwnPropertySlot
{
    my ($outputArray, $interface, $className) = @_;
    
    return if $interface->extendedAttributes->{CustomGetOwnPropertySlot};

    my $namedGetterOperation = GetNamedGetterOperation($interface);
    my $indexedGetterOperation = GetIndexedGetterOperation($interface);

    push(@$outputArray, "bool ${className}::getOwnPropertySlot(JSObject* object, JSGlobalObject* lexicalGlobalObject, PropertyName propertyName, PropertySlot& slot)\n");
    push(@$outputArray, "{\n");

    if ($namedGetterOperation || $indexedGetterOperation) {
        push(@$outputArray, "    auto throwScope = DECLARE_THROW_SCOPE(JSC::getVM(lexicalGlobalObject));\n");
    }

    push(@$outputArray, "    auto* thisObject = jsCast<${className}*>(object);\n");
    push(@$outputArray, "    ASSERT_GC_OBJECT_INHERITS(thisObject, info());\n");
    
    # NOTE: The alogithm for [[GetOwnProperty]] contains only the following step:
    # 1. Return LegacyPlatformObjectGetOwnProperty(O, P, false).
    
    # Therefore, the following steps are from the LegacyPlatformObjectGetOwnProperty algorithm
    # https://webidl.spec.whatwg.org/#LegacyPlatformObjectGetOwnProperty
    
    # 1. If O supports indexed properties and P is an array index property name, then:
    if ($indexedGetterOperation) {
        # 1.1. Let index be the result of calling ToUint32(P).
        push(@$outputArray, "    if (auto index = parseIndex(propertyName)) {\n");
        
        # 1.2. If index is a supported property index, then:
        # FIXME: This should support non-contiguous indices.
        push(@$outputArray, "        if (index.value() < thisObject->wrapped().length()) {\n");
        
        # NOTE: GenerateIndexedGetter implements steps 1.2.1 - 1.2.8.
        
        my ($nativeToJSConversion, $attributeString) = GenerateIndexedGetter($interface, $indexedGetterOperation, "index.value()");
        
        push(@$outputArray, "            auto value = ${nativeToJSConversion};\n");
        push(@$outputArray, "            RETURN_IF_EXCEPTION(throwScope, false);\n");
        
        push(@$outputArray, "            slot.setValue(thisObject, ${attributeString}, value);\n");
        push(@$outputArray, "            return true;\n");
        
        push(@$outputArray, "        }\n");
        
        # 1.3. Set ignoreNamedProps to true.
        # NOTE: Setting ignoreNamedProps has the effect of skipping step 2, so we can early return here
        #       rather than going through the paces of having an actual ignoreNamedProps update.
        if ($namedGetterOperation || $interface->extendedAttributes->{Plugin}) {
            push(@$outputArray, "        return JSObject::getOwnPropertySlot(object, lexicalGlobalObject, propertyName, slot);\n");
        }
        push(@$outputArray, "    }\n");
    }
    
    # 2. If O supports named properties, the result of running the named property visibility
    #    algorithm with property name P and object O is true, and ignoreNamedProps is false, then:
    if ($namedGetterOperation) {
        # NOTE: ignoreNamedProps is guarenteed to be false here, as it is initially false, and never set
        #       to true, due to the early return in step 1.3
        AddToImplIncludes("JSDOMAbstractOperations.h");
                
        my $namedGetterFunctionName = $namedGetterOperation->extendedAttributes->{ImplementedAs} || $namedGetterOperation->name || "namedItem";
        my $IDLType = GetIDLTypeExcludingNullability($interface, $namedGetterOperation->type);
        
        push(@$outputArray, "    using GetterIDLType = ${IDLType};\n");
        
        GenerateNamedGetterLambda($outputArray, $interface, $className, $namedGetterOperation, $namedGetterFunctionName, "GetterIDLType");
        
        my $overrideBuiltin = $codeGenerator->InheritsExtendedAttribute($interface, "LegacyOverrideBuiltIns") ? "LegacyOverrideBuiltIns::Yes" : "LegacyOverrideBuiltIns::No";
        push(@$outputArray, "    if (auto namedProperty = accessVisibleNamedProperty<${overrideBuiltin}>(*lexicalGlobalObject, *thisObject, propertyName, getterFunctor)) {\n");
        
        # NOTE: GenerateNamedGetter implements steps 2.1 - 2.10.
        
        my ($nativeToJSConversion, $attributeString) = GenerateNamedGetter($interface, $namedGetterOperation, "WTFMove(namedProperty.value())");
        
        push(@$outputArray, "        auto value = ${nativeToJSConversion};\n");
        push(@$outputArray, "        RETURN_IF_EXCEPTION(throwScope, false);\n");
        
        push(@$outputArray, "        slot.setValue(thisObject, ${attributeString}, value);\n");
        push(@$outputArray, "        return true;\n");
        push(@$outputArray, "    }\n");
    }

    if ($interface->extendedAttributes->{Plugin}) {
        AddToImplIncludes("JSPluginElementFunctions.h");
        push(@$outputArray, "    if (pluginElementCustomGetOwnPropertySlot(thisObject, lexicalGlobalObject, propertyName, slot))\n");
        push(@$outputArray, "        return true;\n");
        push(@$outputArray, "    ASSERT(slot.isTaintedByOpaqueObject());\n");
        push(@$outputArray, "    if (slot.isVMInquiry())\n");
        push(@$outputArray, "        return false;\n");
    }

    # 3. Return OrdinaryGetOwnProperty(O, P).
    push(@$outputArray, "    return JSObject::getOwnPropertySlot(object, lexicalGlobalObject, propertyName, slot);\n");
    
    push(@$outputArray, "}\n\n");
}

# https://webidl.spec.whatwg.org/#legacy-platform-object-getownproperty
sub GenerateGetOwnPropertySlotByIndex
{
    my ($outputArray, $interface, $className) = @_;
    
    return if $interface->extendedAttributes->{CustomGetOwnPropertySlot};

    # Sink the int-to-string conversion that happens when we create a PropertyName
    # to the point where we actually need it.
    my $didGeneratePropertyName = 0;
    my $propertyNameGeneration = sub {
        return if $didGeneratePropertyName;
        
        push(@$outputArray, "    auto propertyName = Identifier::from(vm, index);\n");
        $didGeneratePropertyName = 1;
    };
    
    my $namedGetterOperation = GetNamedGetterOperation($interface);
    my $indexedGetterOperation = GetIndexedGetterOperation($interface);
    
    push(@$outputArray, "bool ${className}::getOwnPropertySlotByIndex(JSObject* object, JSGlobalObject* lexicalGlobalObject, unsigned index, PropertySlot& slot)\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    VM& vm = JSC::getVM(lexicalGlobalObject);\n");

    if ($namedGetterOperation || $indexedGetterOperation) {
        push(@$outputArray, "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n");
    }

    push(@$outputArray, "    auto* thisObject = jsCast<${className}*>(object);\n");
    push(@$outputArray, "    ASSERT_GC_OBJECT_INHERITS(thisObject, info());\n");

    # NOTE: The alogithm for [[GetOwnProperty]] contains only the following step:
    # 1. Return LegacyPlatformObjectGetOwnProperty(O, P, false).
    
    # Therefore, the following steps are from the LegacyPlatformObjectGetOwnProperty algorithm
    # https://webidl.spec.whatwg.org/#LegacyPlatformObjectGetOwnProperty
    
    # 1. If O supports indexed properties and P is an array index property name, then:
    if ($indexedGetterOperation) {
        # 1.1. Let index be the result of calling ToUint32(P).
        push(@$outputArray, "    if (LIKELY(index <= MAX_ARRAY_INDEX)) {\n");
        
        # 1.2. If index is a supported property index, then:
        # FIXME: This should support non-contiguous indices.
        push(@$outputArray, "        if (index < thisObject->wrapped().length()) {\n");
        
        # NOTE: GenerateIndexedGetter implements steps 1.2.1 - 1.2.8.
        
        my ($nativeToJSConversion, $attributeString) = GenerateIndexedGetter($interface, $indexedGetterOperation, "index");
        
        push(@$outputArray, "            auto value = ${nativeToJSConversion};\n");
        push(@$outputArray, "            RETURN_IF_EXCEPTION(throwScope, false);\n");
        
        push(@$outputArray, "            slot.setValue(thisObject, ${attributeString}, value);\n");
        push(@$outputArray, "            return true;\n");
        
        push(@$outputArray, "        }\n");
        
        # 1.3. Set ignoreNamedProps to true.
        # NOTE: Setting ignoreNamedProps has the effect of skipping step 2, so we can early return here
        #       rather than going through the paces of having an actual ignoreNamedProps update.
        if ($namedGetterOperation || $interface->extendedAttributes->{Plugin}) {
            push(@$outputArray, "        return JSObject::getOwnPropertySlotByIndex(object, lexicalGlobalObject, index, slot);\n");
        }
        push(@$outputArray, "    }\n");
    }
    
    # 2. If O supports named properties, the result of running the named property visibility
    #    algorithm with property name P and object O is true, and ignoreNamedProps is false, then:
    if ($namedGetterOperation) {
        # NOTE: ignoreNamedProps is guarenteed to be false here, as it is initially false, and never set
        #       to true, due to the early return in step 1.3
        AddToImplIncludes("JSDOMAbstractOperations.h");
                
        &$propertyNameGeneration();
        
        my $namedGetterFunctionName = $namedGetterOperation->extendedAttributes->{ImplementedAs} || $namedGetterOperation->name || "namedItem";
        my $IDLType = GetIDLTypeExcludingNullability($interface, $namedGetterOperation->type);
        
        push(@$outputArray, "    using GetterIDLType = ${IDLType};\n");
        
        GenerateNamedGetterLambda($outputArray, $interface, $className, $namedGetterOperation, $namedGetterFunctionName, "GetterIDLType");
        
        my $overrideBuiltin = $codeGenerator->InheritsExtendedAttribute($interface, "LegacyOverrideBuiltIns") ? "LegacyOverrideBuiltIns::Yes" : "LegacyOverrideBuiltIns::No";
        push(@$outputArray, "    if (auto namedProperty = accessVisibleNamedProperty<${overrideBuiltin}>(*lexicalGlobalObject, *thisObject, propertyName, getterFunctor)) {\n");
        
        # NOTE: GenerateNamedGetter implements steps 2.1 - 2.10.
        
        my ($nativeToJSConversion, $attributeString) = GenerateNamedGetter($interface, $namedGetterOperation, "WTFMove(namedProperty.value())");

        push(@$outputArray, "        auto value = ${nativeToJSConversion};\n");
        push(@$outputArray, "        RETURN_IF_EXCEPTION(throwScope, false);\n");
        
        push(@$outputArray, "        slot.setValue(thisObject, ${attributeString}, value);\n");
        push(@$outputArray, "        return true;\n");
        push(@$outputArray, "    }\n");
    }
    
    if ($interface->extendedAttributes->{Plugin}) {
        &$propertyNameGeneration();

        AddToImplIncludes("JSPluginElementFunctions.h");
        push(@$outputArray, "    if (pluginElementCustomGetOwnPropertySlot(thisObject, lexicalGlobalObject, propertyName, slot))\n");
        push(@$outputArray, "        return true;\n");
        push(@$outputArray, "    ASSERT(slot.isTaintedByOpaqueObject());\n");
        push(@$outputArray, "    if (slot.isVMInquiry())\n");
        push(@$outputArray, "        return false;\n");
    }

    # 3. Return OrdinaryGetOwnProperty(O, P).
    push(@$outputArray, "    return JSObject::getOwnPropertySlotByIndex(object, lexicalGlobalObject, index, slot);\n");
    
    push(@$outputArray, "}\n\n");
}

# https://webidl.spec.whatwg.org/#legacy-platform-object-property-enumeration
sub GenerateGetOwnPropertyNames
{
    my ($outputArray, $interface, $className) = @_;
    
    return if $interface->extendedAttributes->{CustomGetOwnPropertyNames};
    
    my $namedGetterOperation = GetNamedGetterOperation($interface);
    my $indexedGetterOperation = GetIndexedGetterOperation($interface);
    
    push(@$outputArray, "void ${className}::getOwnPropertyNames(JSObject* object, JSGlobalObject* lexicalGlobalObject, PropertyNameArray& propertyNames, DontEnumPropertiesMode mode)\n");
    push(@$outputArray, "{\n");
    if ($indexedGetterOperation || $namedGetterOperation) {
        push(@$outputArray, "    VM& vm = JSC::getVM(lexicalGlobalObject);\n");
    }
    push(@$outputArray, "    auto* thisObject = jsCast<${className}*>(object);\n");
    push(@$outputArray, "    ASSERT_GC_OBJECT_INHERITS(object, info());\n");
    
    # 1. If the object supports indexed properties, then the object’s supported
    #    property indices are enumerated first, in numerical order.
    # FIXME: This should support non-contiguous indices.
    if ($indexedGetterOperation) {
        push(@$outputArray, "    for (unsigned i = 0, count = thisObject->wrapped().length(); i < count; ++i)\n");
        push(@$outputArray, "        propertyNames.add(Identifier::from(vm, i));\n");
    }

    # 2. If the object supports named properties and doesn’t implement an interface
    #    with the [LegacyUnenumerableNamedProperties] extended attribute, then the
    #    object’s supported property names that are visible according to the named
    #    property visibility algorithm are enumerated next, in the order given in
    #    the definition of the set of supported property names.
    if ($namedGetterOperation) {
        if (!$interface->extendedAttributes->{LegacyUnenumerableNamedProperties}) {
            push(@$outputArray, "    for (auto& propertyName : thisObject->wrapped().supportedPropertyNames())\n");
            push(@$outputArray, "        propertyNames.add(Identifier::fromString(vm, propertyName));\n");
        } else {
            push(@$outputArray, "    if (mode == DontEnumPropertiesMode::Include) {\n");
            push(@$outputArray, "        for (auto& propertyName : thisObject->wrapped().supportedPropertyNames())\n");
            push(@$outputArray, "            propertyNames.add(Identifier::fromString(vm, propertyName));\n");
            push(@$outputArray, "    }\n");
        }
    }
    
    # 3. Finally, any enumerable own properties or properties from the object’s
    #    prototype chain are then enumerated, in no defined order.
    push(@$outputArray, "    JSObject::getOwnPropertyNames(object, lexicalGlobalObject, propertyNames, mode);\n");
    push(@$outputArray, "}\n\n");
}

# https://webidl.spec.whatwg.org/#invoke-indexed-setter
sub GenerateInvokeIndexedPropertySetter
{
    my ($outputArray, $indent, $interface, $indexedSetterOperation, $indexExpression, $value) = @_;
    
    # The second argument of the indexed setter operation is the argument being converted.
    my $argument = @{$indexedSetterOperation->arguments}[1];
    my $nativeValue = JSValueToNative($interface, $argument, $value, $indexedSetterOperation->extendedAttributes->{Conditional}, "lexicalGlobalObject", "*lexicalGlobalObject", "thisObject", "", "");
    
    push(@$outputArray, $indent . "auto nativeValue = ${nativeValue};\n");
    push(@$outputArray, $indent . "RETURN_IF_EXCEPTION(throwScope, true);\n");
    
    my $indexedSetterFunctionName = $indexedSetterOperation->name || "setItem";
    my $nativeValuePassExpression = PassArgumentExpression("nativeValue", $argument);
    my $functionString = "thisObject->wrapped().${indexedSetterFunctionName}(${indexExpression}, ${nativeValuePassExpression})";
    push(@$outputArray, $indent . "invokeFunctorPropagatingExceptionIfNecessary(*lexicalGlobalObject, throwScope, [&] { return ${functionString}; });\n");
}

# https://webidl.spec.whatwg.org/#invoke-named-setter
sub GenerateInvokeNamedPropertySetter
{
    my ($outputArray, $indent, $interface, $namedSetterOperation, $value) = @_;
    
    my $argument = @{$namedSetterOperation->arguments}[1];
    my $nativeValue = JSValueToNative($interface, $argument, $value, $namedSetterOperation->extendedAttributes->{Conditional}, "lexicalGlobalObject", "*lexicalGlobalObject", "thisObject", "", "");
    
    push(@$outputArray, $indent . "auto nativeValue = ${nativeValue};\n");
    push(@$outputArray, $indent . "RETURN_IF_EXCEPTION(throwScope, true);\n");

    my $namedSetterFunctionName = $namedSetterOperation->name || "setNamedItem";
    my $nativeValuePassExpression = PassArgumentExpression("nativeValue", $argument);
    my $functionString = "thisObject->wrapped().${namedSetterFunctionName}(propertyNameToString(propertyName), ${nativeValuePassExpression})";
    push(@$outputArray, $indent . "invokeFunctorPropagatingExceptionIfNecessary(*lexicalGlobalObject, throwScope, [&] { return ${functionString}; });\n");
}

sub GeneratePut
{
    my ($outputArray, $interface, $className) = @_;
    
    return if $interface->extendedAttributes->{CustomPut};
    
    my $namedSetterOperation = GetNamedSetterOperation($interface);
    my $indexedSetterOperation = GetIndexedSetterOperation($interface);
    
    push(@$outputArray, "bool ${className}::put(JSCell* cell, JSGlobalObject* lexicalGlobalObject, PropertyName propertyName, JSValue value, PutPropertySlot& putPropertySlot)\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    auto* thisObject = jsCast<${className}*>(cell);\n");
    push(@$outputArray, "    ASSERT_GC_OBJECT_INHERITS(thisObject, info());\n\n");
    push(@$outputArray, "    if (UNLIKELY(thisObject != putPropertySlot.thisValue()))\n");
    push(@$outputArray, "        return JSObject::put(thisObject, lexicalGlobalObject, propertyName, value, putPropertySlot);\n");

    push(@$outputArray, "    auto throwScope = DECLARE_THROW_SCOPE(lexicalGlobalObject->vm());\n\n");

    assert("CEReactions is not supported on having both named setters and indexed setters") if $namedSetterOperation && $namedSetterOperation->extendedAttributes->{CEReactions}
        && $indexedSetterOperation && $indexedSetterOperation->extendedAttributes->{CEReactions};
    if ($namedSetterOperation) {
        GenerateCustomElementReactionsStackIfNeeded($outputArray, $namedSetterOperation, "*lexicalGlobalObject");
    }
    if ($indexedSetterOperation) {
        GenerateCustomElementReactionsStackIfNeeded($outputArray, $indexedSetterOperation, "*lexicalGlobalObject");
    }
    
    if ($indexedSetterOperation) {
        push(@$outputArray, "    if (auto index = parseIndex(propertyName)) {\n");
        
        GenerateInvokeIndexedPropertySetter($outputArray, "        ", $interface, $indexedSetterOperation, "index.value()", "value");
        
        push(@$outputArray, "        return true;\n");
        push(@$outputArray, "    }\n\n");
    }
    
    if ($namedSetterOperation) {
        # FIMXE: We need a more comprehensive story for Symbols.
        push(@$outputArray, "    if (!propertyName.isSymbol()) {\n");
        
        my $additionalIndent = "";
        
        my $legacyOverrideBuiltins = $codeGenerator->InheritsExtendedAttribute($interface, "LegacyOverrideBuiltIns");
        if (!$legacyOverrideBuiltins) {
            push(@$outputArray, "        PropertySlot slot { thisObject, PropertySlot::InternalMethodType::VMInquiry, &lexicalGlobalObject->vm() };\n");
            push(@$outputArray, "        JSValue prototype = thisObject->getPrototypeDirect(JSC::getVM(lexicalGlobalObject));\n");
            push(@$outputArray, "        bool found = prototype.isObject() && asObject(prototype)->getPropertySlot(lexicalGlobalObject, propertyName, slot);\n");
            push(@$outputArray, "        slot.disallowVMEntry.reset();\n");
            push(@$outputArray, "        RETURN_IF_EXCEPTION(throwScope, false);\n");
            push(@$outputArray, "        if (!found) {\n");
            $additionalIndent .= "    ";
        }

        GenerateInvokeNamedPropertySetter($outputArray, $additionalIndent . "        ", $interface, $namedSetterOperation, "value");
        push(@$outputArray, $additionalIndent . "        return true;\n");

        if (!$legacyOverrideBuiltins) {
            push(@$outputArray, "        }\n");
        }
        
        push(@$outputArray, "    }\n\n");
    }
    
    assert("Using both a named property setter and [Plugin] together is not supported.") if $namedSetterOperation && $interface->extendedAttributes->{Plugin};
    if ($interface->extendedAttributes->{Plugin}) {
        AddToImplIncludes("JSPluginElementFunctions.h");

        push(@$outputArray, "    bool putResult = false;\n");
        push(@$outputArray, "    bool success = pluginElementCustomPut(thisObject, lexicalGlobalObject, propertyName, value, putPropertySlot, putResult);\n");
        push(@$outputArray, "    RETURN_IF_EXCEPTION(throwScope, false);\n");
        push(@$outputArray, "    if (success)\n");
        push(@$outputArray, "        return putResult;\n\n");
    }

    push(@$outputArray, "    throwScope.assertNoException();\n");
    push(@$outputArray, "    RELEASE_AND_RETURN(throwScope, JSObject::put(thisObject, lexicalGlobalObject, propertyName, value, putPropertySlot));\n");
    push(@$outputArray, "}\n\n");
}

sub GeneratePutByIndex
{
    my ($outputArray, $interface, $className) = @_;
    
    return if $interface->extendedAttributes->{CustomPut};

    my $namedSetterOperation = GetNamedSetterOperation($interface);
    my $indexedSetterOperation = GetIndexedSetterOperation($interface);
    
    my $legacyOverrideBuiltins = $codeGenerator->InheritsExtendedAttribute($interface, "LegacyOverrideBuiltIns");
    my $ellidesCallsToBase = ($namedSetterOperation && $legacyOverrideBuiltins) && !$interface->extendedAttributes->{Plugin};
    
    push(@$outputArray, "bool ${className}::putByIndex(JSCell* cell, JSGlobalObject* lexicalGlobalObject, unsigned index, JSValue value, bool" . (!$ellidesCallsToBase ? " shouldThrow" : "") . ")\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    auto* thisObject = jsCast<${className}*>(cell);\n");
    push(@$outputArray, "    ASSERT_GC_OBJECT_INHERITS(thisObject, info());\n\n");

    push(@$outputArray, "    VM& vm = JSC::getVM(lexicalGlobalObject);\n");
    push(@$outputArray, "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n\n");

    assert("CEReactions is not supported on having both named setters and indexed setters") if $namedSetterOperation && $namedSetterOperation->extendedAttributes->{CEReactions}
        && $indexedSetterOperation && $indexedSetterOperation->extendedAttributes->{CEReactions};
    if ($namedSetterOperation) {
        GenerateCustomElementReactionsStackIfNeeded($outputArray, $namedSetterOperation, "*lexicalGlobalObject");
    }
    if ($indexedSetterOperation) {
        GenerateCustomElementReactionsStackIfNeeded($outputArray, $indexedSetterOperation, "*lexicalGlobalObject");
    }
    
    if ($indexedSetterOperation) {
        push(@$outputArray, "    if (LIKELY(index <= MAX_ARRAY_INDEX)) {\n");
        
        GenerateInvokeIndexedPropertySetter($outputArray, "        ", $interface, $indexedSetterOperation, "index", "value");
        
        push(@$outputArray, "        return true;\n");
        push(@$outputArray, "    }\n\n");
    }
    
    if ($namedSetterOperation) {
        push(@$outputArray, "    auto propertyName = Identifier::from(vm, index);\n");
                
        my $additionalIndent = "";
        if (!$legacyOverrideBuiltins) {
            push(@$outputArray, "    PropertySlot slot { thisObject, PropertySlot::InternalMethodType::VMInquiry, &vm };\n");
            push(@$outputArray, "    JSValue prototype = thisObject->getPrototypeDirect(vm);\n");
            push(@$outputArray, "    bool found = prototype.isObject() && asObject(prototype)->getPropertySlot(lexicalGlobalObject, propertyName, slot);\n");
            push(@$outputArray, "    slot.disallowVMEntry.reset();\n");
            push(@$outputArray, "    RETURN_IF_EXCEPTION(throwScope, false);\n");
            push(@$outputArray, "    if (!found) {\n");
            $additionalIndent .= "    ";
        }
        
        GenerateInvokeNamedPropertySetter($outputArray, $additionalIndent . "    ", $interface, $namedSetterOperation, "value");
        push(@$outputArray, $additionalIndent . "    return true;\n");
        
        if (!$legacyOverrideBuiltins) {
            push(@$outputArray, "    }\n\n");
        }
    }

    assert("Using both a named property setter and [Plugin] together is not supported.") if $namedSetterOperation && $interface->extendedAttributes->{Plugin};
    if ($interface->extendedAttributes->{Plugin}) {
        AddToImplIncludes("JSPluginElementFunctions.h");
        push(@$outputArray, "    auto propertyName = Identifier::from(vm, index);\n");
        push(@$outputArray, "    PutPropertySlot putPropertySlot(thisObject, shouldThrow);\n");
        push(@$outputArray, "    bool putResult = false;\n");
        push(@$outputArray, "    bool success = pluginElementCustomPut(thisObject, lexicalGlobalObject, propertyName, value, putPropertySlot, putResult);\n");
        push(@$outputArray, "    RETURN_IF_EXCEPTION(throwScope, false);\n");
        push(@$outputArray, "    if (success)\n");
        push(@$outputArray, "        return putResult;\n\n");
    }

    if (!$ellidesCallsToBase) {
        push(@$outputArray, "    throwScope.assertNoException();\n");
        push(@$outputArray, "    RELEASE_AND_RETURN(throwScope, JSObject::putByIndex(cell, lexicalGlobalObject, index, value, shouldThrow));\n");
    }
    
    push(@$outputArray, "}\n\n");
}

sub GenerateIsLegacyUnforgeablePropertyName
{
    my ($outputArray, $interface) = @_;
    
    my @unforgeablePropertyNames = ();
    foreach my $property (@{$interface->attributes}, @{$interface->operations}) {
        next if $property->isStatic;
        
        if (IsLegacyUnforgeable($interface, $property)) {
            push(@unforgeablePropertyNames, $property->name);
        }
    }
    
    return 0 if (scalar(@unforgeablePropertyNames) == 0);
    
    my $condition = join(" || ", map { "propertyName == \"" . $_ . "\"" } @unforgeablePropertyNames);
    
    push(@$outputArray, "static bool isLegacyUnforgeablePropertyName(PropertyName propertyName)\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    return ${condition};\n");
    push(@$outputArray, "}\n\n");
    
    return 1;
}

# https://webidl.spec.whatwg.org/#legacy-platform-object-defineownproperty
sub GenerateDefineOwnProperty
{
    my ($outputArray, $interface, $className) = @_;
    
    return if $interface->extendedAttributes->{CustomDefineOwnProperty};
    
    my $namedSetterOperation = GetNamedSetterOperation($interface);
    my $indexedSetterOperation = GetIndexedSetterOperation($interface);
    
    return if !$namedSetterOperation && !$indexedSetterOperation;
    
    push(@$outputArray, "bool ${className}::defineOwnProperty(JSObject* object, JSGlobalObject* lexicalGlobalObject, PropertyName propertyName, const PropertyDescriptor& propertyDescriptor, bool shouldThrow)\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    auto* thisObject = jsCast<${className}*>(object);\n");
    push(@$outputArray, "    ASSERT_GC_OBJECT_INHERITS(thisObject, info());\n\n");

    push(@$outputArray, "    auto throwScope = DECLARE_THROW_SCOPE(lexicalGlobalObject->vm());\n\n");

    assert("CEReactions is not supported on having both named setters and indexed setters") if $namedSetterOperation && $namedSetterOperation->extendedAttributes->{CEReactions}
        && $indexedSetterOperation && $indexedSetterOperation->extendedAttributes->{CEReactions};
    if ($namedSetterOperation) {
        GenerateCustomElementReactionsStackIfNeeded($outputArray, $namedSetterOperation, "*lexicalGlobalObject");
    }
    if ($indexedSetterOperation) {
        GenerateCustomElementReactionsStackIfNeeded($outputArray, $indexedSetterOperation, "*lexicalGlobalObject");
    }
    
    # 1. If O supports indexed properties and P is an array index property name, then:
    if (GetIndexedGetterOperation($interface)) {
        # NOTE: The numbers are out of order because there is no reason doing steps 1, 3, and 4 if there
        # is no indexed property setter.

        if (!$indexedSetterOperation) {
            # 2. If O does not implement an interface with an indexed property setter, then return false.
            push(@$outputArray, "    if (parseIndex(propertyName))\n");
            push(@$outputArray, "        return false;\n\n");
        } else {
            push(@$outputArray, "    if (auto index = parseIndex(propertyName)) {\n");

            # 1. If the result of calling IsDataDescriptor(Desc) is false, then return false.
            push(@$outputArray, "        if (!propertyDescriptor.isDataDescriptor())\n");
            push(@$outputArray, "            return false;\n");
            
            # 3. Invoke the indexed property setter with P and Desc.[[Value]].
            GenerateInvokeIndexedPropertySetter($outputArray, "        ", $interface, $indexedSetterOperation, "index.value()", "propertyDescriptor.value()");
            
            # 4. Return true.
            push(@$outputArray, "        return true;\n");
            push(@$outputArray, "    }\n\n");
        }
    }
    
    # 2. If O supports named properties, O does not implement an interface with the [Global]
    #    extended attribute and P is not an unforgeable property name of O, then:
    if (GetNamedGetterOperation($interface) && !IsGlobalInterface($interface)) {
        # FIMXE: We need a more comprehensive story for Symbols.
        push(@$outputArray, "    if (!propertyName.isSymbol()) {\n");
        
        my $additionalIndent = "";
        
        my $hasUnforgableProperties = GenerateIsLegacyUnforgeablePropertyName($outputArray, $interface);
        if ($hasUnforgableProperties) {
            push(@$outputArray, "        if (!isLegacyUnforgeablePropertyName(propertyName)) {\n");
            $additionalIndent .= "    ";
        }
        
        # 1. Let creating be true if P is not a supported property name, and false otherwise.
        # NOTE: This step is strength reduced into the only use of 'creating' in step 2.2.1
        
        # 2. If O implements an interface with the [LegacyOverrideBuiltIns] extended attribute or O
        #    does not have an own property named P, then:
        my $legacyOverrideBuiltins = $codeGenerator->InheritsExtendedAttribute($interface, "LegacyOverrideBuiltIns");
        if (!$legacyOverrideBuiltins) {
            # FIXME: Is JSObject::getOwnPropertySlot the right function to call? Is there a function that will
            #        only look at the actual properties, and not call into our implementation of the
            #        [[GetOwnProperty]] hook?
            push(@$outputArray, $additionalIndent. "        PropertySlot slot { thisObject, PropertySlot::InternalMethodType::VMInquiry, &lexicalGlobalObject->vm() };\n");
            push(@$outputArray, $additionalIndent. "        bool found = JSObject::getOwnPropertySlot(thisObject, lexicalGlobalObject, propertyName, slot);\n");
            push(@$outputArray, $additionalIndent. "        slot.disallowVMEntry.reset();\n");
            push(@$outputArray, $additionalIndent. "        RETURN_IF_EXCEPTION(throwScope, false);\n");
            push(@$outputArray, $additionalIndent. "        if (!found) {\n");
            $additionalIndent .= "    ";
        }
        if (!$namedSetterOperation) {
            # 2.1. If creating is false and O does not implement an interface with a named property setter, then return false.
            push(@$outputArray, $additionalIndent . "        if (thisObject->wrapped().isSupportedPropertyName(propertyNameToString(propertyName)))\n");
            push(@$outputArray, $additionalIndent . "            return false;\n");
        } else {
            # 2.2. If O implements an interface with a named property setter, then:
            
            # 2.2.1. If the result of calling IsDataDescriptor(Desc) is false, then return false.
            push(@$outputArray, $additionalIndent . "        if (!propertyDescriptor.isDataDescriptor())\n");
            push(@$outputArray, $additionalIndent . "            return false;\n");
            
            # 2.2.2. Invoke the named property setter with P and Desc.[[Value]].
            GenerateInvokeNamedPropertySetter($outputArray, $additionalIndent . "        ", $interface, $namedSetterOperation, "propertyDescriptor.value()");
            # 2.2.3. Return true.
            push(@$outputArray, $additionalIndent . "        return true;\n");
        }
        
        if (!$legacyOverrideBuiltins) {
            push(@$outputArray, $additionalIndent . "    }\n");
        }
        
        if ($hasUnforgableProperties) {
            push(@$outputArray, "        }\n");
        }
        
        # Close the !propertyName.isSymbol() condition.
        push(@$outputArray, "    }\n\n");
    }
    
    push(@$outputArray, "    PropertyDescriptor newPropertyDescriptor = propertyDescriptor;\n");
        
    # 3. If O does not implement an interface with the [Global] extended attribute,
    #    then set Desc.[[Configurable]] to true.
    if (!IsGlobalInterface($interface)) {
        push(@$outputArray, "    newPropertyDescriptor.setConfigurable(true);\n");
    }
    
    # 4. Return OrdinaryDefineOwnProperty(O, P, Desc).
    push(@$outputArray, "    throwScope.release();\n");
    push(@$outputArray, "    return JSObject::defineOwnProperty(object, lexicalGlobalObject, propertyName, newPropertyDescriptor, shouldThrow);\n");
    
    push(@$outputArray, "}\n\n");
}

sub GenerateDeletePropertyCommon
{
    my ($outputArray, $interface, $className, $operation, $conditional) = @_;
    
    # This implements step 2 of https://webidl.spec.whatwg.org/#legacy-platform-object-delete
    # so it can be shared between the generation of deleteProperty and deletePropertyByIndex.

    # 2. If O supports named properties, O does not implement an interface with the
    #    [Global] extended attribute and the result of calling the named
    #    property visibility algorithm with property name P and object O is true, then:
    assert("Named property deleters are not allowed without a corresponding named property getter.") if !GetNamedGetterOperation($interface);
    assert("Named property deleters are not allowed on global object interfaces.") if IsGlobalInterface($interface);

    AddToImplIncludes("JSDOMAbstractOperations.h", $conditional);
    my $overrideBuiltin = $codeGenerator->InheritsExtendedAttribute($interface, "LegacyOverrideBuiltIns") ? "LegacyOverrideBuiltIns::Yes" : "LegacyOverrideBuiltIns::No";
    push(@$outputArray, "    if (isVisibleNamedProperty<${overrideBuiltin}>(*lexicalGlobalObject, thisObject, propertyName)) {\n");

    GenerateCustomElementReactionsStackIfNeeded($outputArray, $operation, "*lexicalGlobalObject");

    # 2.1. If O does not implement an interface with a named property deleter, then return false.
    # 2.2. Let operation be the operation used to declare the named property deleter.
    # NOTE: We only add a deleteProperty implementation of we have a named property deleter.

    # 2.3. If operation was defined without an identifier, then:
    #      1. Perform the steps listed in the interface description to delete an existing named
    #         property with P as the name.
    #      2. If the steps indicated that the deletion failed, then return false.
    # 2.4. Otherwise, operation was defined with an identifier:
    #      1. Perform the steps listed in the description of operation with P as the only argument
    #         value.
    #      2. If operation was declared with a return type of boolean and the steps returned false,
    #         then return false.

    my $functionImplementationName = $operation->extendedAttributes->{ImplementedAs} || $codeGenerator->WK_lcfirst($operation->name) || "deleteNamedProperty";
    my $functionCall = "impl." . $functionImplementationName . "(propertyNameToString(propertyName))";

    # NOTE: We require the implementation function of named deleters without an identifier to
    #       return either bool or ExceptionOr<bool>.
    if (!$operation->name) {
        push(@$outputArray, "        using ReturnType = decltype($functionCall);\n");
        push(@$outputArray, "        static_assert(std::is_same_v<ReturnType, ExceptionOr<bool>> || std::is_same_v<ReturnType, bool>, \"The implementation of named deleters without an identifer must return either bool or ExceptionOr<bool>.\");\n");
    }

    push(@$outputArray, "        return performLegacyPlatformObjectDeleteOperation(*lexicalGlobalObject, [&] { return $functionCall; });\n");
    push(@$outputArray, "    }\n");
}

sub GenerateDeleteProperty
{
    my ($outputArray, $interface, $className, $operation, $conditional) = @_;

    # This implements https://webidl.spec.whatwg.org/#legacy-platform-object-delete for the
    # for the deleteProperty override hook.

    push(@$outputArray, "bool ${className}::deleteProperty(JSCell* cell, JSGlobalObject* lexicalGlobalObject, PropertyName propertyName, DeletePropertySlot& slot)\n");
    push(@$outputArray, "{\n");

    push(@$outputArray, "    auto& thisObject = *jsCast<${className}*>(cell);\n");
    push(@$outputArray, "    auto& impl = thisObject.wrapped();\n");

    # 1. If O supports indexed properties and P is an array index property name, then:
    #    1. Let index be the result of calling ToUint32(P).
    #    2. If index is not a supported property index, then return true.
    #    3. Return false.
    if (GetIndexedGetterOperation($interface)) {
        push(@$outputArray, "    if (auto index = parseIndex(propertyName))\n");
        push(@$outputArray, "        return !impl.isSupportedPropertyIndex(index.value());\n");
    }

    # GenerateDeletePropertyCommon implements step 2.
    GenerateDeletePropertyCommon($outputArray, $interface, $className, $operation, $conditional);

    # FIXME: Instead of calling down JSObject::deleteProperty, perhaps we should implement
    # the remained of the algorithm ourselves.
    push(@$outputArray, "    return JSObject::deleteProperty(cell, lexicalGlobalObject, propertyName, slot);\n");
    push(@$outputArray, "}\n\n");
}

sub GenerateDeletePropertyByIndex
{
    my ($outputArray, $interface, $className, $operation, $conditional) = @_;

    # This implements https://webidl.spec.whatwg.org/#legacy-platform-object-delete for the
    # for the deletePropertyByIndex override hook.

    push(@$outputArray, "bool ${className}::deletePropertyByIndex(JSCell* cell, JSGlobalObject* lexicalGlobalObject, unsigned index)\n");
    push(@$outputArray, "{\n");

    push(@$outputArray, "    auto& thisObject = *jsCast<${className}*>(cell);\n");
    push(@$outputArray, "    auto& impl = thisObject.wrapped();\n");

    # 1. If O supports indexed properties and P is an array index property name, then:
    #    1. Let index be the result of calling ToUint32(P).
    #    2. If index is not a supported property index, then return true.
    #    3. Return false.

    # NOTE: For deletePropertyByIndex, if there is an indexed getter, checking isSupportedPropertyIndex()
    #       is all that needs to be done, no need to generate the .

    if (GetIndexedGetterOperation($interface)) {
        push(@$outputArray, "    return !impl.isSupportedPropertyIndex(index);\n");
    } else {
        push(@$outputArray, "    VM& vm = JSC::getVM(lexicalGlobalObject);\n");
        push(@$outputArray, "    auto propertyName = Identifier::from(vm, index);\n");

        # GenerateDeletePropertyCommon implements step 2.
        GenerateDeletePropertyCommon($outputArray, $interface, $className, $operation, $conditional);

        # FIXME: Instead of calling down JSObject::deletePropertyByIndex, perhaps we should implement
        # the remaineder of the algoritm (steps 3 and 4) ourselves.
        
        # 3. If O has an own property with name P, then:
        #    1. If the property is not configurable, then return false.
        #    2. Otherwise, remove the property from O.
        # 3. Return true.
        
        push(@$outputArray, "    return JSObject::deletePropertyByIndex(cell, lexicalGlobalObject, index);\n");
    }

    push(@$outputArray, "}\n\n");
}


sub GenerateNamedDeleterDefinition
{
    my ($outputArray, $interface, $className) = @_;
    
    return if $interface->extendedAttributes->{CustomDeleteProperty};

    my $namedDeleterOperation = GetNamedDeleterOperation($interface);
    
    # This implements https://webidl.spec.whatwg.org/#legacy-platform-object-delete using
    # the deleteProperty and deletePropertyByIndex override hooks.

    assert("Named property deleters are not allowed without a corresponding named property getter.") if !GetNamedGetterOperation($interface);
    assert("Named property deleters are not allowed on global object interfaces.") if IsGlobalInterface($interface);

    my $conditional = $namedDeleterOperation->extendedAttributes->{Conditional};
    if ($conditional) {
        my $conditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($conditional);
        push(@$outputArray, "#if ${conditionalString}\n\n");;
    }

    GenerateDeleteProperty($outputArray, $interface, $className, $namedDeleterOperation, $conditional);
    GenerateDeletePropertyByIndex($outputArray, $interface, $className, $namedDeleterOperation, $conditional);

    push(@implContent, "#endif\n\n") if $conditional;
}

sub GenerateHeaderContentHeader
{
    my $interface = shift;
    my $className = "JS" . $interface->type->name;

    my @headerContentHeader;
    if ($interface->extendedAttributes->{AppleCopyright}) {
        @headerContentHeader = split("\r", $beginAppleCopyrightForHeaderFiles);
    } else {
        @headerContentHeader = split("\r", $headerTemplate);
    }

    push(@headerContentHeader, "\n#pragma once\n\n");

    my $conditionalString = $codeGenerator->GenerateConditionalString($interface);
    push(@headerContentHeader, "#if ${conditionalString}\n\n") if $conditionalString;
    return @headerContentHeader;
}

sub GenerateImplementationContentHeader
{
    my $interface = shift;
    my $className = "JS" . $interface->type->name;

    my @implContentHeader;
    if ($interface->extendedAttributes->{AppleCopyright}) {
        @implContentHeader = split("\r", $beginAppleCopyrightForSourceFiles);
    } else {
        @implContentHeader = split("\r", $headerTemplate);
    }

    push(@implContentHeader, "\n#include \"config.h\"\n");
    my $conditionalString = $codeGenerator->GenerateConditionalString($interface);
    push(@implContentHeader, "\n#if ${conditionalString}\n\n") if $conditionalString;
    push(@implContentHeader, "#include \"$className.h\"\n\n");
    return @implContentHeader;
}

sub NeedsImplementationClass
{
    my ($interface) = @_;

    return 0 if $interface->extendedAttributes->{JSBuiltin};
    return 0 if $interface->isNamespaceObject;
    return 1;
}

sub ShouldGenerateToWrapped
{
    my ($hasParent, $interface) = @_;

    return 0 if not NeedsImplementationClass($interface);
    return 1 if !$hasParent or $interface->extendedAttributes->{JSGenerateToNativeObject};
    return 1 if $interface->parentType && $interface->parentType->name eq "EventTarget";
    return 0;
}

sub ShouldGenerateWrapperOwnerCode
{
    my ($hasParent, $interface) = @_;

    return 0 if not NeedsImplementationClass($interface);
    return 1 if !$hasParent;
    return 1 if GetGenerateIsReachable($interface);
    return 1 if GetCustomIsReachable($interface);
    return 1 if $interface->extendedAttributes->{JSCustomFinalize};
    return 1 if $codeGenerator->InheritsExtendedAttribute($interface, "ActiveDOMObject");
    return 0;
}

sub ShouldGenerateToJSDeclaration
{
    my ($hasParent, $interface) = @_;

    return 0 if ($interface->extendedAttributes->{SuppressToJSObject});
    return 0 if not NeedsImplementationClass($interface);
    return 0 if IsDOMGlobalObject($interface);
    return 1 if (!$hasParent or $interface->extendedAttributes->{JSGenerateToJSObject} or $interface->extendedAttributes->{CustomToJSObject});
    return 1 if $interface->parentType && $interface->parentType->name eq "EventTarget";
    return 1 if @{$interface->constructors} > 0 && !HasCustomConstructor($interface);
    return 0;
}

sub ShouldGenerateToJSImplementation
{
    my ($hasParent, $interface) = @_;

    return 0 if not ShouldGenerateToJSDeclaration($hasParent, $interface);
    return 1 if not $interface->extendedAttributes->{CustomToJSObject};
    return 0;
}

sub GetTypeNameForDisplayInException
{
    my ($type) = @_;

    # FIXME: Add more type specializations.
    return "(" . join(" or ", map { $_->name } GetFlattenedMemberTypes($type)) . ")" if $type->isUnion;
    return $type->name;
}

sub GetArgumentExceptionFunction
{
    my ($interface, $argument, $argumentIndex, $quotedFunctionName) = @_;

    my $name = $argument->name;
    my $visibleInterfaceName = $codeGenerator->GetVisibleInterfaceName($interface);
    my $typeName = GetTypeNameForDisplayInException($argument->type);

    if ($codeGenerator->IsCallbackInterface($argument->type)) {
        return "throwArgumentMustBeObjectError(lexicalGlobalObject, scope, ${argumentIndex}, \"${name}\", \"${visibleInterfaceName}\", ${quotedFunctionName});";
    }

    if ($codeGenerator->IsCallbackFunction($argument->type)) {
        return "throwArgumentMustBeFunctionError(lexicalGlobalObject, scope, ${argumentIndex}, \"${name}\", \"${visibleInterfaceName}\", ${quotedFunctionName});";
    }

    if ($codeGenerator->IsWrapperType($argument->type) || $codeGenerator->IsBufferSourceType($argument->type)) {
        return "throwArgumentTypeError(lexicalGlobalObject, scope, ${argumentIndex}, \"${name}\", \"${visibleInterfaceName}\", ${quotedFunctionName}, \"${typeName}\");";
    }

    if ($codeGenerator->IsEnumType($argument->type)) {
        my $className = GetEnumerationClassName($argument->type, $interface);
        return "throwArgumentMustBeEnumError(lexicalGlobalObject, scope, ${argumentIndex}, \"${name}\", \"${visibleInterfaceName}\", ${quotedFunctionName}, expectedEnumerationValues<${className}>());";
    }

    return undef;
}

sub GetArgumentExceptionThrower
{
    my ($interface, $argument, $argumentIndex, $quotedFunctionName) = @_;

    my $functionCall = GetArgumentExceptionFunction($interface, $argument, $argumentIndex, $quotedFunctionName);
    return "[](JSC::JSGlobalObject& lexicalGlobalObject, JSC::ThrowScope& scope) { " . $functionCall . " }" if $functionCall;
}

sub GetAttributeExceptionFunction
{
    my ($interface, $attribute) = @_;
    
    my $name = $attribute->name;
    my $visibleInterfaceName = $codeGenerator->GetVisibleInterfaceName($interface);
    my $typeName = GetTypeNameForDisplayInException($attribute->type);

    if ($codeGenerator->IsWrapperType($attribute->type) || $codeGenerator->IsBufferSourceType($attribute->type)) {
        return "throwAttributeTypeError(lexicalGlobalObject, scope, \"${visibleInterfaceName}\", \"${name}\", \"${typeName}\");";
    }
}

sub GetAttributeExceptionThrower
{
    my ($interface, $attribute) = @_;

    my $functionCall = GetAttributeExceptionFunction($interface, $attribute);
    return "[](JSC::JSGlobalObject& lexicalGlobalObject, JSC::ThrowScope& scope) { " . $functionCall . " }" if $functionCall;

}

sub PassArgumentExpression
{
    my ($name, $context) = @_;

    my $type = $context->type;

    return "WTFMove(${name})" if $type->isNullable;

    if ($codeGenerator->IsBufferSourceType($type)) {
        return "*${name}" if $type->name eq "ArrayBuffer";
        return "${name}.releaseNonNull()";
    }

    if ($codeGenerator->IsPromiseType($type)) {
        return "WTFMove(${name})" if ref($context) eq "IDLArgument" && $context->isOptional;
        return "${name}.releaseNonNull()";
    }

    if ($codeGenerator->IsCallbackInterface($type) || $codeGenerator->IsCallbackFunction($type)) {
        return "WTFMove(${name})" if ref($context) eq "IDLArgument" && $context->isOptional;
        return "${name}.releaseNonNull()";
    }

    if ($codeGenerator->IsWrapperType($type)) {
        return "${name}" if ref($context) eq "IDLArgument" && $context->isOptional;
        return "*${name}";
    }

    return "WTFMove(${name})";
}

sub MangleAttributeOrFunctionName
{
    my ($name) = @_;

    $name =~ s/-/_dash_/g;

    return $name =~ /^_/ ? $name : '_' . $name;
}

sub GetAttributeGetterName
{
    my ($interface, $className, $attribute) = @_;

    return GetAttributeGetterName($interface, $className, GetSharedSyntheticAttribute($interface, $attribute)) if $attribute->extendedAttributes->{DelegateToSharedSyntheticAttribute};
    return GetJSBuiltinFunctionName($className, $attribute) if IsJSBuiltin($interface, $attribute);
    return $codeGenerator->WK_lcfirst($className) . "Constructor" . MangleAttributeOrFunctionName($attribute->name) if $attribute->isStatic;
    return $codeGenerator->WK_lcfirst($className) . MangleAttributeOrFunctionName($attribute->name) . "Constructor" if $codeGenerator->IsConstructorType($attribute->type);
    return $codeGenerator->WK_lcfirst($className) . MangleAttributeOrFunctionName($attribute->name);
}

sub GetAttributeSetterName
{
    my ($interface, $className, $attribute) = @_;

    return GetAttributeSetterName($interface, $className, GetSharedSyntheticAttribute($interface, $attribute)) if $attribute->extendedAttributes->{DelegateToSharedSyntheticAttribute};
    return "set" . $codeGenerator->WK_ucfirst(GetJSBuiltinFunctionName($className, $attribute)) if IsJSBuiltin($interface, $attribute);
    return "set" . $codeGenerator->WK_ucfirst($className) . "Constructor" . MangleAttributeOrFunctionName($attribute->name) if $attribute->isStatic;
    return "set" . $codeGenerator->WK_ucfirst($className) . MangleAttributeOrFunctionName($attribute->name);
}

sub GetFunctionName
{
    my ($interface, $className, $operation) = @_;

    return GetJSBuiltinFunctionName($className, $operation) if IsJSBuiltin($interface, $operation);

    my $functionName = $operation->name;
    $functionName = "SymbolIterator" if $functionName eq "[Symbol.Iterator]";

    my $kind = $operation->isStatic ? "Constructor" : (OperationShouldBeOnInstance($interface, $operation) ? "Instance" : "Prototype");
    return $codeGenerator->WK_lcfirst($className) . $kind . "Function" . MangleAttributeOrFunctionName($functionName);
}

sub GetFullyQualifiedImplementationCallName
{
    my ($interface, $property, $implementationName, $implExpression, $conditional) = @_;
    
    my $implementedBy = $property->extendedAttributes->{ImplementedBy};
    if ($implementedBy && !$property->extendedAttributes->{Reflect}) {
        AddToImplIncludes("${implementedBy}.h", $conditional);
        return "WebCore::${implementedBy}::${implementationName}";
    }
    
    if ($property->isStatic || $property->isConstructor) {
        return $interface->type->name . "::${implementationName}";
    }
    
    if ($property->extendedAttributes->{ForwardToMapLike}) {
        return "forward" . $codeGenerator->WK_ucfirst($property->name) . "ToMapLike";
    }
    
    if ($property->extendedAttributes->{ForwardToSetLike}) {
        return "forward" . $codeGenerator->WK_ucfirst($property->name) . "ToSetLike";
    }

    return "${implExpression}.${implementationName}";
}

sub AddAdditionalArgumentsForImplementationCall
{
    my ($arguments, $interface, $property, $implExpression, $globalObject, $callFrame, $thisObjectExpression) = @_;
    
    if ($property->extendedAttributes->{ImplementedBy} && !$property->isStatic && !$property->extendedAttributes->{Reflect}) {
        unshift(@$arguments, $implExpression);
    }
    
    if ($property->extendedAttributes->{ForwardToMapLike} or $property->extendedAttributes->{ForwardToSetLike}) {
        push(@$arguments, $globalObject);
        if (ref($property) eq "IDLOperation") {
            push(@$arguments, $callFrame);
        }
        push(@$arguments, $thisObjectExpression);
    }
}

sub GetSpecialAccessorOperationForType
{
    my ($interface, $special, $firstParameterType, $numberOfParameters) = @_;

    foreach my $operation (@{$interface->operations}, @{$interface->anonymousOperations}) {
        my $specials = $operation->specials;
        my $specialExists = grep { $_ eq $special } @$specials;
        my $arguments = $operation->arguments;
        if ($specialExists and scalar(@$arguments) == $numberOfParameters and $arguments->[0]->type->name eq $firstParameterType) {
            return $operation;
        }
    }

    return 0;
}

sub IsGlobalInterface
{
    my $interface = shift;

    return $interface->extendedAttributes->{Global};
}

sub AttributeShouldBeOnInstance
{
    my $interface = shift;
    my $attribute = shift;

    return 1 if IsGlobalInterface($interface);
    return 1 if $codeGenerator->IsConstructorType($attribute->type);

    # [LegacyUnforgeable] attributes should be on the instance.
    # https://webidl.spec.whatwg.org/#LegacyUnforgeable
    return 1 if IsLegacyUnforgeable($interface, $attribute);

    if ($interface->extendedAttributes->{CheckSecurity}) {
        return 0 if $attribute->extendedAttributes->{DoNotCheckSecurity};
        return 0 if $attribute->extendedAttributes->{DoNotCheckSecurityOnGetter};
        return 1;
    }

    return 0;
}

sub IsAlwaysExposedOnInterface
{
    my ($interfaceExposures, $contextExposures) = @_;

    my %contextExposureSet = ();

    if (ref($contextExposures) eq "ARRAY") {
        foreach my $contextExposure (@$contextExposures) {
            $contextExposureSet{$contextExposure} = 1;
        }
    } else {
        $contextExposureSet{$contextExposures} = 1;
    }

    if (ref($interfaceExposures) ne "ARRAY") {
        $interfaceExposures = [$interfaceExposures];
    }

    foreach my $interfaceExposure (@$interfaceExposures) {
        return 0 unless exists $contextExposureSet{$interfaceExposure};
    }

    return 1;
}

sub NeedsRuntimeCheck
{
    my ($interface, $context) = @_;

    if ($context->extendedAttributes->{Exposed}) {
        return 1 if !IsAlwaysExposedOnInterface($interface->extendedAttributes->{Exposed}, $context->extendedAttributes->{Exposed});
    }

    return $context->extendedAttributes->{EnabledAtRuntime}
        || $context->extendedAttributes->{EnabledForContext}
        || $context->extendedAttributes->{EnabledForWorld}
        || $context->extendedAttributes->{EnabledBySetting}
        || $context->extendedAttributes->{EnabledByQuirk}
        || $context->extendedAttributes->{DisabledByQuirk}
        || $context->extendedAttributes->{SecureContext};
}

sub NeedsRuntimeReadWriteCheck
{
    my ($interface, $context) = @_;
    
    return $context->extendedAttributes->{RuntimeConditionallyReadWrite}
        || $context->extendedAttributes->{SettingsConditionallyReadWrite}
}

# https://webidl.spec.whatwg.org/#es-operations
sub OperationShouldBeOnInstance
{
    my ($interface, $operation) = @_;

    return 1 if IsGlobalInterface($interface);

    # [LegacyUnforgeable] operations should be on the instance. https://webidl.spec.whatwg.org/#LegacyUnforgeable
    if (IsLegacyUnforgeable($interface, $operation)) {
        assert("The bindings generator does not support putting runtime-enabled operations on the instance yet (except for global objects):[" . $interface->type->name . "::" . $operation->name . "]") if NeedsRuntimeCheck($interface, $operation);
        return 1;
    }

    return 0;
}

sub GetOperationReturnedArgumentName
{
    my ($operation) = @_;

    my $argumentIndex = 0;
    foreach my $argument (@{$operation->arguments}) {
        return "argument${argumentIndex}" if $argument->extendedAttributes->{ReturnValue};
        $argumentIndex++;
    }

    return undef;
}

sub IsAcceleratedDOMAttribute
{
    my ($interface, $attribute) = @_;

    # If we use CustomGetterSetter in IDL code generator we cannot skip type check.
    return 0 if NeedsRuntimeCheck($interface, $attribute) and AttributeShouldBeOnInstance($interface, $attribute);
    return 0 if $attribute->extendedAttributes->{PrivateIdentifier} and AttributeShouldBeOnInstance($interface, $attribute);

    # If the interface has special logic for casting we cannot hoist type check to JSC.
    return 0 if IsDOMGlobalObject($interface);

    return 0 if $attribute->isStatic;
    return 0 if $attribute->extendedAttributes->{ForwardToMapLike};
    return 0 if $attribute->extendedAttributes->{ForwardToSetLike};
    return 0 if $codeGenerator->IsConstructorType($attribute->type);
    return 0 if IsJSBuiltin($interface, $attribute);
    return 0 if $attribute->extendedAttributes->{LegacyLenientThis};
    return 0 if $codeGenerator->IsPromiseType($attribute->type);
    return 0 if $attribute->extendedAttributes->{DOMJIT};
    return 1;
}

sub GetJSCAttributesForAttribute
{
    my $interface = shift;
    my $attribute = shift;

    my @specials = ();
    push(@specials, "JSC::PropertyAttribute::DontDelete") if IsLegacyUnforgeable($interface, $attribute);

    # As per Web IDL specification, constructor properties on the ECMAScript global object should not be enumerable.
    my $isGlobalConstructor = $codeGenerator->IsConstructorType($attribute->type);
    push(@specials, "JSC::PropertyAttribute::DontEnum") if ($attribute->extendedAttributes->{NotEnumerable} || $isGlobalConstructor);
    push(@specials, "JSC::PropertyAttribute::ReadOnly") if IsReadonly($attribute);
    push(@specials, "JSC::PropertyAttribute::CustomAccessor") unless $isGlobalConstructor or IsJSBuiltin($interface, $attribute);
    push(@specials, "JSC::PropertyAttribute::DOMAttribute") if IsAcceleratedDOMAttribute($interface, $attribute);
    push(@specials, "JSC::PropertyAttribute::DOMJITAttribute") if $attribute->extendedAttributes->{DOMJIT};
    push(@specials, "JSC::PropertyAttribute::Accessor | JSC::PropertyAttribute::Builtin") if  IsJSBuiltin($interface, $attribute);
    return "static_cast<unsigned>(" . ((@specials > 0) ? join(" | ", @specials) : "0") . ")";
}

sub GetIndexedGetterOperation
{
    my $interface = shift;
    return GetSpecialAccessorOperationForType($interface, "getter", "unsigned long", 1);
}

sub GetIndexedSetterOperation
{
    my $interface = shift;
    return GetSpecialAccessorOperationForType($interface, "setter", "unsigned long", 2);
}

sub GetNamedGetterOperation
{
    my $interface = shift;
    return GetSpecialAccessorOperationForType($interface, "getter", "DOMString", 1);
}

sub GetNamedSetterOperation
{
    my $interface = shift;
    return GetSpecialAccessorOperationForType($interface, "setter", "DOMString", 2);
}

sub GetNamedDeleterOperation
{
    my $interface = shift;
    return GetSpecialAccessorOperationForType($interface, "deleter", "DOMString", 1);
}

sub InstanceOperationCount
{
    my $interface = shift;
    my $count = 0;

    foreach my $operation (@{$interface->operations}) {
        $count++ if OperationShouldBeOnInstance($interface, $operation);
    }

    return $count;
}

sub PrototypeOperationCount
{
    my $interface = shift;
    my $count = 0;

    foreach my $operation (@{$interface->operations}) {
        $count++ if !$operation->isStatic && !OperationShouldBeOnInstance($interface, $operation);
    }

    return $count;
}

sub InstancePropertyCount
{
    my $interface = shift;
    my $count = 0;
    foreach my $attribute (@{$interface->attributes}) {
        $count++ if AttributeShouldBeOnInstance($interface, $attribute);
    }
    $count += InstanceOperationCount($interface);
    return $count;
}

sub PrototypePropertyCount
{
    my $interface = shift;
    my $count = 0;
    foreach my $attribute (@{$interface->attributes}) {
        $count++ if !AttributeShouldBeOnInstance($interface, $attribute);
    }
    $count += PrototypeOperationCount($interface);
    $count++ if NeedsConstructorProperty($interface);
    return $count;
}

sub InstanceOverridesGetOwnPropertySlot
{
    my $interface = shift;
    return $interface->extendedAttributes->{CustomGetOwnPropertySlot}
        || $interface->extendedAttributes->{Plugin}
        || GetIndexedGetterOperation($interface)
        || GetNamedGetterOperation($interface);
}

sub InstanceOverridesGetOwnPropertyNames
{
    my $interface = shift;
    return $interface->extendedAttributes->{CustomGetOwnPropertyNames}
        || GetIndexedGetterOperation($interface)
        || GetNamedGetterOperation($interface);
}

sub InstanceOverridesPut
{
    my $interface = shift;
    return $interface->extendedAttributes->{CustomPut}
        || $interface->extendedAttributes->{Plugin}
        || GetIndexedSetterOperation($interface)
        || GetNamedSetterOperation($interface);
}

sub InstanceOverridesDefineOwnProperty
{
    my $interface = shift;
    return $interface->extendedAttributes->{CustomDefineOwnProperty}
        || GetIndexedSetterOperation($interface)
        || GetNamedSetterOperation($interface);
}

sub InstanceOverridesDeleteProperty
{
    my $interface = shift;
    return $interface->extendedAttributes->{CustomDeleteProperty}
        || GetNamedDeleterOperation($interface);
}

sub PrototypeHasStaticPropertyTable
{
    my $interface = shift;
    my $numConstants = @{$interface->constants};
    return $numConstants > 0 || PrototypePropertyCount($interface) > 0;
}

sub InstanceNeedsVisitChildren
{
    my $interface = shift;
    
    foreach my $attribute (@{$interface->attributes}) {
        return 1 if $attribute->extendedAttributes->{CachedAttribute};
    }

    return 1 if $interface->extendedAttributes->{JSCustomMarkFunction};
    return 1 if $interface->extendedAttributes->{GenerateAddOpaqueRoot};
    return 1 if $interface->extendedAttributes->{Plugin};
    return 1 if $interface->extendedAttributes->{ReportExtraMemoryCost};
    return 0;
}

sub InstanceNeedsEstimatedSize
{
    my $interface = shift;
    return $interface->extendedAttributes->{ReportExtraMemoryCost};
}

sub GetImplClassName
{
    my $interface = shift;

    return $interface->type->name;
}

sub IsClassNameWordBoundary
{
    my ($name, $i) = @_;

    # Interpret negative numbers as distance from end of string, just as the substr function does.
    $i += length($name) if $i < 0;

    return 0 if $i < 0;
    return 1 if $i == 0;
    return 1 if $i == length($name);
    return 0 if $i > length($name);

    my $checkString = substr($name, $i - 1);
    return $checkString =~ /^[^A-Z][A-Z]/ || $checkString =~ /^[A-Z][A-Z][^A-Z]/;
}

sub IsPrefixRemovable
{
    my ($class, $name, $i) = @_;

    return IsClassNameWordBoundary($name, $i)
        && (IsClassNameWordBoundary($class, $i) && substr($class, 0, $i) eq substr($name, 0, $i)
            || IsClassNameWordBoundary($class, -$i) && substr($class, -$i) eq substr($name, 0, $i));
}

sub GetNestedClassName
{
    my ($interface, $name) = @_;

    my $class = GetImplClassName($interface);
    my $member = $codeGenerator->WK_ucfirst($name);

    # Since the enumeration name will be nested in the class name's namespace, remove any words
    # that happen to match the start or end of the class name. If an enumeration is named TrackType or
    # TextTrackType, and the class is named TextTrack, then we will get a name like TextTrack::Type.
    my $memberLength = length($member);
    my $longestPrefixLength = 0;
    if ($member =~ /^[A-Z]./) {
        for (my $i = 2; $i < $memberLength - 1; $i++) {
            $longestPrefixLength = $i if IsPrefixRemovable($class, $member, $i);
        }
    }
    $member = substr($member, $longestPrefixLength);

    return "${class}::$member";
}

sub GetEnumerationClassName
{
    my ($type, $interface) = @_;

    assert("Not a type") if ref($type) ne "IDLType";

    if ($codeGenerator->HasEnumImplementationNameOverride($type)) {
        return $codeGenerator->GetEnumImplementationNameOverride($type);
    }

    my $name = $type->name;

    return $name if $codeGenerator->IsExternalEnumType($type);
    return $name unless defined($interface);

    return GetNestedClassName($interface, $name);
}

sub GetEnumerationValueName
{
    my ($name) = @_;

    return "EmptyString" if $name eq "";
    return "WebRTC" if $name eq "webrtc";
    $name = join("", map { $codeGenerator->WK_ucfirst($_) } split("-", $name));
    $name = "_$name" if $name =~ /^\d/;
    return $name;
}

sub GenerateEnumerationHeader
{
    my ($object, $enumeration, $className) = @_;
 
    # - Add default header template and header protection.
    push(@headerContentHeader, GenerateHeaderContentHeader($enumeration));

    $headerIncludes{"${className}.h"} = 1;

    push(@headerContent, "\nnamespace WebCore {\n\n");
    push(@headerContent, GenerateEnumerationHeaderContent($enumeration, $className));
    push(@headerContent, "} // namespace WebCore\n");
     
    my $conditionalString = $codeGenerator->GenerateConditionalString($enumeration);
    push(@headerContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
}
 
sub GenerateEnumerationImplementation
{
    my ($object, $enumeration, $className) = @_;
 
    # - Add default header template
    push(@implContentHeader, GenerateImplementationContentHeader($enumeration));

    push(@implContent, "\n\nnamespace WebCore {\n");
    push(@implContent, "using namespace JSC;\n\n");
    push(@implContent, GenerateEnumerationImplementationContent($enumeration, $className));
    push(@implContent, "} // namespace WebCore\n");
     
    my $conditionalString = $codeGenerator->GenerateConditionalString($enumeration);
    push(@implContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
}

sub GenerateEnumerationImplementationContent
{
    my ($enumeration, $className, $interface, $conditionalString) = @_;

    # FIXME: A little ugly to have this be a side effect instead of a return value.
    AddToImplIncludes("<JavaScriptCore/JSString.h>");
    AddToImplIncludes("<JavaScriptCore/JSCInlines.h>");
    AddToImplIncludes("JSDOMConvertEnumeration.h");

    my $result = "";
    $result .= "#if ${conditionalString}\n\n" if $conditionalString;


    $result .= "String convertEnumerationToString($className enumerationValue)\n";
    $result .= "{\n";
    AddToImplIncludes("<wtf/NeverDestroyed.h>");
    $result .= "    static const NeverDestroyed<String> values[] = {\n";
    foreach my $value (@{$enumeration->values}) {
        if ($value eq "") {
            $result .= "        emptyString(),\n";
        } else {
            $result .= "        MAKE_STATIC_STRING_IMPL(\"$value\"),\n";
        }
    }
    $result .= "    };\n";
    my $index = 0;
    foreach my $value (@{$enumeration->values}) {
        my $enumerationValueName = GetEnumerationValueName($value);
        $result .= "    static_assert(static_cast<size_t>(${className}::$enumerationValueName) == $index, \"${className}::$enumerationValueName is not $index as expected\");\n";
        $index++;
    }
    $result .= "    ASSERT(static_cast<size_t>(enumerationValue) < WTF_ARRAY_LENGTH(values));\n";
    $result .= "    return values[static_cast<size_t>(enumerationValue)];\n";
    $result .= "}\n\n";


    # FIXME: Change to take VM& instead of JSGlobalObject*.
    $result .= "template<> JSString* convertEnumerationToJS(JSGlobalObject& lexicalGlobalObject, $className enumerationValue)\n";
    $result .= "{\n";
    $result .= "    return jsStringWithCache(lexicalGlobalObject.vm(), convertEnumerationToString(enumerationValue));\n";
    $result .= "}\n\n";

    # FIXME: Change to take VM& instead of JSGlobalObject&.
    # FIXME: Consider using toStringOrNull to make exception checking faster.
    # FIXME: Consider finding a more efficient way to match against all the strings quickly.
    $result .= "template<> std::optional<$className> parseEnumeration<$className>(JSGlobalObject& lexicalGlobalObject, JSValue value)\n";
    $result .= "{\n";
    $result .= "    auto stringValue = value.toWTFString(&lexicalGlobalObject);\n";
    foreach my $value (@{$enumeration->values}) {
        my $enumerationValueName = GetEnumerationValueName($value);
        if ($value eq "") {
            $result .= "    if (stringValue.isEmpty())\n";
        } else {
            $result .= "    if (stringValue == \"$value\")\n";
        }
        $result .= "        return ${className}::${enumerationValueName};\n";
    }
    $result .= "    return std::nullopt;\n";
    $result .= "}\n\n";

    $result .= "template<> const char* expectedEnumerationValues<$className>()\n";
    $result .= "{\n";
    $result .= "    return \"\\\"" . join ("\\\", \\\"", @{$enumeration->values}) . "\\\"\";\n";
    $result .= "}\n\n";

    $result .= "#endif\n\n" if $conditionalString;

    return $result;
}

sub GenerateEnumerationsImplementationContent
{
    my ($interface, $enumerations) = @_;

    return "" unless @$enumerations;

    my $result = "";
    foreach my $enumeration (@$enumerations) {
        my $className = GetEnumerationClassName($enumeration->type, $interface);
        my $conditionalString = $codeGenerator->GenerateConditionalString($enumeration);
        $result .= GenerateEnumerationImplementationContent($enumeration, $className, $interface, $conditionalString);
    }
    return $result;
}

sub GenerateEnumerationHeaderContent
{
    my ($enumeration, $className, $conditionalString) = @_;

    $headerIncludes{"JSDOMConvertEnumeration.h"} = 1;

    my $result = "";
    $result .= "#if ${conditionalString}\n\n" if $conditionalString;

    my $exportMacro = GetExportMacroForJSClass($enumeration);

    $result .= "${exportMacro}String convertEnumerationToString($className);\n";
    $result .= "template<> ${exportMacro}JSC::JSString* convertEnumerationToJS(JSC::JSGlobalObject&, $className);\n\n";
    $result .= "template<> ${exportMacro}std::optional<$className> parseEnumeration<$className>(JSC::JSGlobalObject&, JSC::JSValue);\n";
    $result .= "template<> ${exportMacro}const char* expectedEnumerationValues<$className>();\n\n";
    $result .= "#endif\n\n" if $conditionalString;
    
    return $result;
}

sub GenerateEnumerationsHeaderContent
{
    my ($interface, $enumerations) = @_;

    return "" unless @$enumerations;

    # FIXME: Could optimize this to only generate the parts of each enumeration that are actually
    # used, which would require iterating over everything in the interface.

    my $result = "";
    foreach my $enumeration (@$enumerations) {
        my $className = GetEnumerationClassName($enumeration->type, $interface);
        my $conditionalString = $codeGenerator->GenerateConditionalString($enumeration);
        $result .= GenerateEnumerationHeaderContent($enumeration, $className, $conditionalString);
    }
    return $result;
}

sub GetDictionaryClassName
{
    my ($type, $interface) = @_;

    if ($codeGenerator->HasDictionaryImplementationNameOverride($type)) {
        return $codeGenerator->GetDictionaryImplementationNameOverride($type);
    }

    my $name = $type->name;
    return $name if $codeGenerator->IsExternalDictionaryType($type);
    return $name unless defined($interface);
    return GetNestedClassName($interface, $name);
}

sub GenerateDefaultValue
{
    my ($typeScope, $context, $type, $defaultValue) = @_;

    if ($defaultValue eq "null") {
        if ($type->isUnion) {
            return "std::nullopt" if $type->isNullable;

            my $IDLType = GetIDLType($typeScope, $type);
            return "convert<${IDLType}>(lexicalGlobalObject, jsNull());";
        }

        return "jsNull()" if $type->name eq "any";
        return "nullptr" if $codeGenerator->IsWrapperType($type) || $codeGenerator->IsBufferSourceType($type);
        if ($codeGenerator->IsStringType($type)) {
            my $useAtomString = $type->extendedAttributes->{AtomString};
            return $useAtomString ? "nullAtom()" : "String()";
        }
        return "std::nullopt";
    }

    if ($defaultValue eq "[]") {
        my $IDLType = GetIDLType($typeScope, $type);
        return "Converter<${IDLType}>::ReturnType{ }";
    }

    return "jsUndefined()" if $defaultValue eq "undefined";
    return "PNaN" if $defaultValue eq "NaN";

    if (substr($defaultValue, 0, 1) eq "\"") {
        # Default value is a quoted string so the type should be a DOMString or an enumeration.
        if ($type->isUnion) {
            foreach my $memberType (GetFlattenedMemberTypes($type)) {
                if ($codeGenerator->IsStringType($memberType) || $codeGenerator->IsEnumType($memberType)) {
                    $type = $memberType;
                    last;
                }
            }
        }
        if ($codeGenerator->IsStringType($type)) {
            my $useAtomString = $type->extendedAttributes->{AtomString};
            if ($defaultValue eq "\"\"") {
                return $useAtomString ? "emptyAtom()" : "emptyString()";
            } else {
                return $useAtomString ? "AtomString(${defaultValue}, AtomString::ConstructFromLiteral)" : "${defaultValue}_s";
            }
        }

        if ($codeGenerator->IsEnumType($type)) {
            my $className = GetEnumerationClassName($type, $typeScope);
            my $enumerationValueName = GetEnumerationValueName(substr($defaultValue, 1, -1));
            return $className . "::" . $enumerationValueName;
        }
    }

    return $defaultValue;
}

sub GenerateDictionaryHeaderContent
{
    my ($dictionary, $className, $conditionalString) = @_;

    $headerIncludes{"JSDOMConvertDictionary.h"} = 1;

    my $exportMacro = GetExportMacroForJSClass($dictionary);

    my $result = "";
    $result .= "#if ${conditionalString}\n\n" if $conditionalString;
    $result .= "template<> ${exportMacro}${className} convertDictionary<${className}>(JSC::JSGlobalObject&, JSC::JSValue);\n\n";

    if ($dictionary->extendedAttributes->{JSGenerateToJSObject}) {
        $result .= "${exportMacro}JSC::JSObject* convertDictionaryToJS(JSC::JSGlobalObject&, JSDOMGlobalObject&, const ${className}&);\n\n";
    }

    $result .= "#endif\n\n" if $conditionalString;
    return $result;
}

sub GenerateDictionariesHeaderContent
{
    my ($typeScope, $allDictionaries) = @_;

    return "" unless @$allDictionaries;

    my $result = "";
    foreach my $dictionary (@$allDictionaries) {
        $headerIncludes{$typeScope->type->name . ".h"} = 1 if $typeScope;
        my $className = GetDictionaryClassName($dictionary->type, $typeScope);
        my $conditionalString = $codeGenerator->GenerateConditionalString($dictionary);
        $result .= GenerateDictionaryHeaderContent($dictionary, $className, $conditionalString);
    }
    return $result;
}

sub GenerateDictionaryImplementationContent
{
    my ($dictionary, $className, $interface) = @_;

    my $result = "";

    my $name = $dictionary->type->name;
    my $typeScope = $interface || $dictionary;

    my $conditional = $dictionary->extendedAttributes->{Conditional};
    if ($conditional) {
        my $conditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($conditional);
        $result .= "#if ${conditionalString}\n\n";
    }

    # FIXME: A little ugly to have this be a side effect instead of a return value.
    AddToImplIncludes("<JavaScriptCore/JSCInlines.h>");
    AddToImplIncludes("JSDOMConvertDictionary.h");

    # https://webidl.spec.whatwg.org/#es-dictionary
    $result .= "template<> $className convertDictionary<$className>(JSGlobalObject& lexicalGlobalObject, JSValue value)\n";
    $result .= "{\n";
    $result .= "    VM& vm = JSC::getVM(&lexicalGlobalObject);\n";
    $result .= "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n";
    $result .= "    bool isNullOrUndefined = value.isUndefinedOrNull();\n";
    $result .= "    auto* object = isNullOrUndefined ? nullptr : value.getObject();\n";

    # 1. If Type(V) is not Undefined, Null or Object, then throw a TypeError.
    $result .= "    if (UNLIKELY(!isNullOrUndefined && !object)) {\n";
    $result .= "        throwTypeError(&lexicalGlobalObject, throwScope);\n";
    $result .= "        return { };\n";
    $result .= "    }\n";

    # 2. Let dict be an empty dictionary value of type D; every dictionary member is initially considered to be not present.

    # 3. Let dictionaries be a list consisting of D and all of D’s inherited dictionaries, in order from least to most derived.
    my @dictionaries;
    push(@dictionaries, $dictionary);
    my $parentType = $dictionary->parentType;
    while (defined($parentType)) {
        my $parentDictionary = $codeGenerator->GetDictionaryByType($parentType);
        assert("Unable to find definition for dictionary named '" . $parentType->name . "'!") unless defined($parentDictionary);
        unshift(@dictionaries, $parentDictionary);
        $parentType = $parentDictionary->parentType;
    }

    my $arguments = "";
    my $comma = "";

    $result .= "    $className result;\n";

    # 4. For each dictionary dictionary in dictionaries, in order:
    foreach my $dictionary (@dictionaries) {
        # For each dictionary member member declared on dictionary, in lexicographical order:
        my @sortedMembers = sort { $a->name cmp $b->name } @{$dictionary->members};
        foreach my $member (@sortedMembers) {
            $member->default("undefined") if $member->type->name eq "any" and !defined($member->default); # Use undefined as default value for member of type 'any' unless specified otherwise.
            my $conditional = $member->extendedAttributes->{Conditional};

            my $type = $member->type;
            AddToImplIncludesForIDLType($type, $conditional);

            if ($conditional) {
                my $conditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($conditional);
                $result .= "#if ${conditionalString}\n";
            }

            my $needsRuntimeCheck = NeedsRuntimeCheck($dictionary, $member);
            my $indent = "";
            if ($needsRuntimeCheck) {
                my $runtimeEnableConditionalString = GenerateRuntimeEnableConditionalString($dictionary, $member, "&lexicalGlobalObject");
                $result .= "    if (${runtimeEnableConditionalString}) {\n";
                $indent = "    ";
            }

            # 4.1. Let key be the identifier of member.
            my $key = $member->name;
            my $implementedAsKey = $member->extendedAttributes->{ImplementedAs} || $key;

            # 4.2. Let value be an ECMAScript value, depending on Type(V):
            $result .= "${indent}    JSValue ${key}Value;\n";
            $result .= "${indent}    if (isNullOrUndefined)\n";
            $result .= "${indent}        ${key}Value = jsUndefined();\n";
            $result .= "${indent}    else {\n";
            $result .= "${indent}        ${key}Value = object->get(&lexicalGlobalObject, Identifier::fromString(vm, \"${key}\"));\n";
            $result .= "${indent}        RETURN_IF_EXCEPTION(throwScope, { });\n";
            $result .= "${indent}    }\n";

            my $IDLType = GetIDLType($typeScope, $type);

            # 4.3. If value is not undefined, then:
            $result .= "${indent}    if (!${key}Value.isUndefined()) {\n";

            my $nativeValue = JSValueToNative($typeScope, $member, "${key}Value", $member->extendedAttributes->{Conditional}, "&lexicalGlobalObject", "lexicalGlobalObject", "", "*jsCast<JSDOMGlobalObject*>(&lexicalGlobalObject)");
            $result .= "${indent}        result.$implementedAsKey = $nativeValue;\n";
            $result .= "${indent}        RETURN_IF_EXCEPTION(throwScope, { });\n";

            # Value is undefined.
            # 4.4. Otherwise, if value is undefined but the dictionary member has a default value, then:
            if (!$member->isRequired && defined $member->default) {
                $result .= "${indent}    } else\n";
                $result .= "${indent}        result.$implementedAsKey = " . GenerateDefaultValue($typeScope, $member, $member->type, $member->default) . ";\n";
            } elsif ($member->isRequired) {
                # 4.5. Otherwise, if value is undefined and the dictionary member is a required dictionary member, then throw a TypeError.
                $result .= "${indent}    } else {\n";
                $result .= "${indent}        throwRequiredMemberTypeError(lexicalGlobalObject, throwScope, \"". $member->name ."\", \"$name\", \"". GetTypeNameForDisplayInException($type) ."\");\n";
                $result .= "${indent}        return { };\n";
                $result .= "${indent}    }\n";
            } else {
                $result .= "${indent}    }\n";
            }

            if ($needsRuntimeCheck) {
                $result .= "    }\n";
            }

            $result .= "#endif\n" if $conditional;
        }
    }

    # 5. Return dict.
    $result .= "    return result;\n";
    $result .= "}\n\n";

    if ($dictionary->extendedAttributes->{JSGenerateToJSObject}) {
        AddToImplIncludes("JSDOMGlobalObject.h");
        AddToImplIncludes("<JavaScriptCore/ObjectConstructor.h>");

        my $hasUnconditionalMember = 0;

        $result .= "JSC::JSObject* convertDictionaryToJS(JSC::JSGlobalObject& lexicalGlobalObject, JSDOMGlobalObject& globalObject, const ${className}& dictionary)\n";
        $result .= "{\n";
        $result .= "    auto& vm = JSC::getVM(&lexicalGlobalObject);\n";
        $result .= "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n\n";

        # 1. Let O be ! ObjectCreate(%ObjectPrototype%).
        $result .= "    auto result = constructEmptyObject(&lexicalGlobalObject, globalObject.objectPrototype());\n\n";

        # 2. Let dictionaries be a list consisting of D and all of D’s inherited dictionaries,
        #    in order from least to most derived.
        #    NOTE: This was done above.

        # 3. For each dictionary dictionary in dictionaries, in order:
        foreach my $dictionary (@dictionaries) {
            # 3.1. For each dictionary member member declared on dictionary, in lexicographical order:
            my @sortedMembers = sort { $a->name cmp $b->name } @{$dictionary->members};
            foreach my $member (@sortedMembers) {
                my $key = $member->name;
                my $implementedAsKey = $member->extendedAttributes->{ImplementedAs} || $key;
                my $valueExpression = "dictionary.${implementedAsKey}";

                my $conditional = $member->extendedAttributes->{Conditional};
                if ($conditional) {
                    my $conditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($conditional);
                    $result .= "#if ${conditionalString}\n";
                } else {
                    $hasUnconditionalMember = 1;
                }

                # 1. Let key be the identifier of member.
                # 2. If the dictionary member named key is present in V, then:
                    # 1. Let idlValue be the value of member on V.
                    # 2. Let value be the result of converting idlValue to an ECMAScript value.
                    # 3. Perform ! CreateDataProperty(O, key, value).

                my $needsRuntimeCheck = NeedsRuntimeCheck($dictionary, $member);
                my $indent = "";
                if ($needsRuntimeCheck) {
                    my $runtimeEnableConditionalString = GenerateRuntimeEnableConditionalString($dictionary, $member, "&globalObject");
                    $result .= "    if (${runtimeEnableConditionalString}) {\n";
                    $indent = "    ";
                }

                if (!$member->isRequired && not defined $member->default) {
                    my $IDLType = GetIDLType($typeScope, $member->type);
                    my $conversionExpression = NativeToJSValueUsingReferences($member, $typeScope, "${IDLType}::extractValueFromNullable(${valueExpression})", "globalObject");

                    $result .= "${indent}    if (!${IDLType}::isNullValue(${valueExpression})) {\n";
                    $result .= "${indent}        auto ${key}Value = ${conversionExpression};\n";
                    $result .= "${indent}        RETURN_IF_EXCEPTION(throwScope, { });\n";
                    $result .= "${indent}        result->putDirect(vm, JSC::Identifier::fromString(vm, \"${key}\"), ${key}Value);\n";
                    $result .= "${indent}    }\n";
                } else {
                    my $conversionExpression = NativeToJSValueUsingReferences($member, $typeScope, $valueExpression, "globalObject");

                    $result .= "${indent}    auto ${key}Value = ${conversionExpression};\n";
                    $result .= "${indent}    RETURN_IF_EXCEPTION(throwScope, { });\n";
                    $result .= "${indent}    result->putDirect(vm, JSC::Identifier::fromString(vm, \"${key}\"), ${key}Value);\n";
                }
                if ($needsRuntimeCheck) {
                    $result .= "    }\n";
                }

                $result .= "#endif\n" if $conditional;
            }
        }

        if (!$hasUnconditionalMember) {
            $result .= "    UNUSED_PARAM(dictionary);\n";
            $result .= "    UNUSED_VARIABLE(throwScope);\n\n";
        }

        $result .= "    return result;\n";
        $result .= "}\n\n";
    }

    $result .= "#endif\n\n" if $conditional;

    return $result;
}

sub GenerateDictionariesImplementationContent
{
    my ($typeScope, $allDictionaries) = @_;

    my $result = "";
    foreach my $dictionary (@$allDictionaries) {
        my $className = GetDictionaryClassName($dictionary->type, $typeScope);
        $result .= GenerateDictionaryImplementationContent($dictionary, $className, $typeScope);
    }
    return $result;
}

sub GetJSTypeForNode
{
    my ($interface) = @_;

    if ($codeGenerator->InheritsInterface($interface, "Document")) {
        return "JSDocumentWrapperType";
    }
    if ($codeGenerator->InheritsInterface($interface, "DocumentFragment")) {
        return "JSDocumentFragmentNodeType";
    }
    if ($codeGenerator->InheritsInterface($interface, "DocumentType")) {
        return "JSDocumentTypeNodeType";
    }
    if ($codeGenerator->InheritsInterface($interface, "ProcessingInstruction")) {
        return "JSProcessingInstructionNodeType";
    }
    if ($codeGenerator->InheritsInterface($interface, "CDATASection")) {
        return "JSCDATASectionNodeType";
    }
    if ($codeGenerator->InheritsInterface($interface, "Attr")) {
        return "JSAttrNodeType";
    }
    if ($codeGenerator->InheritsInterface($interface, "Comment")) {
        return "JSCommentNodeType";
    }
    if ($codeGenerator->InheritsInterface($interface, "Text")) {
        return "JSTextNodeType";
    }
    if ($codeGenerator->InheritsInterface($interface, "Element")) {
        return "JSElementType";
    }
    return "JSNodeType";
}

sub GenerateHeader
{
    my ($object, $interface, $enumerations, $dictionaries) = @_;

    my $interfaceName = $interface->type->name;
    my $className = "JS$interfaceName";
    my %structureFlags = ();

    my $hasParent = $interface->parentType || $interface->extendedAttributes->{JSLegacyParent};
    my $parentClassName = GetParentClassName($interface);
    my $needsVisitChildren = InstanceNeedsVisitChildren($interface);

    # - Add default header template and header protection
    push(@headerContentHeader, GenerateHeaderContentHeader($interface));

    if ($hasParent) {
        $headerIncludes{"$parentClassName.h"} = 1;
    } else {
        $headerIncludes{"JSDOMWrapper.h"} = 1;
        if ($interface->extendedAttributes->{Exception}) {
            $headerIncludes{"<JavaScriptCore/ErrorPrototype.h>"} = 1;
        }
    }

    $headerIncludes{"SVGElement.h"} = 1 if $className =~ /^JSSVG/;

    my $implType = GetImplClassName($interface);

    my $numConstants = @{$interface->constants};
    my $numAttributes = @{$interface->attributes};
    my $numOperations = @{$interface->operations};

    push(@headerContent, "\nnamespace WebCore {\n\n");

    if ($codeGenerator->IsSVGAnimatedType($interface->type)) {
        $headerIncludes{"SVGAnimatedPropertyImpl.h"} = 1;
    } elsif ($codeGenerator->IsSVGPathSegType($interface->type)) {
        $headerIncludes{"SVGPathSegImpl.h"} = 1;
    } else {
        $headerIncludes{"$interfaceName.h"} = 1 if $hasParent && $interface->extendedAttributes->{JSGenerateToNativeObject};
        # Implementation class forward declaration
        if (IsDOMGlobalObject($interface)) {
            AddClassForwardIfNeeded($interface->type);
        }
    }

    push(@headerContent, "class JSWindowProxy;\n\n") if $interfaceName eq "DOMWindow" or $interfaceName eq "RemoteDOMWindow";

    my $exportMacro = GetExportMacroForJSClass($interface);

    # Class declaration
    push(@headerContent, "class $exportMacro$className : public $parentClassName {\n");

    # Static create methods
    push(@headerContent, "public:\n");
    push(@headerContent, "    using Base = $parentClassName;\n");
    push(@headerContent, "    using DOMWrapped = $implType;\n") if $hasParent;

    if ($interfaceName eq "DOMWindow" || $interfaceName eq "RemoteDOMWindow") {
        push(@headerContent, "    static $className* create(JSC::VM& vm, JSC::Structure* structure, Ref<$implType>&& impl, JSWindowProxy* proxy)\n");
        push(@headerContent, "    {\n");
        push(@headerContent, "        $className* ptr = new (NotNull, JSC::allocateCell<$className>(vm)) ${className}(vm, structure, WTFMove(impl), proxy);\n");
        push(@headerContent, "        ptr->finishCreation(vm, proxy);\n");
        push(@headerContent, "        return ptr;\n");
        push(@headerContent, "    }\n\n");
    } elsif (ShouldCreateWithJSProxy($codeGenerator, $interface)) {
        push(@headerContent, "    static $className* create(JSC::VM& vm, JSC::Structure* structure, Ref<$implType>&& impl, JSC::JSProxy* proxy)\n");
        push(@headerContent, "    {\n");
        push(@headerContent, "        $className* ptr = new (NotNull, JSC::allocateCell<$className>(vm)) ${className}(vm, structure, WTFMove(impl));\n");
        push(@headerContent, "        ptr->finishCreation(vm, proxy);\n");
        push(@headerContent, "        return ptr;\n");
        push(@headerContent, "    }\n\n");
    } elsif ($interface->extendedAttributes->{MasqueradesAsUndefined}) {
        AddIncludesForImplementationTypeInHeader($implType);
        push(@headerContent, "    static $className* create(JSC::Structure* structure, JSDOMGlobalObject* globalObject, Ref<$implType>&& impl)\n");
        push(@headerContent, "    {\n");
        push(@headerContent, "        globalObject->masqueradesAsUndefinedWatchpoint()->fireAll(globalObject->vm(), \"Allocated masquerading object\");\n");
        push(@headerContent, "        $className* ptr = new (NotNull, JSC::allocateCell<$className>(globalObject->vm())) $className(structure, *globalObject, WTFMove(impl));\n");
        push(@headerContent, "        ptr->finishCreation(globalObject->vm());\n");
        push(@headerContent, "        return ptr;\n");
        push(@headerContent, "    }\n\n");
    } elsif (!NeedsImplementationClass($interface)) {
        push(@headerContent, "    static $className* create(JSC::Structure* structure, JSDOMGlobalObject* globalObject)\n");
        push(@headerContent, "    {\n");
        push(@headerContent, "        $className* ptr = new (NotNull, JSC::allocateCell<$className>(globalObject->vm())) $className(structure, *globalObject);\n");
        push(@headerContent, "        ptr->finishCreation(globalObject->vm());\n");
        push(@headerContent, "        return ptr;\n");
        push(@headerContent, "    }\n\n");  
    } else {
        if (!$codeGenerator->IsSVGAnimatedType($interface->type) && !$codeGenerator->IsSVGPathSegType($interface->type)) {
            AddIncludesForImplementationTypeInHeader($implType);
        }
        push(@headerContent, "    static $className* create(JSC::Structure* structure, JSDOMGlobalObject* globalObject, Ref<$implType>&& impl)\n");
        push(@headerContent, "    {\n");
        push(@headerContent, "        $className* ptr = new (NotNull, JSC::allocateCell<$className>(globalObject->vm())) $className(structure, *globalObject, WTFMove(impl));\n");
        push(@headerContent, "        ptr->finishCreation(globalObject->vm());\n");
        push(@headerContent, "        return ptr;\n");
        push(@headerContent, "    }\n\n");
    }

    $structureFlags{"JSC::HasStaticPropertyTable"} = 1 if InstancePropertyCount($interface) > 0;
    $structureFlags{"JSC::NewImpurePropertyFiresWatchpoints"} = 1 if $interface->extendedAttributes->{NewImpurePropertyFiresWatchpoints};
    $structureFlags{"JSC::IsImmutablePrototypeExoticObject"} = 1 if $interface->extendedAttributes->{IsImmutablePrototypeExoticObject};
    $structureFlags{"JSC::MasqueradesAsUndefined"} = 1 if $interface->extendedAttributes->{MasqueradesAsUndefined};
    $structureFlags{"JSC::ImplementsHasInstance | JSC::ImplementsDefaultHasInstance"} = 1 if $interfaceName eq "DOMWindow";
        
    # Prototype
    unless (ShouldUseGlobalObjectPrototype($interface) || ShouldUseOrdinaryObjectPrototype($interface)) {
        push(@headerContent, "    static JSC::JSObject* createPrototype(JSC::VM&, JSDOMGlobalObject&);\n");
        push(@headerContent, "    static JSC::JSObject* prototype(JSC::VM&, JSDOMGlobalObject&);\n");
    }

    # JSValue to implementation type
    if (ShouldGenerateToWrapped($hasParent, $interface)) {
        my $export = "";
        $export = "WEBCORE_EXPORT " if $interface->extendedAttributes->{ExportToWrappedFunction};
        push(@headerContent, "    static ${export}${implType}* toWrapped(JSC::VM&, JSC::JSValue);\n");
    }

    $headerTrailingIncludes{"${className}Custom.h"} = 1 if $interface->extendedAttributes->{JSCustomHeader};

    my $namedGetterOperation = GetNamedGetterOperation($interface);
    my $indexedGetterOperation = GetIndexedGetterOperation($interface);

    # FIXME: Why doesn't this also include Indexed Getters and [CustomGetOwnPropertySlot]
    if ($namedGetterOperation) {
        if ($codeGenerator->InheritsExtendedAttribute($interface, "LegacyOverrideBuiltIns")) {
            $structureFlags{"JSC::GetOwnPropertySlotIsImpure"} = 1;
        } else {
            $structureFlags{"JSC::GetOwnPropertySlotIsImpureForPropertyAbsence"} = 1;
        }
    }
    
    # ClassInfo MethodTable declarations.
    
    if (InstanceOverridesGetOwnPropertySlot($interface)) {
        push(@headerContent, "    static bool getOwnPropertySlot(JSC::JSObject*, JSC::JSGlobalObject*, JSC::PropertyName, JSC::PropertySlot&);\n");
        $structureFlags{"JSC::OverridesGetOwnPropertySlot"} = 1;
        push(@headerContent, "    static bool getOwnPropertySlotByIndex(JSC::JSObject*, JSC::JSGlobalObject*, unsigned propertyName, JSC::PropertySlot&);\n");
        $structureFlags{"JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero"} = 1;
    }

    if ($interface->extendedAttributes->{Plugin} || GetNamedSetterOperation($interface)) {
        $structureFlags{"JSC::ProhibitsPropertyCaching"} = 1;
    }
    
    if (InstanceOverridesGetOwnPropertyNames($interface)) {
        push(@headerContent, "    static void getOwnPropertyNames(JSC::JSObject*, JSC::JSGlobalObject*, JSC::PropertyNameArray&, JSC::DontEnumPropertiesMode);\n");
        $structureFlags{"JSC::OverridesGetOwnPropertyNames"} = 1;
    }
    
    if (InstanceOverridesPut($interface)) {
        push(@headerContent, "    static bool put(JSC::JSCell*, JSC::JSGlobalObject*, JSC::PropertyName, JSC::JSValue, JSC::PutPropertySlot&);\n");
        push(@headerContent, "    static bool putByIndex(JSC::JSCell*, JSC::JSGlobalObject*, unsigned propertyName, JSC::JSValue, bool shouldThrow);\n");
        $structureFlags{"JSC::OverridesPut"} = 1;
    }
    
    if (InstanceOverridesDefineOwnProperty($interface)) {
        push(@headerContent, "    static bool defineOwnProperty(JSC::JSObject*, JSC::JSGlobalObject*, JSC::PropertyName, const JSC::PropertyDescriptor&, bool shouldThrow);\n");
    }

    if (InstanceOverridesDeleteProperty($interface)) {
        push(@headerContent, "    static bool deleteProperty(JSC::JSCell*, JSC::JSGlobalObject*, JSC::PropertyName, JSC::DeletePropertySlot&);\n");
        push(@headerContent, "    static bool deletePropertyByIndex(JSC::JSCell*, JSC::JSGlobalObject*, unsigned);\n");
    }

    if (InstanceOverridesGetCallData($interface)) {
        push(@headerContent, "    static JSC::CallData getCallData(JSC::JSCell*);\n\n");
        $headerIncludes{"<JavaScriptCore/CallData.h>"} = 1;
        $structureFlags{"JSC::OverridesGetCallData"} = 1;
    }
    
    if ($interface->extendedAttributes->{CustomGetPrototype}) {
        push(@headerContent, "    static JSC::JSValue getPrototype(JSC::JSObject*, JSC::JSGlobalObject*);\n");
        $structureFlags{"JSC::OverridesGetPrototype"} = 1;
    }
    
    if ($interface->extendedAttributes->{CustomPreventExtensions}) {
        push(@headerContent, "    static bool preventExtensions(JSC::JSObject*, JSC::JSGlobalObject*);\n");
    }

    if (InstanceNeedsEstimatedSize($interface)) {
        push(@headerContent, "    static size_t estimatedSize(JSCell*, JSC::VM&);\n");
    }
    
    if (!$hasParent) {
        push(@headerContent, "    static void destroy(JSC::JSCell*);\n");
    }

    # Class info
    if ($interfaceName eq "Node") {
        push(@headerContent, "\n");
        push(@headerContent, "protected:\n");
        push(@headerContent, "    static const JSC::ClassInfo s_info;\n");
        push(@headerContent, "public:\n");
        push(@headerContent, "    static constexpr const JSC::ClassInfo* info() { return &s_info; }\n\n");
    } else {
        push(@headerContent, "\n");
        push(@headerContent, "    DECLARE_INFO;\n\n");
    }

    # Structure ID
    push(@headerContent, "    static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)\n");
    push(@headerContent, "    {\n");
    my $indexingModeIncludingHistory = InstanceOverridesGetOwnPropertySlot($interface) ? "JSC::MayHaveIndexedAccessors" : "JSC::NonArray";
    if (IsDOMGlobalObject($interface)) {
        push(@headerContent, "        return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::GlobalObjectType, StructureFlags), info(), $indexingModeIncludingHistory);\n");
    } elsif ($codeGenerator->InheritsInterface($interface, "Node")) {
        my $type = GetJSTypeForNode($interface);
        push(@headerContent, "        return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::JSType($type), StructureFlags), info(), $indexingModeIncludingHistory);\n");
    } elsif ($codeGenerator->InheritsInterface($interface, "Event")) {
        push(@headerContent, "        return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::JSType(JSEventType), StructureFlags), info(), $indexingModeIncludingHistory);\n");
    } else {
        push(@headerContent, "        return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info(), $indexingModeIncludingHistory);\n");
    }
    push(@headerContent, "    }\n\n");

    # Custom pushEventHandlerScope function
    if ($interface->extendedAttributes->{CustomPushEventHandlerScope}) {
        push(@headerContent, "    JSC::JSScope* pushEventHandlerScope(JSC::JSGlobalObject*, JSC::JSScope*) const;\n\n");
    }

    # Constructor object getter
    unless ($interface->extendedAttributes->{LegacyNoInterfaceObject}) {
        push(@headerContent, "    static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*);\n");
        push(@headerContent, "    static JSC::JSValue getLegacyFactoryFunction(JSC::VM&, JSC::JSGlobalObject*);\n") if $interface->extendedAttributes->{LegacyFactoryFunction};
    }

    if ($interface->extendedAttributes->{GenerateForEachEventHandlerContentAttribute}) {
        push(@headerContent, "    static void forEachEventHandlerContentAttribute(const Function<void(const AtomString& attributeName, const AtomString& eventName)>&);\n\n");
    }
    if ($interface->extendedAttributes->{GenerateForEachWindowEventHandlerContentAttribute}) {
        push(@headerContent, "    static void forEachWindowEventHandlerContentAttribute(const Function<void(const AtomString& attributeName, const AtomString& eventName)>&);\n\n");
    }

    my $numCustomOperations = 0;
    my $numCustomAttributes = 0;

    my $hasDOMJITAttributes = 0;

    # Attribute and function enums
    if ($numAttributes > 0) {
        foreach my $attribute (@{$interface->attributes}) {
            $numCustomAttributes++ if HasCustomGetter($attribute);
            $numCustomAttributes++ if HasCustomSetter($attribute);
            if ($attribute->extendedAttributes->{CachedAttribute}) {
                my $conditionalString = $codeGenerator->GenerateConditionalString($attribute);
                push(@headerContent, "#if ${conditionalString}\n") if $conditionalString;
                push(@headerContent, "    mutable JSC::WriteBarrier<JSC::Unknown> m_" . $attribute->name . ";\n");
                $numCachedAttributes++;
                push(@headerContent, "#endif\n") if $conditionalString;
            }
            $hasDOMJITAttributes = 1 if $attribute->extendedAttributes->{DOMJIT};
        }
    }

    push(@headerContent, "    template<typename, JSC::SubspaceAccess mode> static JSC::IsoSubspace* subspaceFor(JSC::VM& vm)\n");
    push(@headerContent, "    {\n");
    push(@headerContent, "        if constexpr (mode == JSC::SubspaceAccess::Concurrently)\n");
    push(@headerContent, "            return nullptr;\n");
    push(@headerContent, "        return subspaceForImpl(vm);\n");
    push(@headerContent, "    }\n");
    push(@headerContent, "    static JSC::IsoSubspace* subspaceForImpl(JSC::VM& vm);\n");

    # visit function
    if ($needsVisitChildren) {
        push(@headerContent, "    DECLARE_VISIT_CHILDREN;\n");
        push(@headerContent, "    template<typename Visitor> void visitAdditionalChildren(Visitor&);\n") if $interface->extendedAttributes->{JSCustomMarkFunction};
        push(@headerContent, "\n");

        if ($interface->extendedAttributes->{JSCustomMarkFunction}) {
            # We assume that the logic in visitAdditionalChildren is highly volatile, and during a
            # concurrent GC or in between eden GCs something may happen that would lead to this
            # logic behaving differently. Since this could mark objects or add opaque roots, this
            # means that after any increment of mutator resumption in a concurrent GC and at least
            # once during any eden GC we need to re-execute visitAdditionalChildren on any objects
            # that we had executed it on before. We do this using the DOM's own MarkingConstraint,
            # which will call visitOutputConstraints on all objects in the DOM's own
            # outputConstraintSubspace. visitOutputConstraints is the name JSC uses for the method
            # that the GC calls to ask an object is it would like to mark anything else after the
            # program resumed since the last call to visitChildren or visitOutputConstraints. Since
            # this just calls visitAdditionalChildren, you usually don't have to worry about this.
            push(@headerContent, "    template<typename Visitor> static void visitOutputConstraints(JSCell*, Visitor&);\n");
        }
    }

    if (NeedsImplementationClass($interface)) {
        push(@headerContent, "    static void analyzeHeap(JSCell*, JSC::HeapAnalyzer&);\n");
    }
    
    if ($numCustomAttributes > 0) {
        push(@headerContent, "\n    // Custom attributes\n");

        foreach my $attribute (@{$interface->attributes}) {
            my $conditionalString = $codeGenerator->GenerateConditionalString($attribute);
            if (HasCustomGetter($attribute)) {
                push(@headerContent, "#if ${conditionalString}\n") if $conditionalString;
                my $methodName = $codeGenerator->WK_lcfirst($attribute->name);
                push(@headerContent, "    JSC::JSValue " . $methodName . "(JSC::JSGlobalObject&) const;\n");
                push(@headerContent, "#endif\n") if $conditionalString;
            }
            if (HasCustomSetter($attribute) && !IsReadonly($attribute)) {
                push(@headerContent, "#if ${conditionalString}\n") if $conditionalString;
                push(@headerContent, "    void set" . $codeGenerator->WK_ucfirst($attribute->name) . "(JSC::JSGlobalObject&, JSC::JSValue);\n");
                push(@headerContent, "#endif\n") if $conditionalString;
            }
        }
    }

    foreach my $operation (@{$interface->operations}) {
        $numCustomOperations++ if HasCustomMethod($operation);
    }

    if ($numCustomOperations > 0) {
        my $inAppleCopyright = 0;
        push(@headerContent, "\n    // Custom functions\n");
        foreach my $operation (@{$interface->operations}) {
            next unless HasCustomMethod($operation);
            next if $operation->{overloads} && $operation->{overloadIndex} != 1;

            if ($operation->extendedAttributes->{AppleCopyright}) {
                if (!$inAppleCopyright) {
                    push(@headerContent, $beginAppleCopyrightForHeaderFiles);
                    $inAppleCopyright = 1;
                }
            } elsif ($inAppleCopyright) {
                push(@headerContent, $endAppleCopyright);
                $inAppleCopyright = 0;
            }

            my $conditionalString = $codeGenerator->GenerateConditionalString($operation);
            push(@headerContent, "#if ${conditionalString}\n") if $conditionalString;

            my $functionImplementationName = $operation->extendedAttributes->{ImplementedAs} || $codeGenerator->WK_lcfirst($operation->name);

            my @functionArguments = ();
            push(@functionArguments, "JSC::JSGlobalObject&");
            push(@functionArguments, "JSC::CallFrame&");
            push(@functionArguments, "Ref<DeferredPromise>&&") if $codeGenerator->IsPromiseType($operation->type) && !$operation->extendedAttributes->{ReturnsOwnPromise};

            push(@headerContent, "    " . ($operation->isStatic ? "static " : "") . "JSC::JSValue " . $functionImplementationName . "(" . join(", ", @functionArguments) . ");\n");

            push(@headerContent, "#endif\n") if $conditionalString;
        }
        push(@headerContent, $endAppleCopyright) if $inAppleCopyright;
    }

    if (NeedsImplementationClass($interface)) {
        if ($hasParent) {
            push(@headerContent, "    $interfaceName& wrapped() const\n");
            push(@headerContent, "    {\n");
            push(@headerContent, "        return static_cast<$interfaceName&>(Base::wrapped());\n");
            push(@headerContent, "    }\n");
        }
    }

    # structure flags
    if (%structureFlags) {
        push(@headerContent, "public:\n");
        push(@headerContent, "    static constexpr unsigned StructureFlags = Base::StructureFlags");
        foreach my $structureFlag (sort (keys %structureFlags)) {
            push(@headerContent, " | " . $structureFlag);
        }
        push(@headerContent, ";\n");
    }

    push(@headerContent, "protected:\n");

    # Constructor
    if ($interfaceName eq "DOMWindow" || $interfaceName eq "RemoteDOMWindow") {
        push(@headerContent, "    $className(JSC::VM&, JSC::Structure*, Ref<$implType>&&, JSWindowProxy*);\n");
    } elsif (ShouldCreateWithJSProxy($codeGenerator, $interface)) {
        push(@headerContent, "    $className(JSC::VM&, JSC::Structure*, Ref<$implType>&&);\n");
    } elsif (!NeedsImplementationClass($interface)) {
        push(@headerContent, "    $className(JSC::Structure*, JSDOMGlobalObject&);\n\n");
     } else {
        push(@headerContent, "    $className(JSC::Structure*, JSDOMGlobalObject&, Ref<$implType>&&);\n\n");
    }

    if ($interfaceName eq "DOMWindow" || $interfaceName eq "RemoteDOMWindow") {
        push(@headerContent, "    void finishCreation(JSC::VM&, JSWindowProxy*);\n");
    } elsif (ShouldCreateWithJSProxy($codeGenerator, $interface)) {
        push(@headerContent, "    void finishCreation(JSC::VM&, JSC::JSProxy*);\n");
    } else {
        push(@headerContent, "    void finishCreation(JSC::VM&);\n");
    }

    push(@headerContent, "};\n\n");

    if (ShouldGenerateWrapperOwnerCode($hasParent, $interface)) {
        my $overrideDecl = "final";
        if ($interfaceName eq "Node") {
            push(@headerContent, "class ${exportMacro}JS${interfaceName}Owner : public JSC::WeakHandleOwner {\n");
            $overrideDecl = "override";
        } elsif ($codeGenerator->InheritsInterface($interface, "Node")) {
            $headerIncludes{"JSNode.h"} = 1;
            push(@headerContent, "class ${exportMacro}JS${interfaceName}Owner final : public JSNodeOwner {\n");
        } else {
            push(@headerContent, "class ${exportMacro}JS${interfaceName}Owner final : public JSC::WeakHandleOwner {\n");
        }
        $headerIncludes{"<wtf/NeverDestroyed.h>"} = 1;
        push(@headerContent, "public:\n");
        push(@headerContent, "    bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::AbstractSlotVisitor&, const char**) ${overrideDecl};\n");
        push(@headerContent, "    void finalize(JSC::Handle<JSC::Unknown>, void* context) ${overrideDecl};\n");
        push(@headerContent, "};\n");
        push(@headerContent, "\n");
        push(@headerContent, "inline JSC::WeakHandleOwner* wrapperOwner(DOMWrapperWorld&, $implType*)\n");
        push(@headerContent, "{\n");
        push(@headerContent, "    static NeverDestroyed<JS${interfaceName}Owner> owner;\n");
        push(@headerContent, "    return &owner.get();\n");
        push(@headerContent, "}\n");
        push(@headerContent, "\n");
        push(@headerContent, "inline void* wrapperKey($implType* wrappableObject)\n");
        push(@headerContent, "{\n");
        push(@headerContent, "    return wrappableObject;\n");
        push(@headerContent, "}\n");
        push(@headerContent, "\n");
    }
    if (ShouldGenerateToJSDeclaration($hasParent, $interface)) {
        # Node and NodeList have custom inline implementations which thus cannot be exported.
        # FIXME: The special case for Node and NodeList should probably be implemented via an IDL attribute.
        if ($implType eq "Node" or $implType eq "NodeList") {
            push(@headerContent, "JSC::JSValue toJS(JSC::JSGlobalObject*, JSDOMGlobalObject*, $implType&);\n");
        } else {
            push(@headerContent, $exportMacro."JSC::JSValue toJS(JSC::JSGlobalObject*, JSDOMGlobalObject*, $implType&);\n");
        }
        push(@headerContent, "inline JSC::JSValue toJS(JSC::JSGlobalObject* lexicalGlobalObject, JSDOMGlobalObject* globalObject, $implType* impl) { return impl ? toJS(lexicalGlobalObject, globalObject, *impl) : JSC::jsNull(); }\n");

        push(@headerContent, "JSC::JSValue toJSNewlyCreated(JSC::JSGlobalObject*, JSDOMGlobalObject*, Ref<$implType>&&);\n");
        push(@headerContent, "inline JSC::JSValue toJSNewlyCreated(JSC::JSGlobalObject* lexicalGlobalObject, JSDOMGlobalObject* globalObject, RefPtr<$implType>&& impl) { return impl ? toJSNewlyCreated(lexicalGlobalObject, globalObject, impl.releaseNonNull()) : JSC::jsNull(); }\n");
   }

    push(@headerContent, "\n");

    GeneratePrototypeDeclaration(\@headerContent, $className, $interface) if HeaderNeedsPrototypeDeclaration($interface);

    # CheckJSCast Snippet function.
    if ($interface->extendedAttributes->{DOMJIT}) {
        $headerIncludes{"<JavaScriptCore/Snippet.h>"} = 1;
        push(@headerContent, "#if ENABLE(JIT)\n");
        push(@headerContent, "Ref<JSC::Snippet> checkSubClassSnippetFor${className}();\n");
        push(@headerContent, "#endif\n");
    }

    if ($hasDOMJITAttributes) {
        $headerIncludes{"<JavaScriptCore/DOMJITGetterSetter.h>"} = 1;
        push(@headerContent,"// DOM JIT Attributes\n\n");
        foreach my $attribute (@{$interface->attributes}) {
            next unless $attribute->extendedAttributes->{DOMJIT};
            assert("Only DOMJIT=Getter is supported for attributes") unless $codeGenerator->ExtendedAttributeContains($attribute->extendedAttributes->{DOMJIT}, "Getter");

            my $interfaceName = $interface->type->name;
            my $className = $interfaceName . $codeGenerator->WK_ucfirst($attribute->name);
            my $domJITClassName = $className . "Attribute";

            push(@headerContent, "#if ENABLE(JIT)\n");
            push(@headerContent, "Ref<JSC::DOMJIT::CallDOMGetterSnippet> compile${domJITClassName}();\n");
            push(@headerContent, "#endif\n\n");
        }
    }

    if (HasCustomConstructor($interface)) {
        push(@headerContent, "// Custom constructor\n");
        push(@headerContent, "JSC::EncodedJSValue construct${className}(JSC::JSGlobalObject*, JSC::CallFrame&);\n\n");
    }

    if (NeedsImplementationClass($interface)) {
        $headerIncludes{"JSDOMWrapper.h"} = 1;

        push(@headerContent, "template<> struct JSDOMWrapperConverterTraits<${implType}> {\n");
        push(@headerContent, "    using WrapperClass = ${className};\n");
        push(@headerContent, "    using ToWrappedReturnType = ${implType}*;\n");
        push(@headerContent, "};\n");
    }

    push(@headerContent, GenerateEnumerationsHeaderContent($interface, $enumerations));
    push(@headerContent, GenerateDictionariesHeaderContent($interface, $dictionaries));

    my $conditionalString = $codeGenerator->GenerateConditionalString($interface);
    push(@headerContent, "\n} // namespace WebCore\n");
    push(@headerContent, "\n#endif // ${conditionalString}\n") if $conditionalString;

    if ($interface->extendedAttributes->{AppleCopyright}) {
        push(@headerContent, "\n");
        push(@headerContent, split("\r", $endAppleCopyright));
    }

    # - Generate dependencies.
    if ($writeDependencies) {
        my @ancestors;
        $codeGenerator->ForAllParents($interface, sub {
            my $currentInterface = shift;
            push(@ancestors, $currentInterface->type->name);
        }, 0);
        for my $dictionary (@$dictionaries) {
            my $parentType = $dictionary->parentType;
            while (defined($parentType)) {
                push(@ancestors, $parentType->name) if $codeGenerator->IsExternalDictionaryType($parentType);
                my $parentDictionary = $codeGenerator->GetDictionaryByType($parentType);
                assert("Unable to find definition for dictionary named '" . $parentType->name . "'!") unless defined($parentDictionary);
                $parentType = $parentDictionary->parentType;
            }
        }
        push(@depsContent, "$className.h : ", join(" ", map { "$_.idl" } @ancestors), "\n");
        push(@depsContent, map { "$_.idl :\n" } @ancestors);
    }
}

sub GeneratePropertiesHashTable
{
    my ($object, $interface, $isInstance, $hashKeys, $hashSpecials, $hashValue1, $hashValue2, $conditionals, $readWriteConditionals, $runtimeEnabledOperations, $runtimeEnabledAttributes) = @_;

    # FIXME: These should be functions on $interface.
    my $interfaceName = $interface->type->name;
    my $className = "JS$interfaceName";
    
    # - Add all properties in a hashtable definition
    my $propertyCount = $isInstance ? InstancePropertyCount($interface) : PrototypePropertyCount($interface);

    if (!$isInstance && NeedsConstructorProperty($interface)) {
        die if !$propertyCount;
        push(@$hashKeys, "constructor");
        my $getter = "js" . $interfaceName . "Constructor";
        push(@$hashValue1, $getter);

        push(@$hashValue2, "0");
        push(@$hashSpecials, "static_cast<unsigned>(JSC::PropertyAttribute::DontEnum)");
    }

    return 0 if !$propertyCount;

    foreach my $attribute (@{$interface->attributes}) {
        next if ($attribute->isStatic);
        next if AttributeShouldBeOnInstance($interface, $attribute) != $isInstance;
        next if ($attribute->extendedAttributes->{PrivateIdentifier} and not $attribute->extendedAttributes->{PublicIdentifier});

        # Global objects add RuntimeEnabled attributes after creation so do not add them to the static table.
        if ($isInstance && NeedsRuntimeCheck($interface, $attribute)) {
            $propertyCount -= 1;
            next;
        }

        my $name = $attribute->name;
        push(@$hashKeys, $name);

        my $special = GetJSCAttributesForAttribute($interface, $attribute);
        push(@$hashSpecials, $special);

        if ($attribute->extendedAttributes->{DOMJIT}) {
            push(@$hashValue1, "&DOMJITAttributeFor" . $interface->type->name . $codeGenerator->WK_ucfirst($attribute->name));
        } else {
            my $getter = GetAttributeGetterName($interface, $className, $attribute);
            push(@$hashValue1, $getter);
        }

        if (IsReadonly($attribute) || $codeGenerator->IsConstructorType($attribute->type)) {
            push(@$hashValue2, "0");
        } else {
            my $setter = GetAttributeSetterName($interface, $className, $attribute);
            push(@$hashValue2, $setter);
        }

        my $conditional = $attribute->extendedAttributes->{Conditional};
        $conditionals->{$name} = $conditional if $conditional;
        my $readWriteConditional = $attribute->extendedAttributes->{ConditionallyReadWrite};
        $readWriteConditionals->{$name} = $readWriteConditional if $readWriteConditional;

        my $needsRuntimeCheck = NeedsRuntimeCheck($interface, $attribute);
        my $needsRuntimeReadWriteCheck = NeedsRuntimeReadWriteCheck($interface, $attribute);
        
        if ($needsRuntimeCheck && $needsRuntimeReadWriteCheck) {
            die "Being both runtime enabled and runtime conditionally read-write is not yet supported (used on the '${name}' attribute of '${interfaceName}').\n";
        }

        if ($needsRuntimeCheck || $needsRuntimeReadWriteCheck) {
            push(@$runtimeEnabledAttributes, $attribute);
        }
    }

    foreach my $operation (@{$interface->operations}) {
        next if ($operation->extendedAttributes->{PrivateIdentifier} and not $operation->extendedAttributes->{PublicIdentifier});
        next if ($operation->isStatic);
        next if $operation->{overloadIndex} && $operation->{overloadIndex} > 1;
        next if OperationShouldBeOnInstance($interface, $operation) != $isInstance;
        next if $operation->name eq "[Symbol.Iterator]";

        # Global objects add RuntimeEnabled operations after creation so do not add them to the static table.
        if ($isInstance && NeedsRuntimeCheck($interface, $operation)) {
            $propertyCount -= 1;
            next;
        }

        my $name = $operation->name;
        push(@$hashKeys, $name);

        my $functionName = GetFunctionName($interface, $className, $operation);
        push(@$hashValue1, $functionName);

        my $functionLength = GetFunctionLength($operation);

        if ($operation->extendedAttributes->{DOMJIT}) {
            push(@$hashValue2, "&DOMJITSignatureFor" . $interface->type->name . $codeGenerator->WK_ucfirst($operation->name));
        } else {
            push(@$hashValue2, $functionLength);
        }

        push(@$hashSpecials, ComputeFunctionSpecial($interface, $operation));

        my $conditional = GetConditionalForOperationConsideringOverloads($operation);
        $conditionals->{$name} = $conditional if $conditional;

        if (NeedsRuntimeCheck($interface, $operation)) {
            push(@$runtimeEnabledOperations, $operation);
        }
    }

    return $propertyCount;
}

# This computes an effective overload set for a given operation / constructor,
# which represents the allowable invocations.This set is used as input for
# the Web IDL overload resolution algorithm.
# http://heycam.github.io/webidl/#dfn-effective-overload-set
sub ComputeEffectiveOverloadSet
{
    my ($overloads) = @_;

    my %allSets;
    my $addTuple = sub {
        my $tuple = shift;
        # The Web IDL specification uses a flat set of tuples but we use a hash where the key is the
        # number of parameters and the value is the set of tuples for the given number of parameters.
        my $length = scalar(@{@$tuple[1]});
        if (!exists($allSets{$length})) {
            $allSets{$length} = [ $tuple ];
        } else {
            push(@{$allSets{$length}}, $tuple);
        }
    };

    my $m = LengthOfLongestOperationParameterList($overloads);
    foreach my $overload (@{$overloads}) {
        my $n = @{$overload->arguments};
        my @t;
        my @o;
        my $isVariadic = 0;
        foreach my $argument (@{$overload->arguments}) {
            push(@t, $argument->type);
            if ($argument->isOptional) {
                push(@o, "optional");
            } elsif ($argument->isVariadic) {
                push(@o, "variadic");
                $isVariadic = 1;
            } else {
                push(@o, "required");
            }
        }
        &$addTuple([$overload, [@t], [@o]]);
        if ($isVariadic) {
            my @newT = @t;
            my @newO = @o;
            for (my $i = $n; $i < $m; $i++) {
                push(@newT, $t[-1]);
                push(@newO, "variadic");
                &$addTuple([$overload, [@newT], [@newO]]);
            }
        }
        for (my $i = $n - 1; $i >= 0; $i--) {
            my $argument = @{$overload->arguments}[$i];
            last unless ($argument->isOptional || $argument->isVariadic);
            pop(@t);
            pop(@o);
            &$addTuple([$overload, [@t], [@o]]);
        }
    }
    return %allSets;
}

sub IsIDLTypeDistinguishableWithUnionForOverloadResolution
{
    my ($type, $unionSubtypes) = @_;

    assert("First type should not be a union") if $type->isUnion;
    for my $unionSubType (@$unionSubtypes) {
        return 0 unless AreTypesDistinguishableForOverloadResolution($type, $unionSubType);
    }
    return 1;
}

# Determines if two types are distinguishable in the context of overload resolution,
# according to the Web IDL specification:
# http://heycam.github.io/webidl/#dfn-distinguishable
sub AreTypesDistinguishableForOverloadResolution
{
    my ($typeA, $typeB) = @_;

    my $isCallbackFunctionOrDictionary = sub {
        my $type = shift;
        return $codeGenerator->IsCallbackFunction($type) || $codeGenerator->IsDictionaryType($type);
    };

    # Two types are distinguishable for overload resolution if at most one of the two includes a nullable type.
    return 0 if $typeA->isNullable && $typeB->isNullable;

    # Union types: typeA and typeB  are distinguishable if:
    # - Both types are either a union type or nullable union type, and each member type of the one is
    #   distinguishable with each member type of the other.
    # - One type is a union type or nullable union type, the other is neither a union type nor a nullable
    #   union type, and each member type of the first is distinguishable with the second.
    if ($typeA->isUnion && $typeB->isUnion) {
        for my $unionASubType (@{$typeA->subtypes}) {
            return 0 unless IsIDLTypeDistinguishableWithUnionForOverloadResolution($unionASubType, $typeB->subtypes);
        }
        return 1;
    } elsif ($typeA->isUnion) {
        return IsIDLTypeDistinguishableWithUnionForOverloadResolution($typeB, $typeA->subtypes);
    } elsif ($typeB->isUnion) {
        return IsIDLTypeDistinguishableWithUnionForOverloadResolution($typeA, $typeB->subtypes);
    }

    return 0 if $typeA->name eq $typeB->name;
    return 0 if $typeA->name eq "object" or $typeB->name eq "object";
    return 0 if $codeGenerator->IsNumericType($typeA) && $codeGenerator->IsNumericType($typeB);
    return 0 if $codeGenerator->IsStringOrEnumType($typeA) && $codeGenerator->IsStringOrEnumType($typeB);
    return 0 if $codeGenerator->IsDictionaryType($typeA) && $codeGenerator->IsDictionaryType($typeB);
    return 0 if $codeGenerator->IsCallbackInterface($typeA) && $codeGenerator->IsCallbackInterface($typeB);
    return 0 if &$isCallbackFunctionOrDictionary($typeA) && &$isCallbackFunctionOrDictionary($typeB);
    return 0 if $codeGenerator->IsSequenceOrFrozenArrayType($typeA) && $codeGenerator->IsSequenceOrFrozenArrayType($typeB);
    # FIXME: return 0 if $typeA and $typeB are both exception types.
    return 1;
}

# If there is more than one entry in an effective overload set that has a given type list length,
# then for those entries there must be an index i such that for each pair of entries the types
# at index i are distinguishable. The lowest such index is termed the distinguishing argument index.
# http://heycam.github.io/webidl/#dfn-distinguishing-argument-index
sub GetDistinguishingArgumentIndex
{
    my ($operation, $S) = @_;

    # FIXME: Consider all the tuples, not just the 2 first ones?
    my $firstTupleTypes = @{@{$S}[0]}[1];
    my $secondTupleTypes = @{@{$S}[1]}[1];
    for (my $index = 0; $index < scalar(@$firstTupleTypes); $index++) {
        return $index if AreTypesDistinguishableForOverloadResolution(@{$firstTupleTypes}[$index], @{$secondTupleTypes}[$index]);
    }
    die "Undistinguishable overloads for operation " . $operation->name . " with length: " . scalar(@$firstTupleTypes);
}

sub GetOverloadThatMatches
{
    my ($S, $parameterIndex, $matches) = @_;

    for my $tuple (@{$S}) {
        my $type = @{@{$tuple}[1]}[$parameterIndex];
        my $optionality = @{@{$tuple}[2]}[$parameterIndex];
        if ($type->isUnion) {
            for my $subtype (GetFlattenedMemberTypes($type)) {
                return @{$tuple}[0] if $matches->($subtype, $optionality);
            }
        } else {
            return @{$tuple}[0] if $matches->($type, $optionality);
        }
    }
}

sub GetOverloadThatMatchesIgnoringUnionSubtypes
{
    my ($S, $parameterIndex, $matches) = @_;

    for my $tuple (@{$S}) {
        my $type = @{@{$tuple}[1]}[$parameterIndex];
        my $optionality = @{@{$tuple}[2]}[$parameterIndex];
        return @{$tuple}[0] if $matches->($type, $optionality);
    }
}

sub GetConditionalForOperationConsideringOverloads
{
    my $operation = shift;

    return $operation->extendedAttributes->{Conditional} unless $operation->{overloads};

    my %conditions;
    foreach my $overload (@{$operation->{overloads}}) {
        my $conditional = $overload->extendedAttributes->{Conditional};
        return unless $conditional;
        $conditions{$conditional} = 1;
    }
    return join("|", keys %conditions);
}

# Implements the overload resolution algorithm, as defined in the Web IDL specification:
# http://heycam.github.io/webidl/#es-overloads
sub GenerateOverloadDispatcher
{
    my ($operation, $interface, $overloadFunctionPrefix, $overloadFunctionSuffix, $parametersToForward) = @_;
    
    my %allSets = ComputeEffectiveOverloadSet($operation->{overloads});

    my $generateOverloadCallIfNecessary = sub {
        my ($overload, $condition, $conditionCanThrow, $include) = @_;
        return unless $overload;
        my $conditionalString = $codeGenerator->GenerateConditionalString($overload);
        push(@implContent, "#if ${conditionalString}\n") if $conditionalString;
        if ($condition && $conditionCanThrow) {
            push(@implContent, "        {\n");
            push(@implContent, "            bool success = $condition;\n");
            push(@implContent, "            RETURN_IF_EXCEPTION(throwScope, { });\n");
            push(@implContent, "            if (success)\n");
            push(@implContent, "                RELEASE_AND_RETURN(throwScope, (" . $overloadFunctionPrefix . $overload->{overloadIndex} . $overloadFunctionSuffix . "(${parametersToForward})));\n");
            push(@implContent, "        }\n");
        } elsif ($condition) {
            push(@implContent, "        if ($condition)\n");
            push(@implContent, "            RELEASE_AND_RETURN(throwScope, (" . $overloadFunctionPrefix . $overload->{overloadIndex} . $overloadFunctionSuffix . "(${parametersToForward})));\n");
        } else {
            push(@implContent, "        RELEASE_AND_RETURN(throwScope, (" . $overloadFunctionPrefix . $overload->{overloadIndex} . $overloadFunctionSuffix . "(${parametersToForward})));\n");
        }
        push(@implContent, "#endif\n") if $conditionalString;
        AddToImplIncludes($include, $overload->extendedAttributes->{Conditional}) if $include;
    };
    my $isOptionalParameter = sub {
        my ($type, $optionality) = @_;
        return $optionality eq "optional";
    };
    my $isDictionaryOrRecordParameter = sub {
        my ($type, $optionality) = @_;
        return $codeGenerator->IsDictionaryType($type) || $codeGenerator->IsRecordType($type);
    };
    my $isNullableOrDictionaryOrRecordOrUnionContainingOne = sub {
        my ($type, $optionality) = @_;
        return 1 if $type->isNullable;
        if ($type->isUnion) {
            for my $subtype (GetFlattenedMemberTypes($type)) {
                return 1 if $type->isNullable || &$isDictionaryOrRecordParameter($subtype, $optionality);
            }
            return 0;
        } else {
            return &$isDictionaryOrRecordParameter($type, $optionality);
        }
    };
    my $isObjectOrErrorParameter = sub {
        my ($type, $optionality) = @_;
        return $type->name eq "object" || $type->name eq "Error";
    };
    my $isObjectOrErrorOrDOMExceptionParameter = sub {
        my ($type, $optionality) = @_;
        return 1 if &$isObjectOrErrorParameter($type, $optionality);
        return $type->name eq "DOMException";
    };
    my $isObjectOrCallbackFunctionParameter = sub {
        my ($type, $optionality) = @_;
        return $type->name eq "object" || $codeGenerator->IsCallbackFunction($type);
    };
    my $isSequenceOrFrozenArrayParameter = sub {
        my ($type, $optionality) = @_;
        return $codeGenerator->IsSequenceOrFrozenArrayType($type);
    };
    my $isDictionaryOrRecordOrObjectOrCallbackInterfaceParameter = sub {
        my ($type, $optionality) = @_;
        return 1 if &$isDictionaryOrRecordParameter($type, $optionality);
        return 1 if $type->name eq "object";
        return 1 if $codeGenerator->IsCallbackInterface($type) && !$codeGenerator->IsCallbackFunction($type);
        return 0;
    };
    my $isBooleanParameter = sub {
        my ($type, $optionality) = @_;
        return $type->name eq "boolean";
    };
    my $isNumericParameter = sub {
        my ($type, $optionality) = @_;
        return $codeGenerator->IsNumericType($type);
    };
    my $isStringOrEnumParameter = sub {
        my ($type, $optionality) = @_;
        return $codeGenerator->IsStringOrEnumType($type);
    };
    my $isAnyParameter = sub {
        my ($type, $optionality) = @_;
        return $type->name eq "any";
    };

    my $maxArgCount = LengthOfLongestOperationParameterList($operation->{overloads});

    push(@implContent, "    size_t argsCount = std::min<size_t>(${maxArgCount}, callFrame->argumentCount());\n");

    for my $length ( sort keys %allSets ) {
        push(@implContent, "    if (argsCount == ${length}) {\n");

        my $S = $allSets{$length};
        if (scalar(@$S) > 1) {
            my $d = GetDistinguishingArgumentIndex($operation, $S);
            push(@implContent, "        JSValue distinguishingArg = callFrame->uncheckedArgument($d);\n");

            my $overload = GetOverloadThatMatchesIgnoringUnionSubtypes($S, $d, \&$isOptionalParameter);
            &$generateOverloadCallIfNecessary($overload, "distinguishingArg.isUndefined()");

            $overload = GetOverloadThatMatchesIgnoringUnionSubtypes($S, $d, \&$isNullableOrDictionaryOrRecordOrUnionContainingOne);
            &$generateOverloadCallIfNecessary($overload, "distinguishingArg.isUndefinedOrNull()");

            for my $tuple (@{$S}) {
                my $overload = @{$tuple}[0];
                my $type = @{@{$tuple}[1]}[$d];

                my @subtypes = $type->isUnion ? GetFlattenedMemberTypes($type) : ( $type );
                for my $subtype (@subtypes) {
                    if ($codeGenerator->IsWrapperType($subtype) || $codeGenerator->IsBufferSourceType($subtype)) {
                        if ($subtype->name eq "DOMWindow") {
                            AddToImplIncludes("JSWindowProxy.h");
                            &$generateOverloadCallIfNecessary($overload, "distinguishingArg.isObject() && (asObject(distinguishingArg)->inherits<JSWindowProxy>(vm) || asObject(distinguishingArg)->inherits<JSDOMWindow>(vm))");
                        } elsif ($subtype->name eq "RemoteDOMWindow") {
                            AddToImplIncludes("JSWindowProxy.h");
                            &$generateOverloadCallIfNecessary($overload, "distinguishingArg.isObject() && (asObject(distinguishingArg)->inherits<JSWindowProxy>(vm) || asObject(distinguishingArg)->inherits<JSRemoteDOMWindow>(vm))");
                        } else {
                            &$generateOverloadCallIfNecessary($overload, "distinguishingArg.isObject() && asObject(distinguishingArg)->inherits<JS" . $subtype->name . ">(vm)");
                        }
                    }
                }
            }

            $overload = GetOverloadThatMatches($S, $d, \&$isObjectOrErrorOrDOMExceptionParameter);
            &$generateOverloadCallIfNecessary($overload, "distinguishingArg.isObject() && asObject(distinguishingArg)->inherits<JSDOMException>(vm)");

            $overload = GetOverloadThatMatches($S, $d, \&$isObjectOrErrorParameter);
            &$generateOverloadCallIfNecessary($overload, "distinguishingArg.isObject() && asObject(distinguishingArg)->type() == ErrorInstanceType");

            $overload = GetOverloadThatMatches($S, $d, \&$isObjectOrCallbackFunctionParameter);
            &$generateOverloadCallIfNecessary($overload, "distinguishingArg.isCallable(vm)");

            # FIXME: Avoid invoking GetMethod(object, Symbol.iterator) again in convert<IDLSequence<T>>(...).
            $overload = GetOverloadThatMatches($S, $d, \&$isSequenceOrFrozenArrayParameter);
            &$generateOverloadCallIfNecessary($overload, "hasIteratorMethod(lexicalGlobalObject, distinguishingArg)", 1, "<JavaScriptCore/IteratorOperations.h>");

            $overload = GetOverloadThatMatches($S, $d, \&$isDictionaryOrRecordOrObjectOrCallbackInterfaceParameter);
            &$generateOverloadCallIfNecessary($overload, "distinguishingArg.isObject()");

            my $booleanOverload = GetOverloadThatMatches($S, $d, \&$isBooleanParameter);
            &$generateOverloadCallIfNecessary($booleanOverload, "distinguishingArg.isBoolean()");

            my $numericOverload = GetOverloadThatMatches($S, $d, \&$isNumericParameter);
            &$generateOverloadCallIfNecessary($numericOverload, "distinguishingArg.isNumber()");

            # Fallbacks.
            $overload = GetOverloadThatMatches($S, $d, \&$isStringOrEnumParameter);
            if ($overload) {
                &$generateOverloadCallIfNecessary($overload);
            } elsif ($numericOverload) {
                &$generateOverloadCallIfNecessary($numericOverload);
            } elsif ($booleanOverload) {
                &$generateOverloadCallIfNecessary($booleanOverload);
            } else {
                $overload = GetOverloadThatMatches($S, $d, \&$isAnyParameter);
                &$generateOverloadCallIfNecessary($overload);
            }
        } else {
            # Only 1 overload with this number of parameters.
            my $overload = @{@{$S}[0]}[0];
            &$generateOverloadCallIfNecessary($overload);
        }
        push(@implContent, <<END);
    }
END
    }
    my $minArgCount = GetFunctionLength($operation);
    if ($minArgCount > 0) {
        push(@implContent, "    return argsCount < $minArgCount ? throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject)) : throwVMTypeError(lexicalGlobalObject, throwScope);\n")
    } else {
        push(@implContent, "    return throwVMTypeError(lexicalGlobalObject, throwScope);\n")
    }
}

# As per Web IDL specification, the length of a function Object is its number of mandatory parameters.
sub GetFunctionLength
{
    my $operation = shift;

    my $getOverloadLength = sub {
        my $operation = shift;

        my $length = 0;
        foreach my $argument (@{$operation->arguments}) {
            last if $argument->isOptional || $argument->isVariadic;
            $length++;
        }
        return $length;
    };

    my $length = &$getOverloadLength($operation);
    foreach my $overload (@{$operation->{overloads}}) {
        my $newLength = &$getOverloadLength($overload);
        $length = $newLength if $newLength < $length;
    }
    return $length;
}

sub LengthOfLongestOperationParameterList
{
    my ($overloads) = @_;
    my $result = 0;
    foreach my $overload (@{$overloads}) {
        my @arguments = @{$overload->arguments};
        $result = @arguments if $result < @arguments;
    }
    return $result;
}

# See http://refspecs.linux-foundation.org/cxxabi-1.83.html.
sub GetGnuVTableRefForInterface
{
    my $interface = shift;
    my $vtableName = GetGnuVTableNameForInterface($interface);
    if (!$vtableName) {
        return "0";
    }
    my $typename = $interface->type->name;
    my $offset = GetGnuVTableOffsetForType($typename);
    return "&" . $vtableName . "[" . $offset . "]";
}

sub GetGnuVTableNameForInterface
{
    my $interface = shift;
    my $typename = $interface->type->name;
    my $templatePosition = index($typename, "<");
    return "" if $templatePosition != -1;
    return "" if GetSkipVTableValidationForInterface($interface);
    return "_ZTV" . GetGnuMangledNameForInterface($interface);
}

sub GetGnuMangledNameForInterface
{
    my $interface = shift;
    my $typename = $interface->type->name;
    my $templatePosition = index($typename, "<");
    if ($templatePosition != -1) {
        return "";
    }
    my $mangledType = length($typename) . $typename;
    my $namespace = "WebCore";
    my $mangledNamespace =  "N" . length($namespace) . $namespace;
    return $mangledNamespace . $mangledType . "E";
}

sub GetGnuVTableOffsetForType
{
    my $typename = shift;
    if ($typename eq "ApplePaySession"
        || $typename eq "SVGAElement"
        || $typename eq "SVGCircleElement"
        || $typename eq "SVGClipPathElement"
        || $typename eq "SVGDefsElement"
        || $typename eq "SVGEllipseElement"
        || $typename eq "SVGForeignObjectElement"
        || $typename eq "SVGGElement"
        || $typename eq "SVGImageElement"
        || $typename eq "SVGLineElement"
        || $typename eq "SVGPathElement"
        || $typename eq "SVGPolyElement"
        || $typename eq "SVGPolygonElement"
        || $typename eq "SVGPolylineElement"
        || $typename eq "SVGRectElement"
        || $typename eq "SVGSVGElement"
        || $typename eq "SVGGeometryElement"
        || $typename eq "SVGGraphicsElement"
        || $typename eq "SVGSwitchElement"
        || $typename eq "SVGTextElement"
        || $typename eq "SVGUseElement") {
        return "3";
    }
    return "2";
}

# See http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling.
sub GetWinVTableRefForInterface
{
    my $interface = shift;
    my $vtableName = GetWinVTableNameForInterface($interface);
    return 0 if !$vtableName;
    return "__identifier(\"" . $vtableName . "\")";
}

sub GetWinVTableNameForInterface
{
    my $interface = shift;
    my $typename = $interface->type->name;
    my $templatePosition = index($typename, "<");
    return "" if $templatePosition != -1;
    return "" if GetSkipVTableValidationForInterface($interface);
    return "??_7" . GetWinMangledNameForInterface($interface) . "6B@";
}

sub GetWinMangledNameForInterface
{
    my $interface = shift;
    my $typename = $interface->type->name;
    my $namespace = "WebCore";
    return $typename . "@" . $namespace . "@@";
}

sub GetSkipVTableValidationForInterface
{
    my $interface = shift;
    return $interface->extendedAttributes->{SkipVTableValidation};
}

# URL becomes url, but SetURL becomes setURL.
sub ToMethodName
{
    my $param = shift;

    return $param if $param =~ /^CSSOM/;

    my $ret = lcfirst($param);
    $ret =~ s/cSS/css/ if $ret =~ /^cSS/;
    $ret =~ s/dOM/dom/ if $ret =~ /^dOM/;
    $ret =~ s/hTML/html/ if $ret =~ /^hTML/;
    $ret =~ s/hDR/hdr/ if $ret =~ /^hDR/;
    $ret =~ s/jS/js/ if $ret =~ /^jS/;
    $ret =~ s/uRL/url/ if $ret =~ /^uRL/;
    $ret =~ s/xML/xml/ if $ret =~ /^xML/;
    $ret =~ s/xSLT/xslt/ if $ret =~ /^xSLT/;

    # For HTML5 FileSystem API Flags attributes.
    # (create is widely used to instantiate an object and must be avoided.)
    $ret =~ s/^create/isCreate/ if $ret =~ /^create$/;
    $ret =~ s/^exclusive/isExclusive/ if $ret =~ /^exclusive$/;

    return $ret;
}

sub GenerateRuntimeEnableConditionalStringForExposed
{
    my ($interface, $context, $globalObjectPtr, $conjuncts) = @_;

    assert("Must specify value for Exposed.") if $context->extendedAttributes->{Exposed} eq "VALUE_IS_MISSING";

    AddToImplIncludes("ScriptExecutionContext.h");

    my $exposed = $context->extendedAttributes->{Exposed};
    return if $exposed eq "*";

    if (ref($exposed) eq 'ARRAY') {
        if (scalar(@$exposed) > 1) {
            return;
        }
        $exposed = @$exposed[0];
    }

    if ($exposed eq "Window") {
        push(@$conjuncts, "jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext()->isDocument()");
    } elsif ($exposed eq "Worker") {
        push(@$conjuncts, "jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext()->isWorkerGlobalScope()");
    } elsif ($exposed eq "ShadowRealm") {
        push(@$conjuncts, "jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext()->isShadowRealmGlobalScope()");
    } elsif ($exposed eq "Worklet") {
        push(@$conjuncts, "jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext()->isWorkletGlobalScope()");
    } elsif ($exposed eq "AudioWorklet") {
        push(@$conjuncts, "is<AudioWorkletGlobalScope>(jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext())");
    } else {
        assert("Unrecognized value '" . Dumper($context->extendedAttributes->{Exposed}) . "' for the Exposed extended attribute on '" . ref($context) . "'.");
    }
}

# Returns the conditional string that determines whether a method/attribute is enabled at runtime.
# A method/attribute is enabled at runtime if either its RuntimeEnabledFeatures function returns
# true or its EnabledForWorld function returns true (or both).
# NOTE: Parameter passed in must have an 'extendedAttributes' property.
# (e.g. IDLInterface, IDLAttribute, IDLOperation, IDLIterable, etc.)
sub GenerateRuntimeEnableConditionalString
{
    my ($interface, $context, $globalObjectPtr) = @_;

    my @conjuncts;
    if ($context->extendedAttributes->{SecureContext}) {
        AddToImplIncludes("ScriptExecutionContext.h");

        if ($context->extendedAttributes->{ContextAllowsMediaDevices}) {
            push(@conjuncts, "(jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext()->isSecureContext()"
                . "|| jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext()->allowsMediaDevices())");
        } else {
            push(@conjuncts, "jsCast<JSDOMGlobalObject*>(globalObject())->scriptExecutionContext()->isSecureContext()");
        }
    }

    if ($context->extendedAttributes->{Exposed}) {
        GenerateRuntimeEnableConditionalStringForExposed($interface, $context, $globalObjectPtr, \@conjuncts);
    }

    if ($context->extendedAttributes->{EnabledForWorld}) {
        assert("Must specify value for EnabledForWorld.") if $context->extendedAttributes->{EnabledForWorld} eq "VALUE_IS_MISSING";

        AddToImplIncludes("DOMWrapperWorld.h");

        push(@conjuncts, "worldForDOMObject(*this)." . ToMethodName($context->extendedAttributes->{EnabledForWorld}) . "()");
    }

    if ($context->extendedAttributes->{EnabledBySetting}) {
        assert("Must specify value for EnabledBySetting.") if $context->extendedAttributes->{EnabledBySetting} eq "VALUE_IS_MISSING";

        AddToImplIncludes("ScriptExecutionContext.h");

        my @flags = split(/&/, $context->extendedAttributes->{EnabledBySetting});
        foreach my $flag (@flags) {
            push(@conjuncts, "jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext()->settingsValues()." . ToMethodName($flag));
        }
    }

    if ($context->extendedAttributes->{SettingsConditionallyReadWrite}) {
        assert("Must specify value for SettingsConditionallyReadWrite.") if $context->extendedAttributes->{SettingsConditionallyReadWrite} eq "VALUE_IS_MISSING";

        AddToImplIncludes("Document.h");

        assert("SettingsConditionallyReadWrite can only be used by interfaces only exposed to the Window") if $interface->extendedAttributes->{Exposed} && $interface->extendedAttributes->{Exposed} ne "Window";

        my @flags = split(/&/, $context->extendedAttributes->{SettingsConditionallyReadWrite});
        foreach my $flag (@flags) {
            push(@conjuncts, "downcast<Document>(jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext())->settingsValues()." . ToMethodName($flag));
        }
    }

    if ($context->extendedAttributes->{EnabledByQuirk}) {
        assert("Must specify value for EnabledByQuirk.") if $context->extendedAttributes->{DisabledByQuirk} eq "VALUE_IS_MISSING";

        AddToImplIncludes("Document.h");
        AddToImplIncludes("Quirks.h");

        assert("EnabledByQuirk can only be used by interfaces only exposed to the Window") if $interface->extendedAttributes->{Exposed} && $interface->extendedAttributes->{Exposed} ne "Window";

        my @flags = split(/&/, $context->extendedAttributes->{EnabledByQuirk});
        foreach my $flag (@flags) {
            push(@conjuncts, "downcast<Document>(jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext())->quirks()." . ToMethodName($flag) . "Quirk()");
        }
    }

    if ($context->extendedAttributes->{DisabledByQuirk}) {
        assert("Must specify value for DisabledByQuirk.") if $context->extendedAttributes->{DisabledByQuirk} eq "VALUE_IS_MISSING";

        AddToImplIncludes("Document.h");
        AddToImplIncludes("Quirks.h");

        assert("DisabledByQuirk can only be used by interfaces only exposed to the Window") if $interface->extendedAttributes->{Exposed} && $interface->extendedAttributes->{Exposed} ne "Window";

        my @flags = split(/&/, $context->extendedAttributes->{DisabledByQuirk});
        foreach my $flag (@flags) {
            push(@conjuncts, "!downcast<Document>(jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext())->quirks()." . ToMethodName($flag) . "Quirk()");
        }
    }

    if ($context->extendedAttributes->{EnabledAtRuntime}) {
        assert("Must specify value for EnabledAtRuntime.") if $context->extendedAttributes->{EnabledAtRuntime} eq "VALUE_IS_MISSING";

        AddToImplIncludes("RuntimeEnabledFeatures.h");

        my @flags = split(/&/, $context->extendedAttributes->{EnabledAtRuntime});
        foreach my $flag (@flags) {
            push(@conjuncts, "RuntimeEnabledFeatures::sharedFeatures()." . ToMethodName($flag) . "()");
        }
    }

    if ($context->extendedAttributes->{RuntimeConditionallyReadWrite}) {
        assert("Must specify value for RuntimeConditionallyReadWrite.") if $context->extendedAttributes->{RuntimeConditionallyReadWrite} eq "VALUE_IS_MISSING";

        AddToImplIncludes("RuntimeEnabledFeatures.h");

        my @flags = split(/&/, $context->extendedAttributes->{RuntimeConditionallyReadWrite});
        foreach my $flag (@flags) {
            push(@conjuncts, "RuntimeEnabledFeatures::sharedFeatures()." . ToMethodName($flag) . "()");
        }
    }

    if ($context->extendedAttributes->{EnabledForContext}) {
        assert("Must not specify value for EnabledForContext.") unless $context->extendedAttributes->{EnabledForContext} eq "VALUE_IS_MISSING";
        assert("EnabledForContext must be an interface or constructor attribute.") unless $codeGenerator->IsConstructorType($context->type);

        my $contextRef = "*jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext()";
        my $name = $context->name;
        push(@conjuncts,  "${name}::enabledForContext(" . $contextRef . ")");
    }

    if ($context->extendedAttributes->{LegacyFactoryFunctionEnabledBySetting}) {
        assert("Must specify value for LegacyFactoryFunctionEnabledBySetting.") if $context->extendedAttributes->{LegacyFactoryFunctionEnabledBySetting} eq "VALUE_IS_MISSING";

        my @settings = split(/&/, $context->extendedAttributes->{LegacyFactoryFunctionEnabledBySetting});
        foreach my $setting (@settings) {
            push(@conjuncts, "downcast<Document>(jsCast<JSDOMGlobalObject*>(" . $globalObjectPtr . ")->scriptExecutionContext())->settings()." . ToMethodName($setting) . "()");
        }
    }

    my $result = join(" && ", @conjuncts);
    $result = "($result)" if @conjuncts > 1;
    return $result;
}

sub GetCastingHelperForThisObject
{
    my $interface = shift;
    my $interfaceName = $interface->type->name;
    return "jsDynamicCast<JS$interfaceName*>";
}

# http://heycam.github.io/webidl/#Unscopable
sub addUnscopableProperties
{
    my $interface = shift;

    my @unscopables;
    foreach my $operationOrAttribute (@{$interface->operations}, @{$interface->attributes}) {
        push(@unscopables, $operationOrAttribute->name) if $operationOrAttribute->extendedAttributes->{Unscopable};
    }
    return if scalar(@unscopables) == 0;

    AddToImplIncludes("<JavaScriptCore/ObjectConstructor.h>");
    push(@implContent, "    JSObject& unscopables = *constructEmptyObject(globalObject()->vm(), globalObject()->nullPrototypeObjectStructure());\n");
    foreach my $unscopable (@unscopables) {
        push(@implContent, "    unscopables.putDirect(vm, Identifier::fromString(vm, \"$unscopable\"), jsBoolean(true));\n");
    }
    push(@implContent, "    putDirectWithoutTransition(vm, vm.propertyNames->unscopablesSymbol, &unscopables, JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::ReadOnly);\n");
}

sub GetArgumentTypeForFunctionWithoutTypeCheck
{
    my ($interface, $type) = @_;

    my $IDLType = GetIDLType($interface, $type);
    return "DOMJIT::IDLJSArgumentType<${IDLType}>";
}

sub GetArgumentTypeFilter
{
    my ($interface, $type) = @_;

    my $IDLType = GetIDLType($interface, $type);
    return "DOMJIT::IDLArgumentTypeFilter<${IDLType}>::value";
}

sub GetResultTypeFilter
{
    my ($interface, $type) = @_;

    my $IDLType = GetIDLType($interface, $type);
    return "DOMJIT::IDLResultTypeFilter<${IDLType}>::value";
}

sub GetAttributeWithName
{
    my ($interface, $attributeName) = @_;
    
    foreach my $attribute (@{$interface->attributes}) {
        return $attribute if $attribute->name eq $attributeName;
    }
}

# https://webidl.spec.whatwg.org/#es-iterator
sub InterfaceNeedsIterator
{
    my ($interface) = @_;

    return 1 if $interface->setLike;
    return 1 if $interface->mapLike;
    return 1 if $interface->iterable;

    if (GetIndexedGetterOperation($interface)) {
        my $lengthAttribute = GetAttributeWithName($interface, "length");
        return 1 if $lengthAttribute and $codeGenerator->IsIntegerType($lengthAttribute->type);
    }
    return 0;
}

sub GenerateImplementation
{
    my ($object, $interface, $enumerations, $dictionaries) = @_;

    my $interfaceName = $interface->type->name;
    my $className = "JS$interfaceName";

    my $hasParent = $interface->parentType || $interface->extendedAttributes->{JSLegacyParent};
    my $parentClassName = GetParentClassName($interface);
    my $visibleInterfaceName = $codeGenerator->GetVisibleInterfaceName($interface);
    my $needsVisitChildren = InstanceNeedsVisitChildren($interface);

    my $namedGetterOperation = GetNamedGetterOperation($interface);
    my $indexedGetterOperation = GetIndexedGetterOperation($interface);

    # - Add default header template
    push(@implContentHeader, GenerateImplementationContentHeader($interface));

    AddToImplIncludes("<JavaScriptCore/JSCInlines.h>");
    AddToImplIncludes("JSDOMBinding.h");
    AddToImplIncludes("JSDOMExceptionHandling.h");
    AddToImplIncludes("JSDOMWrapperCache.h");
    AddToImplIncludes("<wtf/GetPtr.h>");
    AddToImplIncludes("<wtf/PointerPreparations.h>");
    AddToImplIncludes("<JavaScriptCore/PropertyNameArray.h>") if $indexedGetterOperation;
    AddToImplIncludes("JSDOMMapLike.h") if $interface->mapLike;
    AddToImplIncludes("JSDOMSetLike.h") if $interface->setLike;
    AddJSBuiltinIncludesIfNeeded($interface);

    my $implType = GetImplClassName($interface);

    AddToImplIncludes("${implType}.h") if $interface->isNamespaceObject;

    @implContent = ();

    push(@implContent, "\n\nnamespace WebCore {\n");
    push(@implContent, "using namespace JSC;\n\n");

    push(@implContent, GenerateEnumerationsImplementationContent($interface, $enumerations));
    push(@implContent, GenerateDictionariesImplementationContent($interface, $dictionaries));

    my $numConstants = @{$interface->constants};
    my $numAttributes = @{$interface->attributes};
    my $numOperations = @{$interface->operations};

    if ($numOperations > 0) {
        my $inAppleCopyright = 0;
        push(@implContent,"// Functions\n\n");
        foreach my $operation (@{$interface->operations}) {
            next if $operation->{overloadIndex} && $operation->{overloadIndex} > 1;
            next if IsJSBuiltin($interface, $operation);
            next if $operation->name eq "[Symbol.Iterator]";

            if ($operation->extendedAttributes->{AppleCopyright}) {
                if (!$inAppleCopyright) {
                    push(@implContent, $beginAppleCopyrightForHeaderFiles);
                    $inAppleCopyright = 1;
                }
            } elsif ($inAppleCopyright) {
                push(@implContent, $endAppleCopyright);
                $inAppleCopyright = 0;
            }

            my $conditionalAttribute = GetConditionalForOperationConsideringOverloads($operation);
            my $conditionalString = $conditionalAttribute ? $codeGenerator->GenerateConditionalStringFromAttributeValue($conditionalAttribute) : undef;
            push(@implContent, "#if ${conditionalString}\n") if $conditionalString;
            my $functionName = GetFunctionName($interface, $className, $operation);
            push(@implContent, "static JSC_DECLARE_HOST_FUNCTION(${functionName});\n");
            if ($operation->extendedAttributes->{DOMJIT}) {
                $implIncludes{"DOMJITIDLType.h"} = 1;
                my $nameOfFunctionWithoutTypeCheck = $codeGenerator->WK_lcfirst($functionName) . "WithoutTypeCheck";
                my $functionSignature = "extern \"C\" { static JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(${nameOfFunctionWithoutTypeCheck}, JSC::EncodedJSValue, (JSC::JSGlobalObject*, $className*";
                foreach my $argument (@{$operation->arguments}) {
                    my $type = $argument->type;
                    my $argumentType = GetArgumentTypeForFunctionWithoutTypeCheck($interface, $type);
                    $functionSignature .= ", ${argumentType}";
                }
                push(@implContent, $functionSignature . ")); }");
            }
            push(@implContent, "#endif\n") if $conditionalString;
        }

        push(@implContent, $endAppleCopyright) if $inAppleCopyright;
        push(@implContent, "\n");
    }

    if ($numAttributes > 0 || NeedsConstructorProperty($interface)) {
        push(@implContent, "// Attributes\n\n");

        if (NeedsConstructorProperty($interface)) {
            my $constructorGetter = "js" . $interfaceName . "Constructor";
            push(@implContent, "static JSC_DECLARE_CUSTOM_GETTER(${constructorGetter});\n");
        }

        foreach my $attribute (@{$interface->extendedAttributes->{SyntheticIDLAttributes}}, @{$interface->attributes}) {
            GenerateAttributeGetterAndSetterDeclaration(\@implContent, $interface, $className, $attribute);
        }

        push(@implContent, "\n");
    }

    if ($numOperations > 0) {
        foreach my $operation (@{$interface->operations}) {
            next unless $operation->extendedAttributes->{DOMJIT};
            $implIncludes{"DOMJITIDLTypeFilter.h"} = 1;
            $implIncludes{"DOMJITAbstractHeapRepository.h"} = 1;

            my $isOverloaded = $operation->{overloads} && @{$operation->{overloads}} > 1;
            die "Overloads is not supported in DOMJIT" if $isOverloaded;
            die "Currently ReadDOM value is only allowed" unless $codeGenerator->ExtendedAttributeContains($operation->extendedAttributes->{DOMJIT}, "ReadDOM");

            my $functionName = GetFunctionName($interface, $className, $operation);
            my $nameOfFunctionWithoutTypeCheck = $codeGenerator->WK_lcfirst($functionName) . "WithoutTypeCheck";
            my $domJITSignatureName = "DOMJITSignatureFor" . $interface->type->name . $codeGenerator->WK_ucfirst($operation->name);
            my $classInfo = "JS" . $interface->type->name . "::info()";
            my $resultType = GetResultTypeFilter($interface, $operation->type);
            my $domJITSignatureHeader = "static const JSC::DOMJIT::Signature ${domJITSignatureName}(${nameOfFunctionWithoutTypeCheck},";
            my $domJITSignatureFooter = "$classInfo, JSC::DOMJIT::Effect::forRead(DOMJIT::AbstractHeapRepository::DOM), ${resultType}";
            foreach my $argument (@{$operation->arguments}) {
                my $type = $argument->type;
                my $argumentType = GetArgumentTypeFilter($interface, $type);
                $domJITSignatureFooter .= ", ${argumentType}";
            }
            $domJITSignatureFooter .= ");";
            my $conditionalString = $codeGenerator->GenerateConditionalString($operation);
            push(@implContent, "#if ${conditionalString}\n") if $conditionalString;
            push(@implContent, "$domJITSignatureHeader $domJITSignatureFooter\n");
            push(@implContent, "#endif\n") if $conditionalString;
            push(@implContent, "\n");
        }
    }

    if ($numAttributes > 0 || NeedsConstructorProperty($interface)) {
        foreach my $attribute (@{$interface->attributes}) {
            next unless $attribute->extendedAttributes->{DOMJIT};
            assert("Only DOMJIT=Getter is supported for attributes") unless $codeGenerator->ExtendedAttributeContains($attribute->extendedAttributes->{DOMJIT}, "Getter");

            my $conditionalString = $codeGenerator->GenerateConditionalString($attribute);
            push(@implContent, "#if ${conditionalString}\n\n") if $conditionalString;
            AddToImplIncludes("DOMJITIDLTypeFilter.h", $conditionalString);
            my $generatorName = $interfaceName . $codeGenerator->WK_ucfirst($attribute->name);
            my $domJITClassName = $generatorName . "Attribute";
            my $getter = GetAttributeGetterName($interface, $className, $attribute);
            my $resultType = "JSC::SpecBytecodeTop";
            if ($attribute->extendedAttributes->{DOMJIT}) {
                $resultType = GetResultTypeFilter($interface, $attribute->type);
            }
            push(@implContent, "static const JSC::DOMJIT::GetterSetter DOMJITAttributeFor${generatorName} {\n");
            push(@implContent, "    $getter,\n");
            push(@implContent, "#if ENABLE(JIT)\n");
            push(@implContent, "    &compile${domJITClassName},\n");
            push(@implContent, "#else\n");
            push(@implContent, "    nullptr,\n");
            push(@implContent, "#endif\n");
            push(@implContent, "    $resultType\n");
            push(@implContent, "};\n\n");
            push(@implContent, "#endif\n\n") if $conditionalString;
        }
    }

    GeneratePrototypeDeclaration(\@implContent, $className, $interface) if !HeaderNeedsPrototypeDeclaration($interface);

    GenerateConstructorDeclaration(\@implContent, $className, $interface) if !$interface->extendedAttributes->{LegacyNoInterfaceObject};

    my @hashKeys = ();
    my @hashValue1 = ();
    my @hashValue2 = ();
    my @hashSpecials = ();
    my %conditionals = ();
    my %readWriteConditionals = ();
    my $hashName = $className . "Table";
    my @runtimeEnabledOperations = ();
    my @runtimeEnabledAttributes = ();
    my @runtimeEnabledConstants = ();

    # Generate hash table for properties on the instance.
    my $numInstanceProperties = GeneratePropertiesHashTable($object, $interface, 1, \@hashKeys, \@hashSpecials, \@hashValue1, \@hashValue2, \%conditionals, \%readWriteConditionals, \@runtimeEnabledOperations, \@runtimeEnabledAttributes);
    $object->GenerateHashTable($className, $hashName, $numInstanceProperties, \@hashKeys, \@hashSpecials, \@hashValue1, \@hashValue2, \%conditionals, \%readWriteConditionals, 0) if $numInstanceProperties > 0;

    # - Add all interface object (aka constructor) properties (constants, static attributes, static operations).
    if (!$interface->extendedAttributes->{LegacyNoInterfaceObject}) {
        my $hashSize = 0;
        my $hashName = $className . "ConstructorTable";

        my @hashKeys = ();
        my @hashValue1 = ();
        my @hashValue2 = ();
        my @hashSpecials = ();
        my %conditionals = ();
        my %readWriteConditionals = ();

        foreach my $constant (@{$interface->constants}) {
            my $name = $constant->name;
            push(@hashKeys, $name);
            push(@hashValue1, $constant->value);
            push(@hashValue2, "0");
            push(@hashSpecials, "JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger");

            my $implementedBy = $constant->extendedAttributes->{ImplementedBy};
            $implIncludes{"${implementedBy}.h"} = 1 if $implementedBy;

            my $conditional = $constant->extendedAttributes->{Conditional};
            $conditionals{$name} = $conditional if $conditional;

            if (NeedsRuntimeCheck($interface, $constant)) {
                push(@runtimeEnabledConstants, $constant);
            }

            $hashSize++;
        }

        foreach my $attribute (@{$interface->attributes}) {
            next unless ($attribute->isStatic);
            my $name = $attribute->name;
            push(@hashKeys, $name);

            my @specials = ();
            push(@specials, "JSC::PropertyAttribute::DontDelete") if IsLegacyUnforgeable($interface, $attribute);
            push(@specials, "JSC::PropertyAttribute::ReadOnly") if IsReadonly($attribute);
            push(@specials, "JSC::PropertyAttribute::DOMAttribute") if IsAcceleratedDOMAttribute($interface, $attribute);
            push(@specials, "JSC::PropertyAttribute::DOMJITAttribute") if $attribute->extendedAttributes->{DOMJIT};
            my $special = "static_cast<unsigned>(" . ((@specials > 0) ? join(" | ", @specials) : "0") . ")";
            push(@hashSpecials, $special);

            if ($attribute->extendedAttributes->{DOMJIT}) {
                push(@hashValue1, "&DOMJITAttributeFor" . $interface->type->name . $codeGenerator->WK_ucfirst($attribute->name));
            } else {
                my $getter = GetAttributeGetterName($interface, $className, $attribute);
                push(@hashValue1, $getter);
            }

            if (IsReadonly($attribute)) {
                push(@hashValue2, "0");
            } else {
                my $setter = GetAttributeSetterName($interface, $className, $attribute);
                push(@hashValue2, $setter);
            }

            my $conditional = $attribute->extendedAttributes->{Conditional};
            $conditionals{$name} = $conditional if $conditional;

            my $readWriteConditional = $attribute->extendedAttributes->{ConditionallyReadWrite};
            $readWriteConditionals{$name} = $readWriteConditional if $readWriteConditional;

            $hashSize++;
        }

        foreach my $operation (@{$interface->operations}) {
            next unless ($operation->isStatic);
            next if $operation->{overloadIndex} && $operation->{overloadIndex} > 1;
            my $name = $operation->name;
            push(@hashKeys, $name);

            my $functionName = GetFunctionName($interface, $className, $operation);
            push(@hashValue1, $functionName);

            my $functionLength = GetFunctionLength($operation);
            if ($operation->extendedAttributes->{DOMJIT}) {
                push(@hashValue2, "DOMJITFunctionFor" . $interface->type->name . $codeGenerator->WK_ucfirst($operation->name));
            } else {
                push(@hashValue2, $functionLength);
            }

            push(@hashSpecials, ComputeFunctionSpecial($interface, $operation));

            my $conditional = $operation->extendedAttributes->{Conditional};
            $conditionals{$name} = $conditional if $conditional;

            $hashSize++;
        }

        $object->GenerateHashTable($className, $hashName, $hashSize, \@hashKeys, \@hashSpecials, \@hashValue1, \@hashValue2, \%conditionals, \%readWriteConditionals, 1) if $hashSize > 0;

        push(@implContent, $codeGenerator->GenerateCompileTimeCheckForEnumsIfNeeded($interface));

        my $protoClassName = "${className}Prototype";
        GenerateConstructorDefinitions(\@implContent, $className, $protoClassName, $visibleInterfaceName, $interface);

        my $legacyFactoryFunction = $interface->extendedAttributes->{LegacyFactoryFunction};
        GenerateConstructorDefinitions(\@implContent, $className, $protoClassName, $legacyFactoryFunction, $interface, "GeneratingLegacyFactoryFunction") if $legacyFactoryFunction;
    }

    # - Add functions and constants to a hashtable definition

    $hashName = $className . "PrototypeTable";

    @hashKeys = ();
    @hashValue1 = ();
    @hashValue2 = ();
    @hashSpecials = ();
    %conditionals = ();
    %readWriteConditionals = ();
    @runtimeEnabledOperations = ();
    @runtimeEnabledAttributes = ();

    # Generate hash table for properties on the prototype.
    my $numPrototypeProperties = GeneratePropertiesHashTable($object, $interface, 0,
        \@hashKeys, \@hashSpecials,
        \@hashValue1, \@hashValue2,
        \%conditionals, \%readWriteConditionals,
        \@runtimeEnabledOperations, \@runtimeEnabledAttributes);

    my $hashSize = $numPrototypeProperties;

    foreach my $constant (@{$interface->constants}) {
        my $name = $constant->name;

        push(@hashKeys, $name);
        push(@hashValue1, $constant->value);
        push(@hashValue2, "0");
        push(@hashSpecials, "JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger");

        my $conditional = $constant->extendedAttributes->{Conditional};
        $conditionals{$name} = $conditional if $conditional;

        $hashSize++;
    }

    if (!ShouldUseOrdinaryObjectPrototype($interface)) {
        my $justGenerateValueArray = !IsDOMGlobalObject($interface);

        $object->GenerateHashTable($className, $hashName, $hashSize, \@hashKeys, \@hashSpecials, \@hashValue1, \@hashValue2, \%conditionals, \%readWriteConditionals, $justGenerateValueArray);

        my $prototypeHashTable = $justGenerateValueArray ? "nullptr" : "&${className}PrototypeTable";
        push(@implContent, "const ClassInfo ${className}Prototype::s_info = { \"${visibleInterfaceName}\", &Base::s_info, ${prototypeHashTable}, nullptr, CREATE_METHOD_TABLE(${className}Prototype) };\n\n");

        push(@implContent, "void ${className}Prototype::finishCreation(VM& vm)\n");
        push(@implContent, "{\n");
        push(@implContent, "    Base::finishCreation(vm);\n");
    }

    if (PrototypeHasStaticPropertyTable($interface) && !IsGlobalInterface($interface) && !ShouldUseOrdinaryObjectPrototype($interface)) {
        push(@implContent, "    reifyStaticProperties(vm, ${className}::info(), ${className}PrototypeTableValues, *this);\n");

        my @runtimeEnabledProperties = @runtimeEnabledOperations;
        push(@runtimeEnabledProperties, @runtimeEnabledAttributes);
        push(@runtimeEnabledProperties, @runtimeEnabledConstants);

        if (@runtimeEnabledProperties) {
            push(@implContent, "    bool hasDisabledRuntimeProperties = false;\n");
        }

        foreach my $operationOrAttribute (@runtimeEnabledProperties) {
            my $conditionalString = $codeGenerator->GenerateConditionalString($operationOrAttribute);
            push(@implContent, "#if ${conditionalString}\n") if $conditionalString;
            my $runtimeEnableConditionalString = GenerateRuntimeEnableConditionalString($interface, $operationOrAttribute, "globalObject()");
            my $name = $operationOrAttribute->name;
            push(@implContent, "    if (!${runtimeEnableConditionalString}) {\n");
            push(@implContent, "        hasDisabledRuntimeProperties = true;\n");
            push(@implContent, "        auto propertyName = Identifier::fromString(vm, reinterpret_cast<const LChar*>(\"$name\"), strlen(\"$name\"));\n");
            push(@implContent, "        VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);\n");
            push(@implContent, "        DeletePropertySlot slot;\n");
            push(@implContent, "        JSObject::deleteProperty(this, globalObject(), propertyName, slot);\n");
            push(@implContent, "    }\n");
            push(@implContent, "#endif\n") if $conditionalString;
        }

        foreach my $attribute (@runtimeEnabledAttributes) {
            if (NeedsRuntimeReadWriteCheck($interface, $attribute)) {
                AddToImplIncludes("WebCoreJSClientData.h");
                my $runtimeEnableConditionalString = GenerateRuntimeEnableConditionalString($interface, $attribute, "globalObject()");

                my $attributeName = $attribute->name;
                my $getter = GetAttributeGetterName($interface, $className, $attribute);
                my $setter = "nullptr";
                my $jscAttributes = GetJSCAttributesForAttribute($interface, $attribute);

                my $conditionalString = $codeGenerator->GenerateConditionalString($attribute);
                push(@implContent, "#if ${conditionalString}\n") if $conditionalString;
                push(@implContent, "    // Adding back attribute, but as readonly, after removing the read-write variant above. \n");
                push(@implContent, "    if (!${runtimeEnableConditionalString})\n");
                if (IsAcceleratedDOMAttribute($interface, $attribute)) {
                    my $classForThis = "${className}::info()";
                    push(@implContent, "        putDirectCustomAccessor(vm, static_cast<JSVMClientData*>(vm.clientData)->builtinNames()." . $attributeName . "PublicName(), JSC::DOMAttributeGetterSetter::create(vm, $getter, $setter, JSC::DOMAttributeAnnotation { $classForThis, nullptr }), attributesForStructure($jscAttributes));\n");
                } else {
                    assert("CustomGetterSetter is not allowed for DOMAttribute. DOMAttributeGetterSetter must be used.") if IsAcceleratedDOMAttribute($interface, $attribute);
                    push(@implContent, "        putDirectCustomAccessor(vm, static_cast<JSVMClientData*>(vm.clientData)->builtinNames()." . $attributeName . "PublicName(), CustomGetterSetter::create(vm, $getter, $setter), attributesForStructure($jscAttributes));\n");
                }
                push(@implContent, "#endif\n") if $conditionalString;
            }
        }

        if (@runtimeEnabledProperties) {
            push(@implContent, "    if (hasDisabledRuntimeProperties && structure()->isDictionary())\n");
            push(@implContent, "        flattenDictionaryObject(vm);\n");
        }

        foreach my $operation (@{$interface->operations}) {
            next unless ($operation->extendedAttributes->{PrivateIdentifier});
            AddToImplIncludes("WebCoreJSClientData.h");
            my $conditionalString = $codeGenerator->GenerateConditionalString($operation);
            push(@implContent, "#if ${conditionalString}\n") if $conditionalString;
            push(@implContent, "    putDirect(vm, static_cast<JSVMClientData*>(vm.clientData)->builtinNames()." . $operation->name . "PrivateName(), JSFunction::create(vm, globalObject(), 0, String(), " . GetFunctionName($interface, $className, $operation) . "), JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);\n");
            push(@implContent, "#endif\n") if $conditionalString;
        }

        if (InterfaceNeedsIterator($interface)) {
            AddToImplIncludes("<JavaScriptCore/BuiltinNames.h>");
            if (IsKeyValueIterableInterface($interface) or $interface->mapLike or $interface->setLike) {
                push(@implContent, "    putDirect(vm, vm.propertyNames->iteratorSymbol, getDirect(vm, vm.propertyNames->builtinNames().entriesPublicName()), static_cast<unsigned>(JSC::PropertyAttribute::DontEnum));\n");
            } else {
                AddToImplIncludes("<JavaScriptCore/ArrayPrototype.h>");
                push(@implContent, "    putDirect(vm, vm.propertyNames->iteratorSymbol, globalObject()->arrayPrototype()->getDirect(vm, vm.propertyNames->builtinNames().valuesPrivateName()), static_cast<unsigned>(JSC::PropertyAttribute::DontEnum));\n");
            }
        }
        push(@implContent, "    addValueIterableMethods(*globalObject(), *this);\n") if $interface->iterable and !IsKeyValueIterableInterface($interface);

        addUnscopableProperties($interface);
    }

    assert("JSC_TO_STRING_TAG_WITHOUT_TRANSITION() requires strings two or more characters long") if length($visibleInterfaceName) < 2;

    if (!ShouldUseOrdinaryObjectPrototype($interface)) {
        push(@implContent, "    JSC_TO_STRING_TAG_WITHOUT_TRANSITION();\n");
        push(@implContent, "}\n\n");
    }

    # - Initialize static ClassInfo object
    push(@implContent, "const ClassInfo $className" . "::s_info = { \"${visibleInterfaceName}\", &Base::s_info, ");

    if ($numInstanceProperties > 0) {
        push(@implContent, "&${className}Table");
    } else {
        push(@implContent, "nullptr");
    }
    if ($interface->extendedAttributes->{DOMJIT}) {
        push(@implContent, "\n");
        push(@implContent, "#if ENABLE(JIT)\n");
        push(@implContent, ", &checkSubClassSnippetFor${className}\n");
        push(@implContent, "#else\n");
        push(@implContent, ", nullptr\n");
        push(@implContent, "#endif\n");
    } else {
        push(@implContent, ", nullptr");
    }
    push(@implContent, ", CREATE_METHOD_TABLE($className) };\n\n");

    # Constructor
    if ($interfaceName eq "DOMWindow" || $interfaceName eq "RemoteDOMWindow") {
        AddIncludesForImplementationTypeInImpl("JSWindowProxy");
        push(@implContent, "${className}::$className(VM& vm, Structure* structure, Ref<$implType>&& impl, JSWindowProxy* proxy)\n");
        push(@implContent, "    : $parentClassName(vm, structure, WTFMove(impl), proxy)\n");
        push(@implContent, "{\n");
        push(@implContent, "}\n\n");
      } elsif (ShouldCreateWithJSProxy($codeGenerator, $interface)) {
        AddIncludesForImplementationTypeInImpl($interfaceName);
        push(@implContent, "${className}::$className(VM& vm, Structure* structure, Ref<$implType>&& impl)\n");
        push(@implContent, "    : $parentClassName(vm, structure, WTFMove(impl))\n");
        push(@implContent, "{\n");
        push(@implContent, "}\n\n");
    } elsif (!NeedsImplementationClass($interface)) {
        push(@implContent, "${className}::$className(Structure* structure, JSDOMGlobalObject& globalObject)\n");
        push(@implContent, "    : $parentClassName(structure, globalObject) { }\n\n");
    } else {
        push(@implContent, "${className}::$className(Structure* structure, JSDOMGlobalObject& globalObject, Ref<$implType>&& impl)\n");
        push(@implContent, "    : $parentClassName(structure, globalObject, WTFMove(impl))\n");
        push(@implContent, "{\n");
        push(@implContent, "}\n\n");
    }

    # Finish Creation
    if ($interfaceName eq "DOMWindow" || $interfaceName eq "RemoteDOMWindow") {
        push(@implContent, "void ${className}::finishCreation(VM& vm, JSWindowProxy* proxy)\n");
        push(@implContent, "{\n");
        push(@implContent, "    Base::finishCreation(vm, proxy);\n\n");
    } elsif (ShouldCreateWithJSProxy($codeGenerator, $interface)) {
        push(@implContent, "void ${className}::finishCreation(VM& vm, JSProxy* proxy)\n");
        push(@implContent, "{\n");
        push(@implContent, "    Base::finishCreation(vm, proxy);\n\n");
    } else {
        push(@implContent, "void ${className}::finishCreation(VM& vm)\n");
        push(@implContent, "{\n");
        push(@implContent, "    Base::finishCreation(vm);\n");
        push(@implContent, "    ASSERT(inherits(vm, info()));\n\n");
    }

    if (!$codeGenerator->InheritsExtendedAttribute($interface, "JSBuiltin")) {
        AddToImplIncludes("ActiveDOMObject.h");
        if ($codeGenerator->InheritsExtendedAttribute($interface, "ActiveDOMObject")) {
            push(@implContent, "    static_assert(std::is_base_of<ActiveDOMObject, ${implType}>::value, \"Interface is marked as [ActiveDOMObject] but implementation class does not subclass ActiveDOMObject.\");\n\n");
        } elsif (!$codeGenerator->InheritsExtendedAttribute($interface, "CustomIsReachable")) {
            push(@implContent, "    static_assert(!std::is_base_of<ActiveDOMObject, ${implType}>::value, \"Interface is not marked as [ActiveDOMObject] even though implementation class subclasses ActiveDOMObject.\");\n\n");
        }
    }

    if ($interfaceName eq "Location") {
        push(@implContent, "    putDirect(vm, vm.propertyNames->valueOf, globalObject()->objectProtoValueOfFunction(), JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);\n");
        push(@implContent, "    putDirect(vm, vm.propertyNames->toPrimitiveSymbol, jsUndefined(), JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);\n");
    }

    # Support for RuntimeEnabled attributes on instances.
    foreach my $attribute (@{$interface->attributes}) {
        next unless NeedsRuntimeCheck($interface, $attribute);
        next unless AttributeShouldBeOnInstance($interface, $attribute);

        AddToImplIncludes("WebCoreJSClientData.h");
        my $runtimeEnableConditionalString = GenerateRuntimeEnableConditionalString($interface, $attribute, "globalObject()");
        my $attributeName = $attribute->name;
        my $getter = GetAttributeGetterName($interface, $className, $attribute);
        my $setter = IsReadonly($attribute) || $codeGenerator->IsConstructorType($attribute->type) ? "nullptr" : GetAttributeSetterName($interface, $className, $attribute);
        my $jscAttributes = GetJSCAttributesForAttribute($interface, $attribute);
        my $isPrivateAndPublic = $attribute->extendedAttributes->{PublicIdentifier} && $attribute->extendedAttributes->{PrivateIdentifier};

        my $conditionalString = $codeGenerator->GenerateConditionalString($attribute);
        push(@implContent, "#if ${conditionalString}\n") if $conditionalString;
        push(@implContent, "    if (${runtimeEnableConditionalString})");
        push(@implContent, " {") if $isPrivateAndPublic;
        push(@implContent, "\n");
        assert("CustomGetterSetter is not allowed for DOMAttribute. DOMAttributeGetterSetter must be used.") if IsAcceleratedDOMAttribute($interface, $attribute);

        if ($attribute->extendedAttributes->{PublicIdentifier} || !$attribute->extendedAttributes->{PrivateIdentifier}) {
            push(@implContent, "        putDirectCustomAccessor(vm, static_cast<JSVMClientData*>(vm.clientData)->builtinNames()." . $attributeName . "PublicName(), CustomGetterSetter::create(vm, $getter, $setter), attributesForStructure($jscAttributes));\n");
        }
        if ($attribute->extendedAttributes->{PrivateIdentifier}) {
            push(@implContent, "        putDirectCustomAccessor(vm, static_cast<JSVMClientData*>(vm.clientData)->builtinNames()." . $attributeName . "PrivateName(), CustomGetterSetter::create(vm, $getter, $setter), attributesForStructure($jscAttributes));\n");
        }

        push(@implContent, "    }\n") if $isPrivateAndPublic;
        push(@implContent, "#endif\n") if $conditionalString;
    }

    # Support PrivateIdentifier attributes on instances.
    foreach my $attribute (@{$interface->attributes}) {
        next if NeedsRuntimeCheck($interface, $attribute);
        next unless $attribute->extendedAttributes->{PrivateIdentifier};
        next unless AttributeShouldBeOnInstance($interface, $attribute);

        AddToImplIncludes("WebCoreJSClientData.h");
        my $conditionalString = $codeGenerator->GenerateConditionalString($attribute);
        my $attributeName = $attribute->name;
        my $getter = GetAttributeGetterName($interface, $className, $attribute);

        push(@implContent, "#if ${conditionalString}\n") if $conditionalString;
        assert("CustomGetterSetter is not allowed for DOMAttribute. DOMAttributeGetterSetter must be used.") if IsAcceleratedDOMAttribute($interface, $attribute);
        push(@implContent, "    putDirectCustomAccessor(vm, static_cast<JSVMClientData*>(vm.clientData)->builtinNames()." . $attributeName . "PrivateName(), CustomGetterSetter::create(vm, $getter, nullptr), attributesForStructure(JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly));\n");
        push(@implContent, "#endif\n") if $conditionalString;
    }

    # Support for RuntimeEnabled operations on instances.
    foreach my $operation (@{$interface->operations}) {
        next unless NeedsRuntimeCheck($interface, $operation);
        next unless OperationShouldBeOnInstance($interface, $operation);
        next if $operation->{overloadIndex} && $operation->{overloadIndex} > 1;

        AddToImplIncludes("WebCoreJSClientData.h");
        my $runtimeEnableConditionalString = GenerateRuntimeEnableConditionalString($interface, $operation, "globalObject()");
        my $functionName = $operation->name;
        my $implementationFunction = GetFunctionName($interface, $className, $operation);
        my $functionLength = GetFunctionLength($operation);
        my $jsAttributes = ComputeFunctionSpecial($interface, $operation);

        my $conditionalString = $codeGenerator->GenerateConditionalString($operation);
        push(@implContent, "#if ${conditionalString}\n") if $conditionalString;
        push(@implContent, "    if (${runtimeEnableConditionalString})\n");
        my $propertyName = "static_cast<JSVMClientData*>(vm.clientData)->builtinNames()." . $functionName . ($operation->extendedAttributes->{PrivateIdentifier} ? "PrivateName()" : "PublicName()");
        if (IsJSBuiltin($interface, $operation)) {
            push(@implContent, "        putDirectBuiltinFunction(vm, this, $propertyName, $implementationFunction(vm), attributesForStructure($jsAttributes));\n");
        } else {
            push(@implContent, "        putDirectNativeFunction(vm, this, $propertyName, $functionLength, $implementationFunction, NoIntrinsic, attributesForStructure($jsAttributes));\n");
        }
        push(@implContent, "#endif\n") if $conditionalString;
    }
    push(@implContent, "    vm.heap.reportExtraMemoryAllocated(wrapped().memoryCost());\n") if $interface->extendedAttributes->{ReportExtraMemoryCost};
    push(@implContent, "}\n\n");

    unless (ShouldUseGlobalObjectPrototype($interface) || ShouldUseOrdinaryObjectPrototype($interface)) {
        push(@implContent, "JSObject* ${className}::createPrototype(VM& vm, JSDOMGlobalObject& globalObject)\n");
        push(@implContent, "{\n");
        if ($interface->parentType) {
            my $parentClassNameForPrototype = "JS" . $interface->parentType->name;
            push(@implContent, "    return ${className}Prototype::create(vm, &globalObject, ${className}Prototype::createStructure(vm, &globalObject, ${parentClassNameForPrototype}::prototype(vm, globalObject)));\n");
        } else {
            my $prototype = $interface->extendedAttributes->{Exception} ? "errorPrototype" : "objectPrototype";
            push(@implContent, "    return ${className}Prototype::create(vm, &globalObject, ${className}Prototype::createStructure(vm, &globalObject, globalObject.${prototype}()));\n");
        }
        push(@implContent, "}\n\n");

        push(@implContent, "JSObject* ${className}::prototype(VM& vm, JSDOMGlobalObject& globalObject)\n");
        push(@implContent, "{\n");
        push(@implContent, "    return getDOMPrototype<${className}>(vm, globalObject);\n");
        push(@implContent, "}\n\n");
    }

    if (!$interface->extendedAttributes->{LegacyNoInterfaceObject}) {
        AddToImplIncludes("JSDOMGlobalObjectInlines.h");
        push(@implContent, "JSValue ${className}::getConstructor(VM& vm, const JSGlobalObject* globalObject)\n");
        push(@implContent, "{\n");
        push(@implContent, "    return getDOMConstructor<${className}DOMConstructor, DOMConstructorID::${interfaceName}>(vm, *jsCast<const JSDOMGlobalObject*>(globalObject));\n");
        push(@implContent, "}\n\n");

        if ($interface->extendedAttributes->{LegacyFactoryFunction}) {
            push(@implContent, "JSValue ${className}::getLegacyFactoryFunction(VM& vm, JSGlobalObject* globalObject)\n");
            push(@implContent, "{\n");
            push(@implContent, "    return getDOMConstructor<${className}LegacyFactoryFunction, DOMConstructorID::${interfaceName}LegacyFactory>(vm, *jsCast<JSDOMGlobalObject*>(globalObject));\n");
            push(@implContent, "}\n\n");
        }
    }

    if (!$hasParent) {
        push(@implContent, "void ${className}::destroy(JSC::JSCell* cell)\n");
        push(@implContent, "{\n");
        push(@implContent, "    ${className}* thisObject = static_cast<${className}*>(cell);\n");
        push(@implContent, "    thisObject->${className}::~${className}();\n");
        push(@implContent, "}\n\n");
    }

    if (InstanceOverridesGetOwnPropertySlot($interface)) {
        GenerateGetOwnPropertySlot(\@implContent, $interface, $className);
        GenerateGetOwnPropertySlotByIndex(\@implContent, $interface, $className);
    }
    
    if (InstanceOverridesGetOwnPropertyNames($interface)) {
        GenerateGetOwnPropertyNames(\@implContent, $interface, $className);
    }
    
    if (InstanceOverridesPut($interface)) {
        GeneratePut(\@implContent, $interface, $className);
        GeneratePutByIndex(\@implContent, $interface, $className);
    }
    
    if (InstanceOverridesDefineOwnProperty($interface)) {
        GenerateDefineOwnProperty(\@implContent, $interface, $className);
    }

    if (InstanceOverridesDeleteProperty($interface)) {
        GenerateNamedDeleterDefinition(\@implContent, $interface, $className);
    }
    
    if (InstanceOverridesGetCallData($interface)) {
        GenerateGetCallData(\@implContent, $interface, $className);
    }
    
    AddToImplIncludes("JSDOMAttribute.h") if $numAttributes > 0;
    AddToImplIncludes("JSDOMOperation.h") if $numOperations > 0 && $interfaceName ne "EventTarget";

    if (NeedsConstructorProperty($interface)) {
        my $constructorGetter = "js" . $interfaceName . "Constructor";

        push(@implContent, "JSC_DEFINE_CUSTOM_GETTER(${constructorGetter}, (JSGlobalObject* lexicalGlobalObject, EncodedJSValue thisValue, PropertyName))\n");
        push(@implContent, "{\n");
        push(@implContent, "    VM& vm = JSC::getVM(lexicalGlobalObject);\n");
        push(@implContent, "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n");
        push(@implContent, "    auto* prototype = jsDynamicCast<${className}Prototype*>(vm, JSValue::decode(thisValue));\n");
        push(@implContent, "    if (UNLIKELY(!prototype))\n");
        push(@implContent, "        return throwVMTypeError(lexicalGlobalObject, throwScope);\n");
        push(@implContent, "    return JSValue::encode(${className}::getConstructor(JSC::getVM(lexicalGlobalObject), prototype->globalObject()));\n");
        push(@implContent, "}\n\n");
    }

    foreach my $attribute (@{$interface->extendedAttributes->{SyntheticIDLAttributes}}, @{$interface->attributes}) {
        GenerateAttributeGetterDefinition(\@implContent, $interface, $className, $attribute);
        GenerateAttributeSetterDefinition(\@implContent, $interface, $className, $attribute);
    }

    foreach my $operation (@{$interface->operations}) {
        GenerateOperationDefinition(\@implContent, $interface, $className, $operation);
    }
    
    GenerateIterableDefinition($interface) if $interface->iterable;

    AddToImplIncludes("DOMIsoSubspaces.h");
    AddToImplIncludes("WebCoreJSClientData.h");
    AddToImplIncludes("<JavaScriptCore/JSDestructibleObjectHeapCellType.h>");
    AddToImplIncludes("<JavaScriptCore/SlotVisitorMacros.h>");
    AddToImplIncludes("<JavaScriptCore/SubspaceInlines.h>");
    push(@implContent, "JSC::IsoSubspace* ${className}::subspaceForImpl(JSC::VM& vm)\n");
    push(@implContent, "{\n");
    push(@implContent, "    auto& clientData = *static_cast<JSVMClientData*>(vm.clientData);\n");
    push(@implContent, "    auto& spaces = clientData.subspaces();\n");
    push(@implContent, "    if (auto* space = spaces.m_subspaceFor${interfaceName}.get())\n");
    push(@implContent, "        return space;\n");
    if (IsDOMGlobalObject($interface)) {
        push(@implContent, "    spaces.m_subspaceFor${interfaceName} = makeUnique<IsoSubspace> ISO_SUBSPACE_INIT(vm.heap, clientData.m_heapCellTypeFor${className}, ${className});\n");
    } else {
        push(@implContent, "    static_assert(std::is_base_of_v<JSC::JSDestructibleObject, ${className}> || !${className}::needsDestruction);\n");
        push(@implContent, "    if constexpr (std::is_base_of_v<JSC::JSDestructibleObject, ${className}>)\n");
        push(@implContent, "        spaces.m_subspaceFor${interfaceName} = makeUnique<IsoSubspace> ISO_SUBSPACE_INIT(vm.heap, vm.destructibleObjectHeapCellType(), ${className});\n");
        push(@implContent, "    else\n");
        push(@implContent, "        spaces.m_subspaceFor${interfaceName} = makeUnique<IsoSubspace> ISO_SUBSPACE_INIT(vm.heap, vm.cellHeapCellType(), ${className});\n");
    }
    push(@implContent, "    auto* space = spaces.m_subspaceFor${interfaceName}.get();\n");
    push(@implContent, "IGNORE_WARNINGS_BEGIN(\"unreachable-code\")\n");
    push(@implContent, "IGNORE_WARNINGS_BEGIN(\"tautological-compare\")\n");
    push(@implContent, "    void (*myVisitOutputConstraint)(JSC::JSCell*, JSC::SlotVisitor&) = ${className}::visitOutputConstraints;\n");
    push(@implContent, "    void (*jsCellVisitOutputConstraint)(JSC::JSCell*, JSC::SlotVisitor&) = JSC::JSCell::visitOutputConstraints;\n");
    push(@implContent, "    if (myVisitOutputConstraint != jsCellVisitOutputConstraint)\n");
#    push(@implContent, "    if (&${className}::visitOutputConstraints != &JSC::JSCell::visitOutputConstraints)\n");
    push(@implContent, "        clientData.outputConstraintSpaces().append(space);\n");
    push(@implContent, "IGNORE_WARNINGS_END\n");
    push(@implContent, "IGNORE_WARNINGS_END\n");
    push(@implContent, "    return space;\n");
    push(@implContent, "}\n\n");

    if ($needsVisitChildren) {
        push(@implContent, "template<typename Visitor>\n");
        push(@implContent, "void ${className}::visitChildrenImpl(JSCell* cell, Visitor& visitor)\n");
        push(@implContent, "{\n");
        push(@implContent, "    auto* thisObject = jsCast<${className}*>(cell);\n");
        push(@implContent, "    ASSERT_GC_OBJECT_INHERITS(thisObject, info());\n");
        push(@implContent, "    Base::visitChildren(thisObject, visitor);\n");
        push(@implContent, "    thisObject->visitAdditionalChildren(visitor);\n") if $interface->extendedAttributes->{JSCustomMarkFunction};
        if ($interface->extendedAttributes->{GenerateAddOpaqueRoot}) {
            AddToImplIncludes("<wtf/GetPtr.h>");
            my $functionName = $interface->extendedAttributes->{GenerateAddOpaqueRoot};
            $functionName = "opaqueRoot" if $functionName eq "VALUE_IS_MISSING";
            push(@implContent, "    visitor.addOpaqueRoot(WTF::getPtr(thisObject->wrapped().${functionName}()));\n");
        }
        if ($interface->extendedAttributes->{ReportExtraMemoryCost}) {
            push(@implContent, "    visitor.reportExtraMemoryVisited(thisObject->wrapped().memoryCost());\n");
            if ($interface->extendedAttributes->{ReportExternalMemoryCost}) {;
                push(@implContent, "#if ENABLE(RESOURCE_USAGE)\n");
                push(@implContent, "    visitor.reportExternalMemoryVisited(thisObject->wrapped().externalMemoryCost());\n");
                push(@implContent, "#endif\n");
            }
        }
        if ($numCachedAttributes > 0) {
            foreach my $attribute (@{$interface->attributes}) {
                if ($attribute->extendedAttributes->{CachedAttribute}) {
                    my $conditionalString = $codeGenerator->GenerateConditionalString($attribute);
                    push(@implContent, "#if ${conditionalString}\n") if $conditionalString;
                    push(@implContent, "    visitor.append(thisObject->m_" . $attribute->name . ");\n");
                    push(@implContent, "#endif\n") if $conditionalString;
                }
            }
        }
        push(@implContent, "}\n\n");
        push(@implContent, "DEFINE_VISIT_CHILDREN(${className});\n\n");

        if ($interface->extendedAttributes->{JSCustomMarkFunction}) {
            push(@implContent, "template<typename Visitor>\n");
            push(@implContent, "void ${className}::visitOutputConstraints(JSCell* cell, Visitor& visitor)\n");
            push(@implContent, "{\n");
            push(@implContent, "    auto* thisObject = jsCast<${className}*>(cell);\n");
            push(@implContent, "    ASSERT_GC_OBJECT_INHERITS(thisObject, info());\n");
            push(@implContent, "    Base::visitOutputConstraints(thisObject, visitor);\n");
            push(@implContent, "    thisObject->visitAdditionalChildren(visitor);\n");
            push(@implContent, "}\n\n");
            push(@implContent, "template void ${className}::visitOutputConstraints(JSCell*, AbstractSlotVisitor&);\n");
            push(@implContent, "template void ${className}::visitOutputConstraints(JSCell*, SlotVisitor&);\n");
        }
    }

    if (InstanceNeedsEstimatedSize($interface)) {
        push(@implContent, "size_t ${className}::estimatedSize(JSCell* cell, VM& vm)\n");
        push(@implContent, "{\n");
        push(@implContent, "    auto* thisObject = jsCast<${className}*>(cell);\n");
        push(@implContent, "    return Base::estimatedSize(thisObject, vm) + thisObject->wrapped().memoryCost();\n");
        push(@implContent, "}\n\n");
    }

    if (NeedsImplementationClass($interface) && !$interface->extendedAttributes->{CustomHeapSnapshot}) {
        AddToImplIncludes("<JavaScriptCore/HeapAnalyzer.h>");
        AddToImplIncludes("ScriptExecutionContext.h");
        AddToImplIncludes("<wtf/URL.h>");
        push(@implContent, "void ${className}::analyzeHeap(JSCell* cell, HeapAnalyzer& analyzer)\n");
        push(@implContent, "{\n");
        push(@implContent, "    auto* thisObject = jsCast<${className}*>(cell);\n");
        push(@implContent, "    analyzer.setWrappedObjectForCell(cell, &thisObject->wrapped());\n");
        push(@implContent, "    if (thisObject->scriptExecutionContext())\n");
        push(@implContent, "        analyzer.setLabelForCell(cell, \"url \" + thisObject->scriptExecutionContext()->url().string());\n");
        push(@implContent, "    Base::analyzeHeap(cell, analyzer);\n");
        push(@implContent, "}\n\n");
    }

    if ($interface->extendedAttributes->{GenerateForEachEventHandlerContentAttribute}) {
        GenerateForEachEventHandlerContentAttribute(\@implContent, $interface, $className, "forEachEventHandlerContentAttribute");
    }
    if ($interface->extendedAttributes->{GenerateForEachWindowEventHandlerContentAttribute}) {
        GenerateForEachEventHandlerContentAttribute(\@implContent, $interface, $className, "forEachWindowEventHandlerContentAttribute", "WindowEventHandler");
    }

    if ($indexedGetterOperation) {
        $implIncludes{"<wtf/URL.h>"} = 1 if $indexedGetterOperation->type->name eq "DOMString";
        if ($interfaceName =~ /^HTML\w*Collection$/ or $interfaceName eq "RadioNodeList") {
            $implIncludes{"JSNode.h"} = 1;
            $implIncludes{"Node.h"} = 1;
        }
    }

    if (ShouldGenerateWrapperOwnerCode($hasParent, $interface) && !GetCustomIsReachable($interface)) {
        push(@implContent, "bool JS${interfaceName}Owner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, AbstractSlotVisitor& visitor, const char** reason)\n");
        push(@implContent, "{\n");
        # All ActiveDOMObjects implement hasPendingActivity(), but not all of them
        # increment their C++ reference counts when hasPendingActivity() becomes
        # true. As a result, ActiveDOMObjects can be prematurely destroyed before
        # their pending activities complete. To wallpaper over this bug, JavaScript
        # wrappers unconditionally keep ActiveDOMObjects with pending activity alive.
        # FIXME: Fix this lifetime issue in the DOM, and move this hasPendingActivity
        # check just above the (GetGenerateIsReachable($interface) eq "Impl") check below.
        my $emittedJSCast = 0;
        if ($codeGenerator->InheritsExtendedAttribute($interface, "ActiveDOMObject")) {
            push(@implContent, "    auto* js${interfaceName} = jsCast<JS${interfaceName}*>(handle.slot()->asCell());\n");
            $emittedJSCast = 1;
            push(@implContent, "    auto& wrapped = js${interfaceName}->wrapped();\n");
            push(@implContent, "    if (!wrapped.isContextStopped() && wrapped.hasPendingActivity()) {\n");
            push(@implContent, "        if (UNLIKELY(reason))\n");
            push(@implContent, "            *reason = \"ActiveDOMObject with pending activity\";\n");
            push(@implContent, "        return true;\n");
            push(@implContent, "     }\n");
        }
        if ($codeGenerator->InheritsInterface($interface, "EventTarget")) {
            if (!$emittedJSCast) {
                push(@implContent, "    auto* js${interfaceName} = jsCast<JS${interfaceName}*>(handle.slot()->asCell());\n");
                $emittedJSCast = 1;
            }
            push(@implContent, "    if (js${interfaceName}->wrapped().isFiringEventListeners()) {\n");
            push(@implContent, "        if (UNLIKELY(reason))\n");
            push(@implContent, "            *reason = \"EventTarget firing event listeners\";\n");
            push(@implContent, "        return true;\n");
            push(@implContent, "    }\n");
        }
        if ($codeGenerator->InheritsInterface($interface, "Node")) {
            if (!$emittedJSCast) {
                push(@implContent, "    auto* js${interfaceName} = jsCast<JS${interfaceName}*>(handle.slot()->asCell());\n");
                $emittedJSCast = 1;
            }
            push(@implContent, "    if (JSNodeOwner::isReachableFromOpaqueRoots(handle, 0, visitor, reason))\n");
            push(@implContent, "        return true;\n");
        }
        if (GetGenerateIsReachable($interface)) {
            if (!$emittedJSCast) {
                push(@implContent, "    auto* js${interfaceName} = jsCast<JS${interfaceName}*>(handle.slot()->asCell());\n");
                $emittedJSCast = 1;
            }

            my $rootString;
            if (GetGenerateIsReachable($interface) eq "Impl") {
                $rootString  = "    ${implType}* root = &js${interfaceName}->wrapped();\n";
                $rootString .= "    if (UNLIKELY(reason))\n";
                $rootString .= "        *reason = \"Reachable from ${interfaceName}\";\n";
            } elsif (GetGenerateIsReachable($interface) eq "ImplWebGLRenderingContext") {
                $rootString  = "    WebGLRenderingContextBase* root = WTF::getPtr(js${interfaceName}->wrapped().context());\n";
                $rootString .= "    if (UNLIKELY(reason))\n";
                $rootString .= "        *reason = \"Reachable from ${interfaceName}\";\n";
            } elsif (GetGenerateIsReachable($interface) eq "ReachableFromDOMWindow") {
                $rootString  = "    auto* root = WTF::getPtr(js${interfaceName}->wrapped().window());\n";
                $rootString .= "    if (!root)\n";
                $rootString .= "        return false;\n";
                $rootString .= "    if (UNLIKELY(reason))\n";
                $rootString .= "        *reason = \"Reachable from Window\";\n";
            } elsif (GetGenerateIsReachable($interface) eq "ReachableFromNavigator") {
                $implIncludes{"Navigator.h"} = 1;
                $implIncludes{"WorkerNavigator.h"} = 1;
                $rootString  = "    NavigatorBase* root = WTF::getPtr(js${interfaceName}->wrapped().navigator());\n";
                $rootString .= "    if (!root)\n";
                $rootString .= "        return false;\n";
                $rootString .= "    if (UNLIKELY(reason))\n";
                $rootString .= "        *reason = \"Reachable from Navigator\";\n";
            } elsif (GetGenerateIsReachable($interface) eq "ImplCanvasBase") {
                $rootString  = "    CanvasBase* root = WTF::getPtr(&(js${interfaceName}->wrapped().canvasBase()));\n";
                $rootString .= "    if (!root)\n";
                $rootString .= "        return false;\n";
                $rootString .= "    if (UNLIKELY(reason))\n";
                $rootString .= "        *reason = \"Reachable from CanvasBase\";\n";
            } elsif (GetGenerateIsReachable($interface) eq "ImplDocument") {
                $rootString  = "    Document* root = WTF::getPtr(js${interfaceName}->wrapped().document());\n";
                $rootString .= "    if (!root)\n";
                $rootString .= "        return false;\n";
                $rootString .= "    if (UNLIKELY(reason))\n";
                $rootString .= "        *reason = \"Reachable from Document\";\n";
            } elsif (GetGenerateIsReachable($interface) eq "ImplElementRoot") {
                $implIncludes{"Element.h"} = 1;
                $implIncludes{"JSNodeCustom.h"} = 1;
                $rootString  = "    Element* element = WTF::getPtr(js${interfaceName}->wrapped().element());\n";
                $rootString .= "    if (!element)\n";
                $rootString .= "        return false;\n";
                $rootString .= "    if (UNLIKELY(reason))\n";
                $rootString .= "        *reason = \"Reachable from ${interfaceName}Owner\";\n";
                $rootString .= "    void* root = WebCore::root(element);\n";
            } elsif (GetGenerateIsReachable($interface) eq "ImplOwnerNodeRoot") {
                $implIncludes{"Element.h"} = 1;
                $implIncludes{"JSNodeCustom.h"} = 1;
                $rootString  = "    void* root = WebCore::root(js${interfaceName}->wrapped().ownerNode());\n";
                $rootString .= "    if (UNLIKELY(reason))\n";
                $rootString .= "        *reason = \"Reachable from ${interfaceName} ownerNode\";\n";
            } elsif (GetGenerateIsReachable($interface) eq "ImplScriptExecutionContext") {
                $rootString  = "    ScriptExecutionContext* root = WTF::getPtr(js${interfaceName}->wrapped().scriptExecutionContext());\n";
                $rootString .= "    if (!root)\n";
                $rootString .= "        return false;\n";
                $rootString .= "    if (UNLIKELY(reason))\n";
                $rootString .= "        *reason = \"Reachable from ScriptExecutionContext\";\n";
            } elsif (GetGenerateIsReachable($interface) eq "ImplWebXRSessionRoot") {
                $rootString  = "    WebXRSession* root = WTF::getPtr(js${interfaceName}->wrapped().session());\n";
                $rootString .= "    if (!root)\n";
                $rootString .= "        return false;\n";
                $rootString .= "    if (UNLIKELY(reason))\n";
                $rootString .= "        *reason = \"Reachable from WebXRSession\";\n";
            } else {
                $rootString  = "    void* root = WebCore::root(&js${interfaceName}->wrapped());\n";
                $rootString .= "    if (UNLIKELY(reason))\n";
                $rootString .= "        *reason = \"Reachable from js${interfaceName}\";\n";
            }

            push(@implContent, $rootString);
            push(@implContent, "    return visitor.containsOpaqueRoot(root);\n");
        } else {
            if (!$emittedJSCast) {
                push(@implContent, "    UNUSED_PARAM(handle);\n");
            }
            push(@implContent, "    UNUSED_PARAM(visitor);\n");
            push(@implContent, "    UNUSED_PARAM(reason);\n");
            push(@implContent, "    return false;\n");
        }
        push(@implContent, "}\n\n");
    }

    if (ShouldGenerateWrapperOwnerCode($hasParent, $interface) && !$interface->extendedAttributes->{JSCustomFinalize}) {
        push(@implContent, "void JS${interfaceName}Owner::finalize(JSC::Handle<JSC::Unknown> handle, void* context)\n");
        push(@implContent, "{\n");
        push(@implContent, "    auto* js${interfaceName} = static_cast<JS${interfaceName}*>(handle.slot()->asCell());\n");
        push(@implContent, "    auto& world = *static_cast<DOMWrapperWorld*>(context);\n");
        push(@implContent, "    uncacheWrapper(world, &js${interfaceName}->wrapped(), js${interfaceName});\n");
        push(@implContent, "}\n\n");
    }

    if (ShouldGenerateToJSImplementation($hasParent, $interface)) {
        my $vtableNameGnu = GetGnuVTableNameForInterface($interface);
        my $vtableRefGnu = GetGnuVTableRefForInterface($interface);
        my $vtableRefWin = GetWinVTableRefForInterface($interface);

        push(@implContent, <<END) if $vtableNameGnu;
#if ENABLE(BINDING_INTEGRITY)
#if PLATFORM(WIN)
#pragma warning(disable: 4483)
extern "C" { extern void (*const ${vtableRefWin}[])(); }
#else
extern "C" { extern void* ${vtableNameGnu}[]; }
#endif
#endif

END

        push(@implContent, "JSC::JSValue toJSNewlyCreated(JSC::JSGlobalObject*, JSDOMGlobalObject* globalObject, Ref<$implType>&& impl)\n");
        push(@implContent, "{\n");
        push(@implContent, <<END) if $vtableNameGnu;

    if constexpr (std::is_polymorphic_v<${implType}>) {
#if ENABLE(BINDING_INTEGRITY)
        const void* actualVTablePointer = getVTablePointer(impl.ptr());
#if PLATFORM(WIN)
        void* expectedVTablePointer = ${vtableRefWin};
#else
        void* expectedVTablePointer = ${vtableRefGnu};
#endif

        // If you hit this assertion you either have a use after free bug, or
        // ${implType} has subclasses. If ${implType} has subclasses that get passed
        // to toJS() we currently require $interfaceName you to opt out of binding hardening
        // by adding the SkipVTableValidation attribute to the interface IDL definition
        RELEASE_ASSERT(actualVTablePointer == expectedVTablePointer);
#endif
    }
END
        push(@implContent, "    return createWrapper<${implType}>(globalObject, WTFMove(impl));\n");
        push(@implContent, "}\n\n");

        push(@implContent, "JSC::JSValue toJS(JSC::JSGlobalObject* lexicalGlobalObject, JSDOMGlobalObject* globalObject, ${implType}& impl)\n");
        push(@implContent, "{\n");
        push(@implContent, "    return wrap(lexicalGlobalObject, globalObject, impl);\n");
        push(@implContent, "}\n\n");
    }

    if (ShouldGenerateToWrapped($hasParent, $interface) and !$interface->extendedAttributes->{JSCustomToNativeObject}) {
        push(@implContent, "${implType}* ${className}::toWrapped(JSC::VM& vm, JSC::JSValue value)\n");
        push(@implContent, "{\n");
        push(@implContent, "    if (auto* wrapper = " . GetCastingHelperForThisObject($interface) . "(vm, value))\n");
        push(@implContent, "        return &wrapper->wrapped();\n");
        push(@implContent, "    return nullptr;\n");
        push(@implContent, "}\n");
    }

    push(@implContent, "\n}\n");

    my $conditionalString = $codeGenerator->GenerateConditionalString($interface);
    push(@implContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
}

sub GenerateAttributeGetterAndSetterDeclaration
{
    my ($outputArray, $interface, $className, $attribute) = @_;

    return if IsJSBuiltin($interface, $attribute);
    return if $attribute->extendedAttributes->{DelegateToSharedSyntheticAttribute};

    my $conditionalString = $codeGenerator->GenerateConditionalString($attribute);
    push(@$outputArray, "#if ${conditionalString}\n") if $conditionalString;
    my $getter = GetAttributeGetterName($interface, $className, $attribute);
    push(@$outputArray, "static JSC_DECLARE_CUSTOM_GETTER(${getter});\n");
    unless (IsReadonly($attribute) || $codeGenerator->IsConstructorType($attribute->type)) {
        my $readWriteConditional = $attribute->extendedAttributes->{ConditionallyReadWrite};
        if ($readWriteConditional) {
            my $readWriteConditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($readWriteConditional);
            push(@$outputArray, "#if ${readWriteConditionalString}\n");
        }
        my $setter = GetAttributeSetterName($interface, $className, $attribute);
        push(@$outputArray, "static JSC_DECLARE_CUSTOM_SETTER(${setter});\n");
        push(@$outputArray, "#endif\n") if $readWriteConditional;
    }
    push(@$outputArray, "#endif\n") if $conditionalString;
}

sub GenerateForEachEventHandlerContentAttribute
{
    my ($outputArray, $interface, $className, $functionName, $eventHandlerExtendedAttributeName) = @_;
    AddToImplIncludes("HTMLNames.h");
    push(@$outputArray, "void ${className}::${functionName}(const Function<void(const AtomString& attributeName, const AtomString& eventName)>& function)\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    static constexpr std::pair<decltype(HTMLNames::altAttr)&, const AtomString EventNames::*> table[] = {\n");
    foreach my $attribute (@{$interface->attributes}) {
        if ($attribute->type->name eq "EventHandler" && (!defined $eventHandlerExtendedAttributeName || $attribute->extendedAttributes->{$eventHandlerExtendedAttributeName})) {
            my $attributeName = $attribute->name;
            my $eventName = EventHandlerAttributeShortEventName($attribute);
            push(@$outputArray, "        { HTMLNames::${attributeName}Attr, &EventNames::${eventName} },\n");
        }
    }
    push(@$outputArray, "    };\n");
    push(@$outputArray, "    auto& eventNames = WebCore::eventNames();\n");
    push(@$outputArray, "    for (auto& names : table)\n");
    push(@$outputArray, "        function(names.first.get().localName(), eventNames.*names.second);\n");
    push(@$outputArray, "}\n\n");
}

sub GenerateAttributeGetterBodyDefinition
{
    my ($outputArray, $interface, $className, $attribute, $attributeGetterBodyName, $conditional) = @_;
    
    my @signatureArguments = ();
    push(@signatureArguments, "JSGlobalObject& lexicalGlobalObject");
    push(@signatureArguments, "${className}& thisObject") if !$attribute->isStatic;
    push(@signatureArguments, "PropertyName propertyName") if $codeGenerator->ExtendedAttributeContains($attribute->extendedAttributes->{CallWith}, "PropertyName");

    my $needSecurityCheck = $interface->extendedAttributes->{CheckSecurity} && !$attribute->extendedAttributes->{DoNotCheckSecurity} && !$attribute->extendedAttributes->{DoNotCheckSecurityOnGetter};
    my $hasCustomGetter = HasCustomGetter($attribute);
    my $isEventHandler = $attribute->type->name eq "EventHandler";
    my $isConstructor = $codeGenerator->IsConstructorType($attribute->type);

    my $needThrowScope = $needSecurityCheck || (!$hasCustomGetter && !$isEventHandler && !$isConstructor);

    push(@$outputArray, "static inline JSValue ${attributeGetterBodyName}(" . join(", ", @signatureArguments) . ")\n");
    push(@$outputArray, "{\n");

    if ($needThrowScope) {
        push(@$outputArray, "    auto& vm = JSC::getVM(&lexicalGlobalObject);\n");
        push(@$outputArray, "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n");
    } else {
        push(@$outputArray, "    UNUSED_PARAM(lexicalGlobalObject);\n");
    }

    if ($needSecurityCheck) {
        if ($interface->type->name eq "DOMWindow") {
            AddToImplIncludes("JSDOMBindingSecurityInlines.h", $conditional);
            push(@$outputArray, "    bool shouldAllowAccess = BindingSecurity::shouldAllowAccessToDOMWindow(&lexicalGlobalObject, thisObject, ThrowSecurityError);\n");
        } else {
            AddToImplIncludes("JSDOMBindingSecurity.h", $conditional);
            push(@$outputArray, "    bool shouldAllowAccess = BindingSecurity::shouldAllowAccessToDOMWindow(&lexicalGlobalObject, thisObject.wrapped().window(), ThrowSecurityError);\n");
        }
        push(@$outputArray, "    EXCEPTION_ASSERT_UNUSED(throwScope, !throwScope.exception() || !shouldAllowAccess);\n");
        push(@$outputArray, "    if (!shouldAllowAccess)\n");
        push(@$outputArray, "        return jsUndefined();\n");
    }
    
    if ($hasCustomGetter) {
        my $implGetterFunctionName = $codeGenerator->WK_lcfirst($attribute->extendedAttributes->{ImplementedAs} || $attribute->name);
        push(@$outputArray, "    return thisObject.${implGetterFunctionName}(lexicalGlobalObject);\n");
    } elsif ($isEventHandler) {
        $implIncludes{"EventNames.h"} = 1;
        my $getter = $attribute->extendedAttributes->{WindowEventHandler} ? "windowEventHandlerAttribute" : "eventHandlerAttribute";
        my $eventName = EventHandlerAttributeEventName($attribute);
        push(@$outputArray, "    return $getter(thisObject.wrapped(), $eventName, worldForDOMObject(thisObject));\n");
    } elsif ($isConstructor) {
        # FIXME: This should be switched to using an extended attribute rather than infering this information from name.
        my $constructorType = $attribute->type->name;
        my $constructorGetter = ($constructorType =~ /LegacyFactoryFunctionConstructor$/) ? "getLegacyFactoryFunction" : "getConstructor";

        # Strip off any trailing "Constructor" or "LegacyFactoryFunctionConstructor" to get the real type.
        $constructorType =~ s/Constructor$//;

        # $constructorType ~= /LegacyFactoryFunction$/ indicates that it is LegacyFactoryFunction.
        # We do not generate the header file for LegacyFactoryFunction of class X,
        # since we generate the LegacyFactoryFunction declaration into the header file of class X.
        if ($constructorType ne "any" and $constructorType !~ /LegacyFactoryFunction$/) {
            AddToImplIncludes("JS" . $constructorType . ".h", $conditional);
        }

        $constructorType =~ s/LegacyFactoryFunction$//;

        if (IsDOMGlobalObject($interface)) {
            push(@$outputArray, "    return JS" . $constructorType . "::${constructorGetter}(JSC::getVM(&lexicalGlobalObject), &thisObject);\n");
        } else {
            push(@$outputArray, "    return JS" . $constructorType . "::${constructorGetter}(JSC::getVM(&lexicalGlobalObject), thisObject.globalObject());\n");
        }
    } else {
        if ($attribute->extendedAttributes->{CachedAttribute}) {
            push(@$outputArray, "    if (JSValue cachedValue = thisObject.m_" . $attribute->name . ".get())\n");
            push(@$outputArray, "        return cachedValue;\n");
        }
        
        my @callWithArgs = GenerateCallWithUsingReferences($attribute->extendedAttributes->{CallWith}, $outputArray, "jsUndefined()", "thisObject");
        
        my ($baseFunctionName, @arguments) = $codeGenerator->GetterExpression(\%implIncludes, $interface->type->name, $attribute);
        my $functionName = GetFullyQualifiedImplementationCallName($interface, $attribute, $baseFunctionName, "impl", $conditional);
        AddAdditionalArgumentsForImplementationCall(\@arguments, $interface, $attribute, "impl", "lexicalGlobalObject", "", "thisObject");
        
        unshift(@arguments, @callWithArgs);

        my $globalObjectReference = $attribute->isStatic ? "*jsCast<JSDOMGlobalObject*>(&lexicalGlobalObject)" : "*thisObject.globalObject()";
        my $toJSExpression = NativeToJSValueUsingReferences($attribute, $interface, "${functionName}(" . join(", ", @arguments) . ")", $globalObjectReference);
        push(@$outputArray, "    auto& impl = thisObject.wrapped();\n") unless $attribute->isStatic or $attribute->extendedAttributes->{ForwardToMapLike} or $attribute->extendedAttributes->{ForwardToSetLike};

        if (!IsReadonly($attribute)) {
            my $callTracer = $attribute->extendedAttributes->{CallTracer} || $interface->extendedAttributes->{CallTracer};
            if ($callTracer) {
                my @callTracerArguments = ();
                GenerateCallTracer($outputArray, $callTracer, $attribute->name, \@callTracerArguments, "    ");
            }
        }

        if ($attribute->extendedAttributes->{CachedAttribute}) {
            push(@$outputArray, "    JSValue result = ${toJSExpression};\n");
            push(@$outputArray, "    RETURN_IF_EXCEPTION(throwScope, { });\n") if ($needThrowScope);
            push(@$outputArray, "    thisObject.m_" . $attribute->name . ".set(JSC::getVM(&lexicalGlobalObject), &thisObject, result);\n");
            push(@$outputArray, "    return result;\n");
        } elsif ($needThrowScope) {
            push(@$outputArray, "    RELEASE_AND_RETURN(throwScope, (${toJSExpression}));\n");
        } else {
            push(@$outputArray, "    return ${toJSExpression};\n");
        }
    }
    push(@$outputArray, "}\n\n");
}

sub GenerateAttributeGetterTrampolineDefinition
{
    my ($outputArray, $interface, $className, $attribute, $attributeGetterName, $attributeGetterBodyName, $conditional) = @_;
    
    AddToImplIncludes("JSDOMAttribute.h", $conditional);
    
    my $callAttributeGetterName = "get";
    $callAttributeGetterName .= "Static" if $attribute->isStatic;
    $callAttributeGetterName .= "PassingPropertyName" if $codeGenerator->ExtendedAttributeContains($attribute->extendedAttributes->{CallWith}, "PropertyName");

    my @templateParameters = ();
    push(@templateParameters, $attributeGetterBodyName);
    if ($attribute->extendedAttributes->{LegacyLenientThis}) {
        push(@templateParameters, "CastedThisErrorBehavior::ReturnEarly")
    } elsif ($codeGenerator->IsPromiseType($attribute->type)) {
        push(@templateParameters, "CastedThisErrorBehavior::RejectPromise")
    } elsif (IsAcceleratedDOMAttribute($interface, $attribute)) {
        push(@templateParameters, "CastedThisErrorBehavior::Assert");
    }
    
    push(@$outputArray, "JSC_DEFINE_CUSTOM_GETTER(${attributeGetterName}, (JSGlobalObject* lexicalGlobalObject, EncodedJSValue thisValue, PropertyName attributeName))\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    return IDLAttribute<${className}>::${callAttributeGetterName}<" . join(", ", @templateParameters) . ">(*lexicalGlobalObject, thisValue, attributeName);\n");
    push(@$outputArray, "}\n\n");
}

sub GenerateAttributeGetterDefinition
{
    my ($outputArray, $interface, $className, $attribute) = @_;

    return if IsJSBuiltin($interface, $attribute);
    return if $attribute->extendedAttributes->{DelegateToSharedSyntheticAttribute};

    my $attributeGetterName = GetAttributeGetterName($interface, $className, $attribute);
    my $attributeGetterBodyName = $attributeGetterName . "Getter";
    
    my $conditional = $attribute->extendedAttributes->{Conditional};
    if ($conditional) {
        my $conditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($conditional);
        push(@$outputArray, "#if ${conditionalString}\n");;
    }
    
    GenerateAttributeGetterBodyDefinition($outputArray, $interface, $className, $attribute, $attributeGetterBodyName, $conditional);
    GenerateAttributeGetterTrampolineDefinition($outputArray, $interface, $className, $attribute, $attributeGetterName, $attributeGetterBodyName, $conditional);
    
    push(@$outputArray, "#endif\n\n") if $conditional;
}

sub AttributeSetterNeedsPropertyName
{
    my $attribute = shift;

    return $codeGenerator->ExtendedAttributeContains($attribute->extendedAttributes->{CallWith}, "PropertyName")
        || $attribute->extendedAttributes->{Replaceable};
}

sub GenerateAttributeSetterBodyDefinition
{
    my ($outputArray, $interface, $className, $attribute, $attributeSetterBodyName, $conditional) = @_;

    my @signatureArguments = ();
    push(@signatureArguments, "JSGlobalObject& lexicalGlobalObject");
    push(@signatureArguments, "${className}& thisObject") if !$attribute->isStatic;
    push(@signatureArguments, "JSValue value");
    push(@signatureArguments, "PropertyName propertyName") if AttributeSetterNeedsPropertyName($attribute);

    my $needSecurityCheck = $interface->extendedAttributes->{CheckSecurity} && !$attribute->extendedAttributes->{DoNotCheckSecurity} && !$attribute->extendedAttributes->{DoNotCheckSecurityOnSetter};
    my $hasCustomSetter = HasCustomSetter($attribute);
    my $isEventHandler = $attribute->type->name eq "EventHandler";
    my $isReplaceable = $attribute->extendedAttributes->{Replaceable};

    my $needThrowScope = $needSecurityCheck || (!$hasCustomSetter && !$isEventHandler && !$isReplaceable);

    push(@$outputArray, "static inline bool ${attributeSetterBodyName}(" . join(", ", @signatureArguments) . ")\n");
    push(@$outputArray, "{\n");

    push(@$outputArray, "    auto& vm = JSC::getVM(&lexicalGlobalObject);\n");
    push(@$outputArray, "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n") if $needThrowScope;

    GenerateCustomElementReactionsStackIfNeeded($outputArray, $attribute, "lexicalGlobalObject");

    if ($needSecurityCheck) {
        if ($interface->type->name eq "DOMWindow") {
            AddToImplIncludes("JSDOMBindingSecurityInlines.h", $conditional);
            push(@$outputArray, "    bool shouldAllowAccess = BindingSecurity::shouldAllowAccessToDOMWindow(&lexicalGlobalObject, thisObject, ThrowSecurityError);\n");
        } else {
            AddToImplIncludes("JSDOMBindingSecurity.h", $conditional);
            push(@$outputArray, "    bool shouldAllowAccess = BindingSecurity::shouldAllowAccessToDOMWindow(&lexicalGlobalObject, thisObject.wrapped().window(), ThrowSecurityError);\n");
        }
        push(@$outputArray, "    EXCEPTION_ASSERT_UNUSED(throwScope, !throwScope.exception() || !shouldAllowAccess);\n");
        push(@$outputArray, "    if (!shouldAllowAccess)\n");
        push(@$outputArray, "        return false;\n");
    }
    
    if ($hasCustomSetter) {
        my $implSetterFunctionName = $codeGenerator->WK_ucfirst($attribute->name);
        push(@$outputArray, "    thisObject.set${implSetterFunctionName}(lexicalGlobalObject, value);\n");
        push(@$outputArray, "    return true;\n");
    } elsif ($isEventHandler) {
        AddToImplIncludes("JSEventListener.h", $conditional);
        my $eventName = EventHandlerAttributeEventName($attribute);
        # FIXME: Find a way to do this special case without hardcoding the class and attribute names here.
        if (($interface->type->name eq "DOMWindow" or $interface->type->name eq "WorkerGlobalScope") and $attribute->name eq "onerror") {
            AddToImplIncludes("JSErrorHandler.h", $conditional);
            push(@$outputArray, "    setEventHandlerAttribute<JSErrorHandler>(thisObject.wrapped(), ${eventName}, value, thisObject);\n");
        } else {
            AddToImplIncludes("JSEventListener.h", $conditional);
            my $setter = $attribute->extendedAttributes->{WindowEventHandler} ? "setWindowEventHandlerAttribute" : "setEventHandlerAttribute";
            push(@$outputArray, "    $setter<JSEventListener>(thisObject.wrapped(), ${eventName}, value, thisObject);\n");
        }
        push(@$outputArray, "    vm.writeBarrier(&thisObject, value);\n");
        push(@$outputArray, "    ensureStillAliveHere(value);\n\n");
        push(@$outputArray, "    return true;\n");
    } elsif ($isReplaceable) {
        if ($needThrowScope) {
            push(@$outputArray, "    throwScope.release();\n");
        } else {
            push(@$outputArray, "    UNUSED_PARAM(vm);\n");
        }
        push(@$outputArray, "    bool shouldThrow = true;\n");
        push(@$outputArray, "    thisObject.createDataProperty(&lexicalGlobalObject, propertyName, value, shouldThrow);\n");
        push(@$outputArray, "    return true;\n");
    } elsif ($attribute->extendedAttributes->{PutForwards}) {
        assert("[PutForwards] is not compatible with static attributes") if $attribute->isStatic;
        
        # 3.5.9.1. Let Q be ? Get(O, id).
        my $id = $attribute->name;
        push(@$outputArray, "    auto id = Identifier::fromString(vm, reinterpret_cast<const LChar*>(\"${id}\"), strlen(\"${id}\"));\n");
        push(@$outputArray, "    auto valueToForwardTo = thisObject.get(&lexicalGlobalObject, id);\n");
        push(@$outputArray, "    RETURN_IF_EXCEPTION(throwScope, false);\n");
        
        # 3.5.9.2. If Type(Q) is not Object, then throw a TypeError.
        push(@$outputArray, "    if (UNLIKELY(!valueToForwardTo.isObject())) {\n");
        push(@$outputArray, "        throwTypeError(&lexicalGlobalObject, throwScope);\n");
        push(@$outputArray, "        return false;\n");
        push(@$outputArray, "    }\n");
        
        # 3.5.9.3. Let forwardId be the identifier argument of the [PutForwards] extended attribute.
        my $forwardId = $attribute->extendedAttributes->{PutForwards};
        push(@$outputArray, "    auto forwardId = Identifier::fromString(vm, reinterpret_cast<const LChar*>(\"${forwardId}\"), strlen(\"${forwardId}\"));\n");
        
        # 3.5.9.4. Perform ? Set(Q, forwardId, V, false).
        push(@$outputArray, "    PutPropertySlot slot(valueToForwardTo, false);\n");
        push(@$outputArray, "    asObject(valueToForwardTo)->methodTable(vm)->put(asObject(valueToForwardTo), &lexicalGlobalObject, forwardId, value, slot);\n");
        push(@$outputArray, "    RETURN_IF_EXCEPTION(throwScope, false);\n");
        
        push(@$outputArray, "    return true;\n");
    } else {
        push(@$outputArray, "    auto& impl = thisObject.wrapped();\n") if !$attribute->isStatic;
       
        if ($codeGenerator->IsEnumType($attribute->type)) {
            # As per section 3.5.6 of https://webidl.spec.whatwg.org/#dfn-attribute-setter, enumerations do not use
            # the standard conversion, but rather silently fail on invalid enumeration values.
            push(@$outputArray, "    auto optionalNativeValue = parseEnumeration<" . GetEnumerationClassName($attribute->type, $interface) . ">(lexicalGlobalObject, value);\n");
            push(@$outputArray, "    RETURN_IF_EXCEPTION(throwScope, false);\n");
            push(@$outputArray, "    if (UNLIKELY(!optionalNativeValue))\n");
            push(@$outputArray, "        return false;\n");
            push(@$outputArray, "    auto nativeValue = optionalNativeValue.value();\n");
        } else {
            my $globalObjectReference = $attribute->isStatic ? "*jsCast<JSDOMGlobalObject*>(lexicalGlobalObject)" : "*thisObject.globalObject()";
            my $exceptionThrower = GetAttributeExceptionThrower($interface, $attribute);

            my $toNativeExpression = JSValueToNative($interface, $attribute, "value", $attribute->extendedAttributes->{Conditional}, "&lexicalGlobalObject", "lexicalGlobalObject", "thisObject", $globalObjectReference, $exceptionThrower);
            push(@$outputArray, "    auto nativeValue = ${toNativeExpression};\n");
            push(@$outputArray, "    RETURN_IF_EXCEPTION(throwScope, false);\n");
        }

        my ($baseFunctionName, @arguments) = $codeGenerator->SetterExpression(\%implIncludes, $interface->type->name, $attribute);

        push(@arguments, PassArgumentExpression("nativeValue", $attribute));

        my $functionName = GetFullyQualifiedImplementationCallName($interface, $attribute, $baseFunctionName, "impl", $conditional);
        AddAdditionalArgumentsForImplementationCall(\@arguments, $interface, $attribute, "impl", "lexicalGlobalObject", "", "thisObject");

        unshift(@arguments, GenerateCallWithUsingReferences($attribute->extendedAttributes->{SetterCallWith}, $outputArray, "false", "thisObject"));
        unshift(@arguments, GenerateCallWithUsingReferences($attribute->extendedAttributes->{CallWith}, $outputArray, "false", "thisObject"));

        my $callTracer = $attribute->extendedAttributes->{CallTracer} || $interface->extendedAttributes->{CallTracer};
        if ($callTracer) {
            my $indent = "    ";
            my @callTracerArguments = ("nativeValue");
            GenerateCallTracer($outputArray, $callTracer, $attribute->name, \@callTracerArguments, $indent);
        }

        my $functionString = "${functionName}(" . join(", ", @arguments) . ")";
        push(@$outputArray, "    invokeFunctorPropagatingExceptionIfNecessary(lexicalGlobalObject, throwScope, [&] {\n");
        push(@$outputArray, "        return $functionString;\n");
        push(@$outputArray, "    });\n");
        push(@$outputArray, "    return true;\n");
    }
    push(@$outputArray, "}\n\n");
}

sub GenerateAttributeSetterTrampolineDefinition
{
    my ($outputArray, $interface, $className, $attribute, $attributeSetterName, $attributeSetterBodyName, $conditional) = @_;
    
    AddToImplIncludes("JSDOMAttribute.h", $conditional);
    
    my $callAttributeSetterName = "set";
    $callAttributeSetterName .= "Static" if $attribute->isStatic;
    $callAttributeSetterName .= "PassingPropertyName" if AttributeSetterNeedsPropertyName($attribute);

    my @templateParameters = ();
    push(@templateParameters, $attributeSetterBodyName);
    push(@templateParameters, "CastedThisErrorBehavior::ReturnEarly") if $attribute->extendedAttributes->{LegacyLenientThis};
    
    push(@$outputArray, "JSC_DEFINE_CUSTOM_SETTER(${attributeSetterName}, (JSGlobalObject* lexicalGlobalObject, EncodedJSValue thisValue, EncodedJSValue encodedValue, PropertyName attributeName))\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    return IDLAttribute<${className}>::${callAttributeSetterName}<" . join(", ", @templateParameters) . ">(*lexicalGlobalObject, thisValue, encodedValue, attributeName);\n");
    push(@$outputArray, "}\n\n");
}

sub GenerateAttributeSetterDefinition
{
    my ($outputArray, $interface, $className, $attribute) = @_;
    
    return if IsReadonly($attribute);
    return if $codeGenerator->IsConstructorType($attribute->type);
    return if IsJSBuiltin($interface, $attribute);
    return if $attribute->extendedAttributes->{DelegateToSharedSyntheticAttribute};

    my $conditional = $attribute->extendedAttributes->{Conditional};
    if ($conditional) {
        my $conditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($conditional);
        push(@$outputArray, "#if ${conditionalString}\n");;
    }

    my $readWriteConditional = $attribute->extendedAttributes->{ConditionallyReadWrite};
    if ($readWriteConditional) {
        my $conditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($readWriteConditional);
        push(@$outputArray, "#if ${conditionalString}\n");;
    }

    my $attributeSetterName = GetAttributeSetterName($interface, $className, $attribute);
    my $attributeSetterBodyName = $attributeSetterName . "Setter";
    
    GenerateAttributeSetterBodyDefinition($outputArray, $interface, $className, $attribute, $attributeSetterBodyName, $conditional);
    GenerateAttributeSetterTrampolineDefinition($outputArray, $interface, $className, $attribute, $attributeSetterName, $attributeSetterBodyName, $conditional);

    push(@$outputArray, "#endif\n\n") if $readWriteConditional;
    push(@$outputArray, "#endif\n\n") if $conditional;
}

sub GenerateOperationTrampolineDefinition
{
    my ($outputArray, $interface, $className, $operation, $functionName, $functionBodyName) = @_;

    my $hasPromiseReturnType = $codeGenerator->IsPromiseType($operation->type);
    my $idlOperationType = $hasPromiseReturnType ? "IDLOperationReturningPromise" : "IDLOperation";

    my $callFunctionName = "call";
    $callFunctionName .= "Static" if $operation->isStatic;
    $callFunctionName .= "ReturningOwnPromise" if $hasPromiseReturnType && $operation->extendedAttributes->{ReturnsOwnPromise};

    my @callFunctionTemplateArguments = ();
    push(@callFunctionTemplateArguments, $functionBodyName);
    push(@callFunctionTemplateArguments, "CastedThisErrorBehavior::Assert") if ($operation->extendedAttributes->{PrivateIdentifier} and not $operation->extendedAttributes->{PublicIdentifier});

    push(@$outputArray, "JSC_DEFINE_HOST_FUNCTION(${functionName}, (JSGlobalObject* lexicalGlobalObject, CallFrame* callFrame))\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    return ${idlOperationType}<${className}>::${callFunctionName}<" . join(", ", @callFunctionTemplateArguments) . ">(*lexicalGlobalObject, *callFrame, \"" . $operation->name . "\");\n");
    push(@$outputArray, "}\n\n");
}

sub GenerateOperationBodyDefinition
{
    my ($outputArray, $interface, $className, $operation, $functionName, $functionImplementationName, $functionBodyName, $isOverloaded, $generatingOverloadDispatcher) = @_;

    my $hasPromiseReturnType = $codeGenerator->IsPromiseType($operation->type);
    my $idlOperationType = $hasPromiseReturnType ? "IDLOperationReturningPromise" : "IDLOperation";
    my $conditional = $operation->extendedAttributes->{Conditional};

    my @signatureArguments = ();
    push(@signatureArguments, "JSC::JSGlobalObject* lexicalGlobalObject");
    push(@signatureArguments, "JSC::CallFrame* callFrame");
    push(@signatureArguments, "typename ${idlOperationType}<${className}>::ClassParameter castedThis") if !$operation->isStatic;
    push(@signatureArguments, "Ref<DeferredPromise>&& promise") if $hasPromiseReturnType && !$operation->extendedAttributes->{ReturnsOwnPromise};

    push(@$outputArray, "static inline JSC::EncodedJSValue ${functionBodyName}(" . join(", ", @signatureArguments) . ")\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    auto& vm = JSC::getVM(lexicalGlobalObject);\n");
    push(@$outputArray, "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n");
    push(@$outputArray, "    UNUSED_PARAM(throwScope);\n");
    push(@$outputArray, "    UNUSED_PARAM(callFrame);\n");

    GenerateCustomElementReactionsStackIfNeeded($outputArray, $operation, "*lexicalGlobalObject") unless $generatingOverloadDispatcher;

    # For overloads, we generate the security check in the overload dispatcher, instead of the body of each overload, as per specification:
    # https://webidl.spec.whatwg.org/#dfn-create-operation-function
    if (!$isOverloaded || $generatingOverloadDispatcher) {
        if ($interface->extendedAttributes->{CheckSecurity} and !$operation->extendedAttributes->{DoNotCheckSecurity}) {
            assert("Security checks are not supported for static operations.") if $operation->isStatic;
            
            if ($interface->type->name eq "DOMWindow") {
                AddToImplIncludes("JSDOMBindingSecurityInlines.h", $conditional);
                push(@$outputArray, "    bool shouldAllowAccess = BindingSecurity::shouldAllowAccessToDOMWindow(lexicalGlobalObject, *castedThis, ThrowSecurityError);\n");
            } else {
                AddToImplIncludes("JSDOMBindingSecurity.h", $conditional);
                push(@$outputArray, "    bool shouldAllowAccess = BindingSecurity::shouldAllowAccessToDOMWindow(lexicalGlobalObject, castedThis->wrapped().window(), ThrowSecurityError);\n");
            }
            push(@$outputArray, "    EXCEPTION_ASSERT_UNUSED(throwScope, !throwScope.exception() || !shouldAllowAccess);\n");
            push(@$outputArray, "    if (!shouldAllowAccess)\n");
            push(@$outputArray, "        return JSValue::encode(jsUndefined());\n");
        }
    }

    my $indent = "    ";

    if ($generatingOverloadDispatcher) {
        my @argumentsToForward = ();
        push(@argumentsToForward, "lexicalGlobalObject");
        push(@argumentsToForward, "callFrame");
        push(@argumentsToForward, "castedThis") if !$operation->isStatic;
        push(@argumentsToForward, "WTFMove(promise)") if $hasPromiseReturnType && !$operation->extendedAttributes->{ReturnsOwnPromise};

        GenerateOverloadDispatcher($operation, $interface, $functionName, "Body", join(", ", @argumentsToForward));
    } elsif (HasCustomMethod($operation)) {
        GenerateImplementationCustomFunctionCall($outputArray, $operation, $interface, $className, $functionImplementationName, $indent);
    } else {
        if (!$operation->extendedAttributes->{ForwardToMapLike} && !$operation->extendedAttributes->{ForwardToSetLike} && !$operation->isStatic) {
            push(@$outputArray, "    auto& impl = castedThis->wrapped();\n");
        }

        GenerateArgumentsCountCheck($outputArray, $operation, $interface, $indent);
        my $functionString = GenerateParametersCheck($outputArray, $operation, $interface, $functionImplementationName, $indent);

        my $hasThrowScope = 1;
        if ($operation->extendedAttributes->{ResultField}) {
            my $resultName = $operation->extendedAttributes->{ResultField};
            push(@$outputArray, "    auto implResult = $functionString;\n");
            GenerateImplementationFunctionCall($outputArray, $operation, $interface, "WTFMove(implResult.$resultName)", $indent, $hasThrowScope);
        } else {
            GenerateImplementationFunctionCall($outputArray, $operation, $interface, $functionString, $indent, $hasThrowScope);
        }
    }

    push(@$outputArray, "}\n\n");
}

sub GenerateOperationDefinition
{
    my ($outputArray, $interface, $className, $operation) = @_;

    return if IsJSBuiltin($interface, $operation);
    return if $operation->extendedAttributes->{FromIterable};
    
    if ($operation->extendedAttributes->{Default}) {
        return GenerateDefaultOperationDefinition($outputArray, $interface, $className, $operation);
    }

    my $isCustom = HasCustomMethod($operation);
    my $isOverloaded = $operation->{overloads} && @{$operation->{overloads}} > 1;

    assert("[Custom] is not supported for overloaded operations.") if $isCustom && $isOverloaded;

    my $inAppleCopyright = 0;

    if ($operation->extendedAttributes->{AppleCopyright}) {
        if (!$inAppleCopyright) {
            push(@$outputArray, $beginAppleCopyrightForSourceFiles);
            $inAppleCopyright = 1;
        }
    } elsif ($inAppleCopyright) {
        push(@$outputArray, $endAppleCopyright);
        $inAppleCopyright = 0;
    }

    my $conditional = $operation->extendedAttributes->{Conditional};
    if ($conditional) {
        my $conditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($conditional);
        push(@$outputArray, "#if ${conditionalString}\n");
    }

    my $hasPromiseReturnType = $codeGenerator->IsPromiseType($operation->type);

    AddToImplIncludesForIDLType($operation->type, $conditional) unless $isCustom or $hasPromiseReturnType;
    AddToImplIncludes("JSDOMOperation.h", $conditional) if !$hasPromiseReturnType;
    AddToImplIncludes("JSDOMOperationReturningPromise.h", $conditional) if $hasPromiseReturnType;

    my $functionName = GetFunctionName($interface, $className, $operation);
    my $functionImplementationName = $operation->extendedAttributes->{ImplementedAs} || $codeGenerator->WK_lcfirst($operation->name);
    my $functionBodyName = ($isOverloaded ? $functionName . $operation->{overloadIndex} : $functionName) . "Body";

    GenerateOperationBodyDefinition($outputArray, $interface, $className, $operation, $functionName, $functionImplementationName, $functionBodyName, $isOverloaded);

    # Overloaded operations don't generate a trampoline for each overload, and instead have a single dispatch trampoline
    # that gets generated after the last overload body has been generated.
    unless ($isOverloaded) {
        GenerateOperationTrampolineDefinition($outputArray, $interface, $className, $operation, $functionName, $functionBodyName);
    }

    push(@$outputArray, "#endif\n\n") if $conditional;

    # Generate a function dispatching call to the rest of the overloads.
    if ($isOverloaded && $operation->{overloadIndex} == @{$operation->{overloads}}) {
        my $overloadsConditionalAttribute = GetConditionalForOperationConsideringOverloads($operation);
        my $overloadsConditionalString = $overloadsConditionalAttribute ? $codeGenerator->GenerateConditionalStringFromAttributeValue($overloadsConditionalAttribute) : undef;
        push(@$outputArray, "#if ${overloadsConditionalString}\n\n") if $overloadsConditionalString;

        my $overloadDispatcherFunctionBodyName = $functionName . "OverloadDispatcher";
        GenerateOperationBodyDefinition($outputArray, $interface, $className, $operation, $functionName, $functionImplementationName, $overloadDispatcherFunctionBodyName, $isOverloaded, 1);
        GenerateOperationTrampolineDefinition($outputArray, $interface, $className, $operation, $functionName, $overloadDispatcherFunctionBodyName);
    
        push(@$outputArray, "#endif\n\n") if $overloadsConditionalString;
    }


    if ($operation->extendedAttributes->{DOMJIT}) {
        if ($conditional) {
            my $conditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($conditional);
            push(@$outputArray, "#if ${conditionalString}\n");
        }

        AddToImplIncludes("<JavaScriptCore/FrameTracers.h>", $conditional);
        my $nameOfFunctionWithoutTypeCheck = $codeGenerator->WK_lcfirst($functionName) . "WithoutTypeCheck";
        push(@$outputArray, "JSC_DEFINE_JIT_OPERATION(${nameOfFunctionWithoutTypeCheck}, JSC::EncodedJSValue, (JSC::JSGlobalObject* lexicalGlobalObject, $className* castedThis");
        foreach my $argument (@{$operation->arguments}) {
            my $type = $argument->type;
            my $argumentType = GetArgumentTypeForFunctionWithoutTypeCheck($interface, $type);
            my $name = $argument->name;
            my $encodedName = "encoded" . $codeGenerator->WK_ucfirst($name);
            push(@$outputArray, ", ${argumentType} ${encodedName}");
        }
        push(@$outputArray, "))\n");
        push(@$outputArray, "{\n");
        push(@$outputArray, "    UNUSED_PARAM(lexicalGlobalObject);\n");
        push(@$outputArray, "    VM& vm = JSC::getVM(lexicalGlobalObject);\n");
        push(@$outputArray, "    IGNORE_WARNINGS_BEGIN(\"frame-address\")\n");
        push(@$outputArray, "    CallFrame* callFrame = DECLARE_CALL_FRAME(vm);\n");
        push(@$outputArray, "    IGNORE_WARNINGS_END\n");
        push(@$outputArray, "    JSC::JITOperationPrologueCallFrameTracer tracer(vm, callFrame);\n");
        push(@$outputArray, "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n");
        push(@$outputArray, "    UNUSED_PARAM(throwScope);\n");
        push(@$outputArray, "    auto& impl = castedThis->wrapped();\n");
        
        my $implFunctionName = GetFullyQualifiedImplementationCallName($interface, $operation, $functionImplementationName, "impl", $conditional);
        
        my @arguments = ();
        AddAdditionalArgumentsForImplementationCall(\@arguments, $interface, $operation, "impl", "*lexicalGlobalObject", "*callFrame", "*castedThis");
        
        foreach my $argument (@{$operation->arguments}) {
            my $value = "";
            my $type = $argument->type;
            my $name = $argument->name;
            my $encodedName = "encoded" . $codeGenerator->WK_ucfirst($name);
            my $shouldPassByReference = ShouldPassArgumentByReference($argument);

            my ($nativeValue, $mayThrowException) = ToNativeForFunctionWithoutTypeCheck($interface, $argument, $encodedName, $operation->extendedAttributes->{Conditional});
            push(@$outputArray, "    auto $name = ${nativeValue};\n");
            push(@$outputArray, "    RETURN_IF_EXCEPTION(throwScope, encodedJSValue());\n") if $mayThrowException;
            $value = "WTFMove($name)";

            if ($shouldPassByReference) {
                $value = "*$name";
            }
            push(@arguments, $value);
        }
        my $functionString = "$implFunctionName(" . join(", ", @arguments) . ")";
        push(@$outputArray, "    return JSValue::encode(" . NativeToJSValueUsingPointers($operation, $interface, $functionString, "*castedThis->globalObject()") . ");\n");
        push(@$outputArray, "}\n\n");

        push(@$outputArray, "#endif\n\n") if $conditional;
    }

    push(@$outputArray, $endAppleCopyright) if $inAppleCopyright;
}

sub GenerateDefaultOperationDefinition
{
    my ($outputArray, $interface, $className, $operation) = @_;

    if ($operation->name eq "toJSON" && $operation->type->name eq "object") {
        return GenerateDefaultToJSONOperationDefinition($outputArray, $interface, $className, $operation);
    }

    die "[Default] is not support for for this operation (" . $operation->name . "). It is only currently defined for 'object toJSON();'."
}

sub GenerateDefaultToJSONOperationDefinition
{
    my ($outputArray, $interface, $className, $operation) = @_;

    # https://webidl.spec.whatwg.org/#es-default-tojson

    my @inheritenceStack = ();
    push(@inheritenceStack, $interface);
    $codeGenerator->ForAllParents($interface, sub {
        my $parentInterface = shift;
        push(@inheritenceStack, $parentInterface);
    }, 0);

    my $functionName = GetFunctionName($interface, $className, $operation);

    push(@$outputArray, "static inline EncodedJSValue ${functionName}Body(JSGlobalObject* lexicalGlobalObject, CallFrame*, ${className}* castedThis)\n");
    push(@$outputArray, "{\n");
    push(@implContent, "    auto& vm = JSC::getVM(lexicalGlobalObject);\n");
    push(@implContent, "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n");
    push(@implContent, "    UNUSED_PARAM(throwScope);\n");
    push(@implContent, "    auto& impl = castedThis->wrapped();\n");

    AddToImplIncludes("<JavaScriptCore/ObjectConstructor.h>");
    push(@implContent, "    auto* result = constructEmptyObject(lexicalGlobalObject, castedThis->globalObject()->objectPrototype());\n");

     while (@inheritenceStack) {
        my $currentInterface = pop(@inheritenceStack);

        my $hasDefaultToJSONOperation = 0;
        foreach my $operation (@{$currentInterface->operations}) {
            if ($operation->extendedAttributes->{Default} && $operation->name eq "toJSON" && $operation->type->name eq "object") {
                $hasDefaultToJSONOperation = 1;
                last;
            }
        }
        if ($hasDefaultToJSONOperation) {
            foreach my $attribute (@{$currentInterface->attributes}) {
                next if $attribute->isStatic;
                next if !$codeGenerator->IsJSONType($interface, $attribute->type);

                assert("[CachedAttribute] is not currently support on interfaces with [Default] object toJSON();") if $attribute->extendedAttributes->{CachedAttribute};

                my $conditional = $attribute->extendedAttributes->{Conditional};
                if ($conditional) {
                    my $conditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($conditional);
                    push(@$outputArray, "#if ${conditionalString}\n");;
                }

                my $attributeName = $attribute->name;
                my $toJSExpression = "";
                my $mayThrowException = 0;
                if (HasCustomGetter($attribute)) {
                    my $implGetterFunctionName = $codeGenerator->WK_lcfirst($attribute->extendedAttributes->{ImplementedAs} || $attributeName);
                    $toJSExpression = "castedThis->${implGetterFunctionName}(*lexicalGlobalObject)";
                } else {
                    my ($baseFunctionName, @arguments) = $codeGenerator->GetterExpression(\%implIncludes, $currentInterface->type->name, $attribute);
                    my $functionName = GetFullyQualifiedImplementationCallName($currentInterface, $attribute, $baseFunctionName, "impl", $conditional);
                    $mayThrowException = NativeToJSValueMayThrow($attribute);
                    $toJSExpression = NativeToJSValue($attribute, $currentInterface, "${functionName}(" . join(", ", @arguments) . ")", "*lexicalGlobalObject", "*castedThis->globalObject()");
                }

                my $needsRuntimeCheck = NeedsRuntimeCheck($currentInterface, $attribute);
                if ($needsRuntimeCheck) {
                    my $runtimeEnableConditionalString = GenerateRuntimeEnableConditionalString($currentInterface, $attribute, "castedThis->globalObject()");
                    push(@$outputArray, "    if (${runtimeEnableConditionalString}) {\n");
                    push(@$outputArray, "        auto ${attributeName}Value = ${toJSExpression};\n");
                    push(@$outputArray, "        RETURN_IF_EXCEPTION(throwScope, { });\n") if $mayThrowException;
                    push(@$outputArray, "        result->putDirect(vm, Identifier::fromString(vm, \"${attributeName}\"), ${attributeName}Value);\n");
                    push(@$outputArray, "    }\n");
                } else {
                    push(@$outputArray, "    auto ${attributeName}Value = ${toJSExpression};\n");
                    push(@$outputArray, "    RETURN_IF_EXCEPTION(throwScope, { });\n") if $mayThrowException;
                    push(@$outputArray, "    result->putDirect(vm, Identifier::fromString(vm, \"${attributeName}\"), ${attributeName}Value);\n");
                }

                if ($conditional) {
                    push(@$outputArray, "#endif\n\n") ;
                }
            }
        }
    }

    push(@$outputArray, "    return JSValue::encode(result);\n");
    push(@$outputArray, "}\n");
    push(@$outputArray, "\n");

    my $interfaceName = $interface->type->name;
    push(@$outputArray, "JSC_DEFINE_HOST_FUNCTION(${functionName}, (JSGlobalObject* lexicalGlobalObject, CallFrame* callFrame))\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    return IDLOperation<JS${interfaceName}>::call<${functionName}Body>(*lexicalGlobalObject, *callFrame, \"toJSON\");\n");
    push(@$outputArray, "}\n");
    push(@$outputArray, "\n");
}

sub GenerateGetCallData
{
    my ($outputArray, $interface, $className) = @_;

    return if $interface->extendedAttributes->{CustomGetCallData};

    AddToImplIncludes("JSPluginElementFunctions.h");

    push(@$outputArray, "CallData ${className}::getCallData(JSCell* cell)\n");
    push(@$outputArray, "{\n");
    push(@$outputArray, "    auto* thisObject = jsCast<${className}*>(cell);\n");
    push(@$outputArray, "    ASSERT_GC_OBJECT_INHERITS(thisObject, info());\n\n");

    push(@$outputArray, "    return pluginElementCustomGetCallData(thisObject);\n");
    push(@$outputArray, "}\n");
    push(@$outputArray, "\n");
}

sub GenerateCallWithUsingReferences
{
    my ($callWith, $outputArray, $returnValue, $thisReference, $callFrameReference, $indent) = @_;

    my $callFramePointer = $callFrameReference && "&$callFrameReference";
    my $globalObject = "jsCast<JSDOMGlobalObject*>(&lexicalGlobalObject)";

    return GenerateCallWith($callWith, $outputArray, $returnValue, $returnValue, $callFramePointer, $callFrameReference, $globalObject, $globalObject, $thisReference, $indent);
}

# FIXME: We should remove GenerateCallWithUsingPointers and combine GenerateCallWithUsingReferences and GenerateCallWith
sub GenerateCallWithUsingPointers
{
    my ($callWith, $outputArray, $returnValue, $thisReference, $indent) = @_;

    my $callFramePointer = "callFrame";
    my $callFrameReference = "*callFrame";
    my $globalObject = "jsCast<JSDOMGlobalObject*>(lexicalGlobalObject)";

    return GenerateCallWith($callWith, $outputArray, $returnValue, $returnValue, $callFramePointer, $callFrameReference, $globalObject, $globalObject, $thisReference, $indent);
}

sub GenerateConstructorCallWithUsingPointers
{
    my ($callWith, $outputArray, $visibleInterfaceName, $thisReference, $indent) = @_;

    my $callFramePointer = "callFrame";
    my $callFrameReference = "*callFrame";
    my $globalObject = "castedThis->globalObject()";
    my $contextMissing = "throwConstructorScriptExecutionContextUnavailableError(*lexicalGlobalObject, throwScope, \"${visibleInterfaceName}\")";
    my $scriptExecutionContextAccessor = "castedThis";

    return GenerateCallWith($callWith, $outputArray, "", $contextMissing, $callFramePointer, $callFrameReference, $globalObject, $scriptExecutionContextAccessor, $thisReference, $indent);
}

sub GenerateCallWith
{
    my ($callWith, $outputArray, $returnValue, $contextMissing, $callFramePointer, $callFrameReference, $globalObject, $scriptExecutionContextAccessor, $thisReference, $indent) = @_;

    return () unless $callWith;

    $indent ||= "    ";

    my @callWithArgs;
    # Global object of current realm (https://html.spec.whatwg.org/multipage/webappapis.html#concept-current-everything)
    if ($codeGenerator->ExtendedAttributeContains($callWith, "GlobalObject")) {
        push(@callWithArgs, "*${globalObject}");
    }
    my $relevantGlobalObjectPointer = "(${thisReference}).globalObject()";
    # Global object of relevant realm (https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-everything)
    if ($codeGenerator->ExtendedAttributeContains($callWith, "RelevantGlobalObject")) {
        push(@callWithArgs, "*${relevantGlobalObjectPointer}");
    }
    # Script execution context of current realm (https://html.spec.whatwg.org/multipage/webappapis.html#concept-current-everything)
    if ($codeGenerator->ExtendedAttributeContains($callWith, "ScriptExecutionContext")) {
        push(@$outputArray, $indent . "auto* context = ${scriptExecutionContextAccessor}->scriptExecutionContext();\n");
        push(@$outputArray, $indent . "if (UNLIKELY(!context))\n");
        push(@$outputArray, $indent . "    return" . ($contextMissing ? " " . $contextMissing : "") . ";\n");
        push(@callWithArgs, "*context");
    }
    # Script execution context of relevant realm (https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-everything)
    if ($codeGenerator->ExtendedAttributeContains($callWith, "RelevantScriptExecutionContext")) {
        push(@$outputArray, $indent . "auto* context = ${relevantGlobalObjectPointer}->scriptExecutionContext();\n");
        push(@$outputArray, $indent . "if (UNLIKELY(!context))\n");
        push(@$outputArray, $indent . "    return" . ($contextMissing ? " " . $contextMissing : "") . ";\n");
        push(@callWithArgs, "*context");
    }
    # Document of current realm (https://html.spec.whatwg.org/multipage/webappapis.html#concept-current-everything)
    if ($codeGenerator->ExtendedAttributeContains($callWith, "Document")) {
        AddToImplIncludes("Document.h");
        push(@$outputArray, $indent . "auto* context = ${scriptExecutionContextAccessor}->scriptExecutionContext();\n");
        push(@$outputArray, $indent . "if (UNLIKELY(!context))\n");
        push(@$outputArray, $indent . "    return" . ($contextMissing ? " " . $contextMissing : "") . ";\n");
        push(@$outputArray, $indent . "ASSERT(context->isDocument());\n");
        push(@$outputArray, $indent . "auto& document = downcast<Document>(*context);\n");
        push(@callWithArgs, "document");
    }
    # Document of relevant realm (https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-everything)
    if ($codeGenerator->ExtendedAttributeContains($callWith, "RelevantDocument")) {
        AddToImplIncludes("Document.h");
        push(@$outputArray, $indent . "auto* context = ${relevantGlobalObjectPointer}->scriptExecutionContext();\n");
        push(@$outputArray, $indent . "if (UNLIKELY(!context))\n");
        push(@$outputArray, $indent . "    return" . ($contextMissing ? " " . $contextMissing : "") . ";\n");
        push(@$outputArray, $indent . "ASSERT(context->isDocument());\n");
        push(@$outputArray, $indent . "auto& document = downcast<Document>(*context);\n");
        push(@callWithArgs, "document");
    }
    if ($codeGenerator->ExtendedAttributeContains($callWith, "IncumbentDocument")) {
        AddToImplIncludes("DOMWindow.h");
        AddToImplIncludes("JSDOMWindowBase.h");
        push(@$outputArray, $indent . "auto* incumbentDocument = incumbentDOMWindow(*$globalObject, $callFrameReference).document();\n");
        push(@$outputArray, $indent . "if (!incumbentDocument)\n");
        push(@$outputArray, $indent . "    return" . ($returnValue ? " " . $returnValue : "") . ";\n");
        push(@callWithArgs, "*incumbentDocument");
    }
    if ($codeGenerator->ExtendedAttributeContains($callWith, "EntryDocument")) {
        AddToImplIncludes("DOMWindow.h");
        AddToImplIncludes("JSDOMWindowBase.h");
        push(@callWithArgs, "firstDOMWindow(*$globalObject).document()");
    }
    if ($codeGenerator->ExtendedAttributeContains($callWith, "ActiveWindow")) {
        AddToImplIncludes("DOMWindow.h");
        AddToImplIncludes("JSDOMWindowBase.h");
        push(@callWithArgs, "activeDOMWindow(*$globalObject)");
    }
    if ($codeGenerator->ExtendedAttributeContains($callWith, "IncumbentWindow")) {
        AddToImplIncludes("DOMWindow.h");
        AddToImplIncludes("JSDOMWindowBase.h");
        push(@callWithArgs, "incumbentDOMWindow(*$globalObject" . ($callFrameReference ? ", " . $callFrameReference : "") . ")");
    }
    if ($codeGenerator->ExtendedAttributeContains($callWith, "LegacyActiveWindowForAccessor")) {
        AddToImplIncludes("DOMWindow.h");
        AddToImplIncludes("JSDOMWindowBase.h");
        push(@callWithArgs, "legacyActiveDOMWindowForAccessor(*$globalObject" . ($callFrameReference ? ", " . $callFrameReference : "") . ")");
    }
    if ($codeGenerator->ExtendedAttributeContains($callWith, "FirstWindow")) {
        AddToImplIncludes("DOMWindow.h");
        AddToImplIncludes("JSDOMWindowBase.h");
        push(@callWithArgs, "firstDOMWindow(*$globalObject)");
    }
    if ($codeGenerator->ExtendedAttributeContains($callWith, "RuntimeFlags")) {
        push(@callWithArgs, "${globalObject}->runtimeFlags()");
    }
    if ($codeGenerator->ExtendedAttributeContains($callWith, "World")) {
        push(@callWithArgs, "worldForDOMObject(${thisReference})");
    }
    if ($codeGenerator->ExtendedAttributeContains($callWith, "PropertyName")) {
        AddToImplIncludes("JSDOMConvertStrings.h");
        push(@callWithArgs, "propertyNameToAtomString(propertyName)");
    }

    return @callWithArgs;
}

sub GenerateArgumentsCountCheck
{
    my ($outputArray, $operation, $interface, $indent) = @_;

    # Overloaded operations don't need to check the argument count since the 
    # dispatch function does for them.
    return if $operation->{overloads} && @{$operation->{overloads}} > 1;

    my $numMandatoryArguments = @{$operation->arguments};
    foreach my $argument (reverse(@{$operation->arguments})) {
        if ($argument->isOptional or $argument->isVariadic) {
            $numMandatoryArguments--;
        } else {
            last;
        }
    }
    if ($numMandatoryArguments >= 1) {
        push(@$outputArray, $indent . "if (UNLIKELY(callFrame->argumentCount() < $numMandatoryArguments))\n");
        push(@$outputArray, $indent . "    return throwVMError(lexicalGlobalObject, throwScope, createNotEnoughArgumentsError(lexicalGlobalObject));\n");
    }
}

my %automaticallyGeneratedDefaultValues = (
    "any" => "undefined",

    # toString() will convert undefined to the string "undefined";
    # (note that this optimizes a behavior that is almost never useful)
    "DOMString" => "\"undefined\"",
    "USVString" => "\"undefined\"",

    # JSValue::toBoolean() will convert undefined to false.
    "boolean" => "false",

    # JSValue::toInt*() / JSValue::toUint*() will convert undefined to 0.
    "byte" => "0",
    "long long" => "0",
    "long" => "0",
    "octet" => "0",
    "short" => "0",
    "unsigned long long" => "0",
    "unsigned long" => "0",
    "unsigned short" => "0",

    # toNumber() / toFloat() convert undefined to NaN.
    "double" => "NaN",
    "float" => "NaN",
    "unrestricted double" => "NaN",
    "unrestricted float" => "NaN",
);

sub WillConvertUndefinedToDefaultParameterValue
{
    my ($parameterType, $defaultValue) = @_;

    my $automaticallyGeneratedDefaultValue = $automaticallyGeneratedDefaultValues{$parameterType->name};
    return 1 if defined $automaticallyGeneratedDefaultValue && $automaticallyGeneratedDefaultValue eq $defaultValue;

    return 1 if $defaultValue eq "null" && $codeGenerator->IsWrapperType($parameterType);
    return 1 if $defaultValue eq "[]" && $codeGenerator->IsDictionaryType($parameterType);

    return 0;
}

sub GenerateParametersCheck
{
    my ($outputArray, $operation, $interface, $functionImplementationName, $indent) = @_;

    my $interfaceName = $interface->type->name;
    my $visibleInterfaceName = $codeGenerator->GetVisibleInterfaceName($interface);
    my $numArguments = @{$operation->arguments};
    my $conditional = $operation->extendedAttributes->{Conditional};
    my $isConstructor = $operation->isConstructor;

    my $functionName = GetFullyQualifiedImplementationCallName($interface, $operation, $functionImplementationName, "impl", $conditional);
    
    my @arguments = ();
    AddAdditionalArgumentsForImplementationCall(\@arguments, $interface, $operation, "impl", "*lexicalGlobalObject", "*callFrame", "*castedThis");
    
    my $callWith = $operation->extendedAttributes->{CallWith};
    my $quotedFunctionName;
    if (!$isConstructor) {
        my $name = $operation->name;
        $quotedFunctionName = "\"$name\"";
        push(@arguments, GenerateCallWithUsingPointers($callWith, \@$outputArray, "JSValue::encode(jsUndefined())", "*castedThis"));
    } else {
        $quotedFunctionName = "nullptr";
        unless ($callWith) {
            $callWith = $operation->extendedAttributes->{LegacyFactoryFunctionCallWith};
        }
        push(@arguments, GenerateConstructorCallWithUsingPointers($callWith, \@$outputArray, $visibleInterfaceName, "*castedThis"));
    }

    my $argumentIndex = 0;
    foreach my $argument (@{$operation->arguments}) {
        my $type = $argument->type;

        if ($argument->isOptional && !defined($argument->default)) {
            # As per Web IDL, optional dictionary arguments are always considered to have a default value of an empty dictionary, unless otherwise specified.
            $argument->default("[]") if $codeGenerator->IsDictionaryType($type);

            # Treat undefined the same as an empty sequence Or frozen array.
            $argument->default("[]") if $codeGenerator->IsSequenceOrFrozenArrayType($type);

            # We use undefined as default value for optional arguments of type 'any' unless specified otherwise.
            $argument->default("undefined") if $type->name eq "any";

            # We use the null string as default value for arguments of type DOMString unless specified otherwise.
            $argument->default("null") if $codeGenerator->IsStringType($type);

            # As per Web IDL, passing undefined for a nullable argument is treated as null. Therefore, use null as
            # default value for nullable arguments unless otherwise specified.
            $argument->default("null") if $type->isNullable;
        }

        my $name = $argument->name;
        my $value = $name;

        if ($argument->isVariadic) {
            AddToImplIncludes("JSDOMConvertVariadic.h", $conditional);
            AddToImplIncludesForIDLType($type, $conditional);
        
            my $IDLType = GetIDLType($interface, $type);

            push(@$outputArray, $indent . "auto ${name} = convertVariadicArguments<${IDLType}>(*lexicalGlobalObject, *callFrame, ${argumentIndex});\n");
            push(@$outputArray, $indent . "RETURN_IF_EXCEPTION(throwScope, encodedJSValue());\n");

            $value = "WTFMove(${name})";
        } else {
            my $argumentLookupForConversion;
            my $optionalCheck;
            my $nativeValueCastFunction;

            if ($argument->isOptional) {
                assert("[ReturnValue] is not supported for optional arguments") if $argument->extendedAttributes->{ReturnValue};

                if (defined($argument->default)) {
                    push(@$outputArray, $indent . "EnsureStillAliveScope argument${argumentIndex} = callFrame->argument($argumentIndex);\n");
                    if (!WillConvertUndefinedToDefaultParameterValue($type, $argument->default)) {
                        my $defaultValue = GenerateDefaultValue($interface, $argument, $argument->type, $argument->default);
                        $optionalCheck = "argument${argumentIndex}.value().isUndefined() ? $defaultValue : ";
                    }
                    $argumentLookupForConversion = "argument${argumentIndex}.value()"
                } else {
                    my $argumentIDLType = GetIDLType($interface, $argument->type);

                    my $defaultValue;
                    if ($codeGenerator->IsCallbackInterface($type) || $codeGenerator->IsCallbackFunction($type)) {
                        $defaultValue = "Converter<$argumentIDLType>::ReturnType()";
                    } elsif ($codeGenerator->IsPromiseType($argument->type) || $codeGenerator->IsWrapperType($type)) {
                        $defaultValue = "nullptr";
                    } else {
                        $defaultValue = "std::optional<Converter<$argumentIDLType>::ReturnType>()";
                        $nativeValueCastFunction = "std::optional<Converter<$argumentIDLType>::ReturnType>";
                    }

                    push(@$outputArray, $indent . "EnsureStillAliveScope argument${argumentIndex} = callFrame->argument($argumentIndex);\n");
                    $optionalCheck = "argument${argumentIndex}.value().isUndefined() ? $defaultValue : ";
                    $argumentLookupForConversion = "argument${argumentIndex}.value()";
                }
            } else {
                push(@$outputArray, $indent . "EnsureStillAliveScope argument${argumentIndex} = callFrame->uncheckedArgument($argumentIndex);\n");
                $argumentLookupForConversion = "argument${argumentIndex}.value()";
            }

            my $globalObjectReference = $operation->isStatic ? "*jsCast<JSDOMGlobalObject*>(lexicalGlobalObject)" : "*castedThis->globalObject()";
            my $argumentExceptionThrower = GetArgumentExceptionThrower($interface, $argument, $argumentIndex, $quotedFunctionName);

            my $nativeValue = JSValueToNative($interface, $argument, $argumentLookupForConversion, $conditional, "lexicalGlobalObject", "*lexicalGlobalObject", "*castedThis", $globalObjectReference, $argumentExceptionThrower);

            $nativeValue = "${nativeValueCastFunction}(" . $nativeValue . ")" if defined $nativeValueCastFunction;
            $nativeValue = $optionalCheck . $nativeValue if defined $optionalCheck;

            push(@$outputArray, $indent . "auto $name = ${nativeValue};\n");
            push(@$outputArray, $indent . "RETURN_IF_EXCEPTION(throwScope, encodedJSValue());\n");

            $value = PassArgumentExpression($name, $argument);
        }

        push(@arguments, $value);
        $argumentIndex++;
    }

    push(@arguments, "WTFMove(promise)") if $operation->type && $codeGenerator->IsPromiseType($operation->type) && !$operation->extendedAttributes->{PromiseProxy};

    return "$functionName(" . join(", ", @arguments) . ")";
}

sub GenerateDictionaryHeader
{
    my ($object, $dictionary, $className, $enumerations, $otherDictionaries) = @_;

    # - Add default header template and header protection.
    push(@headerContentHeader, GenerateHeaderContentHeader($dictionary));

    $headerIncludes{"${className}.h"} = 1;

    push(@headerContent, "\nnamespace WebCore {\n\n");
    push(@headerContent, GenerateDictionaryHeaderContent($dictionary, $className));
    push(@headerContent, GenerateEnumerationsHeaderContent($dictionary, $enumerations));
    push(@headerContent, GenerateDictionariesHeaderContent($dictionary, $otherDictionaries)) if $otherDictionaries;
    push(@headerContent, "} // namespace WebCore\n");

    my $conditionalString = $codeGenerator->GenerateConditionalString($dictionary);
    push(@headerContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
    
    # - Generate dependencies.
    if ($writeDependencies) {
        my @ancestors;
        my $parentType = $dictionary->parentType;
        while (defined($parentType)) {
            push(@ancestors, $parentType->name) if $codeGenerator->IsExternalDictionaryType($parentType);
            my $parentDictionary = $codeGenerator->GetDictionaryByType($parentType);
            assert("Unable to find definition for dictionary named '" . $parentType->name . "'!") unless $parentDictionary;
            $parentType = $parentDictionary->parentType;
        }
        push(@depsContent, "$className.h : ", join(" ", map { "$_.idl" } @ancestors), "\n");
        push(@depsContent, map { "$_.idl :\n" } @ancestors);
    }
}

sub GenerateDictionaryImplementation
{
    my ($object, $dictionary, $className, $enumerations, $otherDictionaries) = @_;

    # - Add default header template
    push(@implContentHeader, GenerateImplementationContentHeader($dictionary));

    push(@implContent, "\n\nnamespace WebCore {\n");
    push(@implContent, "using namespace JSC;\n\n");
    push(@implContent, GenerateDictionaryImplementationContent($dictionary, $className));
    push(@implContent, GenerateEnumerationsImplementationContent($dictionary, $enumerations));
    push(@implContent, GenerateDictionariesImplementationContent($dictionary, $otherDictionaries)) if $otherDictionaries;
    push(@implContent, "} // namespace WebCore\n");

    my $conditionalString = $codeGenerator->GenerateConditionalString($dictionary);
    push(@implContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
}

sub GenerateCallbackFunctionHeader
{
    my ($object, $callbackFunction, $enumerations, $dictionaries) = @_;

    push(@headerContentHeader, GenerateHeaderContentHeader($callbackFunction));

    push(@headerContent, "\nnamespace WebCore {\n\n");

    my @operations = ();
    push(@operations, $callbackFunction->operation);
    my @constants = ();

    $object->GenerateCallbackHeaderContent($callbackFunction, \@operations, \@constants, \@headerContent, \%headerIncludes);

    push(@headerContent, GenerateEnumerationsHeaderContent($callbackFunction, $enumerations));
    push(@headerContent, GenerateDictionariesHeaderContent($callbackFunction, $dictionaries));

    push(@headerContent, "} // namespace WebCore\n");

    my $conditionalString = $codeGenerator->GenerateConditionalString($callbackFunction);
    push(@headerContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
}

sub GenerateCallbackFunctionImplementation
{
    my ($object, $callbackFunction, $enumerations, $dictionaries) = @_;

    push(@implContentHeader, GenerateImplementationContentHeader($callbackFunction));

    push(@implContent, "\n\nnamespace WebCore {\n");
    push(@implContent, "using namespace JSC;\n\n");

    push(@implContent, GenerateEnumerationsImplementationContent($callbackFunction, $enumerations));
    push(@implContent, GenerateDictionariesImplementationContent($callbackFunction, $dictionaries));

    my @operations = ();
    push(@operations, $callbackFunction->operation);
    my @constants = ();

    $object->GenerateCallbackImplementationContent($callbackFunction, \@operations, \@constants, \@implContent, \%implIncludes);

    push(@implContent, "} // namespace WebCore\n");

    my $conditionalString = $codeGenerator->GenerateConditionalString($callbackFunction);
    push(@implContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
}

sub GenerateCallbackInterfaceHeader
{
    my ($object, $callbackInterface, $enumerations, $dictionaries) = @_;

    push(@headerContentHeader, GenerateHeaderContentHeader($callbackInterface));

    push(@headerContent, "\nnamespace WebCore {\n\n");
    
    $object->GenerateCallbackHeaderContent($callbackInterface, $callbackInterface->operations, $callbackInterface->constants, \@headerContent, \%headerIncludes);

    push(@headerContent, GenerateEnumerationsHeaderContent($callbackInterface, $enumerations));
    push(@headerContent, GenerateDictionariesHeaderContent($callbackInterface, $dictionaries));

    push(@headerContent, "} // namespace WebCore\n");

    my $conditionalString = $codeGenerator->GenerateConditionalString($callbackInterface);
    push(@headerContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
}

sub GenerateCallbackInterfaceImplementation
{
    my ($object, $callbackInterface, $enumerations, $dictionaries) = @_;

    push(@implContentHeader, GenerateImplementationContentHeader($callbackInterface));

    push(@implContent, "\n\nnamespace WebCore {\n");
    push(@implContent, "using namespace JSC;\n\n");

    push(@implContent, GenerateEnumerationsImplementationContent($callbackInterface, $enumerations));
    push(@implContent, GenerateDictionariesImplementationContent($callbackInterface, $dictionaries));

    $object->GenerateCallbackImplementationContent($callbackInterface, $callbackInterface->operations, $callbackInterface->constants, \@implContent, \%implIncludes);

    push(@implContent, "} // namespace WebCore\n");

    my $conditionalString = $codeGenerator->GenerateConditionalString($callbackInterface);
    push(@implContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
}

sub GenerateCallbackHeaderContent
{
    my ($object, $interfaceOrCallback, $operations, $constants, $contentRef, $includesRef) = @_;

    my $name = $interfaceOrCallback->type->name;
    my $callbackDataType = $interfaceOrCallback->extendedAttributes->{IsWeakCallback} ? "JSCallbackDataWeak" : "JSCallbackDataStrong";
    my $className = "JS${name}";

    $includesRef->{"IDLTypes.h"} = 1;
    $includesRef->{"JSCallbackData.h"} = 1;
    $includesRef->{"<wtf/Forward.h>"} = 1;
    $includesRef->{"${name}.h"} = 1;

    my $exportMacro = GetExportMacroForJSClass($interfaceOrCallback);

    push(@$contentRef, "class $exportMacro$className final : public ${name} {\n");
    push(@$contentRef, "public:\n");

    # The static create() method.
    push(@$contentRef, "    static Ref<$className> create(JSC::VM& vm, JSC::JSObject* callback)\n");
    push(@$contentRef, "    {\n");
    push(@$contentRef, "        return adoptRef(*new ${className}(vm, callback));\n");
    push(@$contentRef, "    }\n\n");

    push(@$contentRef, "    ScriptExecutionContext* scriptExecutionContext() const { return ContextDestructionObserver::scriptExecutionContext(); }\n\n");

    push(@$contentRef, "    ~$className() final;\n");

    push(@$contentRef, "    ${callbackDataType}* callbackData() { return m_data; }\n");

    push(@$contentRef, "    static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*);\n") if @{$constants};

    # Operations
    my $numOperations = @{$operations};
    if ($numOperations > 0) {
        push(@$contentRef, "\n    // Functions\n");
        foreach my $operation (@{$operations}) {
            my @arguments = ();

            my $callbackThisObject = $operation->extendedAttributes->{CallbackThisObject};
            if ($callbackThisObject) {
                my $thisObjectType = $codeGenerator->ParseType($callbackThisObject);
                my $IDLType = GetIDLType($interfaceOrCallback, $thisObjectType);
                push(@arguments, "typename ${IDLType}::ParameterType thisObject");
            }

            foreach my $argument (@{$operation->arguments}) {
                my $IDLType = GetIDLType($interfaceOrCallback, $argument->type);
                push(@arguments, "typename ${IDLType}::ParameterType " . $argument->name);
            }

            my $nativeReturnType = "CallbackResult<typename " . GetIDLType($interfaceOrCallback, $operation->type) . "::ImplementationType>";
            
            # FIXME: Change the default name (used for callback functions) to something other than handleEvent. It makes little sense.
            my $functionName = $operation->extendedAttributes->{ImplementedAs} || $operation->name || "handleEvent";

            push(@$contentRef, "    ${nativeReturnType} ${functionName}(" . join(", ", @arguments) . ") override;\n");
        }
    }

    push(@$contentRef, "\nprivate:\n");

    push(@$contentRef, "    ${className}(JSC::VM&, JSC::JSObject* callback);\n\n");

    if ($interfaceOrCallback->extendedAttributes->{IsWeakCallback}) {
        push(@$contentRef, "    bool hasCallback() const final { return m_data && m_data->callback(); }\n\n");
    }

    push(@$contentRef, "    void visitJSFunction(JSC::AbstractSlotVisitor&) override;\n\n") if $interfaceOrCallback->extendedAttributes->{IsWeakCallback};
    push(@$contentRef, "    void visitJSFunction(JSC::SlotVisitor&) override;\n\n") if $interfaceOrCallback->extendedAttributes->{IsWeakCallback};

    push(@$contentRef, "    ${callbackDataType}* m_data;\n");
    push(@$contentRef, "};\n\n");

    # toJS().
    push(@$contentRef, $exportMacro . "JSC::JSValue toJS(${name}&);\n");
    push(@$contentRef, "inline JSC::JSValue toJS(${name}* impl) { return impl ? toJS(*impl) : JSC::jsNull(); }\n\n");
}

sub GenerateCallbackImplementationContent
{
    my ($object, $interfaceOrCallback, $operations, $constants, $contentRef, $includesRef) = @_;

    my $name = $interfaceOrCallback->type->name;
    my $callbackDataType = $interfaceOrCallback->extendedAttributes->{IsWeakCallback} ? "JSCallbackDataWeak" : "JSCallbackDataStrong";
    my $visibleName = $codeGenerator->GetVisibleInterfaceName($interfaceOrCallback);
    my $className = "JS${name}";

    $includesRef->{"ScriptExecutionContext.h"} = 1;

    # Constructor
    push(@$contentRef, "${className}::${className}(VM& vm, JSObject* callback)\n");
    push(@$contentRef, "    : ${name}(jsCast<JSDOMGlobalObject*>(callback->globalObject(vm))->scriptExecutionContext())\n");
    push(@$contentRef, "    , m_data(new ${callbackDataType}(vm, callback, this))\n");
    push(@$contentRef, "{\n");
    push(@$contentRef, "}\n\n");

    # Destructor
    push(@$contentRef, "${className}::~${className}()\n");
    push(@$contentRef, "{\n");
    push(@$contentRef, "    ScriptExecutionContext* context = scriptExecutionContext();\n");
    push(@$contentRef, "    // When the context is destroyed, all tasks with a reference to a callback\n");
    push(@$contentRef, "    // should be deleted. So if the context is 0, we are on the context thread.\n");
    push(@$contentRef, "    if (!context || context->isContextThread())\n");
    push(@$contentRef, "        delete m_data;\n");
    push(@$contentRef, "    else\n");
    push(@$contentRef, "        context->postTask(DeleteCallbackDataTask(m_data));\n");
    push(@$contentRef, "#ifndef NDEBUG\n");
    push(@$contentRef, "    m_data = nullptr;\n");
    push(@$contentRef, "#endif\n");
    push(@$contentRef, "}\n\n");

    # Constants.
    my $numConstants = @{$constants};
    if ($numConstants > 0) {
        GenerateConstructorDeclaration($contentRef, $className, $interfaceOrCallback, $name);

        my $hashSize = 0;
        my $hashName = $className . "ConstructorTable";

        my @hashKeys = ();
        my @hashValue1 = ();
        my @hashValue2 = ();
        my @hashSpecials = ();
        my %conditionals = ();
        my %readWriteConditionals = ();

        foreach my $constant (@{$constants}) {
            my $name = $constant->name;
            push(@hashKeys, $name);
            push(@hashValue1, $constant->value);
            push(@hashValue2, "0");
            push(@hashSpecials, "JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger");

            my $implementedBy = $constant->extendedAttributes->{ImplementedBy};
            $implIncludes{"${implementedBy}.h"} = 1 if $implementedBy;

            my $conditional = $constant->extendedAttributes->{Conditional};
            $conditionals{$name} = $conditional if $conditional;

            $hashSize++;
        }
        $object->GenerateHashTable($className, $hashName, $hashSize, \@hashKeys, \@hashSpecials, \@hashValue1, \@hashValue2, \%conditionals, \%readWriteConditionals, 1) if $hashSize > 0;

        push(@$contentRef, $codeGenerator->GenerateCompileTimeCheckForEnumsIfNeeded($interfaceOrCallback));

        GenerateConstructorDefinitions($contentRef, $className, "", $visibleName, $interfaceOrCallback);

        AddToImplIncludes("JSDOMGlobalObjectInlines.h");
        push(@$contentRef, "JSValue ${className}::getConstructor(VM& vm, const JSGlobalObject* globalObject)\n");
        push(@$contentRef, "{\n");
        push(@$contentRef, "    return getDOMConstructor<${className}DOMConstructor, DOMConstructorID::${name}>(vm, *jsCast<const JSDOMGlobalObject*>(globalObject));\n");
        push(@$contentRef, "}\n\n");
    }

    # Operations
    my $numOperations = @{$operations};
    if ($numOperations > 0) {
        foreach my $operation (@{$operations}) {
            next if $operation->extendedAttributes->{Custom};
        
            AddToIncludesForIDLType($operation->type, $includesRef);

            my $nativeReturnType = "CallbackResult<typename " . GetIDLType($interfaceOrCallback, $operation->type) . "::ImplementationType>";
            
            # FIXME: Change the default name (used for callback functions) to something other than handleEvent. It makes little sense.
            my $functionName = $operation->name || "handleEvent";
            my $functionImplementationName = $operation->extendedAttributes->{ImplementedAs} || $functionName;

            my @arguments = ();

            my $thisValue = "jsUndefined()";

            my $callbackThisObject = $operation->extendedAttributes->{CallbackThisObject};
            if ($callbackThisObject) {
                my $thisObjectType = $codeGenerator->ParseType($callbackThisObject);

                AddToIncludesForIDLType($thisObjectType, $includesRef, 1);
                my $IDLType = GetIDLType($interfaceOrCallback, $thisObjectType);
                push(@arguments, "typename ${IDLType}::ParameterType thisObject");

                my $thisObjectArgument = IDLArgument->new();
                $thisObjectArgument->type($thisObjectType);

                $thisValue = NativeToJSValueUsingReferences($thisObjectArgument, $interfaceOrCallback, "thisObject", "globalObject");
            }

            foreach my $argument (@{$operation->arguments}) {
                AddToIncludesForIDLType($argument->type, $includesRef, 1);
                my $IDLType = GetIDLType($interfaceOrCallback, $argument->type);
                push(@arguments, "typename ${IDLType}::ParameterType " . $argument->name);
            }
            
            push(@$contentRef, "${nativeReturnType} ${className}::${functionImplementationName}(" . join(", ", @arguments) . ")\n");
            push(@$contentRef, "{\n");

            push(@$contentRef, "    if (!canInvokeCallback())\n");
            push(@$contentRef, "        return CallbackResultType::UnableToExecute;\n\n");

            push(@$contentRef, "    Ref<$className> protectedThis(*this);\n\n");
            push(@$contentRef, "    auto& globalObject = *jsCast<JSDOMGlobalObject*>(scriptExecutionContext()->globalObject());\n");
            push(@$contentRef, "    auto& vm = globalObject.vm();\n\n");
            push(@$contentRef, "    JSLockHolder lock(vm);\n");

            push(@$contentRef, "    auto& lexicalGlobalObject = globalObject;\n");

            push(@$contentRef, "    JSValue thisValue = ${thisValue};\n");
            push(@$contentRef, "    MarkedArgumentBuffer args;\n");

            foreach my $argument (@{$operation->arguments}) {
                push(@$contentRef, "    args.append(" . NativeToJSValueUsingReferences($argument, $interfaceOrCallback, $argument->name, "globalObject") . ");\n");
            }
            push(@$contentRef, "    ASSERT(!args.hasOverflowed());\n");

            push(@$contentRef, "\n    NakedPtr<JSC::Exception> returnedException;\n");

            my $callbackInvocation;
            if (ref($interfaceOrCallback) eq "IDLCallbackFunction") {
                $callbackInvocation = "m_data->invokeCallback(vm, thisValue, args, JSCallbackData::CallbackType::Function, Identifier(), returnedException)";
            } else {
                my $callbackType = $numOperations > 1 ? "Object" : "FunctionOrObject";
                $callbackInvocation = "m_data->invokeCallback(vm, thisValue, args, JSCallbackData::CallbackType::${callbackType}, Identifier::fromString(vm, \"${functionName}\"), returnedException)";
            }

            if ($operation->type->name eq "undefined") {
                push(@$contentRef, "    ${callbackInvocation};\n");
            } else {
                push(@$contentRef, "    auto jsResult = ${callbackInvocation};\n");
            }

            $includesRef->{"JSDOMExceptionHandling.h"} = 1;
            push(@$contentRef, "    if (returnedException) {\n");
            if ($operation->extendedAttributes->{RethrowException}) {
                push(@$contentRef, "        auto throwScope = DECLARE_THROW_SCOPE(vm);\n");
                push(@$contentRef, "        throwException(&lexicalGlobalObject, throwScope, returnedException);\n");
            } else {
                push(@$contentRef, "        reportException(&lexicalGlobalObject, returnedException);\n");
            }
            push(@$contentRef, "        return CallbackResultType::ExceptionThrown;\n");
            push(@$contentRef, "     }\n\n");

            if ($operation->type->name eq "undefined") {
                push(@$contentRef, "    return { };\n");
            } else {
                my $nativeValue = JSValueToNative($interfaceOrCallback, $operation, "jsResult", "", "&lexicalGlobalObject", "lexicalGlobalObject");
            
                push(@$contentRef, "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n");
                push(@$contentRef, "    auto returnValue = ${nativeValue};\n");
                push(@$contentRef, "    RETURN_IF_EXCEPTION(throwScope, CallbackResultType::ExceptionThrown);\n");
                push(@$contentRef, "    return { WTFMove(returnValue) };\n");
            }

            push(@$contentRef, "}\n\n");
        }
    }

    if ($interfaceOrCallback->extendedAttributes->{IsWeakCallback}) {
        push(@$contentRef, "void ${className}::visitJSFunction(JSC::AbstractSlotVisitor& visitor)\n");
        push(@$contentRef, "{\n");
        push(@$contentRef, "    m_data->visitJSFunction(visitor);\n");
        push(@$contentRef, "}\n\n");
        push(@$contentRef, "void ${className}::visitJSFunction(JSC::SlotVisitor& visitor)\n");
        push(@$contentRef, "{\n");
        push(@$contentRef, "    m_data->visitJSFunction(visitor);\n");
        push(@$contentRef, "}\n\n");
    }

    push(@$contentRef, "JSC::JSValue toJS(${name}& impl)\n");
    push(@$contentRef, "{\n");
    push(@$contentRef, "    if (!static_cast<${className}&>(impl).callbackData())\n");
    push(@$contentRef, "        return jsNull();\n\n");
    push(@$contentRef, "    return static_cast<${className}&>(impl).callbackData()->callback();\n");
    push(@$contentRef, "}\n\n");
}

sub GenerateWriteBarriersForArguments
{
    my ($outputArray, $operation, $indent, $isDryRun) = @_;

    my $argumentIndex = 0;
    my $hasOutput = 0;
    foreach my $argument (@{$operation->arguments}) {
        if ($argument->type->name eq "EventListener") {
            push(@$outputArray, $indent . "vm.writeBarrier(&static_cast<JSObject&>(*castedThis), argument${argumentIndex}.value());\n") if !$isDryRun;
            $hasOutput = 1;
        }
        $argumentIndex++;
    }
    return $hasOutput;
}

sub GenerateImplementationFunctionCall
{
    my ($outputArray, $operation, $interface, $functionString, $indent, $hasThrowScope) = @_;

    my $callTracer = $operation->extendedAttributes->{CallTracer} || $interface->extendedAttributes->{CallTracer};
    if ($callTracer) {
        my @callTracerArguments = map { $_->name } @{$operation->arguments};
        GenerateCallTracer($outputArray, $callTracer, $operation->name, \@callTracerArguments, $indent);
    }

    my $dryRun = 1;
    my $hasWriteBarriersForArguments = GenerateWriteBarriersForArguments($outputArray, $operation, $indent, $dryRun);
    my $returnArgumentName = GetOperationReturnedArgumentName($operation);
    if ($returnArgumentName) {
        push(@$outputArray, $indent . "invokeFunctorPropagatingExceptionIfNecessary(*lexicalGlobalObject, throwScope, [&] { return $functionString; });\n");
        GenerateWriteBarriersForArguments($outputArray, $operation, $indent);
        push(@$outputArray, $indent . "return JSValue::encode($returnArgumentName.value());\n");
    } else {
        my $globalObjectReference = $operation->isStatic ? "*jsCast<JSDOMGlobalObject*>(lexicalGlobalObject)" : "*castedThis->globalObject()";
        if ($hasWriteBarriersForArguments) {
            push(@$outputArray, $indent . "auto result = JSValue::encode(" . NativeToJSValueUsingPointers($operation, $interface, $functionString, $globalObjectReference) . ");\n");
            push(@$outputArray, $indent . "RETURN_IF_EXCEPTION(throwScope, encodedJSValue());\n") if $hasThrowScope;
            GenerateWriteBarriersForArguments($outputArray, $operation, $indent);
            push(@$outputArray, $indent . "return result;\n");
        } else {
            push(@$outputArray, $indent . "RELEASE_AND_RETURN(throwScope, JSValue::encode(" . NativeToJSValueUsingPointers($operation, $interface, $functionString, $globalObjectReference) . "));\n");
        }
    }
}

sub GenerateImplementationCustomFunctionCall
{
    my ($outputArray, $operation, $interface, $className, $functionImplementationName, $indent) = @_;

    my @customFunctionArguments = ();
    push(@customFunctionArguments, "*lexicalGlobalObject");
    push(@customFunctionArguments, "*callFrame");
    push(@customFunctionArguments, "WTFMove(promise)") if $codeGenerator->IsPromiseType($operation->type) && !$operation->extendedAttributes->{ReturnsOwnPromise};

    if ($operation->isStatic) {
        push(@$outputArray, $indent . "RELEASE_AND_RETURN(throwScope, (JSValue::encode(${className}::" . $functionImplementationName . "(" . join(", ", @customFunctionArguments) . "))));\n");
    } else {
        push(@$outputArray, $indent . "RELEASE_AND_RETURN(throwScope, (JSValue::encode(castedThis->" . $functionImplementationName . "(" . join(", ", @customFunctionArguments) . "))));\n");
    }
}

sub IsValueIterableInterface
{
    my $interface = shift;
    return 0 unless $interface->iterable;
    return 0 if length $interface->iterable->keyType;
    # FIXME: See https://webkit.org/b/159140, we should die if the next check is false.
    return 0 unless GetIndexedGetterOperation($interface);
    return 1;
}

sub IsKeyValueIterableInterface
{
    my $interface = shift;
    return 0 unless $interface->iterable;
    return 0 if IsValueIterableInterface($interface);
    return 1;
}

sub GenerateIterableDefinition
{
    my $interface = shift;

    my $interfaceName = $interface->type->name;
    my $className = "JS$interfaceName";
    my $visibleInterfaceName = $codeGenerator->GetVisibleInterfaceName($interface);

    AddToImplIncludes("JSDOMIterator.h");
    AddToImplIncludes("<JavaScriptCore/SlotVisitorMacros.h>");

    return unless IsKeyValueIterableInterface($interface);

    my $iteratorName = "${interfaceName}Iterator";
    my $iteratorPrototypeName = "${interfaceName}IteratorPrototype";

    my $iteratorTraitsName = "${interfaceName}IteratorTraits";
    my $iteratorTraitsType = $interface->iterable->isKeyValue ? "JSDOMIteratorType::Map" : "JSDOMIteratorType::Set";
    my $iteratorTraitsKeyType = $interface->iterable->isKeyValue ? GetIDLType($interface, $interface->iterable->keyType) : "void";
    my $iteratorTraitsValueType = GetIDLType($interface, $interface->iterable->valueType);
    
    AddToImplIncludesForIDLType($interface->iterable->keyType) if $interface->iterable->isKeyValue;
    AddToImplIncludesForIDLType($interface->iterable->valueType);

    push(@implContent,  <<END);
struct ${iteratorTraitsName} {
    static constexpr JSDOMIteratorType type = ${iteratorTraitsType};
    using KeyType = ${iteratorTraitsKeyType};
    using ValueType = ${iteratorTraitsValueType};
};

using ${iteratorName}Base = JSDOMIteratorBase<${className}, ${iteratorTraitsName}>;
class ${iteratorName} final : public ${iteratorName}Base {
public:
    using Base = ${iteratorName}Base;
    DECLARE_INFO;

    template<typename, JSC::SubspaceAccess mode> static JSC::IsoSubspace* subspaceFor(JSC::VM& vm)
    {
        if constexpr (mode == JSC::SubspaceAccess::Concurrently)
            return nullptr;
        auto& clientData = *static_cast<JSVMClientData*>(vm.clientData);
        auto& spaces = clientData.subspaces();
        if (auto* space = spaces.m_subspaceFor${iteratorName}.get())
            return space;
        static_assert(std::is_base_of_v<JSC::JSDestructibleObject, ${iteratorName}> || !${iteratorName}::needsDestruction);
        if constexpr (std::is_base_of_v<JSC::JSDestructibleObject, ${iteratorName}>)
            spaces.m_subspaceFor${iteratorName} = makeUnique<IsoSubspace> ISO_SUBSPACE_INIT(vm.heap, vm.destructibleObjectHeapCellType(), ${iteratorName});
        else
            spaces.m_subspaceFor${iteratorName} = makeUnique<IsoSubspace> ISO_SUBSPACE_INIT(vm.heap, vm.cellHeapCellType(), ${iteratorName});
        auto* space = spaces.m_subspaceFor${iteratorName}.get();
IGNORE_WARNINGS_BEGIN(\"unreachable-code\")
IGNORE_WARNINGS_BEGIN(\"tautological-compare\")
        void (*myVisitOutputConstraint)(JSC::JSCell*, JSC::SlotVisitor&) = ${iteratorName}::visitOutputConstraints;
        void (*jsCellVisitOutputConstraint)(JSC::JSCell*, JSC::SlotVisitor&) = JSC::JSCell::visitOutputConstraints;
        if (myVisitOutputConstraint != jsCellVisitOutputConstraint)
            clientData.outputConstraintSpaces().append(space);
IGNORE_WARNINGS_END
IGNORE_WARNINGS_END
        return space;
    }

    static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
    {
        return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
    }

    static ${iteratorName}* create(JSC::VM& vm, JSC::Structure* structure, ${className}& iteratedObject, IterationKind kind)
    {
        auto* instance = new (NotNull, JSC::allocateCell<${iteratorName}>(vm)) ${iteratorName}(structure, iteratedObject, kind);
        instance->finishCreation(vm);
        return instance;
    }

private:
    ${iteratorName}(JSC::Structure* structure, ${className}& iteratedObject, IterationKind kind)
        : Base(structure, iteratedObject, kind)
    {
    }
};

using ${iteratorPrototypeName} = JSDOMIteratorPrototype<${className}, ${iteratorTraitsName}>;
JSC_ANNOTATE_HOST_FUNCTION(${iteratorPrototypeName}Next, ${iteratorPrototypeName}::next);

template<>
const JSC::ClassInfo ${iteratorName}Base::s_info = { "${visibleInterfaceName} Iterator", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(${iteratorName}Base) };
const JSC::ClassInfo ${iteratorName}::s_info = { "${visibleInterfaceName} Iterator", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(${iteratorName}) };

template<>
const JSC::ClassInfo ${iteratorPrototypeName}::s_info = { "${visibleInterfaceName} Iterator", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(${iteratorPrototypeName}) };

END

    foreach my $operation (@{$interface->iterable->operations}) {
        my $propertyName = $operation->name;
        my $functionName = GetFunctionName($interface, $className, $operation);

        next if $propertyName eq "[Symbol.Iterator]";

        if ($propertyName eq "forEach") {
            push(@implContent,  <<END);
static inline EncodedJSValue ${functionName}Caller(JSGlobalObject* lexicalGlobalObject, CallFrame* callFrame, JS$interfaceName* thisObject)
{
    return JSValue::encode(iteratorForEach<${iteratorName}>(*lexicalGlobalObject, *callFrame, *thisObject));
}

END
        } else {
            my $iterationKind = "Entries";
            $iterationKind = "Keys" if $propertyName eq "keys";
            $iterationKind = "Values" if $propertyName eq "values";
            $iterationKind = "Values" if $propertyName eq "entries" and not $interface->iterable->isKeyValue;

            push(@implContent,  <<END);
static inline EncodedJSValue ${functionName}Caller(JSGlobalObject*, CallFrame*, JS$interfaceName* thisObject)
{
    return JSValue::encode(iteratorCreate<${iteratorName}>(*thisObject, IterationKind::${iterationKind}));
}

END
        }

        push(@implContent,  <<END);
JSC_DEFINE_HOST_FUNCTION(${functionName}, (JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callFrame))
{
    return IDLOperation<${className}>::call<${functionName}Caller>(*lexicalGlobalObject, *callFrame, "${propertyName}");
}

END
    }
}

# http://heycam.github.io/webidl/#dfn-flattened-union-member-types
sub GetFlattenedMemberTypes
{
    my ($idlUnionType) = @_;

    my @flattenedMemberTypes = ();

    foreach my $memberType (@{$idlUnionType->subtypes}) {
        if ($memberType->isUnion) {
            push(@flattenedMemberTypes, GetFlattenedMemberTypes($memberType));
        } else {
            push(@flattenedMemberTypes, $memberType);
        }
    }

    return @flattenedMemberTypes;
}

# http://heycam.github.io/webidl/#dfn-number-of-nullable-member-types
sub GetNumberOfNullableMemberTypes
{
    my ($idlUnionType) = @_;

    my $count = 0;

    foreach my $memberType (@{$idlUnionType->subtypes}) {
        $count++ if $memberType->isNullable;
        $count += GetNumberOfNullableMemberTypes($memberType) if $memberType->isUnion;
    }

    return $count;
}

sub GetIDLUnionMemberTypes
{
    my ($interface, $idlUnionType) = @_;

    my $numberOfNullableMembers = GetNumberOfNullableMemberTypes($idlUnionType);
    assert("Union types must only have 0 or 1 nullable types.") if $numberOfNullableMembers > 1;

    my @idlUnionMemberTypes = ();

    push(@idlUnionMemberTypes, "IDLNull") if $numberOfNullableMembers == 1;

    foreach my $memberType (GetFlattenedMemberTypes($idlUnionType)) {
        push(@idlUnionMemberTypes, GetIDLTypeExcludingNullability($interface, $memberType));
    }

    return @idlUnionMemberTypes;
}

sub IsAnnotatedType
{
    my ($type) = @_;

    return 1 if $type->extendedAttributes->{Clamp};
    return 1 if $type->extendedAttributes->{EnforceRange};
    return 1 if $type->extendedAttributes->{LegacyNullToEmptyString};
    return 1 if $type->extendedAttributes->{AtomString};
    return 1 if $type->extendedAttributes->{RequiresExistingAtomString};
    return 1 if $type->extendedAttributes->{AllowShared};
}

sub GetAnnotatedIDLType
{
    my ($type) = @_;

    return "IDLClampAdaptor" if $type->extendedAttributes->{Clamp};
    return "IDLEnforceRangeAdaptor" if $type->extendedAttributes->{EnforceRange};
    return "IDLLegacyNullToEmptyStringAdaptor" if $type->extendedAttributes->{LegacyNullToEmptyString};
    return "IDLAtomStringAdaptor" if $type->extendedAttributes->{AtomString};
    return "IDLRequiresExistingAtomStringAdaptor" if $type->extendedAttributes->{RequiresExistingAtomString};
    return "IDLAllowSharedAdaptor" if $type->extendedAttributes->{AllowShared};
}

sub GetBaseIDLType
{
    my ($interface, $type) = @_;

    if ($type->extendedAttributes->{OverrideIDLType}) {
        return $type->extendedAttributes->{OverrideIDLType};
    }

    my %IDLTypes = (
        "undefined" => "IDLUndefined",
        "any" => "IDLAny",
        "boolean" => "IDLBoolean",
        "byte" => "IDLByte",
        "octet" => "IDLOctet",
        "short" => "IDLShort",
        "unsigned short" => "IDLUnsignedShort",
        "long" => "IDLLong",
        "unsigned long" => "IDLUnsignedLong",
        "long long" => "IDLLongLong",
        "unsigned long long" => "IDLUnsignedLongLong",
        "float" => "IDLFloat",
        "unrestricted float" => "IDLUnrestrictedFloat",
        "double" => "IDLDouble",
        "unrestricted double" => "IDLUnrestrictedDouble",
        "DOMString" => "IDLDOMString",
        "ByteString" => "IDLByteString",
        "USVString" => "IDLUSVString",
        "object" => "IDLObject",
        "ArrayBuffer" => "IDLArrayBuffer",
        "ArrayBufferView" => "IDLArrayBufferView",
        "DataView" => "IDLDataView",
        "Int8Array" => "IDLInt8Array",
        "Int16Array" => "IDLInt16Array",
        "Int32Array" => "IDLInt32Array",
        "Uint8Array" => "IDLUint8Array",
        "Uint16Array" => "IDLUint16Array",
        "Uint32Array" => "IDLUint32Array",
        "Uint8ClampedArray" => "IDLUint8ClampedArray",
        "Float32Array" => "IDLFloat32Array",
        "Float64Array" => "IDLFloat64Array",
        "BigInt64Array" => "IDLBigInt64Array",
        "BigUint64Array" => "IDLBigUint64Array",

        # Non-WebIDL extensions
        "Date" => "IDLDate",
        "EventListener" => "IDLEventListener<JSEventListener>",
        "JSON" => "IDLJSON",
        "ScheduledAction" => "IDLScheduledAction",
        "SerializedScriptValue" => "IDLSerializedScriptValue<SerializedScriptValue>",
    );

    return $IDLTypes{$type->name} if exists $IDLTypes{$type->name};
    return "IDLEnumeration<" . GetEnumerationClassName($type, $interface) . ">" if $codeGenerator->IsEnumType($type);
    return "IDLDictionary<" . GetDictionaryClassName($type, $interface) . ">" if $codeGenerator->IsDictionaryType($type);
    return "IDLSequence<" . GetIDLType($interface, @{$type->subtypes}[0]) . ">" if $codeGenerator->IsSequenceType($type);
    return "IDLFrozenArray<" . GetIDLType($interface, @{$type->subtypes}[0]) . ">" if $codeGenerator->IsFrozenArrayType($type);
    return "IDLRecord<" . GetIDLType($interface, @{$type->subtypes}[0]) . ", " . GetIDLType($interface, @{$type->subtypes}[1]) . ">" if $codeGenerator->IsRecordType($type);
    return "IDLPromise<" . GetIDLType($interface, @{$type->subtypes}[0]) . ">" if $codeGenerator->IsPromiseType($type);
    return "IDLUnion<" . join(", ", GetIDLUnionMemberTypes($interface, $type)) . ">" if $type->isUnion;
    return "IDLCallbackFunction<" . GetCallbackClassName($type->name) . ">" if $codeGenerator->IsCallbackFunction($type);
    return "IDLCallbackInterface<" . GetCallbackClassName($type->name) . ">" if $codeGenerator->IsCallbackInterface($type);

    assert("Unknown type '" . $type->name . "'.\n") unless $codeGenerator->IsInterfaceType($type);
    return "IDLInterface<" . $type->name . ">";
}

sub GetIDLTypeExcludingNullability
{
    my ($interface, $type) = @_;

    my $baseIDLType = GetBaseIDLType($interface, $type);
    $baseIDLType = GetAnnotatedIDLType($type) . "<" . $baseIDLType . ">" if IsAnnotatedType($type);
    return $baseIDLType;
}

sub GetIDLType
{
    my ($interface, $type) = @_;

    my $baseIDLType = GetIDLTypeExcludingNullability($interface, $type);
    $baseIDLType = "IDLNullable<" . $baseIDLType . ">" if $type->isNullable;
    return $baseIDLType;
}

sub ShouldPassArgumentByReference
{
    my ($argument) = @_;

    my $type = $argument->type;

    return 0 if $type->isNullable;
    return 0 if $codeGenerator->IsCallbackInterface($type);
    return 0 if $codeGenerator->IsCallbackFunction($type);
    return 0 if !$codeGenerator->IsWrapperType($type) && !$codeGenerator->IsBufferSourceType($type);

    return 1;
}

sub JSValueToNativeDOMConvertNeedsThisObject
{
    my $type = shift;

    return 1 if $type->name eq "EventListener";
    return 0;
}

sub JSValueToNativeDOMConvertNeedsGlobalObject
{
    my $type = shift;

    return JSValueToNativeDOMConvertNeedsGlobalObject(@{$type->subtypes}[1]) if $codeGenerator->IsRecordType($type);
    return 1 if $type->name eq "ScheduledAction";
    return 0;
}

sub IsValidContextForJSValueToNative
{
    my $context = shift;
    return (ref($context) eq "IDLAttribute" && !$codeGenerator->IsEnumType($context->type)) || ref($context) eq "IDLArgument" || ref($context) eq "IDLDictionaryMember" || ref($context) eq "IDLOperation";
}

sub JSValueToNative
{
    my ($interface, $context, $value, $conditional, $lexicalGlobalObjectPointer, $lexicalGlobalObjectReference, $thisObjectReference, $globalObjectReference, $exceptionThrower) = @_;

    assert("Invalid context type") if !IsValidContextForJSValueToNative($context);

    my $type = $context->type;

    # FIXME: Remove these 3 variables when all JSValueToNative use references.
    $lexicalGlobalObjectPointer = "lexicalGlobalObject" unless $lexicalGlobalObjectPointer;
    $lexicalGlobalObjectReference = "*lexicalGlobalObject" unless $lexicalGlobalObjectReference;
    $thisObjectReference = "*castedThis" unless $thisObjectReference;

    AddToImplIncludesForIDLType($type, $conditional);
    AddToImplIncludes("JSDOMGlobalObject.h", $conditional) if JSValueToNativeDOMConvertNeedsGlobalObject($type);

    my $IDLType = GetIDLType($interface, $type);

    my @conversionArguments = ();
    push(@conversionArguments, $lexicalGlobalObjectReference);
    push(@conversionArguments, $value);
    push(@conversionArguments, $thisObjectReference) if JSValueToNativeDOMConvertNeedsThisObject($type);
    push(@conversionArguments, $globalObjectReference) if JSValueToNativeDOMConvertNeedsGlobalObject($type);
    push(@conversionArguments, $exceptionThrower) if $exceptionThrower;

    return "convert<$IDLType>(" . join(", ", @conversionArguments) . ")";
}

sub ToNativeForFunctionWithoutTypeCheck
{
    my ($interface, $context, $value, $conditional, $lexicalGlobalObjectPointer, $lexicalGlobalObjectReference, $thisObjectReference) = @_;

    assert("Invalid context type") if !IsValidContextForJSValueToNative($context);

    my $type = $context->type;

    # FIXME: Remove these 3 variables when all JSValueToNative use references.
    $lexicalGlobalObjectPointer = "lexicalGlobalObject" unless $lexicalGlobalObjectPointer;
    $lexicalGlobalObjectReference = "*lexicalGlobalObject" unless $lexicalGlobalObjectReference;
    $thisObjectReference = "*castedThis" unless $thisObjectReference;

    AddToImplIncludesForIDLType($type, $conditional);

    # FIXME: Support more types.

    AddToImplIncludes("DOMJITIDLConvert.h");

    my $IDLType = GetIDLType($interface, $type);

    my @conversionArguments = ();
    push(@conversionArguments, "$lexicalGlobalObjectReference");
    push(@conversionArguments, "$value");

    return ("DOMJIT::DirectConverter<$IDLType>::directConvert(" . join(", ", @conversionArguments) . ")", 1);
}

sub NativeToJSValueDOMConvertNeedsState
{
    my ($type) = @_;

    # FIXME: We need a more robust way to specify this requirement so as not
    # to require specializing each type. Perhaps just requiring all override
    # types to take both lexicalGlobalObject and the global object would work?
    if ($type->extendedAttributes->{OverrideIDLType}) {
        my $overrideTypeName = $type->extendedAttributes->{OverrideIDLType};
        return 1 if $overrideTypeName eq "IDLIDBKey";
        return 1 if $overrideTypeName eq "IDLWebGLAny";
        return 1 if $overrideTypeName eq "IDLWebGLExtension";

        return 0;
    }

    # FIXME: This should actually check if all the sub-objects of the union need the lexicalGlobalObject.
    return 1 if $type->isUnion;
    return 1 if $codeGenerator->IsSequenceOrFrozenArrayType($type);
    return 1 if $codeGenerator->IsRecordType($type);
    return 1 if $codeGenerator->IsStringType($type);
    return 1 if $codeGenerator->IsEnumType($type);
    return 1 if $codeGenerator->IsDictionaryType($type);
    return 1 if $codeGenerator->IsInterfaceType($type);
    return 1 if $codeGenerator->IsBufferSourceType($type);
    return 1 if $codeGenerator->IsPromiseType($type);
    return 1 if $type->name eq "Date";
    return 1 if $type->name eq "JSON";
    return 1 if $type->name eq "SerializedScriptValue";
    
    return 0;
}

sub NativeToJSValueDOMConvertNeedsGlobalObject
{
    my ($type) = @_;
    
    # FIXME: We need a more robust way to specify this requirement so as not
    # to require specializing each type. Perhaps just requiring all override
    # types to take both lexicalGlobalObject and the global object would work?
    if ($type->extendedAttributes->{OverrideIDLType}) {
        my $overrideTypeName = $type->extendedAttributes->{OverrideIDLType};
        return 1 if $overrideTypeName eq "IDLIDBKey";
        return 1 if $overrideTypeName eq "IDLWebGLAny";
        return 1 if $overrideTypeName eq "IDLWebGLExtension";

        return 0;
    }

    # FIXME: This should actually check if all the sub-objects of the union need the global object.
    return 1 if $type->isUnion;
    return 1 if $codeGenerator->IsSequenceOrFrozenArrayType($type);
    return 1 if $codeGenerator->IsRecordType($type);
    return 1 if $codeGenerator->IsDictionaryType($type);
    return 1 if $codeGenerator->IsInterfaceType($type);
    return 1 if $codeGenerator->IsBufferSourceType($type);
    return 1 if $codeGenerator->IsPromiseType($type);
    return 1 if $type->name eq "SerializedScriptValue";

    return 0;
}

sub NativeToJSValueUsingReferences
{
    my ($context, $interface, $value, $globalObjectReference) = @_;

    return NativeToJSValue($context, $interface, $value, "lexicalGlobalObject", $globalObjectReference);
}

# FIXME: We should remove NativeToJSValueUsingPointers and combine NativeToJSValueUsingReferences and NativeToJSValue
sub NativeToJSValueUsingPointers
{
    my ($context, $interface, $value, $globalObjectReference) = @_;

    return NativeToJSValue($context, $interface, $value, "*lexicalGlobalObject", $globalObjectReference);
}

sub IsValidContextForNativeToJSValue
{
    my $context = shift;
    
    return ref($context) eq "IDLAttribute" || ref($context) eq "IDLArgument" || ref($context) eq "IDLDictionaryMember" || ref($context) eq "IDLOperation";
}

sub NativeToJSValueMayThrow
{
    my ($context) = @_;
    return ref($context) eq "IDLAttribute" || ref($context) eq "IDLOperation" || ref($context) eq "IDLDictionaryMember";
}

sub NativeToJSValue
{
    my ($context, $interface, $value, $lexicalGlobalObjectReference, $globalObjectReference) = @_;

    assert("Invalid context type") if !IsValidContextForNativeToJSValue($context);

    my $conditional = $context->extendedAttributes->{Conditional};
    my $type = $context->type;
    my $mayThrowException = NativeToJSValueMayThrow($context);

    # We could instead overload a function to work with optional as well as non-optional numbers, but this
    # is slightly better because it guarantees we will fail to compile if the IDL file doesn't match the C++.
    if ($context->extendedAttributes->{Reflect} and ($type->name eq "unsigned long" or $type->name eq "unsigned short")) {
        $value =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g;
        $value = "std::max(0, $value)";
    }

    AddToImplIncludesForIDLType($type, $conditional);
    AddToImplIncludes("JSDOMGlobalObject.h", $conditional) if NativeToJSValueDOMConvertNeedsGlobalObject($type);

    if ($context->extendedAttributes->{CheckSecurityForNode}) {
        AddToImplIncludes("JSDOMBindingSecurity.h", $conditional);
        $value = "BindingSecurity::checkSecurityForNode($lexicalGlobalObjectReference, $value)";
    }

    my $IDLType = GetIDLType($interface, $type);

    # FIXME: Not all promise types require the functor wrapping (some attribute getters actually return a value)
    # but wrapping is a no-op, so fixing this would purely be a stylistic / compile time fix.
    my $needsFunctorWrapping = $type->name eq "undefined" || $codeGenerator->IsPromiseType($type);

    my @conversionArguments = ();
    push(@conversionArguments, $lexicalGlobalObjectReference) if NativeToJSValueDOMConvertNeedsState($type) || $mayThrowException;
    push(@conversionArguments, $globalObjectReference) if NativeToJSValueDOMConvertNeedsGlobalObject($type);
    push(@conversionArguments, "throwScope") if $mayThrowException;
    if ($needsFunctorWrapping) {
        push(@conversionArguments, "[&]() -> decltype(auto) { return $value; }");
    } else {
        push(@conversionArguments, "$value");
    }
    my $functionName = $context->extendedAttributes->{NewObject} ? "toJSNewlyCreated" : "toJS";

    return "${functionName}<${IDLType}>(" . join(", ", @conversionArguments) . ")";
}

sub ceilingToPowerOf2
{
    my ($size) = @_;

    my $powerOf2 = 1;
    while ($size > $powerOf2) {
        $powerOf2 <<= 1;
    }

    return $powerOf2;
}

# Internal Helper
sub GenerateHashTableValueArray
{
    my $keys = shift;
    my $specials = shift;
    my $value1 = shift;
    my $value2 = shift;
    my $conditionals = shift;
    my $readWriteConditionals = shift;
    my $nameEntries = shift;

    my $packedSize = scalar @{$keys};
    push(@implContent, "\nstatic const HashTableValue $nameEntries\[\] =\n\{\n");

    my $hasSetter = "false";

    my $i = 0;
    foreach my $key (@{$keys}) {
        my $firstTargetType;
        my $secondTargetType = "";
        my $conditional;

        if ($conditionals) {
            $conditional = $conditionals->{$key};
        }
        if ($conditional) {
            my $conditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($conditional);
            push(@implContent, "#if ${conditionalString}\n");
        }

        if ("@$specials[$i]" =~ m/DOMJITFunction/) {
            $firstTargetType = "static_cast<RawNativeFunction>";
            $secondTargetType = "static_cast<const JSC::DOMJIT::Signature*>";
        } elsif ("@$specials[$i]" =~ m/Function/) {
            $firstTargetType = "static_cast<RawNativeFunction>";
        } elsif ("@$specials[$i]" =~ m/Builtin/) {
            $firstTargetType = "static_cast<BuiltinGenerator>";
        } elsif ("@$specials[$i]" =~ m/ConstantInteger/) {
            $firstTargetType = "";
        } elsif ("@$specials[$i]" =~ m/DOMJITAttribute/) {
            $firstTargetType = "static_cast<const JSC::DOMJIT::GetterSetter*>";
        } else {
            $firstTargetType = "static_cast<PropertySlot::GetValueFunc>";
            $secondTargetType = "static_cast<PutPropertySlot::PutValueFunc>";
            $hasSetter = "true";
        }
        if ("@$specials[$i]" =~ m/ConstantInteger/) {
            push(@implContent, "    { \"$key\", @$specials[$i], NoIntrinsic, { (long long)" . $firstTargetType . "(@$value1[$i]) } },\n");
        } else {
            my $readWriteConditional = $readWriteConditionals ? $readWriteConditionals->{$key} : undef;
            if ($readWriteConditional) {
                my $readWriteConditionalString = $codeGenerator->GenerateConditionalStringFromAttributeValue($readWriteConditional);
                push(@implContent, "#if ${readWriteConditionalString}\n");
            }

            push(@implContent, "    { \"$key\", @$specials[$i], NoIntrinsic, { (intptr_t)" . $firstTargetType . "(@$value1[$i]), (intptr_t) " . $secondTargetType . "(@$value2[$i]) } },\n");

            if ($readWriteConditional) {
                push(@implContent, "#else\n") ;
                push(@implContent, "    { \"$key\", JSC::PropertyAttribute::ReadOnly | @$specials[$i], NoIntrinsic, { (intptr_t)" . $firstTargetType . "(@$value1[$i]), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },\n");
                push(@implContent, "#endif\n");
            }
        }
        if ($conditional) {
            push(@implContent, "#else\n");
            push(@implContent, "    { 0, 0, NoIntrinsic, { 0, 0 } },\n");
            push(@implContent, "#endif\n");
        }
        ++$i;
    }

    push(@implContent, "    { 0, 0, NoIntrinsic, { 0, 0 } }\n") if (!$packedSize);
    push(@implContent, "};\n\n");

    return $hasSetter;
}

sub GenerateHashTable
{
    my $object = shift;

    my $className = shift;
    my $name = shift;
    my $size = shift;
    my $keys = shift;
    my $specials = shift;
    my $value1 = shift;
    my $value2 = shift;
    my $conditionals = shift;
    my $readWriteConditionals = shift;
    my $justGenerateValueArray = shift;

    my $nameEntries = "${name}Values";
    $nameEntries =~ s/:/_/g;
    my $nameIndex = "${name}Index";
    $nameIndex =~ s/:/_/g;

    if (($name =~ /Prototype/) or ($name =~ /Constructor/)) {
        my $type = $name;
        my $implClass;

        if ($name =~ /Prototype/) {
            $type =~ s/Prototype.*//;
            $implClass = $type; $implClass =~ s/Wrapper$//;
            push(@implContent, "/* Hash table for prototype */\n");
        } else {
            $type =~ s/Constructor.*//;
            $implClass = $type; $implClass =~ s/Constructor$//;
            push(@implContent, "/* Hash table for constructor */\n");
        }
    } else {
        push(@implContent, "/* Hash table */\n");
    }

    if ($justGenerateValueArray) {
        GenerateHashTableValueArray($keys, $specials, $value1, $value2, $conditionals, $readWriteConditionals, $nameEntries) if $size;
        return;
    }

    # Generate size data for compact' size hash table

    my @table = ();
    my @links = ();

    my $compactSize = ceilingToPowerOf2($size * 2);

    my $maxDepth = 0;
    my $collisions = 0;
    my $numEntries = $compactSize;

    my $i = 0;
    foreach (@{$keys}) {
        my $depth = 0;
        my $h = Hasher::GenerateHashValue($_) % $numEntries;

        while (defined($table[$h])) {
            if (defined($links[$h])) {
                $h = $links[$h];
                $depth++;
            } else {
                $collisions++;
                $links[$h] = $compactSize;
                $h = $compactSize;
                $compactSize++;
            }
        }

        $table[$h] = $i;

        $i++;
        $maxDepth = $depth if ($depth > $maxDepth);
    }

    push(@implContent, "\nstatic const struct CompactHashIndex ${nameIndex}\[$compactSize\] = {\n");
    for (my $i = 0; $i < $compactSize; $i++) {
        my $T = -1;
        if (defined($table[$i])) { $T = $table[$i]; }
        my $L = -1;
        if (defined($links[$i])) { $L = $links[$i]; }
        push(@implContent, "    { $T, $L },\n");
    }
    push(@implContent, "};\n\n");

    # Dump the hash table
    my $hasSetter = GenerateHashTableValueArray($keys, $specials, $value1, $value2, $conditionals, $readWriteConditionals, $nameEntries);
    my $packedSize = scalar @{$keys};

    my $compactSizeMask = $numEntries - 1;
    push(@implContent, "static const HashTable $name = { $packedSize, $compactSizeMask, $hasSetter, ${className}::info(), $nameEntries, $nameIndex };\n");
}

sub SubstituteHeader
{
    # Internal macOS SDKs up to 10.15 have non-suffixed headers in their WebKitAdditions, requiring the addition of the suffix to build successfully.
    my $include = shift;
    if ($include eq "\"ApplePayInstallmentConfiguration.h\"") {
        return "\"ApplePayInstallmentConfigurationWebCore.h\"";
    }
    if ($include eq "\"ApplePaySetupFeatureType.h\"") {
        return "\"ApplePaySetupFeatureTypeWebCore.h\"";
    }
    if ($include eq "\"ApplePaySetupFeature.h\"") {
        return "\"ApplePaySetupFeatureWebCore.h\"";
    }
    if ($include eq "\"ApplePaySetup.h\"") {
        return "\"ApplePaySetupWebCore.h\"";
    }
    if ($include eq "\"PaymentInstallmentConfiguration.h\"") {
        return "\"PaymentInstallmentConfigurationWebCore.h\"";
    }
    return $include;
}

sub WriteData
{
    my $object = shift;
    my $interface = shift;
    my $outputDir = shift;

    my $name = $interface->type->name;
    my $headerFileName = "$outputDir/JS$name.h";
    my $implFileName = "$outputDir/JS$name.cpp";
    my $depsFileName = "$outputDir/JS$name.dep";

    # Update a .cpp file if the contents are changed.
    my $contents = join "", @implContentHeader;

    my @includes = ();
    my %implIncludeConditions = ();
    foreach my $include (keys %implIncludes) {
        next if $headerIncludes{$include};
        next if $headerTrailingIncludes{$include};

        my $condition = $implIncludes{$include};

        my $checkType = $include;
        $checkType =~ s/\.h//;
        next if $codeGenerator->IsSVGAnimatedTypeName($checkType);

        $include = "\"$include\"" unless $include =~ /^["<]/; # "

        if ($condition eq 1) {
            push @includes, $include;
        } else {
            push @{$implIncludeConditions{$codeGenerator->GenerateConditionalStringFromAttributeValue($condition)}}, $include;
        }
    }
    foreach my $include (sort @includes) {
        $contents .= "#include $include\n";
    }
    foreach my $condition (sort keys %implIncludeConditions) {
        $contents .= "\n#if " . $condition . "\n";
        foreach my $include (sort @{$implIncludeConditions{$condition}}) {
            $contents .= "#include $include\n";
        }
        $contents .= "#endif\n";
    }

    $contents .= join "", @implContent;
    $codeGenerator->UpdateFile($implFileName, $contents);

    @implContentHeader = ();
    @implContent = ();
    %implIncludes = ();

    # Update a .h file if the contents are changed.
    $contents = join "", @headerContentHeader;

    @includes = ();
    foreach my $include (keys %headerIncludes) {
        $include = "\"$include\"" unless $include =~ /^["<]/; # "
        $include = SubstituteHeader($include);
        push @includes, $include;
    }
    foreach my $include (sort @includes) {
        # "JSClassName.h" is already included right after config.h.
        next if $include eq "\"JS$name.h\"";
        $contents .= "#include $include\n";
    }

    $contents .= join "", @headerContent;

    @includes = ();
    foreach my $include (keys %headerTrailingIncludes) {
        $include = "\"$include\"" unless $include =~ /^["<]/; # "
        push @includes, $include;
    }
    foreach my $include (sort @includes) {
        $contents .= "#include $include\n";
    }
    $codeGenerator->UpdateFile($headerFileName, $contents);

    @headerContentHeader = ();
    @headerContent = ();
    %headerIncludes = ();
    %headerTrailingIncludes = ();

    if (@depsContent) {
        # Update a .dep file if the contents are changed.
        $contents = join "", @depsContent;
        $codeGenerator->UpdateFile($depsFileName, $contents);

        @depsContent = ();
    }
}

sub GeneratePrototypeDeclaration
{
    my ($outputArray, $className, $interface) = @_;

    return if ShouldUseOrdinaryObjectPrototype($interface);

    my $prototypeClassName = "${className}Prototype";

    my %structureFlags = ();
    push(@$outputArray, "class ${prototypeClassName} final : public JSC::JSNonFinalObject {\n");
    push(@$outputArray, "public:\n");
    push(@$outputArray, "    using Base = JSC::JSNonFinalObject;\n");

    push(@$outputArray, "    static ${prototypeClassName}* create(JSC::VM& vm, JSDOMGlobalObject* globalObject, JSC::Structure* structure)\n");
    push(@$outputArray, "    {\n");
    push(@$outputArray, "        ${className}Prototype* ptr = new (NotNull, JSC::allocateCell<${className}Prototype>(vm)) ${className}Prototype(vm, globalObject, structure);\n");
    push(@$outputArray, "        ptr->finishCreation(vm);\n");
    push(@$outputArray, "        return ptr;\n");
    push(@$outputArray, "    }\n\n");

    push(@$outputArray, "    DECLARE_INFO;\n");

    push(@$outputArray, "    template<typename CellType, JSC::SubspaceAccess>\n");
    push(@$outputArray, "    static JSC::IsoSubspace* subspaceFor(JSC::VM& vm)\n");
    push(@$outputArray, "    {\n");
    push(@$outputArray, "        STATIC_ASSERT_ISO_SUBSPACE_SHARABLE(${prototypeClassName}, Base);\n");
    push(@$outputArray, "        return &vm.plainObjectSpace();\n");
    push(@$outputArray, "    }\n");

    push(@$outputArray, "    static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)\n");
    push(@$outputArray, "    {\n");
    push(@$outputArray, "        return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());\n");
    push(@$outputArray, "    }\n");

    push(@$outputArray, "\nprivate:\n");
    push(@$outputArray, "    ${prototypeClassName}(JSC::VM& vm, JSC::JSGlobalObject*, JSC::Structure* structure)\n");
    push(@$outputArray, "        : JSC::JSNonFinalObject(vm, structure)\n");
    push(@$outputArray, "    {\n");
    push(@$outputArray, "    }\n");

    push(@$outputArray, "\n");
    push(@$outputArray, "    void finishCreation(JSC::VM&);\n");

    $structureFlags{"JSC::HasStaticPropertyTable"} = 1 if PrototypeHasStaticPropertyTable($interface) && IsGlobalInterface($interface);
    $structureFlags{"JSC::IsImmutablePrototypeExoticObject"} = 1 if $interface->extendedAttributes->{IsImmutablePrototypeExoticObjectOnPrototype};

    # structure flags
    if (%structureFlags) {
        push(@$outputArray, "public:\n");
        push(@$outputArray, "    static constexpr unsigned StructureFlags = Base::StructureFlags");
        foreach my $structureFlag (sort (keys %structureFlags)) {
            push(@$outputArray, " | " . $structureFlag);
        }
        push(@$outputArray, ";\n");
    }

    push(@$outputArray, "};\n");
    push(@$outputArray, "STATIC_ASSERT_ISO_SUBSPACE_SHARABLE(${prototypeClassName}, ${prototypeClassName}::Base);\n\n");
}

sub GetConstructorTemplateClassName
{
    my $interface = shift;
    return "JSDOMBuiltinConstructor" if HasJSBuiltinConstructor($interface);
    return "JSDOMConstructorNotCallable" if $interface->isNamespaceObject;
    return "JSDOMConstructorNotConstructable" if $interface->extendedAttributes->{LegacyFactoryFunction};
    return "JSDOMConstructorNotConstructable" unless IsConstructable($interface);
    return "JSDOMConstructor";
}

sub GenerateConstructorDeclaration
{
    my ($outputArray, $className, $interface) = @_;

    my $interfaceName = $interface->type->name;
    my $constructorClassName = "${className}DOMConstructor";
    my $templateClassName = GetConstructorTemplateClassName($interface);

    AddToImplIncludes("${templateClassName}.h");
    AddToImplIncludes("JSDOMLegacyFactoryFunction.h") if $interface->extendedAttributes->{LegacyFactoryFunction};

    push(@$outputArray, "using $constructorClassName = $templateClassName<$className>;\n");
    push(@$outputArray, "using JS${interfaceName}LegacyFactoryFunction = JSDOMLegacyFactoryFunction<$className>;\n") if $interface->extendedAttributes->{LegacyFactoryFunction};
    push(@$outputArray, "\n");
}

sub GenerateConstructorDefinitions
{
    my ($outputArray, $className, $protoClassName, $visibleInterfaceName, $interface, $generatingLegacyFactoryFunction) = @_;

    if (IsConstructable($interface)) {
        my @constructors = @{$interface->constructors};
        if (@constructors > 1) {
            foreach my $constructor (@constructors) {
                GenerateConstructorDefinition($outputArray, $className, $protoClassName, $visibleInterfaceName, $interface, $generatingLegacyFactoryFunction, $constructor);
            }

            my $overloadFunctionPrefix = "construct${className}";

            push(@implContent, "template<> EncodedJSValue JSC_HOST_CALL_ATTRIBUTES ${className}DOMConstructor::construct(JSGlobalObject* lexicalGlobalObject, CallFrame* callFrame)\n");
            push(@implContent, "{\n");
            push(@implContent, "    VM& vm = lexicalGlobalObject->vm();\n");
            push(@implContent, "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n");
            push(@implContent, "    UNUSED_PARAM(throwScope);\n");

            GenerateOverloadDispatcher(@{$interface->constructors}[0], $interface, $overloadFunctionPrefix, "", "lexicalGlobalObject, callFrame");

            push(@implContent, "}\n");
            push(@implContent, "JSC_ANNOTATE_HOST_FUNCTION(${className}ConstructorConstruct, ${className}DOMConstructor::construct);\n\n");
        } elsif (@constructors == 1) {
            GenerateConstructorDefinition($outputArray, $className, $protoClassName, $visibleInterfaceName, $interface, $generatingLegacyFactoryFunction, $constructors[0]);
        } else {
            GenerateConstructorDefinition($outputArray, $className, $protoClassName, $visibleInterfaceName, $interface, $generatingLegacyFactoryFunction);
        }
    }

    GenerateConstructorHelperMethods($outputArray, $className, $protoClassName, $visibleInterfaceName, $interface, $generatingLegacyFactoryFunction);
}

sub GenerateConstructorDefinition
{
    my ($outputArray, $className, $protoClassName, $visibleInterfaceName, $interface, $generatingLegacyFactoryFunction, $operation) = @_;

    return if HasJSBuiltinConstructor($interface);

    my $interfaceName = $interface->type->name;
    my $constructorClassName = $generatingLegacyFactoryFunction ? "${className}LegacyFactoryFunction" : "${className}DOMConstructor";

    if (IsConstructable($interface)) {
        if (HasCustomConstructor($interface)) {
            push(@$outputArray, "template<> JSC::EncodedJSValue JSC_HOST_CALL_ATTRIBUTES ${constructorClassName}::construct(JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callFrame)\n");
            push(@$outputArray, "{\n");
            push(@$outputArray, "    ASSERT(callFrame);\n");
            push(@$outputArray, "    return construct${className}(lexicalGlobalObject, *callFrame);\n");
            push(@$outputArray, "}\n");
            push(@implContent, "JSC_ANNOTATE_HOST_FUNCTION(${constructorClassName}Construct, ${constructorClassName}::construct);\n\n");
         } elsif (!HasCustomConstructor($interface) && (!$interface->extendedAttributes->{LegacyFactoryFunction} || $generatingLegacyFactoryFunction)) {
            my $isOverloaded = $operation->{overloads} && @{$operation->{overloads}} > 1;
            if ($isOverloaded) {
                push(@$outputArray, "static inline EncodedJSValue construct${className}$operation->{overloadIndex}(JSGlobalObject* lexicalGlobalObject, CallFrame* callFrame)\n");
            } else {
                push(@$outputArray, "template<> EncodedJSValue JSC_HOST_CALL_ATTRIBUTES ${constructorClassName}::construct(JSGlobalObject* lexicalGlobalObject, CallFrame* callFrame)\n");
            }

            push(@$outputArray, "{\n");
            push(@$outputArray, "    VM& vm = lexicalGlobalObject->vm();\n");
            push(@$outputArray, "    auto throwScope = DECLARE_THROW_SCOPE(vm);\n");
            push(@$outputArray, "    auto* castedThis = jsCast<${constructorClassName}*>(callFrame->jsCallee());\n");
            push(@$outputArray, "    ASSERT(castedThis);\n");

             if ($operation->extendedAttributes->{EnabledBySetting}) {
                 my $runtimeEnableConditionalString = GenerateRuntimeEnableConditionalString($interface, $operation, "lexicalGlobalObject");
                 push(@$outputArray, "    if (!${runtimeEnableConditionalString}) {\n");
                 push(@$outputArray, "        throwTypeError(lexicalGlobalObject, throwScope, \"Illegal constructor\"_s);\n");
                 push(@$outputArray, "        return JSValue::encode(jsNull());\n");
                 push(@$outputArray, "    }\n");
             }

            GenerateArgumentsCountCheck($outputArray, $operation, $interface, "    ");

            my $functionImplementationName = $generatingLegacyFactoryFunction ? "createForLegacyFactoryFunction" : "create";
            my $functionString = GenerateParametersCheck($outputArray, $operation, $interface, $functionImplementationName, "    ");

            push(@$outputArray, "    auto object = ${functionString};\n");
            push(@$outputArray, "    if constexpr (IsExceptionOr<decltype(object)>)\n");
            push(@$outputArray, "        RETURN_IF_EXCEPTION(throwScope, { });\n");

            push(@$outputArray, "    static_assert(TypeOrExceptionOrUnderlyingType<decltype(object)>::isRef);\n");

            my $IDLType = GetIDLType($interface, $interface->type);
            my $implType = GetImplClassName($interface);

            AddToImplIncludes("JSDOMConvertInterface.h");

            my @constructionConversionArguments = ();
            push(@constructionConversionArguments, "*lexicalGlobalObject");
            push(@constructionConversionArguments, "*castedThis->globalObject()");
            push(@constructionConversionArguments, "throwScope");
            push(@constructionConversionArguments, "WTFMove(object)");

            # FIXME: toJSNewlyCreated should return JSObject* instead of JSValue.
            push(@$outputArray, "    auto jsValue = toJSNewlyCreated<${IDLType}>(" . join(", ", @constructionConversionArguments) . ");\n");
            push(@$outputArray, "    if constexpr (IsExceptionOr<decltype(object)>)\n");
            push(@$outputArray, "        RETURN_IF_EXCEPTION(throwScope, { });\n");
            push(@$outputArray, "    setSubclassStructureIfNeeded<${implType}>(lexicalGlobalObject, callFrame, asObject(jsValue));\n");
            push(@$outputArray, "    RETURN_IF_EXCEPTION(throwScope, { });\n");
            push(@$outputArray, "    return JSValue::encode(jsValue);\n");
            push(@$outputArray, "}\n");
            if (!$isOverloaded) {
                push(@$outputArray, "JSC_ANNOTATE_HOST_FUNCTION(${constructorClassName}Construct, ${constructorClassName}::construct);\n");
            }
            push(@$outputArray, "\n");
        }
    }
}

sub ConstructorHasProperties
{
    my $interface = shift;

    foreach my $constant (@{$interface->constants}) {
        return 1;
    }

    foreach my $attribute (@{$interface->attributes}) {
        next unless ($attribute->isStatic);
        return 1;
    }

    foreach my $operation (@{$interface->operations}) {
        next unless ($operation->isStatic);
        return 1;
    }

    return 0;
}

sub GetRuntimeEnabledStaticProperties
{
    my ($interface) = @_;

    my @runtimeEnabledProperties = ();

    foreach my $attribute (@{$interface->attributes}) {
        next if AttributeShouldBeOnInstance($interface, $attribute) != 0;
        next if not $attribute->isStatic;

        if (NeedsRuntimeCheck($interface, $attribute)) {
            push(@runtimeEnabledProperties, $attribute);
        }
    }

    foreach my $constant (@{$interface->constants}) {
        if (NeedsRuntimeCheck($interface, $constant)) {
            push(@runtimeEnabledProperties, $constant);
        }
    }

    foreach my $operation (@{$interface->operations}) {
        next if ($operation->extendedAttributes->{PrivateIdentifier} and not $operation->extendedAttributes->{PublicIdentifier});
        next if $operation->{overloadIndex} && $operation->{overloadIndex} > 1;
        next if OperationShouldBeOnInstance($interface, $operation) != 0;
        next if $operation->name eq "[Symbol.Iterator]";
        next if not $operation->isStatic;

        if (NeedsRuntimeCheck($interface, $operation)) {
            push(@runtimeEnabledProperties, $operation);
        }
    }

    return @runtimeEnabledProperties;
}

sub GenerateConstructorHelperMethods
{
    my ($outputArray, $className, $protoClassName, $visibleInterfaceName, $interface, $generatingLegacyFactoryFunction) = @_;

    my $constructorClassName = $generatingLegacyFactoryFunction ? "${className}LegacyFactoryFunction" : "${className}DOMConstructor";
    my $leastConstructorLength = 0;
    if (@{$interface->constructors} > 0) {
        $leastConstructorLength = 255;
        foreach my $constructor (@{$interface->constructors}) {
            my $constructorLength = GetFunctionLength($constructor);
            $leastConstructorLength = $constructorLength if ($constructorLength < $leastConstructorLength);
        }
    } else {
        $leastConstructorLength = 0;
    }

    push(@$outputArray, "template<> const ClassInfo ${constructorClassName}::s_info = { \"${visibleInterfaceName}\", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(${constructorClassName}) };\n\n");

    # If the interface has a parent interface which does not have [LegacyNoInterfaceObject], then use its interface object as prototype,
    # otherwise use FunctionPrototype: http://heycam.github.io/webidl/#interface-object
    push(@$outputArray, "template<> JSValue ${constructorClassName}::prototypeForStructure(JSC::VM& vm, const JSDOMGlobalObject& globalObject)\n");
    push(@$outputArray, "{\n");

    assert("An interface cannot inherit from another interface that is marked as [LegacyNoInterfaceObject]") if $interface->parentType && $codeGenerator->GetInterfaceExtendedAttributesFromName($interface->parentType->name)->{LegacyNoInterfaceObject};

    if (!$generatingLegacyFactoryFunction and $interface->parentType) {
        my $parentClassName = "JS" . $interface->parentType->name;
        push(@$outputArray, "    return ${parentClassName}::getConstructor(vm, &globalObject);\n");
    } elsif (ShouldUseOrdinaryObjectPrototype($interface)) {
        AddToImplIncludes("<JavaScriptCore/ObjectPrototype.h>");
        push(@$outputArray, "    UNUSED_PARAM(vm);\n");
        push(@$outputArray, "    return globalObject.objectPrototype();\n");
    } else {
        AddToImplIncludes("<JavaScriptCore/FunctionPrototype.h>");
        push(@$outputArray, "    UNUSED_PARAM(vm);\n");
        push(@$outputArray, "    return globalObject.functionPrototype();\n");
    }
    push(@$outputArray, "}\n\n");


    push(@$outputArray, "template<> void ${constructorClassName}::initializeProperties(VM& vm, JSDOMGlobalObject& globalObject)\n");
    push(@$outputArray, "{\n");

    assert("jsNontrivialString() requires strings two or more characters long") if length($visibleInterfaceName) < 2;
    if ($interface->isNamespaceObject) {
        push(@$outputArray, "    JSC_TO_STRING_TAG_WITHOUT_TRANSITION();\n");
    } else {
        # FIXME: Remove TextTrackCue constructor along with [LegacyFactoryFunctionEnabledBySetting] extended attribute.
        # https://bugs.webkit.org/show_bug.cgi?id=129615
        if ($interface->extendedAttributes->{LegacyFactoryFunctionEnabledBySetting}) {
            my $runtimeEnableConditionalString = GenerateRuntimeEnableConditionalString($interface, $interface, "&globalObject");
            push(@$outputArray, "    int constructorLength = ${leastConstructorLength};\n");
            push(@$outputArray, "    if (!${runtimeEnableConditionalString})\n");
            push(@$outputArray, "        constructorLength = 0;\n");
            push(@$outputArray, "    putDirect(vm, vm.propertyNames->length, jsNumber(constructorLength), JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);\n");
        } else {
            push(@$outputArray, "    putDirect(vm, vm.propertyNames->length, jsNumber(${leastConstructorLength}), JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);\n");
        }

        push(@$outputArray, "    JSString* nameString = jsNontrivialString(vm, \"$visibleInterfaceName\"_s);\n");
        push(@$outputArray, "    m_originalName.set(vm, this, nameString);\n");
        push(@$outputArray, "    putDirect(vm, vm.propertyNames->name, nameString, JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);\n");

        # There must exist an interface prototype object for every non-callback interface defined, regardless
        # of whether the interface was declared with the [LegacyNoInterfaceObject] extended attribute.
        # https://webidl.spec.whatwg.org/#interface-prototype-object
        if ($interface->isCallback) {
            push(@$outputArray, "    UNUSED_PARAM(globalObject);\n");
        } else {
            my $prototype = ShouldUseGlobalObjectPrototype($interface) ? "globalObject.getPrototypeDirect(vm)" : "${className}::prototype(vm, globalObject)";
            push(@$outputArray, "    putDirect(vm, vm.propertyNames->prototype, ${prototype}, JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::DontDelete);\n");
        }
    }

    my $classForThis = "${className}::info()";
    if ($interface->isCallback) {
        $classForThis = "nullptr";
    }
    push(@$outputArray, "    reifyStaticProperties(vm, ${classForThis}, ${className}ConstructorTableValues, *this);\n") if ConstructorHasProperties($interface);

    my @runtimeEnabledProperties = GetRuntimeEnabledStaticProperties($interface);

    foreach my $operationOrAttribute (@runtimeEnabledProperties) {
        my $conditionalString = $codeGenerator->GenerateConditionalString($operationOrAttribute);
        push(@$outputArray, "#if ${conditionalString}\n") if $conditionalString;
        my $runtimeEnableConditionalString = GenerateRuntimeEnableConditionalString($interface, $operationOrAttribute, "&globalObject");
        my $name = $operationOrAttribute->name;
        push(@$outputArray, "    if (!${runtimeEnableConditionalString}) {\n");
        push(@$outputArray, "        auto propertyName = Identifier::fromString(vm, reinterpret_cast<const LChar*>(\"$name\"), strlen(\"$name\"));\n");
        push(@$outputArray, "        VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);\n");
        push(@$outputArray, "        DeletePropertySlot slot;\n");
        push(@$outputArray, "        JSObject::deleteProperty(this, &globalObject, propertyName, slot);\n");
        push(@$outputArray, "    }\n");
        push(@$outputArray, "#endif\n") if $conditionalString;
    }

    push(@$outputArray, "}\n\n");

    if (HasJSBuiltinConstructor($interface)) {
        push(@$outputArray, "template<> FunctionExecutable* ${constructorClassName}::initializeExecutable(VM& vm)\n");
        push(@$outputArray, "{\n");
        push(@$outputArray, "    return " . GetJSBuiltinFunctionNameFromString($interface->type->name, "initialize" . $interface->type->name) . "(vm);\n");
        push(@$outputArray, "}\n");
        push(@$outputArray, "\n");
    }
}

sub HasCustomConstructor
{
    my ($interface) = @_;

    my $hasCustomConstuctor = 0;
    my $hasNonCustomConstuctor = 0;
    
    foreach my $constructor (@{$interface->constructors}) {
        if ($constructor->extendedAttributes->{Custom}) {
            $hasCustomConstuctor = 1;
        } else {
            $hasNonCustomConstuctor = 1;
        }
    }

    assert("Using both Custom and non-Custom constructors on the same interface is not supported at this time") if $hasCustomConstuctor && $hasNonCustomConstuctor;

    return $hasCustomConstuctor;
}

sub HasCustomGetter
{
    my $attribute = shift;
    return $attribute->extendedAttributes->{Custom} || $attribute->extendedAttributes->{CustomGetter};
}

sub HasCustomSetter
{
    my $attribute = shift;
    return $attribute->extendedAttributes->{Custom} || $attribute->extendedAttributes->{CustomSetter};
}

sub HasCustomMethod
{
    my $operation = shift;
    return $operation->extendedAttributes->{Custom};
}

sub NeedsConstructorProperty
{
    my $interface = shift;
    
    return 0 if $interface->isNamespaceObject;
    return !$interface->extendedAttributes->{LegacyNoInterfaceObject};
}

sub IsConstructable
{
    my $interface = shift;
    return @{$interface->constructors} > 0;
}

sub InstanceOverridesGetCallData
{
    my $interface = shift;
    return $interface->extendedAttributes->{CustomGetCallData} || $interface->extendedAttributes->{Plugin};
}

sub HeaderNeedsPrototypeDeclaration
{
    my $interface = shift;
    return IsDOMGlobalObject($interface);
}

sub IsLegacyUnforgeable
{
    my ($interface, $property) = @_;

    return $property->extendedAttributes->{LegacyUnforgeable} || $interface->extendedAttributes->{LegacyUnforgeable};
}

sub ComputeFunctionSpecial
{
    my ($interface, $operation) = @_;

    my @specials = ();
    push(@specials, ("JSC::PropertyAttribute::DontDelete", "JSC::PropertyAttribute::ReadOnly")) if IsLegacyUnforgeable($interface, $operation);
    push(@specials, "JSC::PropertyAttribute::DontEnum") if $operation->extendedAttributes->{NotEnumerable};
    if (IsJSBuiltin($interface, $operation)) {
        push(@specials, "JSC::PropertyAttribute::Builtin");
    } else {
        push(@specials, "JSC::PropertyAttribute::Function");
    }
    if ($operation->extendedAttributes->{DOMJIT}) {
        push(@specials, "JSC::PropertyAttribute::DOMJITFunction") if $operation->extendedAttributes->{DOMJIT};
    }
    return "static_cast<unsigned>(" . ((@specials > 0) ? join(" | ", @specials) : "0") . ")";
}

sub IsJSBuiltin
{
    my ($interface, $object) = @_;

    return 0 if $object->extendedAttributes->{Custom};
    return 0 if $object->extendedAttributes->{CustomGetter};
    return 0 if $object->extendedAttributes->{CustomSetter};

    return 1 if $object->extendedAttributes->{JSBuiltin};
    return 1 if $interface->extendedAttributes->{JSBuiltin};

    return 0;
}

sub HasJSBuiltinConstructor
{
    my ($interface) = @_;

    return 1 if $interface->extendedAttributes->{JSBuiltin};

    my $hasJSBuiltinConstuctor = 0;
    my $hasNonJSBuiltinConstuctor = 0;
    
    foreach my $constructor (@{$interface->constructors}) {
        if ($constructor->extendedAttributes->{JSBuiltin}) {
            $hasJSBuiltinConstuctor = 1;
        } else {
            $hasNonJSBuiltinConstuctor = 1;
        }
    }

    assert("Using both JSBuiltin and non-JSBuiltin constructors on the same interface is not supported at this time") if $hasJSBuiltinConstuctor && $hasNonJSBuiltinConstuctor;

    return $hasJSBuiltinConstuctor;
}

sub GetJSBuiltinFunctionName
{
    my ($className, $operation) = @_;

    my $scopeName = $operation->extendedAttributes->{ImplementedBy};
    $scopeName = substr $className, 2 unless $scopeName;
    return GetJSBuiltinFunctionNameFromString($scopeName, $operation->name);
}

sub GetJSBuiltinFunctionNameFromString
{
    my ($scopeName, $functionName) = @_;

    return $codeGenerator->WK_lcfirst($scopeName) . $codeGenerator->WK_ucfirst($functionName) . "CodeGenerator";
}

sub GetJSBuiltinScopeName
{
    my ($interface, $object) = @_;
    return $object->extendedAttributes->{ImplementedBy} || $interface->type->name;
}

sub AddJSBuiltinIncludesIfNeeded()
{
    my $interface = shift;

    if (HasJSBuiltinConstructor($interface)) {
        AddToImplIncludes($interface->type->name . "Builtins.h");
        return;
    }

    foreach my $operation (@{$interface->operations}) {
        AddToImplIncludes(GetJSBuiltinScopeName($interface, $operation) . "Builtins.h", $operation->extendedAttributes->{Conditional}) if IsJSBuiltin($interface, $operation);
    }

    foreach my $attribute (@{$interface->attributes}) {
        AddToImplIncludes(GetJSBuiltinScopeName($interface, $attribute) . "Builtins.h", $attribute->extendedAttributes->{Conditional}) if IsJSBuiltin($interface, $attribute);
    }
}

sub GenerateCallTracer()
{
    my ($outputArray, $callTracer, $name, $arguments, $indent) = @_;

    AddToImplIncludes($callTracer . ".h");

    push(@$outputArray, $indent . "if (UNLIKELY(impl.hasActive" . $callTracer . "()))\n");
    push(@$outputArray, $indent . "    " . $callTracer . "::recordAction(impl, \"" . $name . "\"_s");
    if (scalar(@$arguments)) {
        push(@$outputArray, ", { " . join(", ", map { $callTracer . "::processArgument(impl, " . $_ . ")" } @$arguments) . " }");
    }
    push(@$outputArray, ");\n");
}

sub GenerateCustomElementReactionsStackIfNeeded
{
    my ($outputArray, $context, $stateVariable) = @_;

    my $CEReactions = $context->extendedAttributes->{CEReactions};

    return if !$CEReactions;

    AddToImplIncludes("CustomElementReactionQueue.h");

    if ($CEReactions eq "NotNeeded") {
        push(@$outputArray, "    CustomElementReactionDisallowedScope customElementReactionDisallowedScope;\n");
    } else {
        push(@$outputArray, "    CustomElementReactionStack customElementReactionStack($stateVariable);\n");
    }
}

sub MakeSharedSyntheticAttribute
{
    my ($name, $baseAttribute) = @_;

    my $sharedAttribute = IDLAttribute->new();
    $sharedAttribute->name($name);
    $sharedAttribute->type(IDLParser::cloneType($baseAttribute->type));
    IDLParser::copyExtendedAttributes($sharedAttribute->extendedAttributes, $baseAttribute->extendedAttributes);

    # Replace "DelegateToSharedSyntheticAttribute" extended attribute with "IsSharedSyntheticAttribute" extended attribute to
    # that this is the real synthesized attribute.
    delete $sharedAttribute->extendedAttributes->{DelegateToSharedSyntheticAttribute};
    $sharedAttribute->extendedAttributes->{IsSharedSyntheticAttribute} = 1;

    return $sharedAttribute;
}

sub AddSharedSyntheticAttributesIfNeeded
{
    my $interface = shift;

    # Use a fake extended attribute, SyntheticIDLAttributes, to store the new attributes
    if (not exists $interface->extendedAttributes->{SyntheticIDLAttributes}) {
        my %syntheticIDLAttributes = ( );
        my @attributes = ();
        foreach my $attribute (@{$interface->attributes}) {
            if ($attribute->extendedAttributes->{DelegateToSharedSyntheticAttribute}) {
                my $name = $attribute->extendedAttributes->{DelegateToSharedSyntheticAttribute};
                if (not $syntheticIDLAttributes{$name}) {
                    my $syntheticAttribute = MakeSharedSyntheticAttribute($name, $attribute);
                    $syntheticIDLAttributes{$name} = 1;
                    push(@attributes, $syntheticAttribute);
                }
            }
        }
        $interface->extendedAttributes->{SyntheticIDLAttributes} = \@attributes;
    }
}

sub GetSharedSyntheticAttribute
{
    my ($interface, $attribute) = @_;

    foreach my $syntheticAttribute (@{$interface->extendedAttributes->{SyntheticIDLAttributes}}) {
        if ($attribute->extendedAttributes->{DelegateToSharedSyntheticAttribute} eq $syntheticAttribute->name()) {
            return $syntheticAttribute;
        }
    }
    
    return undef;
}

1;
