diff options
author | Teng-Hui Zhu <ztenghui@google.com> | 2010-11-10 15:31:59 -0800 |
---|---|---|
committer | Teng-Hui Zhu <ztenghui@google.com> | 2010-11-17 13:35:59 -0800 |
commit | 28040489d744e0c5d475a88663056c9040ed5320 (patch) | |
tree | c463676791e4a63e452a95f0a12b2a8519730693 /WebCore/bindings/scripts/CodeGeneratorObjC.pm | |
parent | eff9be92c41913c92fb1d3b7983c071f3e718678 (diff) | |
download | external_webkit-28040489d744e0c5d475a88663056c9040ed5320.zip external_webkit-28040489d744e0c5d475a88663056c9040ed5320.tar.gz external_webkit-28040489d744e0c5d475a88663056c9040ed5320.tar.bz2 |
Merge WebKit at r71558: Initial merge by git.
Change-Id: Ib345578fa29df7e4bc72b4f00e4a6fddcb754c4c
Diffstat (limited to 'WebCore/bindings/scripts/CodeGeneratorObjC.pm')
-rw-r--r-- | WebCore/bindings/scripts/CodeGeneratorObjC.pm | 136 |
1 files changed, 85 insertions, 51 deletions
diff --git a/WebCore/bindings/scripts/CodeGeneratorObjC.pm b/WebCore/bindings/scripts/CodeGeneratorObjC.pm index 8351c87..69e24a9 100644 --- a/WebCore/bindings/scripts/CodeGeneratorObjC.pm +++ b/WebCore/bindings/scripts/CodeGeneratorObjC.pm @@ -1,4 +1,4 @@ -# +# # Copyright (C) 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org> # Copyright (C) 2006 Anders Carlsson <andersca@mac.com> # Copyright (C) 2006, 2007 Samuel Weinig <sam@webkit.org> @@ -59,8 +59,7 @@ my @depsContent = (); my %protocolTypeHash = ("XPathNSResolver" => 1, "EventListener" => 1, "EventTarget" => 1, "NodeFilter" => 1, "SVGLocatable" => 1, "SVGTransformable" => 1, "SVGStylable" => 1, "SVGFilterPrimitiveStandardAttributes" => 1, "SVGTests" => 1, "SVGLangSpace" => 1, "SVGExternalResourcesRequired" => 1, "SVGURIReference" => 1, - "SVGZoomAndPan" => 1, "SVGFitToViewBox" => 1, "SVGAnimatedPathData" => 1, "SVGAnimatedPoints" => 1, - "ElementTimeControl" => 1); + "SVGZoomAndPan" => 1, "SVGFitToViewBox" => 1, "SVGAnimatedPathData" => 1, "ElementTimeControl" => 1); my %nativeObjCTypeHash = ("URL" => 1, "Color" => 1); # FIXME: this should be replaced with a function that recurses up the tree @@ -71,7 +70,7 @@ my %baseTypeHash = ("Object" => 1, "Node" => 1, "NodeList" => 1, "NamedNodeMap" "NodeIterator" => 1, "TreeWalker" => 1, "AbstractView" => 1, "Blob" => 1, "SVGAngle" => 1, "SVGAnimatedAngle" => 1, "SVGAnimatedBoolean" => 1, "SVGAnimatedEnumeration" => 1, "SVGAnimatedInteger" => 1, "SVGAnimatedLength" => 1, "SVGAnimatedLengthList" => 1, - "SVGAnimatedNumber" => 1, "SVGAnimatedNumberList" => 1, "SVGAnimatedPoints" => 1, + "SVGAnimatedNumber" => 1, "SVGAnimatedNumberList" => 1, "SVGAnimatedPreserveAspectRatio" => 1, "SVGAnimatedRect" => 1, "SVGAnimatedString" => 1, "SVGAnimatedTransformList" => 1, "SVGLength" => 1, "SVGLengthList" => 1, "SVGMatrix" => 1, "SVGNumber" => 1, "SVGNumberList" => 1, "SVGPathSeg" => 1, "SVGPathSegList" => 1, "SVGPoint" => 1, @@ -600,12 +599,6 @@ sub AddIncludesForType return; } - if ($type eq "SVGPoint") { - $implIncludes{"FloatPoint.h"} = 1; - $implIncludes{"DOMSVGPointInternal.h"} = 1; - return; - } - if ($type eq "SVGMatrix") { $implIncludes{"AffineTransform.h"} = 1; $implIncludes{"DOMSVGMatrixInternal.h"} = 1; @@ -613,11 +606,6 @@ sub AddIncludesForType return; } - if ($type eq "SVGNumber") { - $implIncludes{"DOMSVGNumberInternal.h"} = 1; - return; - } - if ($type =~ /(\w+)(Abs|Rel)$/) { $implIncludes{"$1.h"} = 1; $implIncludes{"DOM${type}Internal.h"} = 1; @@ -656,6 +644,16 @@ sub AddIncludesForType $implIncludes{"DOM${type}Internal.h"} = 1; } +sub GetSVGTypeWithNamespace +{ + my $type = shift; + my $typeWithNamespace = "WebCore::" . $codeGenerator->GetSVGTypeNeedingTearOff($type); + + # Special case for DOMSVGNumber + $typeWithNamespace =~ s/</\<WebCore::/ unless $type eq "SVGNumber"; + return $typeWithNamespace; +} + sub GetSVGPropertyTypes { my $implType = shift; @@ -671,13 +669,18 @@ sub GetSVGPropertyTypes # Append space to avoid compilation errors when using PassRefPtr<$svgNativeType> $svgNativeType = "WebCore::$svgNativeType "; - $svgNativeType =~ s/</\<WebCore::/; + $svgNativeType =~ s/</\<WebCore::/ if not $svgNativeType =~ /float/; my $svgWrappedNativeType = $codeGenerator->GetSVGWrappedTypeNeedingTearOff($implType); if ($svgNativeType =~ /SVGPropertyTearOff/) { - $svgPropertyType = "WebCore::$svgWrappedNativeType"; - $svgPropertyType =~ s/</\<WebCore::/; - } elsif ($svgNativeType =~ /SVGListPropertyTearOff/) { + if ($svgWrappedNativeType eq "float") { + # Special case for DOMSVGNumber + $svgPropertyType = $svgWrappedNativeType; + } else { + $svgPropertyType = "WebCore::$svgWrappedNativeType"; + $svgPropertyType =~ s/</\<WebCore::/; + } + } elsif ($svgNativeType =~ /SVGListPropertyTearOff/ or $svgNativeType =~ /SVGStaticListPropertyTearOff/) { $svgListPropertyType = "WebCore::$svgWrappedNativeType"; $svgListPropertyType =~ s/</\<WebCore::/; } @@ -1127,7 +1130,12 @@ sub GenerateImplementation $implIncludes{"$1.h"} = 1; } else { if (!$podType) { - $implIncludes{"$implClassName.h"} = 1 if not $codeGenerator->AvoidInclusionOfType($implClassName); + if (!$codeGenerator->AvoidInclusionOfType($implClassName)) { + $implIncludes{"$implClassName.h"} = 1 ; + } elsif ($codeGenerator->IsSVGTypeNeedingTearOff($implClassName)) { + my $includeType = $codeGenerator->GetSVGWrappedTypeNeedingTearOff($implClassName); + $implIncludes{"${includeType}.h"} = 1; + } } else { $implIncludes{"$podType.h"} = 1 unless $podType eq "float"; } @@ -1236,13 +1244,7 @@ sub GenerateImplementation # TODO: Handle special case for DOMSVGLength. We do need Custom code support for this. if ($svgPropertyType eq "WebCore::SVGLength" and $attributeName eq "value") { - $getterContentHead = "value(0 /* FIXME */"; - } - } else { - # Special case for DOMSVGNumber - if ($podType and $podType eq "float") { - $getterContentHead = "*IMPL"; - $getterContentTail = ""; + $getterContentHead = "value(IMPL->contextElement(), "; } } @@ -1287,10 +1289,15 @@ sub GenerateImplementation $getterContentHead = "kit($getterContentHead"; $getterContentTail .= ")"; } elsif ($svgPropertyType) { - $getterContentHead = "IMPL->propertyReference().$getterContentHead"; + # Special case for DOMSVGNumber + if ($svgPropertyType eq "float") { + # Intentional leave out closing brace, it's already contained in getterContentTail + $getterContentHead = "IMPL->propertyReference("; + } else { + $getterContentHead = "IMPL->propertyReference().$getterContentHead"; + } } elsif ($codeGenerator->IsSVGNewStyleAnimatedType($implClassName) and $codeGenerator->IsSVGTypeNeedingTearOff($idlType)) { - my $idlTypeWithNamespace = "WebCore::" . $codeGenerator->GetSVGTypeNeedingTearOff($idlType); - $idlTypeWithNamespace =~ s/</\<WebCore::/; + my $idlTypeWithNamespace = GetSVGTypeWithNamespace($idlType); $getterContentHead = "kit(static_cast<$idlTypeWithNamespace*>($getterContentHead)"; $getterContentTail .= ")"; } elsif (IsProtocolType($idlType) and $idlType ne "EventTarget") { @@ -1303,12 +1310,30 @@ sub GenerateImplementation $getterContentHead = "$getterContentHead"; $getterContentTail .= "->toString()"; } elsif (ConversionNeeded($attribute->signature->type)) { - if ($codeGenerator->IsSVGTypeNeedingTearOff($attribute->signature->type) and not $implClassName =~ /List$/) { - my $idlType = $attribute->signature->type; - my $idlTypeWithNamespace = "WebCore::" . $codeGenerator->GetSVGTypeNeedingTearOff($idlType); - $idlTypeWithNamespace =~ s/</\<WebCore::/; - $getterContentHead = "kit(WTF::getPtr(${idlTypeWithNamespace}::create($getterContentHead"; - $getterContentTail .= ")))"; + my $type = $attribute->signature->type; + if ($codeGenerator->IsSVGTypeNeedingTearOff($type) and not $implClassName =~ /List$/) { + my $idlTypeWithNamespace = GetSVGTypeWithNamespace($type); + if ($codeGenerator->IsSVGTypeWithWritablePropertiesNeedingTearOff($type) and not defined $attribute->signature->extendedAttributes->{"Immutable"}) { + $idlTypeWithNamespace =~ s/SVGPropertyTearOff</SVGStaticPropertyTearOff<$implClassNameWithNamespace, /; + $implIncludes{"SVGStaticPropertyTearOff.h"} = 1; + + my $getter = $getterContentHead; + $getter =~ s/IMPL->//; + $getter =~ s/\(//; + my $updater = "update" . $codeGenerator->WK_ucfirst($getter); + $getterContentHead = "kit(WTF::getPtr(${idlTypeWithNamespace}::create(IMPL, $getterContentHead$getterContentTail, &${implClassNameWithNamespace}::$updater"; + $getterContentTail .= "))"; + } elsif ($idlTypeWithNamespace =~ /SVGStaticListPropertyTearOff/) { + my $extraImp = "WebCore::GetOwnerElementForType<$implClassNameWithNamespace, WebCore::IsDerivedFromSVGElement<$implClassNameWithNamespace>::value>::ownerElement(IMPL), "; + $getterContentHead = "kit(WTF::getPtr(${idlTypeWithNamespace}::create($extraImp$getterContentHead"; + $getterContentTail .= ")))"; + } elsif ($idlTypeWithNamespace =~ /SVGPointList/) { + $getterContentHead = "kit(WTF::getPtr($getterContentHead"; + $getterContentTail .= "))"; + } else { + $getterContentHead = "kit(WTF::getPtr(${idlTypeWithNamespace}::create($getterContentHead"; + $getterContentTail .= ")))"; + } } else { $getterContentHead = "kit(WTF::getPtr($getterContentHead"; $getterContentTail .= "))"; @@ -1381,24 +1406,31 @@ sub GenerateImplementation push(@implContent, " $svgPropertyType& podImpl = IMPL->propertyReference();\n"); my $ec = $hasSetterException ? ", ec" : ""; push(@implContent, " $exceptionInit\n") if $hasSetterException; - push(@implContent, " podImpl.$coreSetterName($arg$ec);\n"); + + # Special case for DOMSVGNumber + if ($svgPropertyType eq "float") { + push(@implContent, " podImpl = $arg;\n"); + } else { + # FIXME: Special case for DOMSVGLength. We do need Custom code support for this. + if ($svgPropertyType eq "WebCore::SVGLength" and $attributeName eq "value") { + push(@implContent, " podImpl.$coreSetterName($arg, IMPL->contextElement()$ec);\n"); + } else { + push(@implContent, " podImpl.$coreSetterName($arg$ec);\n"); + } + } + if ($hasSetterException) { push(@implContent, " if (!ec)\n"); push(@implContent, " IMPL->commitChange();\n"); push(@implContent, " $exceptionRaiseOnError\n"); } else { - push(@implContent, " IMPL->commitChange();\n"); + push(@implContent, " IMPL->commitChange();\n"); } } elsif ($svgListPropertyType) { $getterContentHead = "$getterExpressionPrefix"; push(@implContent, " IMPL->$coreSetterName($arg);\n"); } elsif ($podType) { - # Special case for DOMSVGNumber - if ($podType eq "float") { - push(@implContent, " *IMPL = $arg;\n"); - } else { - push(@implContent, " IMPL->$coreSetterName($arg);\n"); - } + push(@implContent, " IMPL->$coreSetterName($arg);\n"); } else { my $setterExpressionPrefix = $codeGenerator->SetterExpressionPrefix(\%implIncludes, $interfaceName, $attribute); my $ec = $hasSetterException ? ", ec" : ""; @@ -1519,8 +1551,8 @@ sub GenerateImplementation my $svgMatrixInverse = ($podType and $podType eq "AffineTransform" and $functionName eq "inverse"); my $svgLengthConvertToSpecifiedUnits = ($svgPropertyType and $svgPropertyType eq "WebCore::SVGLength" and $functionName eq "convertToSpecifiedUnits"); + push(@parameterNames, "IMPL->contextElement()") if $svgLengthConvertToSpecifiedUnits; push(@parameterNames, "ec") if $raisesExceptions and !($svgMatrixRotateFromVector || $svgMatrixInverse); - push(@parameterNames, "0 /* FIXME */") if $svgLengthConvertToSpecifiedUnits; # Handle arguments that are 'SVGProperty' based (SVGAngle/SVGLength). We need to convert from SVGPropertyTearOff<Type>* to Type, # to be able to call the desired WebCore function. If the conversion fails, we can't extract Type and need to raise an exception. @@ -1533,8 +1565,7 @@ sub GenerateImplementation next if not $codeGenerator->IsSVGTypeNeedingTearOff($idlType) or $implClassName =~ /List$/; my $implGetter = GetObjCTypeGetter($paramName, $idlType); - my $idlTypeWithNamespace = "WebCore::" . $codeGenerator->GetSVGTypeNeedingTearOff($idlType); - $idlTypeWithNamespace =~ s/</\<WebCore::/; + my $idlTypeWithNamespace = GetSVGTypeWithNamespace($idlType); push(@functionContent, " $idlTypeWithNamespace* ${paramName}Core = $implGetter;\n"); push(@functionContent, " if (!${paramName}Core) {\n"); @@ -1555,7 +1586,7 @@ sub GenerateImplementation if ($svgPropertyType) { push(@functionContent, " $svgPropertyType& podImpl = IMPL->propertyReference();\n"); - $content = "podImpl.$content;\n IMPL->commitChange()"; + $content = "podImpl.$content"; } else { $content = $caller . "->$content"; } @@ -1579,9 +1610,14 @@ sub GenerateImplementation if ($raisesExceptions) { push(@functionContent, " $exceptionInit\n"); push(@functionContent, " $content;\n"); + if ($svgPropertyType) { + push(@functionContent, " if (!ec)\n"); + push(@functionContent, " IMPL->commitChange();\n"); + } push(@functionContent, " $exceptionRaiseOnError\n"); } else { push(@functionContent, " $content;\n"); + push(@functionContent, " IMPL->commitChange()\n") if $svgPropertyType; } } elsif (defined $needsCustom{"NodeToReturn"}) { # Special case the insertBefore, replaceChild, removeChild @@ -1603,9 +1639,7 @@ sub GenerateImplementation } else { if (ConversionNeeded($function->signature->type)) { if ($codeGenerator->IsSVGTypeNeedingTearOff($function->signature->type) and not $implClassName =~ /List$/) { - my $idlType = $function->signature->type; - my $idlTypeWithNamespace = "WebCore::" . $codeGenerator->GetSVGTypeNeedingTearOff($idlType); - $idlTypeWithNamespace =~ s/</\<WebCore::/; + my $idlTypeWithNamespace = GetSVGTypeWithNamespace($function->signature->type); $content = "kit(WTF::getPtr(${idlTypeWithNamespace}::create($content)))"; } elsif ($codeGenerator->IsPodType($function->signature->type)) { $content = "kit($content)"; |