summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/scripts/CodeGeneratorObjC.pm
diff options
context:
space:
mode:
authorTeng-Hui Zhu <ztenghui@google.com>2010-11-10 15:31:59 -0800
committerTeng-Hui Zhu <ztenghui@google.com>2010-11-17 13:35:59 -0800
commit28040489d744e0c5d475a88663056c9040ed5320 (patch)
treec463676791e4a63e452a95f0a12b2a8519730693 /WebCore/bindings/scripts/CodeGeneratorObjC.pm
parenteff9be92c41913c92fb1d3b7983c071f3e718678 (diff)
downloadexternal_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.pm136
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)";