Index: Source/bindings/scripts/CodeGeneratorV8.pm |
diff --git a/Source/bindings/scripts/CodeGeneratorV8.pm b/Source/bindings/scripts/CodeGeneratorV8.pm |
index 39924de35f13b9c1a2fb606a286d1c822d392371..d2ce39aff5cd7d8a6806a55d3de22e1e134ed5a7 100644 |
--- a/Source/bindings/scripts/CodeGeneratorV8.pm |
+++ b/Source/bindings/scripts/CodeGeneratorV8.pm |
@@ -275,6 +275,21 @@ sub GetSVGPropertyTypes |
return ($svgPropertyType, $svgListPropertyType, $svgNativeType); |
} |
+sub GetNamedGetterFunction |
+{ |
+ my $interface = shift; |
+ |
+ foreach my $function (@{$interface->functions}) { |
+ my $specials = $function->signature->specials; |
+ my $getterExists = grep { $_ eq "getter" } @$specials; |
+ my $parameters = $function->parameters; |
+ if ($getterExists and scalar(@$parameters) == 1 and $parameters->[0]->type eq "DOMString" ) { |
+ return $function; |
+ } |
+ } |
+ return 0; |
+} |
+ |
sub GenerateHeader |
{ |
my $object = shift; |
@@ -719,7 +734,7 @@ sub GenerateHeaderNamedAndIndexedPropertyAccessors |
my $interfaceName = $interface->name; |
my $hasIndexedGetter = $interface->extendedAttributes->{"IndexedGetter"} || $interface->extendedAttributes->{"CustomIndexedGetter"}; |
my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexedSetter"}; |
- my $hasCustomNamedGetter = $interface->extendedAttributes->{"NamedGetter"} || $interface->extendedAttributes->{"CustomNamedGetter"} || $interface->extendedAttributes->{"CustomGetOwnPropertySlot"}; |
+ my $hasCustomNamedGetter = GetNamedGetterFunction($interface) || $interface->extendedAttributes->{"CustomNamedGetter"} || $interface->extendedAttributes->{"CustomGetOwnPropertySlot"}; |
my $hasCustomNamedSetter = $interface->extendedAttributes->{"CustomNamedSetter"}; |
my $hasCustomDeleters = $interface->extendedAttributes->{"CustomDeleteProperty"}; |
my $hasCustomEnumerator = $interface->extendedAttributes->{"CustomEnumerateProperty"}; |
@@ -2916,20 +2931,17 @@ END |
sub GenerateImplementationNamedPropertyGetter |
{ |
my $interface = shift; |
- my $namedPropertyGetter = shift; |
- my $subCode = ""; |
+ my $subCode = ""; |
my $interfaceName = $interface->name; |
my $v8InterfaceName = "V8$interfaceName"; |
- if (!$namedPropertyGetter) { |
- $namedPropertyGetter = $codeGenerator->FindSuperMethod($interface, "namedItem"); |
- } |
- |
- if ($interface->extendedAttributes->{"NamedGetter"}) { |
- die "$interfaceName: [NamedGetter] but no namedItem() method." if (!$namedPropertyGetter); |
+ my $function = GetNamedGetterFunction($interface); |
+ if ($function) { |
+ my $returnType = $function->signature->type; |
+ my $methodName = $function->signature->name; |
AddToImplIncludes("V8Collection.h"); |
- my $type = $namedPropertyGetter->type; |
+ AddToImplIncludes("V8$returnType.h"); |
$subCode .= <<END; |
desc->InstanceTemplate()->SetNamedPropertyHandler(${v8InterfaceName}::namedPropertyGetter, 0, 0, 0, 0); |
END |
@@ -2943,20 +2955,17 @@ v8::Handle<v8::Value> ${v8InterfaceName}::namedPropertyGetter(v8::Local<v8::Stri |
return v8Undefined(); |
v8::Local<v8::Object> object = info.Holder(); |
- v8::Handle<v8::Object> creationContext = info.Holder(); |
- v8::Isolate* isolate = info.GetIsolate(); |
- |
ASSERT(V8DOMWrapper::maybeDOMWrapper(object)); |
ASSERT(toWrapperTypeInfo(object) != &V8Node::info); |
$interfaceName* collection = toNative(object); |
AtomicString propertyName = toWebCoreAtomicStringWithNullCheck(name); |
- RefPtr<$type> element = collection->namedItem(propertyName); |
+ RefPtr<$returnType> element = collection->$methodName(propertyName); |
if (!element) |
return v8Undefined(); |
- return toV8(element.release(), creationContext, isolate); |
+ return toV8Fast(element.release(), info, collection); |
} |
END |
@@ -3213,7 +3222,6 @@ END |
} |
my $indexer; |
- my $namedPropertyGetter; |
my @enabledPerContextFunctions; |
my @normalFunctions; |
my $needsDomainSafeFunctionSetter = 0; |
@@ -3238,8 +3246,6 @@ END |
if ($function->signature->name eq "item") { |
$indexer = $function->signature; |
- } elsif ($function->signature->name eq "namedItem") { |
- $namedPropertyGetter = $function->signature; |
} |
# If the function does not need domain security check, we need to |
@@ -3516,7 +3522,7 @@ END |
} |
$code .= GenerateImplementationIndexedProperty($interface, $indexer); |
- $code .= GenerateImplementationNamedPropertyGetter($interface, $namedPropertyGetter); |
+ $code .= GenerateImplementationNamedPropertyGetter($interface); |
$code .= GenerateImplementationCustomCall($interface); |
$code .= GenerateImplementationMasqueradesAsUndefined($interface); |