Index: Source/WebCore/bindings/dart/gyp/scripts/CodeGeneratorDart.pm |
diff --git a/Source/WebCore/bindings/dart/gyp/scripts/CodeGeneratorDart.pm b/Source/WebCore/bindings/dart/gyp/scripts/CodeGeneratorDart.pm |
deleted file mode 100644 |
index ccf7cef64b2008fcdf7e8ba7c2d9ff141ad47c0a..0000000000000000000000000000000000000000 |
--- a/Source/WebCore/bindings/dart/gyp/scripts/CodeGeneratorDart.pm |
+++ /dev/null |
@@ -1,1696 +0,0 @@ |
-# Copyright (C) 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org> |
-# Copyright (C) 2006 Anders Carlsson <andersca@mac.com> |
-# Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com> |
-# Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org> |
-# Copyright (C) 2006 Apple Computer, Inc. |
-# Copyright (C) 2007, 2008, 2009 Google Inc. |
-# 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) |
-# |
-# 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., 59 Temple Place - Suite 330, |
-# Boston, MA 02111-1307, USA. |
-# |
- |
-package CodeGeneratorDart; |
- |
-use Class::Struct; |
- |
-my $outputDir = ""; |
-my $outputHeadersDir = ""; |
- |
-my @headerContent = (); |
-my %headerIncludes = (); |
- |
-my @allParents = (); |
- |
-my @customCallbackDeclarations = (); |
-my @implContentHeader = (); |
-my @implFixedHeader = (); |
-my @implContent = (); |
-my %implIncludes = (); |
-my @dartNatives = (); |
- |
-my @dartInterfaceContent = (); |
-my @dartImplContent = (); |
- |
-# 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., 59 Temple Place - Suite 330, |
- Boston, MA 02111-1307, USA. |
-*/ |
-EOF |
- |
-struct(NativeBindingDescriptor => { |
- cppCallbackName => '$', |
- nativeId => '$', |
- argumentCount => '$', |
-}); |
- |
-struct(IDLTypeInfoStruct => { |
- additionalInterfaces => '@', |
- superClass => '$', |
- auxilaryMethods => '@', |
-}); |
- |
-# Default constructor |
-sub new |
-{ |
- my $object = shift; |
- |
- $codeGenerator = shift; |
- $outputDir = shift; |
- $outputHeadersDir = shift; |
- |
- my $reference = { }; |
- bless($reference, $object); |
- return $reference; |
-} |
- |
-sub finish |
-{ |
- my ($object,) = @_; |
- |
- # Commit changes! |
- $object->WriteData(); |
-} |
- |
-sub GenerateModule |
-{ |
- my ($object, $dataNode) = @_; |
-} |
- |
-sub GenerateInterface |
-{ |
- my ($object, $dataNode, $defines) = @_; |
- |
- # Add parent classes (for multiple-inheritance) fields as needed. |
- @allParents = (); |
- $codeGenerator->AddMethodsConstantsAndAttributesFromParentClasses($dataNode, \@allParents, 0); |
- # Prepare internal structures. |
- $codeGenerator->LinkOverloadedFunctions($dataNode); |
- |
- # Start actual generation |
- if ($dataNode->extendedAttributes->{Callback}) { |
- $object->GenerateCallbackDartInterface($dataNode); |
- $object->GenerateCallbackHeader($dataNode); |
- $object->GenerateCallbackImplementation($dataNode); |
- } else { |
- $object->GenerateSource($dataNode); |
- $object->GenerateHeader($dataNode); |
- } |
- |
- my $name = $dataNode->name; |
- |
- # Open files for writing |
- my $headerFileName = "$outputHeadersDir/Dart${name}.h"; |
- my $implFileName = "$outputDir/Dart${name}.cpp"; |
- my $dartInterfaceFileName = "$outputHeadersDir/${name}.dart"; |
- my $dartImplFileName = "$outputHeadersDir/${name}Implementation.dart"; |
- |
- open($IMPL, ">$implFileName") || die "Couldn't open file $implFileName"; |
- open($HEADER, ">$headerFileName") || die "Couldn't open file $headerFileName"; |
- open($DART_INTERFACE, ">$dartInterfaceFileName") || die "Couldn't open file $dartInterfaceFileName"; |
- open($DART_IMPL, ">$dartImplFileName") || die "Couldn't open file $dartImplFileName"; |
-} |
- |
-# If the node has a [Conditional=XXX] attribute, returns an "ENABLE(XXX)" string for use in an #if. |
-# FIXME: common with CodeGeneratorV8 |
-sub GenerateConditionalStringForAttributes |
-{ |
- my ($attributes,) = @_; |
- |
- my $conditional = $attributes->{Conditional}; |
- if ($conditional) { |
- if ($conditional =~ /&/) { |
- return "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")"; |
- } elsif ($conditional =~ /\|/) { |
- return "ENABLE(" . join(") || ENABLE(", split(/\|/, $conditional)) . ")"; |
- } else { |
- return "ENABLE(" . $conditional . ")"; |
- } |
- } else { |
- return ""; |
- } |
-} |
- |
-sub GenerateConditionalString |
-{ |
- my ($node,) = @_; |
- return GenerateConditionalStringForAttributes($node->extendedAttributes); |
-} |
- |
-sub GenerateCustomCallbackDeclaration |
-{ |
- my ($callbackName) = @_; |
- return "void $callbackName(Dart_NativeArguments);"; |
-} |
- |
-sub ClassName |
-{ |
- my ($interfaceName,) = @_; |
- return "Dart$interfaceName"; |
-} |
- |
-sub HasOverloads |
-{ |
- my ($function,) = @_; |
- return 1 if @{$function->{overloads}} > 1; |
-} |
- |
-sub MaxOverloadParameterCount |
-{ |
- my ($function,) = @_; |
- |
- my $maxParameterCount = 0; |
- foreach my $overload (@{$function->{overloads}}) { |
- my $parameterCount = @{$overload->parameters}; |
- $maxParameterCount = $maxParameterCount > $parameterCount ? $maxParameterCount : $parameterCount; |
- } |
- return $maxParameterCount; |
-} |
- |
-sub HasOptionalParameters |
-{ |
- my ($function) = @_; |
- |
- # FIXME: useCapture was marked as optional upstream, however native |
- # implementation still requires all three parameters. JavaScript bindings |
- # have custom generation for addEventListener and removeEventListener. |
- return 0 if $function->signature->name eq "addEventListener" || $function->signature->name eq "removeEventListener"; |
- |
- foreach my $parameter (@{$function->parameters}) { |
- return 1 if IsParameterOptionalInWebKit($parameter); |
- } |
-} |
- |
-sub HasCustomConstructor |
-{ |
- my ($dataNode) = @_; |
- |
- # FIXME: switch to using CanBeConstructed attribute. |
- return 1 if $dataNode->name eq "FileReader"; |
- return 1 if $dataNode->name eq "XMLHttpRequest"; |
- return 1 if $dataNode->name eq "WebKitCSSMatrix"; |
- return 1 if $dataNode->name eq "WebKitPoint"; |
- |
- return 0; |
-} |
- |
-sub IsParameterOptionalInWebKit |
-{ |
- my ($parameter) = @_; |
- |
- # Optional callbacks are not optional parameters in native implementations, they always have a default value (0). |
- my $optional = $parameter->extendedAttributes->{Optional}; |
- return $optional && $optional ne "CallWithDefaultValue" && !$parameter->extendedAttributes->{Callback}; |
-} |
- |
-my %renames = ( |
- "IDBCursor" => { |
- "continue" => "continueFunction", |
- }, |
- "IDBIndex" => { |
- "get" => "getObject", |
- }, |
- "IDBObjectStore" => { |
- "get" => "getObject", |
- }, |
- "Int8Array" => { |
- "set" => "setElements", |
- }, |
- "Int16Array" => { |
- "set" => "setElements", |
- }, |
- "Int32Array" => { |
- "set" => "setElements", |
- }, |
- "Uint8Array" => { |
- "set" => "setElements", |
- }, |
- "Uint16Array" => { |
- "set" => "setElements", |
- }, |
- "Uint32Array" => { |
- "set" => "setElements", |
- }, |
- "Float32Array" => { |
- "set" => "setElements", |
- }, |
- "Float64Array" => { |
- "set" => "setElements", |
- }, |
- "SVGFEMorphologyElement" => { |
- "operator" => "operatorValue", |
- }, |
- "SVGFECompositeElement" => { |
- "operator" => "operatorValue", |
- }, |
- "Console" => { |
- "assert" => "assert_", |
- }, |
-); |
- |
-sub DartName |
-{ |
- my ($interfaceName, $memberName) = @_; |
- return $memberName unless $renames{$interfaceName}; |
- my $class = $renames{$interfaceName}; |
- return $memberName unless $class->{$memberName}; |
- return $class->{$memberName}; |
-} |
- |
-# FIXME: eventually those should go away. |
-my %classesWithUnsupportedCustomGetters = ( |
- "Clipboard" => 1, |
- "Console" => 1, |
- "Coordinates" => 1, |
- "DeviceMotionEvent" => 1, |
- "DeviceOrientationEvent" => 1, |
- "FileReader" => 1, |
- "JavaScriptCallFrame" => 1, |
- "HTMLInputElement" => 1, |
- "HTMLOptionsCollection" => 1, |
- "HTMLOutputElement" => 1, |
- "ScriptProfileNode" => 1, |
- "WebKitAnimation" => 1, |
-); |
- |
-sub IgnoredAttribute |
-{ |
- my ($interfaceName, $attribute) = @_; |
- |
- # FIXME: reconsider if need to be supported in Dart bindings at all. |
- return 1 if $attribute->signature->type =~ /Constructor$/; |
- |
- # Attribute event listeners are not supported in Dart. |
- return 1 if $attribute->signature->type eq "EventListener"; |
- |
- # FIXME: support float[]. |
- return 1 if $attribute->signature->type eq "float[]"; |
- |
- # The only usage is HTMLIFrameElement.contentDocument. |
- return 1 if $attribute->signature->extendedAttributes->{CheckFrameSecurity}; |
- |
- return 1 if HasCustomGetter($attribute) && exists $classesWithUnsupportedCustomGetters{$interfaceName}; |
- |
- return 0; |
-} |
- |
- |
-sub HasSetter |
-{ |
- my ($attribute,) = @_; |
- |
- return 0 if $attribute->type =~ /^readonly/; |
- # FIXME: Replaceable apparently means that the value can be overwritten by JS and |
- # hence there is no correspondence to this in Dart. |
- return 0 if $attribute->signature->extendedAttributes->{"Replaceable"}; |
- return 1; |
-} |
- |
- |
-sub IgnoredCallback |
-{ |
- my ($interfaceName, $function) = @_; |
- |
- # FIXME: WebGLContextEvent.initEvent overloads initEvent in base interface Event and adds |
- # another argument. |
- # In the current architecture it's difficult to solve as IDL files are processed one by one. |
- # As this is the only case, I'd suggest to put Custom attribute on WebGLContextEvent.initEvent. |
- return 1 if $interfaceName eq "WebGLContextEvent" && $function->signature->name eq "initEvent"; |
- |
- # FIXME: implement callbacks with ScriptState. |
- my $callWith = $function->signature->extendedAttributes->{CallWith}; |
- return 1 if $callWith and $callWith eq "ScriptState"; |
- |
- return 0; |
-} |
- |
-# FIXME: Consider adding this to IDL as an attribute. |
-my %idlTypeToW3C = ( |
- "DOMWindow" => "Window", |
- "DOMCoreException" => "DOMException" |
-); |
- |
-sub HasW3CName |
-{ |
- my ($idlType,) = @_; |
- return 1 if exists $idlTypeToW3C{$idlType}; |
- return 0; |
-} |
- |
-sub IDLTypeToW3C |
-{ |
- my ($idlType,) = @_; |
- return $idlTypeToW3C{$idlType} if exists $idlTypeToW3C{$idlType}; |
- return $idlType; |
-} |
- |
-my %idlTypeToDart = ( |
- "any" => "Object", |
- "boolean" => "bool", |
- "custom" => "Object", |
- "object" => "Object", |
- "Array" => "List", |
- "DOMObject" => "Object", |
- "DOMString" => "String", |
- "DOMString[]" => "DOMStringList", |
- "DOMTimeStamp" => "int", |
- "ObjectArray" => "List", |
- "SerializedScriptValue" => "Object", |
- "Date" => "Date", |
- "float" => "num", |
- "short" => "int", |
- "long" => "int", |
- "long long" => "int", |
- "unsigned int" => "int", |
- "unsigned short" => "int", |
- "unsigned long" => "int", |
- "unsigned long long" => "int", |
- "string" => "String", |
- "WebKitFlags" => "num", |
-); |
- |
-my %primitiveDartTypes = ( |
- "int" => 1, |
- "String" => 1, |
- "Object" => 1, |
- "Date" => 1, |
- "SerializedScriptValue" => 1, |
-); |
- |
-sub IDLTypeToDart |
-{ |
- my ($idlType,) = @_; |
- return $idlTypeToDart{$idlType} if exists $idlTypeToDart{$idlType}; |
- return $idlType; |
-} |
- |
-# FIXME: pretty much %non_wrapper_types in CodeGeneratorV8. |
-my %nonWrapperTypes = ( |
- "CompareHow" => 1, |
- "EventListener" => 1, |
- "EventTarget" => 1, |
- "MediaQueryListListener" => 1, |
- "OptionsObject" => 1, |
- "VoidCallback" => 1, |
- "WebKitFlags" => 1, |
-); |
- |
-sub IsIDLTypeWithDartBindings |
-{ |
- my ($idlType,) = @_; |
- |
- return 0 if exists $idlTypeToDart{$idlType}; |
- return 0 if exists $primitiveDartTypes{$idlType}; |
- return 0 if !IsRefPtrType(IDLTypeToDart($idlType)); |
- return 0 if exists $nonWrapperTypes{$idlType}; |
- |
- return 1; |
-} |
- |
-sub ParameterAdapterType |
-{ |
- my ($idlType,) = @_; |
- |
- my $webkitParameterType = IDLTypeToWebkit($idlType); |
- |
- my $suffix = ""; |
- if (IsIDLTypeWithDartBindings($idlType)) { |
- my $bindingsClass = ClassName($idlType); |
- $implIncludes{"$bindingsClass.h"} = 1; |
- $suffix = ", $bindingsClass"; |
- } |
- |
- return "ParameterAdapter< $webkitParameterType$suffix >"; |
-} |
- |
-# FIXME: common with CodeGeneratorV8 |
-sub GetNativeTypeForConversions |
-{ |
- my ($type,) = @_; |
- $type = $codeGenerator->GetSVGTypeNeedingTearOff($type) if $codeGenerator->IsSVGTypeNeedingTearOff($type); |
- return $type; |
-} |
- |
- |
-sub AddHeaderForIDLType |
-{ |
- my ($idlType, $includes) = @_; |
- |
- $idlType =~ s/Abs|Rel// if $idlType =~ /SVGPathSeg/; |
- |
- return if $codeGenerator->IsPrimitiveType($idlType); |
- |
- return if exists $primitiveDartTypes{IDLTypeToDart($idlType)}; |
- |
- return if $codeGenerator->AvoidInclusionOfType($idlType); |
- |
- return if $idlType eq "CompareHow"; |
- |
- $includes->{"$idlType.h"} = 1; |
- $includes->{"SVGPropertyTearOff.h"} = 1 if $codeGenerator->IsSVGTypeNeedingTearOff($idlType); |
-} |
- |
-# FIXME: common with CodeGeneratorV8 |
-sub AddHeaderClassIncludes |
-{ |
- my ($idlType,) = @_; |
- |
- AddHeaderForIDLType($idlType, \%headerIncludes); |
- |
- $headerIncludes{"DartDOMWrapper.h"} = 1; |
-} |
- |
-sub GenerateIncludes |
-{ |
- return map { "#include " . (/wtf|dart_api\.h/ ? "<$_>" : "\"$_\"") . "\n"; } sort(@_); |
-} |
- |
-my %withCustomConverters = ( |
- "DOMWindow" => 1, |
- "Element" => 1, |
- "HTMLElement" => 1, |
- "SVGElement" => 1, |
-); |
- |
-sub RequiresCustomToDartConverter |
-{ |
- my ($dataNode,) = @_; |
- |
- return 1 if $dataNode->extendedAttributes->{CustomToJS}; |
- return 1 if $dataNode->extendedAttributes->{PureInterface}; |
- return exists $withCustomConverters{$dataNode->name}; |
-} |
- |
-sub GenerateHeader |
-{ |
- my ($object, $dataNode) = @_; |
- |
- my $interfaceName = $dataNode->name; |
- my $className = ClassName($interfaceName); |
- my $webkitClassName = GetNativeTypeForConversions($interfaceName); |
- |
- my $conditionalString = GenerateConditionalString($dataNode); |
- |
- my $toDartValue = ""; |
- if (!RequiresCustomToDartConverter($dataNode)) { |
- $toDartValue = <<END; |
-inline Dart_Handle toDartValue($webkitClassName* value) |
-{ |
- return DartDOMWrapper::toDart<$className>(value); |
-} |
-END |
- } else { |
- $toDartValue = <<END; |
-Dart_Handle toDartValue($webkitClassName*); |
-END |
- } |
- |
- $toDartValue .= <<END; |
-inline Dart_Handle toDartValue(PassRefPtr< $webkitClassName > value) |
-{ |
- return toDartValue(value.get()); |
-} |
-END |
- |
- my $customCallbackDeclarations = join("\n\n", @customCallbackDeclarations); |
- |
- push(@headerContent, $headerTemplate); |
- |
- push(@headerContent, "\n#if ${conditionalString}\n") if $conditionalString; |
- push(@headerContent, <<END); |
- |
-#ifndef ${className}_h |
-#define ${className}_h |
- |
-END |
- |
- AddHeaderClassIncludes($interfaceName); |
- |
- $headerIncludes{"dart_api.h"} = 1; |
- push(@headerContent, GenerateIncludes(keys(%headerIncludes))); |
- |
- push(@headerContent, <<END); |
- |
-namespace WebCore { |
- |
-struct $className { |
- static const char* const dartImplementationClassName; |
- typedef $webkitClassName NativeType; |
- |
- static PassRefPtr<NativeType> toNative(Dart_Handle handle, Dart_Handle& exception) |
- { |
- return DartDOMWrapper::unwrapDartWrapper<$className>(handle, exception); |
- } |
- |
- static Dart_NativeFunction resolver(Dart_Handle name, int argumentCount); |
-}; |
- |
-$toDartValue |
-namespace Dart${interfaceName}Internal { |
- |
-$customCallbackDeclarations |
- |
-} |
- |
-} |
- |
-#endif // ${className}_h |
-END |
- |
- push(@headerContent, "\n#endif // ${conditionalString}\n") if $conditionalString; |
-} |
- |
-sub HasCustomGetter |
-{ |
- my ($attribute,) = @_; |
- my $extendedAttributes = $attribute->signature->extendedAttributes; |
- return $extendedAttributes->{"CustomGetter"} || $extendedAttributes->{"Custom"}; |
-} |
- |
-sub HasCustomSetter |
-{ |
- my ($attribute,) = @_; |
- my $extendedAttributes = $attribute->signature->extendedAttributes; |
- return $extendedAttributes->{"CustomSetter"} || $extendedAttributes->{"Custom"} || $extendedAttributes->{"V8CustomSetter"}; |
-} |
- |
-sub WithTearOffNotList |
-{ |
- my ($interfaceName) = @_; |
- |
- return ($codeGenerator->IsSVGTypeNeedingTearOff($interfaceName) and (not ($interfaceName =~ /List$/))); |
-} |
- |
-sub PrepareInvocation |
-{ |
- my ($receiver, $interfaceName, $invocationPrefix, $invocationParameters) = @_; |
- |
- my $invocationPostfix; |
- $receiver .= "->"; |
- if ($interfaceName eq "SVGNumber") { |
- $receiver .= "propertyReference()"; |
- if ($invocationPrefix =~ /^setValue/) { |
- $invocationPrefix = " = "; |
- } else { |
- $invocationPrefix = ""; |
- } |
- $invocationPostfix = ""; |
- } else { |
- $receiver .= "propertyReference()." if WithTearOffNotList($interfaceName); |
- $invocationPostfix = ")"; |
- } |
- return "$receiver$invocationPrefix$invocationParameters$invocationPostfix"; |
-} |
- |
-my %svgPrimitiveTypes = ( |
- "SVGAngle" => 1, |
- "SVGLength" => 1, |
- "SVGMatrix" => 1, |
- "SVGNumber" => 1, |
- "SVGPoint" => 1, |
- "SVGRect" => 1, |
- "SVGTransform" => 1); |
- |
-sub ProcessInvocationResult |
-{ |
- my ($invocation, $interfaceName, $returnType) = @_; |
- my $svgNativeReturnType = $codeGenerator->GetSVGTypeNeedingTearOff($returnType); |
- |
- return $invocation if (not $svgNativeReturnType); |
- |
- return "static_cast<${svgNativeReturnType}*>(${invocation})" if ($interfaceName =~ /^SVGAnimated/); |
- |
- return "${svgNativeReturnType}::create(receiver, ${invocation})" if ($returnType eq "SVGStringList"); |
- |
- return "static_cast<${svgNativeReturnType}*>(${invocation}.get())" if ($interfaceName =~ /List$/); |
- |
- if (exists $svgPrimitiveTypes{$returnType}) { |
- return "${svgNativeReturnType}::create(${invocation})"; |
- } else { |
- return "static_cast<${svgNativeReturnType}*>(${invocation})"; |
- } |
-} |
- |
-sub GenerateGenericBindingsFunction |
-{ |
- my ($name, $interfaceName, $functionName, $constantParameters, $parameters, $returnType, $raisesExceptions, $attributes, $isSetter) = @_; |
- |
- my $webkitClassName = GetNativeTypeForConversions($interfaceName); |
- my $invocationPrefix = "$functionName("; |
- |
- my $exceptionManagementPrologue = ""; |
- my $exceptionManagementEpilogue = ""; |
- if (@{$parameters} || $raisesExceptions || $attributes->{CustomArgumentHandling}) { |
- $exceptionManagementPrologue = <<END; |
- Dart_Handle exception; |
-END |
- $exceptionManagementEpilogue = <<END; |
- |
-fail: |
- Dart_ThrowException(exception); |
- ASSERT_NOT_REACHED(); |
-END |
- } |
- |
- my @defineInvocationParameters = (); |
- my @invocationParameters = @{$constantParameters}; |
- |
- my $callWith = $attributes->{CallWith}; |
- if ($callWith) { |
- # Generate code for "CallWith" parameter. |
- if ($callWith eq "ScriptExecutionContext") { |
- push(@defineInvocationParameters, <<END); |
- ScriptExecutionContext* context = DartUtilities::scriptExecutionContext(); |
- if (!context) |
- return; |
-END |
- push(@invocationParameters, "context"); |
- } |
- } |
- |
- # Generate code for parameters conversion. |
- my $parameterCount = @$parameters; |
- foreach my $parameterIndex (0..$parameterCount - 1) { |
- my $parameter = @$parameters[$parameterIndex]; |
- my $parameterType = $parameter->type; |
- $parameterType = "DOMStringList" if $parameterType eq "DOMString[]"; |
- AddHeaderForIDLType($parameterType, \%implIncludes); |
- my $name = $parameter->name; |
- my $parameterAdapterType = ParameterAdapterType($parameterType); |
- my $dartArgumentIndex = $parameterIndex + 1; # 0 is for the receiver. |
- my @adapterParameters = ("Dart_GetNativeArgument(args, $dartArgumentIndex)"); |
- my $adapterParameters = join(", ", @adapterParameters); |
- push(@defineInvocationParameters, <<END); |
- const $parameterAdapterType $name($adapterParameters); |
- if (!$name.conversionSuccessful()) { |
- exception = $name.exception(); |
- goto fail; |
- } |
-END |
- } |
- @invocationParameters = (@invocationParameters, map { $_->name; } @{$parameters}); |
- |
- if ($attributes->{CustomArgumentHandling}) { |
- $implIncludes{"ScriptArguments.h"} = 1; |
- $implIncludes{"ScriptCallStack.h"} = 1; |
- $implIncludes{"V8Proxy.h"} = 1; |
- $implIncludes{"v8.h"} = 1; |
- my $customArgument = $parameterCount + 1; |
- push(@defineInvocationParameters, <<END); |
- v8::HandleScope handleScope; |
- v8::Context::Scope scope(V8Proxy::mainWorldContext(DartUtilities::domWindowForCurrentIsolate()->frame())); |
- |
- Dart_Handle customArgument = Dart_GetNativeArgument(args, $customArgument); |
- RefPtr<ScriptArguments> scriptArguments(DartUtilities::createScriptArguments(customArgument, exception)); |
- if (!scriptArguments) |
- goto fail; |
- |
- RefPtr<ScriptCallStack> scriptCallStack(DartUtilities::createScriptCallStack()); |
- if (!scriptCallStack->size()) |
- return; |
-END |
- push(@invocationParameters, "scriptArguments", "scriptCallStack"); |
- } |
- |
- if ($attributes->{NeedsUserGestureCheck}) { |
- push(@invocationParameters, "DartUtilities::processingUserGesture()"); |
- } |
- |
- if ($raisesExceptions) { |
- push(@invocationParameters, "ec"); |
- } |
- |
- my $defineInvocationParameters = join "", @defineInvocationParameters; |
- my $invocationParameters = join ", ", @invocationParameters; |
- my $invocation = PrepareInvocation("receiver", $interfaceName, $invocationPrefix, $invocationParameters); |
- # Generate code for setting return value. |
- my $invocationAndReturn = <<END; |
- $invocation; |
-END |
- if ($returnType ne "void") { |
- $invocation = ProcessInvocationResult($invocation, $interfaceName, $returnType); |
- my $dartType = IDLTypeToDart($returnType); |
- if (!$codeGenerator->IsPrimitiveType($returnType) && !exists $primitiveDartTypes{$dartType}) { |
- $implIncludes{"@{[ClassName($dartType)]}.h"} = 1; |
- } |
- $invocation = "static_pointer_cast<SVGAnimatedEnumeration>($invocation)" if $returnType eq "SVGAnimatedEnumeration"; |
- # FIXME: this is too simplistic for long return types, reconsider. |
- $invocation = "static_cast<int64_t>($invocation)" if $dartType eq "int"; |
- # There is GC3Dboolean which is not a bool, but unsigned char for OpenGL compatibility. |
- $invocation = "static_cast<bool>($invocation)" if $dartType eq "bool"; |
- $conversion = ($codeGenerator->IsStringType($returnType) and defined |
- $attributes->{ConvertNullStringTo}) ? ", ConvertDefaultToNull" : ""; |
- $invocationAndReturn = <<END; |
- Dart_Handle returnValue = toDartValue($invocation$conversion); |
- if (returnValue) |
- Dart_SetReturnValue(args, returnValue); |
-END |
- } |
- |
- my $webkitInvocation = $invocationAndReturn; |
- if ($raisesExceptions) { |
- $implIncludes{"ExceptionCode.h"} = 1; |
- $webkitInvocation = <<END; |
- ExceptionCode ec = 0; |
- $invocationAndReturn; |
- if (UNLIKELY(ec)) { |
- exception = DartDOMWrapper::exceptionCodeToDartException(ec); |
- goto fail; |
- } |
-END |
- } |
- |
- my $conditionalString = GenerateConditionalStringForAttributes($attributes); |
- if ($conditionalString) { |
- push(@implContent, <<END); |
-#if $conditionalString |
-END |
- } |
- |
- push(@implContent, <<END); |
-static void $name(Dart_NativeArguments args) |
-{ |
- DartApiScope dartApiScope; |
-$exceptionManagementPrologue { |
- $webkitClassName* receiver = DartDOMWrapper::receiver< $webkitClassName >(args); |
-$defineInvocationParameters |
-$webkitInvocation return; |
- } |
-$exceptionManagementEpilogue} |
- |
-END |
- |
- if ($conditionalString) { |
- push(@implContent, <<END); |
-#else |
-static void $name(Dart_NativeArguments args) |
-{ |
- DartApiScope dartApiScope; |
- Dart_ThrowException(DartUtilities::conditionalFunctionalityException()); |
-} |
-#endif |
- |
-END |
- } |
-} |
- |
-# FIXME: copied from CodeGeneratorV8.pm |
-sub IsRefPtrType |
-{ |
- my ($type,) = @_; |
- |
- return 0 if $type eq "boolean"; |
- return 0 if $type eq "float"; |
- return 0 if $type eq "int"; |
- return 0 if $type eq "Date"; |
- return 0 if $type eq "DOMString"; |
- return 0 if $type eq "double"; |
- return 0 if $type eq "short"; |
- return 0 if $type eq "long"; |
- return 0 if $type eq "unsigned"; |
- return 0 if $type eq "unsigned long"; |
- return 0 if $type eq "unsigned short"; |
- |
- return 1; |
-} |
- |
-# FIXME: partially copied from GetNativeType of CodeGeneratorV8.pm |
-sub IDLTypeToWebkit |
-{ |
- my ($type, $isParameter) = @_; |
- |
- my $svgNativeType = $codeGenerator->GetSVGTypeNeedingTearOff($type); |
- if ($svgNativeType) { |
- if ($svgNativeType =~ /List$/) { |
- return "${svgNativeType}*"; |
- } else { |
- return "RefPtr<${svgNativeType} >"; |
- } |
- } |
- |
- if ($type eq "float" or $type eq "double") { |
- return $type; |
- } |
- |
- return ($isParameter ? "const String&" : "String") if ($type eq "DOMString" or $type eq "DOMUserData"); |
- return "int" if $type eq "int"; |
- return "int" if $type eq "short" or $type eq "unsigned short"; |
- return "unsigned" if $type eq "unsigned long"; |
- return "int" if $type eq "long"; |
- return "long long" if $type eq "long long"; |
- return "unsigned long long" if $type eq "unsigned long long"; |
- return "bool" if $type eq "boolean"; |
- return "Range::CompareHow" if $type eq "CompareHow"; |
- return "DOMTimeStamp" if $type eq "DOMTimeStamp"; |
- return "unsigned" if $type eq "unsigned int"; |
- # FIXME: EventTarget are evils! |
- # return "Node*" if $type eq "EventTarget" and $isParameter; |
- return "double" if $type eq "Date"; |
- return "ScriptValue" if $type eq "DOMObject"; |
- return "OptionsObject" if $type eq "OptionsObject"; |
- |
- # temporary hack |
- return "RefPtr<NodeFilter>" if $type eq "NodeFilter"; |
- |
- return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue"; |
- |
- return "RefPtr<IDBKey>" if $type eq "IDBKey"; |
- |
- # necessary as resolvers could be constructed on fly. |
- return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver"; |
- |
- return ($isParameter ? "${type}*" : "RefPtr<${type}>") if IsRefPtrType($type); |
- |
- return "RefPtr<DOMStringList>" if $type eq "DOMStringList"; |
- |
- return "RefPtr<MediaQueryListListener>" if $type eq "MediaQueryListListener"; |
- |
- # Default, assume native type is a pointer with same type name as idl type |
- return "${type}*"; |
-} |
- |
-sub GenerateResolver |
-{ |
- my ($interfaceName,) = @_; |
- |
- my $className = ClassName($interfaceName); |
- |
- push(@implContent, <<END); |
- |
-Dart_NativeFunction ${className}::resolver(Dart_Handle name, int argumentCount) |
-{ |
- String str = DartUtilities::dartStringToString(name); |
- |
-END |
- |
- foreach my $nativeDescriptor (@dartNatives) { |
- my $cppCallbackName = $nativeDescriptor->cppCallbackName; |
- my $nativeId = $nativeDescriptor->nativeId; |
- my $argumentCount = $nativeDescriptor->argumentCount; |
- push(@implContent, <<END); |
- if ($argumentCount == argumentCount && str == "$nativeId") |
- return Dart${interfaceName}Internal::$cppCallbackName; |
-END |
- } |
- |
- push(@implContent, <<END); |
- return 0; |
-} |
- |
-END |
-} |
- |
-sub GenerateDartImplementationClassname |
-{ |
- my ($interfaceName,) = @_; |
- |
- my $className = ClassName($interfaceName); |
- |
- push(@implContent, <<END); |
- |
-const char* const ${className}::dartImplementationClassName = "${interfaceName}Implementation"; |
-END |
-} |
- |
-sub GenerateImplementationPrologue |
-{ |
- my ($dataNode) = @_; |
- |
- my $interfaceName = $dataNode->name; |
- my $className = ClassName($interfaceName); |
- my $internalNamespaceName = "Dart${interfaceName}Internal"; |
- |
- my $conditionalString = GenerateConditionalString($dataNode); |
- |
- push(@implContentHeader, $headerTemplate); |
- |
- push(@implContentHeader, <<END); |
- |
-#include "config.h" |
-#include "$className.h" |
- |
-END |
- |
- push(@implContentHeader, "#if $conditionalString\n\n") if $conditionalString; |
- |
- $implIncludes{"DartBindingsCommonIncludes.h"} = 1; |
- |
- push(@implContent, <<END); |
-namespace WebCore { |
- |
-namespace $internalNamespaceName { |
-END |
-} |
- |
-sub GenerateImplementationEpilogue |
-{ |
- my ($dataNode) = @_; |
- |
- my $interfaceName = $dataNode->name; |
- my $className = ClassName($interfaceName); |
- my $internalNamespaceName = "Dart${interfaceName}Internal"; |
- |
- my $conditionalString = GenerateConditionalString($dataNode); |
- |
- push(@implContent, "}\n"); |
- |
- GenerateResolver($interfaceName); |
- GenerateDartImplementationClassname($interfaceName); |
- |
- push(@implContent, <<END); |
-} |
-END |
- |
- push(@implContent, "\n#endif // $conditionalString\n") if $conditionalString; |
- |
- # We've already added the header for this file in implFixedHeader, so remove |
- # it from implIncludes to ensure we don't #include it twice. |
- delete $implIncludes{"$className.h"}; |
-} |
- |
-sub GenerateCallbackDartInterface |
-{ |
- my ($object, $dataNode) = @_; |
- my $function = $dataNode->functions->[0]; |
- my $functionDecl = DartInterfaceMethodDeclaration($interfaceName, $function, $dataNode->name); |
- push(@dartInterfaceContent, $headerTemplate); |
- push(@dartInterfaceContent, <<END); |
-typedef $functionDecl; |
-END |
-} |
- |
-sub FormatCallbackArgument |
-{ |
- my ($argument,) = @_; |
- my $webkitType = IDLTypeToWebkit($argument->type, 1); |
- my $name = $argument->name; |
- return "$webkitType $name"; |
-} |
- |
-sub GenerateCallbackHeader |
-{ |
- my ($object, $dataNode) = @_; |
- |
- my $interfaceName = $dataNode->name; |
- my $className = ClassName($interfaceName); |
- my $webkitClassName = GetNativeTypeForConversions($interfaceName); |
- |
- my $conditionalString = GenerateConditionalString($dataNode); |
- |
- push(@headerContent, $headerTemplate); |
- |
- push(@headerContent, "\n#if ${conditionalString}\n") if $conditionalString; |
- push(@headerContent, <<END); |
- |
-#ifndef ${className}_h |
-#define ${className}_h |
- |
-END |
- |
- AddHeaderClassIncludes($interfaceName); |
- |
- $headerIncludes{"ActiveDOMCallback.h"} = 1; |
- $headerIncludes{"DartCallback.h"} = 1; |
- push(@headerContent, GenerateIncludes(keys(%headerIncludes))); |
- |
- my @handleEventMethods = (); |
- foreach my $function (@{$dataNode->functions}) { |
- die "Expect only handleEvent methods" if ($function->signature->type ne "boolean") || ($function->signature->name ne "handleEvent"); |
- |
- my $arguments = join ", ", map { FormatCallbackArgument($_); } @{$function->parameters}; |
- push(@handleEventMethods, " virtual bool handleEvent($arguments);"); |
- } |
- my $methods = join "\n", @handleEventMethods; |
- |
- push(@headerContent, <<END); |
- |
-namespace WebCore { |
- |
-class ScriptExecutionContext; |
- |
-class $className : public $interfaceName, public ActiveDOMCallback { |
-public: |
- typedef $interfaceName NativeType; |
- |
- static PassRefPtr<NativeType> toNative(Dart_Handle object, Dart_Handle& exception) |
- { |
- return adoptRef(new $className(object, exception, DartUtilities::scriptExecutionContext())); |
- } |
- |
-$methods |
- |
-private: |
- $className(Dart_Handle object, Dart_Handle& exception, ScriptExecutionContext* context) |
- : ActiveDOMCallback(context) |
- , m_callback(object, exception) |
- { |
- } |
- |
- DartCallback m_callback; |
-}; |
- |
-} |
- |
-#endif // ${className}_h |
-END |
- |
- push(@headerContent, "\n#endif // ${conditionalString}\n") if $conditionalString; |
-} |
- |
-sub GenerateCallbackImplementation |
-{ |
- my ($object, $dataNode) = @_; |
- |
- my $interfaceName = $dataNode->name; |
- my $className = ClassName($interfaceName); |
- my $internalNamespaceName = "Dart${interfaceName}Internal"; |
- |
- my $conditionalString = GenerateConditionalString($dataNode); |
- |
- push(@implContentHeader, $headerTemplate); |
- |
- $implIncludes{"DartBindingsCommonIncludes.h"} = 1; |
- |
- push(@implContentHeader, <<END); |
- |
-#include "config.h" |
-#include "$className.h" |
- |
-END |
- |
- push(@implContentHeader, "#if $conditionalString\n\n") if $conditionalString; |
- |
- my @handleEventMethods = (); |
- foreach my $function (@{$dataNode->functions}) { |
- die "Expect only handleEvent methods" if ($function->signature->type ne "boolean") || ($function->signature->name ne "handleEvent"); |
- |
- my $arguments = join ", ", map { FormatCallbackArgument($_); } @{$function->parameters}; |
- my $parameters = join ", ", map { $_->name; } @{$function->parameters}; |
- push(@handleEventMethods, <<END); |
-bool ${className}::handleEvent($arguments) |
-{ |
- return m_callback.handleEvent($parameters); |
-} |
-END |
- } |
- my $methods = join "\n", @handleEventMethods; |
- |
- push(@implContent, <<END); |
-namespace WebCore { |
- |
-$methods |
- |
-} |
-END |
- |
- push(@implContent, "\n#endif // $conditionalString\n") if $conditionalString; |
- |
- # We've already added the header for this file in implFixedHeader, so remove |
- # it from implIncludes to ensure we don't #include it twice. |
- delete $implIncludes{"$className.h"}; |
-} |
- |
-sub DartMethodDeclaration |
-{ |
- my ($functionName, $parameters, $returnType) = @_; |
- |
- $returnType = IDLTypeToDart($codeGenerator->StripModule($returnType)); |
- return "$returnType $functionName($parameters)"; |
-} |
- |
-sub DartInterfaceMethodDeclaration |
-{ |
- my ($interfaceName, $function, $name) = @_; |
- |
- my $parameters; |
- if (HasOverloads($function)) { |
- my $maxParameterCount = MaxOverloadParameterCount($function); |
- $parameters = DartAnonymousNamedOptionalParameters($maxParameterCount); |
- } else { |
- $parameters = DartParameters($function, $function->parameters, 1); |
- } |
- return DartMethodDeclaration($name || DartName($interfaceName, $function->signature->name), $parameters, $function->signature->type); |
-} |
- |
-sub DartParameters |
-{ |
- my ($function, $parameters, $useDefaultValues) = @_; |
- |
- my @mandatoryParameters = (); |
- my @optionalParameters = (); |
- foreach my $parameter (@{$parameters}) { |
- # FIXME: parameter modifiers. |
- my $type = IDLTypeToDart($parameter->type); |
- my $name = $parameter->name; |
- if ($useDefaultValues && IsParameterOptionalInWebKit($parameter)) { |
- push(@optionalParameters, "$type ${name}"); |
- } else { |
- push(@mandatoryParameters, "$type ${name}"); |
- } |
- } |
- if ($function->signature->extendedAttributes->{CustomArgumentHandling}) { |
- die "Optional parameters in function with custom argument handling. " if @optionalParameters; |
- push(@mandatoryParameters, "argument"); |
- } |
- my $dartParameters = join(", ", @mandatoryParameters); |
- if (@optionalParameters) { |
- $dartParameters .= ", " if $dartParameters; |
- $dartParameters .= "[" . join(", ", @optionalParameters) . "]"; |
- } |
- return $dartParameters; |
-} |
- |
-sub DartParameterCount |
-{ |
- my ($function, $parameters) = @_; |
- |
- my $parameterCount = @{$parameters}; |
- $parameterCount += 1 if $function->signature->extendedAttributes->{CustomArgumentHandling}; |
- return $parameterCount; |
-} |
- |
-sub DartAnonymousArguments |
-{ |
- my ($parameterCount) = @_; |
- return "" unless $parameterCount; |
- return join(", ", map { "_arg$_" } (0..$parameterCount - 1)); |
-} |
- |
-sub DartAnonymousNamedOptionalParameters |
-{ |
- my ($parameterCount) = @_; |
- return "" unless $parameterCount; |
- return "[" . DartAnonymousArguments($parameterCount) . "]"; |
-} |
- |
-sub CreateFunctionNativeDescriptor |
-{ |
- my ($interfaceName, $functionName, $argumentCount) = @_; |
- my $descriptor = NativeBindingDescriptor->new( |
- cppCallbackName => "${functionName}Callback", |
- nativeId => "${interfaceName}_${functionName}_Callback", |
- argumentCount => $argumentCount); |
- push(@dartNatives, $descriptor); |
- return $descriptor; |
-} |
- |
-sub CreateGetterNativeDescriptor |
-{ |
- my ($interfaceName, $attributeName) = @_; |
- my $descriptor = NativeBindingDescriptor->new( |
- cppCallbackName => "${attributeName}Getter", |
- nativeId => "${interfaceName}_${attributeName}_Getter", |
- argumentCount => 1); |
- push(@dartNatives, $descriptor); |
- return $descriptor; |
-} |
- |
-sub CreateSetterNativeDescriptor |
-{ |
- my ($interfaceName, $attributeName) = @_; |
- my $descriptor = NativeBindingDescriptor->new( |
- cppCallbackName => "${attributeName}Setter", |
- nativeId => "${interfaceName}_${attributeName}_Setter", |
- argumentCount => 2); |
- push(@dartNatives, $descriptor); |
- return $descriptor; |
-} |
- |
-sub GenerateDartOptionalArgumentsResolver |
-{ |
- my ($interfaceName, $function) = @_; |
- |
- my $interfaceMethodDeclaration = DartInterfaceMethodDeclaration($interfaceName, $function); |
- push(@dartInterfaceContent, " $interfaceMethodDeclaration;\n"); |
- |
- my @resolver = (); |
- push(@resolver, " $interfaceMethodDeclaration {\n"); |
- my @parameters = (); |
- foreach my $parameterIndex (0..@{$function->parameters}) { |
- my $parameter = @{$function->parameters}[$parameterIndex]; |
- if (!$parameter || IsParameterOptionalInWebKit($parameter)) { |
- my $functionName = GenerateNativeBinding($interfaceName, $function, \@parameters); |
- if ($parameter) { |
- my $parameterName = $parameter->name; |
- push(@resolver, " if ($parameterName === null)\n "); |
- } |
- my $parameterNames = join(", ", map { $_->name } @parameters); |
- push(@resolver, " return $functionName($parameterNames);\n"); |
- } |
- push(@parameters, $parameter); |
- } |
- push(@resolver, " }\n"); |
- push(@dartImplContent, join("", @resolver)); |
-} |
- |
-sub GenerateDartOverloadResolver |
-{ |
- my ($interfaceName, $function) = @_; |
- |
- # Generate code for choosing the correct overload to call. Overloads are |
- # chosen based on the the type of the arguments. When more than a single |
- # overload is applicable, precedence is given according to the order of |
- # declaration in the IDL. |
- |
- my $interfaceMethodDeclaration = DartInterfaceMethodDeclaration($interfaceName, $function); |
- push(@dartInterfaceContent, " $interfaceMethodDeclaration;\n"); |
- |
- my @resolver = (); |
- push(@resolver, " $interfaceMethodDeclaration {\n"); |
- my $maxParameterCount = MaxOverloadParameterCount($function); |
- foreach my $overload (@{$function->{overloads}}) { |
- my @parameters = (); |
- my @parameterNames = (); |
- my @parameterChecks = map { "_arg$_ === null" } (0..$maxParameterCount - 1); |
- foreach my $parameterIndex (0..@{$overload->parameters}) { |
- my $parameter = @{$overload->parameters}[$parameterIndex]; |
- if (!$parameter || IsParameterOptionalInWebKit($parameter)) { |
- my $functionName = GenerateNativeBinding($interfaceName, $overload, \@parameters); |
- my $parameterNames = join(", ", @parameterNames); |
- my $parameterChecks = join(" && ", @parameterChecks); |
- push(@resolver, <<END); |
- if ($parameterChecks) |
- return $functionName($parameterNames); |
-END |
- } |
- last if !$parameter; |
- my $idlType = $codeGenerator->StripModule($parameter->type); |
- my $dartType = IDLTypeToDart($idlType); |
- push(@parameterNames, "_arg$parameterIndex"); |
- $parameterChecks[$parameterIndex] = "_arg$parameterIndex is $dartType"; |
- push(@parameters, $parameter); |
- } |
- } |
- |
- # FIXME: throw appropriate exception when overload is not found. |
- push(@resolver, <<END); |
- throw "Failed to find overload of @{[$function->signature->name]}"; |
- } |
-END |
- push(@dartImplContent, join("", @resolver)); |
-} |
- |
-sub ParentInterface |
-{ |
- my $dataNode = shift; |
- |
- foreach (@{$dataNode->parents}) { |
- my $parent = $codeGenerator->StripModule($_); |
- if ($parent eq "EventTarget") { |
- next; |
- } |
- return $parent; |
- } |
-} |
- |
-my %excludedInterfaces = ( |
- "SVGURIReference" => 1, # Is not in the list of SVG idls files (see WebCore.gypi), v8 bindings do not immediately compile |
- # Explicitly excluded in WebCore.gyp |
- "ElementTimeControl" => 1, |
- "SVGExternalResourcesRequired" => 1, |
- "SVGFilterPrimitiveStandardAttributes" => 1, |
- "SVGFitToViewBox" => 1, |
- "SVGLangSpace" => 1, |
- "SVGLocatable" => 1, |
- "SVGStylable" => 1, |
- "SVGTests" => 1, |
- "SVGTransformable" => 1, |
- "SVGViewSpec" => 1, |
- "SVGZoomAndPan" => 1, |
-); |
- |
-sub ListLike |
-{ |
- my ($elementType, $needsAuxiliaryAccessors) = @_; |
- |
- my @auxiliaryMethods = (); |
- if ($needsAuxiliaryAccessors) { |
- push(@auxiliaryMethods, ["$elementType operator [] (int index)", "numericIndexGetter", 2]); |
- push(@auxiliaryMethods, ["void operator []= (int index, $elementType value)", "numericIndexSetter", 3]); |
- } |
- |
- return IDLTypeInfoStruct->new( |
- additionalInterfaces => ["List<$elementType>"], |
- superClass => "ListBase<$elementType>", |
- auxilaryMethods => \@auxiliaryMethods |
- ); |
-} |
- |
-sub MapLike |
-{ |
- # FIXME: most probably we need to deduce more types using hints like |
- # HasNameGetter, CustomDeleteProperty, CustomGetPropertyNames, DelegatingPutFunction |
- # attributes. |
- # FIXME: technically at least DOMStringMap.setItem and DOMStringMap.item could be automatically |
- # generated and then used from [] and []=. I don't do it for now not to mess up with IDLs too |
- # much. |
- # FIXME: support removal of elements if allowed (it is at least for DOMStringMap.) |
- my ($interfaceName, $keyType, $elementType) = @_; |
- return IDLTypeInfoStruct->new( |
- additionalInterfaces => ["Map<$keyType, $elementType>"], |
- superClass => "MapBase<$keyType, $elementType>", |
- auxilaryMethods => [ |
- ["Collection<$keyType> getKeys()", "getKeys", 1], |
- ["$elementType operator [] ($keyType k)", "item", 2], |
- ["operator []= ($keyType k, $elementType v)", "setItem", 3], |
- ["$elementType remove($keyType k)", "deleteItem", 2], |
- ], |
- ); |
-} |
- |
-my %idlTypeInfoOverrides = ( |
- "CanvasPixelArray" => ListLike("int", 1), |
- "DOMStringMap" => MapLike("DOMStringMap", "String", "String"), |
- "HTMLCollection" => ListLike("Node"), |
- "NodeList" => ListLike("Node"), |
- "StyleSheetList" => ListLike("StyleSheet"), |
-); |
- |
-# FIXME: turn into the single IDL type info registry. |
-sub IDLTypeInfo |
-{ |
- my ($dataNode,) = @_; |
- my $override = $idlTypeInfoOverrides{$dataNode->name}; |
- return $override if $override; |
- |
- my $parentInterface = ParentInterface($dataNode); |
- return IDLTypeInfoStruct->new( |
- superClass => $parentInterface ? "${parentInterface}Implementation" : "DOMType", |
- ); |
-} |
- |
-sub GenerateSource |
-{ |
- my ($object, $dataNode) = @_; |
- |
- my $interfaceName = $dataNode->name; |
- my $w3cInterfaceName = IDLTypeToW3C($interfaceName); |
- |
- push(@dartInterfaceContent, $headerTemplate); |
- |
- # Build extends clause if any. |
- my $extendsClause = ""; |
- my $parentInterface = ParentInterface($dataNode); |
- my $isEventTarget = $dataNode->extendedAttributes->{EventTarget}; |
- my @implementedInterfaces = (); |
- push(@implementedInterfaces, $parentInterface) if $parentInterface; |
- push(@implementedInterfaces, "EventTarget") if $isEventTarget; |
- |
- push(@implementedInterfaces, @{IDLTypeInfo($dataNode)->additionalInterfaces}); |
- push(@implementedInterfaces, @allParents); |
- |
- if (@implementedInterfaces) { |
- $extendsClause = " extends " . join(", ", @implementedInterfaces); |
- } |
- |
- # Build default clause if any. |
- my $defaultClause = ""; |
- if (HasCustomConstructor($dataNode)) { |
- $defaultClause = " default ${w3cInterfaceName}Implementation"; |
- push(@customCallbackDeclarations, GenerateCustomCallbackDeclaration("constructorCallback")); |
- } |
- |
- push(@dartInterfaceContent, "\ninterface ${w3cInterfaceName}${extendsClause}${defaultClause} {\n"); |
- push(@dartInterfaceContent, "\n // Constants.\n"); |
- foreach my $constant (@{$dataNode->constants}) { |
- my $name = $constant->name; |
- my $value = $constant->value; |
- |
- push(@dartInterfaceContent, " static final int $name = $value;\n"); |
- } |
- |
- # Generate Dart implementation prologue. |
- my $implementationClassName = "${interfaceName}Implementation"; |
- my $superClass = IDLTypeInfo($dataNode)->superClass; |
- push(@dartImplContent, $headerTemplate); |
- push(@dartImplContent, "\nclass $implementationClassName extends $superClass implements $interfaceName {\n"); |
- |
- GenerateImplementationPrologue($dataNode); |
- |
- # Generate fields. |
- # FIXME: special treatment of constructors attributes (see V8 code generator). |
- push(@dartInterfaceContent, "\n // Fields.\n"); |
- push(@dartImplContent, "\n // Fields.\n"); |
- push(@implContent, "\n// Getters & setters.\n"); |
- foreach my $attribute (@{$dataNode->attributes}) { |
- next if IgnoredAttribute($interfaceName, $attribute); |
- GenerateField($interfaceName, $attribute); |
- } |
- |
- # Generate methods. |
- push(@dartInterfaceContent, "\n // Methods.\n"); |
- push(@dartImplContent, "\n // Methods.\n"); |
- push(@implContent, "\n// Callbacks.\n"); |
- foreach my $function (@{$dataNode->functions}) { |
- next if IgnoredCallback($interfaceName, $function); |
- next if HasOverloads($function) && $function->{overloadIndex} != 1; |
- GenerateMethod($interfaceName, $function); |
- } |
- |
- foreach my $auxilaryMethod (@{IDLTypeInfo($dataNode)->auxilaryMethods}) { |
- my $dartDeclaration = $auxilaryMethod->[0]; |
- my $descriptor = CreateFunctionNativeDescriptor($interfaceName, $auxilaryMethod->[1], $auxilaryMethod->[2]); |
- my $nativeId = $descriptor->nativeId; |
- push(@dartImplContent, " $dartDeclaration native \"$nativeId\";\n"); |
- push(@customCallbackDeclarations, GenerateCustomCallbackDeclaration($descriptor->cppCallbackName)); |
- } |
- |
- if (HasCustomConstructor($dataNode)) { |
- my $parameterCount = $dataNode->extendedAttributes->{"ConstructorParameters"} || 0; |
- my $descriptor = CreateFunctionNativeDescriptor($interfaceName, "constructor", 1 + $parameterCount); |
- my $nativeId = $descriptor->nativeId; |
- my $parameters = DartAnonymousNamedOptionalParameters($parameterCount); |
- my $arguments = DartAnonymousArguments($parameterCount); |
- push(@dartInterfaceContent, " $w3cInterfaceName($parameters);\n"); |
- push(@dartImplContent, <<END); |
- $implementationClassName($parameters) { |
- this._bind($arguments); |
- } |
-END |
- push(@dartImplContent, " void _bind($arguments) native \"$nativeId\";\n"); |
- } |
- |
- # Generate implementation support. |
- # FIXME: get rid of implementation support completely. |
- push(@dartImplContent, <<END); |
- // Implementation support. |
- static $implementationClassName _create$implementationClassName() => new $implementationClassName._create$implementationClassName(); |
- $implementationClassName._create$implementationClassName(); |
- |
- String get typeName() => \"$interfaceName\"; |
-END |
- |
- push(@dartInterfaceContent, "}\n"); |
- push(@dartImplContent, "}\n"); |
- |
- if (HasW3CName($interfaceName)) { |
- push(@dartInterfaceContent, "\ninterface ${interfaceName} extends ${w3cInterfaceName} {}\n"); |
- } |
- |
- GenerateImplementationEpilogue($dataNode); |
-} |
- |
-sub GenerateField |
-{ |
- my ($interfaceName, $attribute) = @_; |
- |
- my $attributeName = DartName($interfaceName, $attribute->signature->name); |
- my $attributeType = $attribute->signature->type; |
- my $dartAttributeType = IDLTypeToDart($attributeType); |
- |
- # Generate field declaration. |
- my $final = HasSetter($attribute) ? "" : "final "; |
- push(@dartInterfaceContent, " $final$dartAttributeType $attributeName;\n"); |
- |
- # Generate getter implementation. |
- my $getterDescriptor = CreateGetterNativeDescriptor($interfaceName, $attributeName); |
- my $getterNativeId = $getterDescriptor->nativeId; |
- push(@dartImplContent, " $dartAttributeType get $attributeName() native \"$getterNativeId\";\n"); |
- if (HasCustomGetter($attribute)) { |
- push(@customCallbackDeclarations, GenerateCustomCallbackDeclaration($getterDescriptor->cppCallbackName)); |
- } else { |
- my ($functionName, @arguments) = $codeGenerator->GetterExpression(\%implIncludes, $interfaceName, $attribute); |
- my $raisesExceptions = scalar(@{$attribute->getterExceptions}); |
- GenerateGenericBindingsFunction($getterDescriptor->cppCallbackName, $interfaceName, $functionName, \@arguments, [], $attributeType, $raisesExceptions, $attribute->signature->extendedAttributes); |
- } |
- |
- return unless HasSetter($attribute); |
- |
- # Generate setter implementation. |
- my $setterDescriptor = CreateSetterNativeDescriptor($interfaceName, $attributeName); |
- my $setterNativeId = $setterDescriptor->nativeId; |
- push(@dartImplContent, " void set $attributeName($dartAttributeType) native \"$setterNativeId\";\n"); |
- if (HasCustomSetter($attribute)) { |
- push(@customCallbackDeclarations, GenerateCustomCallbackDeclaration($setterDescriptor->cppCallbackName)); |
- } else { |
- my ($functionName, @arguments) = $codeGenerator->SetterExpression(\%implIncludes, $interfaceName, $attribute); |
- my $raisesExceptions = scalar(@{$attribute->setterExceptions}); |
- GenerateGenericBindingsFunction($setterDescriptor->cppCallbackName, $interfaceName, $functionName, \@arguments, [$attribute->signature], "void", $raisesExceptions, $attribute->signature->extendedAttributes, 1); |
- } |
-} |
- |
-sub GenerateMethod |
-{ |
- my ($interfaceName, $function) = @_; |
- |
- my $functionName = DartName($interfaceName, $function->signature->name); |
- |
- if (!$function->signature->extendedAttributes->{"Custom"}) { |
- if (HasOverloads($function)) { |
- GenerateDartOverloadResolver($interfaceName, $function); |
- } elsif (HasOptionalParameters($function)) { |
- GenerateDartOptionalArgumentsResolver($interfaceName, $function); |
- } else { |
- my $interfaceMethodDeclaration = DartInterfaceMethodDeclaration($interfaceName, $function); |
- push(@dartInterfaceContent, " $interfaceMethodDeclaration;\n"); |
- my $bindingFunctionName = GenerateNativeBinding($interfaceName, $function, $function->parameters); |
- die if $bindingFunctionName ne $functionName; |
- } |
- } else { |
- my $parameters; |
- my $parameterCount; |
- if (HasOverloads($function)) { |
- $parameterCount = MaxOverloadParameterCount($function); |
- $parameters = DartAnonymousNamedOptionalParameters($parameterCount); |
- } else { |
- $parameters = DartParameters($function, $function->parameters, 1); |
- $parameterCount = DartParameterCount($function, $function->parameters); |
- } |
- my $methodDeclaration = DartMethodDeclaration($functionName, $parameters, $function->signature->type); |
- my $descriptor = CreateFunctionNativeDescriptor($interfaceName, $functionName, 1 + $parameterCount); |
- my $nativeId = $descriptor->nativeId; |
- push(@dartInterfaceContent, " $methodDeclaration;\n"); |
- push(@dartImplContent, " $methodDeclaration native \"$nativeId\";\n"); |
- push(@customCallbackDeclarations, GenerateCustomCallbackDeclaration($descriptor->cppCallbackName)); |
- } |
- |
- # If there is a method named "item", duplicate it as operator []. |
- if ($functionName eq "item") { |
- # Consider operator [] should support overloads and optional arguments. |
- die "$interfaceName.item has overloads" if HasOverloads($function); |
- die "$interfaceName.item has optional arguments" if HasOptionalParameters($function); |
- |
- my $subscriptOperatorDeclaration = DartInterfaceMethodDeclaration($interfaceName, $function, "operator []"); |
- my $parameters = join ", ", (map { $_->name } @{$function->parameters}); |
- push(@dartInterfaceContent, " $subscriptOperatorDeclaration;\n"); |
- push(@dartImplContent, " $subscriptOperatorDeclaration { return item($parameters); }\n"); |
- } |
-} |
- |
-sub GenerateNativeBinding |
-{ |
- my ($interfaceName, $function, $parameters) = @_; |
- |
- my $functionName = DartName($interfaceName, $function->signature->name); |
- if (HasOverloads($function)) { |
- $functionName .= $function->{overloadIndex}; |
- } |
- if (HasOptionalParameters($function)) { |
- $functionName .= "_" . @$parameters; |
- } |
- |
- my $extendedAttributes = $function->signature->extendedAttributes; |
- my $returnType = $function->signature->type; |
- |
- my $dartParameters = DartParameters($function, $parameters, 0); |
- my $dartParameterCount = DartParameterCount($function, $parameters); |
- my $methodDeclaration = DartMethodDeclaration($functionName, $dartParameters, $returnType); |
- my $descriptor = CreateFunctionNativeDescriptor($interfaceName, $functionName, 1 + $dartParameterCount); |
- my $nativeId = $descriptor->nativeId; |
- push(@dartImplContent, <<END); |
- $methodDeclaration native "$nativeId"; |
-END |
- |
- my $nativeFunctionName; |
- if ($extendedAttributes->{ImplementationFunction}) { |
- $nativeFunctionName = $extendedAttributes->{ImplementationFunction}; |
- } else { |
- $nativeFunctionName = $function->signature->name; |
- } |
- my $raisesExceptions = scalar(@{$function->raisesExceptions}); |
- GenerateGenericBindingsFunction($descriptor->cppCallbackName, $interfaceName, $nativeFunctionName, [], $parameters, $returnType, $raisesExceptions, $extendedAttributes); |
- |
- return $functionName; |
-} |
- |
-# Internal helper |
-sub WriteData |
-{ |
- if (defined($IMPL)) { |
- # Write content to file. |
- print $IMPL @implContentHeader; |
- |
- print $IMPL @implFixedHeader; |
- |
- print $IMPL GenerateIncludes(keys(%implIncludes)); |
- |
- print $IMPL "\n"; |
- print $IMPL @implContent; |
- close($IMPL); |
- undef($IMPL); |
- |
- %implIncludes = (); |
- @implFixedHeader = (); |
- @implHeaderContent = (); |
- @implContent = (); |
- @dartNatives = (); |
- } |
- |
- if (defined($HEADER)) { |
- # Write content to file. |
- print $HEADER @headerContent; |
- close($HEADER); |
- undef($HEADER); |
- |
- @headerContent = (); |
- } |
- |
- if (defined($DART_INTERFACE)) { |
- # Write content of Dart file. |
- print $DART_INTERFACE @dartInterfaceContent; |
- close($DART_INTERFACE); |
- undef($DART_INTERFACE); |
- |
- @dartInterfaceContent = (); |
- } |
- |
- if (defined($DART_IMPL)) { |
- # Write content of Dart file. |
- print $DART_IMPL @dartImplContent; |
- close($DART_IMPL); |
- undef($DART_IMPL); |
- |
- @dartImplContent = (); |
- } |
-} |