Chromium Code Reviews| Index: Source/bindings/scripts/CodeGeneratorV8.pm |
| diff --git a/Source/bindings/scripts/CodeGeneratorV8.pm b/Source/bindings/scripts/CodeGeneratorV8.pm |
| index a396dfe645e5e0b2eef6de8d74f8ab8dc3008e1c..91a5fce7f483c81dde9ee00baaf5b742b1854e49 100644 |
| --- a/Source/bindings/scripts/CodeGeneratorV8.pm |
| +++ b/Source/bindings/scripts/CodeGeneratorV8.pm |
| @@ -431,18 +431,66 @@ sub GetSVGPropertyTypes |
| return ($svgPropertyType, $svgListPropertyType, $svgNativeType); |
| } |
| +sub MakeDummyFunction |
| +{ |
| + my $returnType = shift; |
| + my $methodName = shift; |
| + my $function = domFunction->new(); |
| + $function->signature(domSignature->new()); |
| + $function->signature->type($returnType); |
| + $function->signature->name($methodName); |
| + $function->signature->extendedAttributes({}); |
| + return $function; |
| +} |
| + |
| +sub GetIndexedGetterFunction |
| +{ |
| + my $interface = shift; |
| + |
| + # FIXME: Expose indexed getter of WebKitCSSMixFunctionValue by removing this special case |
| + # because CSSValueList(which is parent of WebKitCSSMixFunctionValue) has indexed property getter. |
| + if ($interface->name eq "WebKitCSSMixFunctionValue") { |
| + return 0; |
| + } |
| + |
| + # FIXME: add getter method to WebKitCSSKeyframesRule.idl or remove special case of WebKitCSSKeyframesRule.idl |
| + # Currently return type and method name is hard coded because it can not be obtained from IDL. |
| + if ($interface->name eq "WebKitCSSKeyframesRule") { |
| + return MakeDummyFunction("WebKitCSSKeyframeRule", "item") |
| + } |
| + |
| + return GetSpecialGetterFunctionForType($interface, "unsigned long"); |
| +} |
| + |
| 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 GetSpecialGetterFunctionForType($interface, "DOMString"); |
| +} |
| + |
| +sub GetSpecialGetterFunctionForType |
| +{ |
| + my $interface = shift; |
| + my $type = shift; |
| + |
| + my @interfaces = ($interface); |
| + ForAllParents($interface, sub { |
| + my $currentInterface = shift; |
| + push(@interfaces, $currentInterface); |
| + }); |
| + |
| + foreach my $currentInterface (@interfaces) { |
| + foreach my $function (@{$currentInterface->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 $type ) { |
| + return $function; |
| + } |
| } |
| } |
| + |
| return 0; |
| } |
| @@ -889,7 +937,7 @@ sub GenerateHeaderNamedAndIndexedPropertyAccessors |
| { |
| my $interface = shift; |
| my $interfaceName = $interface->name; |
| - my $hasIndexedGetter = $interface->extendedAttributes->{"IndexedGetter"} || $interface->extendedAttributes->{"CustomIndexedGetter"}; |
| + my $hasIndexedGetter = GetIndexedGetterFunction($interface) || $interface->extendedAttributes->{"CustomIndexedGetter"}; |
| my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexedSetter"}; |
| my $hasCustomNamedGetter = GetNamedGetterFunction($interface) || $interface->extendedAttributes->{"CustomNamedGetter"} || $interface->extendedAttributes->{"CustomGetOwnPropertySlot"}; |
| my $hasCustomNamedSetter = $interface->extendedAttributes->{"CustomNamedSetter"}; |
| @@ -2955,19 +3003,18 @@ END |
| sub GenerateImplementationIndexedProperty |
| { |
| my $interface = shift; |
| - my $indexer = shift; |
| my $interfaceName = $interface->name; |
| my $v8InterfaceName = "V8$interfaceName"; |
| + my $indexedGetterfunction = GetIndexedGetterFunction($interface); |
| my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexedSetter"}; |
| - my $hasIndexedGetter = $interface->extendedAttributes->{"IndexedGetter"} || $interface->extendedAttributes->{"CustomIndexedGetter"}; |
| + my $hasCustomIndexedGetter = $interface->extendedAttributes->{"CustomIndexedGetter"}; |
| # FIXME: Investigate and remove this nastinesss. In V8, named property handling and indexer handling are apparently decoupled, |
| # which means that object[X] where X is a number doesn't reach named property indexer. So we need to provide |
| # simplistic, mirrored indexer handling in addition to named property handling. |
| my $isSpecialCase = exists $indexerSpecialCases{$interfaceName}; |
| if ($isSpecialCase) { |
| - $hasIndexedGetter = 1; |
| if ($interface->extendedAttributes->{"CustomNamedSetter"}) { |
| $hasCustomIndexedSetter = 1; |
| } |
| @@ -2979,24 +3026,20 @@ sub GenerateImplementationIndexedProperty |
| # FIXME: Find a way to not have to special-case HTMLOptionsCollection. |
| if ($interfaceName eq "HTMLOptionsCollection") { |
| $hasEnumerator = 1; |
| - $hasIndexedGetter = 1; |
| } |
| - if (!$hasIndexedGetter) { |
| + if (!$indexedGetterfunction && !$hasCustomIndexedGetter) { |
| return ""; |
| } |
| AddToImplIncludes("bindings/v8/V8Collection.h"); |
| - if (!$indexer) { |
| - $indexer = FindSuperMethod($interface, "item"); |
| - } |
| - |
| - my $indexerType = $indexer ? $indexer->type : 0; |
| - |
| - if ($indexerType && !$hasCustomIndexedSetter) { |
| + if ($indexedGetterfunction && !$hasCustomIndexedSetter) { |
| $hasEnumerator = 1; |
| } |
| + if ($interfaceName eq "WebKitCSSKeyframesRule") { |
| + $hasEnumerator = 0; |
| + } |
|
kojih
2013/05/01 08:50:22
Although I think every object that have IndexedPro
|
| my $hasDeleter = $interface->extendedAttributes->{"CustomDeleteProperty"}; |
| my $setOn = "Instance"; |
| @@ -3021,26 +3064,21 @@ sub GenerateImplementationIndexedProperty |
| $code .= ", nodeCollectionIndexedPropertyEnumerator<${interfaceName}>" if $hasEnumerator; |
| $code .= ");\n"; |
| - if($interface->extendedAttributes->{"IndexedGetter"}) { |
| - # FIXME: add item() method to WebKitCSSKeyframesRule.idl or remove [IndexedGetter] from WebKitCSSKeyframesRule.idl |
| - # Currently indexer type is hard coded because it can not be obtained from IDL. |
| - if ($interfaceName eq "WebKitCSSKeyframesRule") { |
| - $indexerType = "WebKitCSSKeyframeRule"; |
| - } |
| + if ($indexedGetterfunction && !$hasCustomIndexedGetter) { |
| + my $returnType = $indexedGetterfunction->signature->type; |
| + my $methodName = $indexedGetterfunction->signature->name; |
| + AddToImplIncludes("bindings/v8/V8Collection.h"); |
| my $jsValue = ""; |
| - my $nativeType = GetNativeType($indexerType); |
| + my $nativeType = GetNativeType($returnType); |
| my $isNull = ""; |
| - if (IsRefPtrType($indexerType)) { |
| + if (IsRefPtrType($returnType)) { |
| + AddToImplIncludes("V8$returnType.h"); |
| $isNull = "!element"; |
| - if ($interfaceName eq "WebKitCSSKeyframesRule") { |
| - $jsValue = "toV8(element.release(), info.Holder(), info.GetIsolate())"; |
| - } else { |
| - $jsValue = NativeToJSValue($indexer, "element.release()", "info.Holder()", "info.GetIsolate()"); |
| - } |
| + $jsValue = NativeToJSValue($indexedGetterfunction->signature, "element.release()", "info.Holder()", "info.GetIsolate()", "info", "collection", "", ""); |
| } else { |
| $isNull = "element.isNull()"; |
| - $jsValue = NativeToJSValue($indexer, "element", "info.Holder()", "info.GetIsolate()"); |
| + $jsValue = NativeToJSValue($indexedGetterfunction->signature, "element", "info.Holder()", "info.GetIsolate()"); |
| } |
| AddToImplContent(<<END); |
| @@ -3048,7 +3086,7 @@ v8::Handle<v8::Value> ${v8InterfaceName}::indexedPropertyGetter(uint32_t index, |
| { |
| ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); |
| ${interfaceName}* collection = toNative(info.Holder()); |
| - $nativeType element = collection->item(index); |
| + $nativeType element = collection->$methodName(index); |
| if ($isNull) |
| return v8Undefined(); |
| return $jsValue; |
| @@ -3066,10 +3104,18 @@ sub GenerateImplementationNamedPropertyGetter |
| my $interfaceName = $interface->name; |
| my $v8InterfaceName = "V8$interfaceName"; |
| - my $function = GetNamedGetterFunction($interface); |
| - if ($function) { |
| - my $returnType = $function->signature->type; |
| - my $methodName = $function->signature->name; |
| + my $namedGetterFunction = GetNamedGetterFunction($interface); |
| + my $hasCustomNamedGetter = $interface->extendedAttributes->{"CustomNamedGetter"}; |
| + # FIXME: make consistent between IDL and implementation. Then remove these special cases. |
| + $hasCustomNamedGetter = 1 if $interfaceName eq "HTMLAppletElement"; |
| + $hasCustomNamedGetter = 1 if $interfaceName eq "HTMLEmbedElement"; |
| + $hasCustomNamedGetter = 1 if $interfaceName eq "HTMLObjectElement"; |
| + $hasCustomNamedGetter = 1 if $interfaceName eq "DOMWindow"; |
| + $hasCustomNamedGetter = 0 if $interfaceName eq "HTMLDocument"; |
| + |
| + if ($namedGetterFunction && !$hasCustomNamedGetter) { |
| + my $returnType = $namedGetterFunction->signature->type; |
| + my $methodName = $namedGetterFunction->signature->name; |
| AddToImplIncludes("bindings/v8/V8Collection.h"); |
| AddToImplIncludes("V8$returnType.h"); |
| $subCode .= <<END; |
| @@ -3102,14 +3148,6 @@ END |
| AddToImplContent($code); |
| } |
| - my $hasCustomNamedGetter = $interface->extendedAttributes->{"CustomNamedGetter"}; |
| - # FIXME: make consistent between IDL and implementation. Then remove these special cases. |
| - $hasCustomNamedGetter = 1 if $interfaceName eq "HTMLAppletElement"; |
| - $hasCustomNamedGetter = 1 if $interfaceName eq "HTMLEmbedElement"; |
| - $hasCustomNamedGetter = 1 if $interfaceName eq "HTMLObjectElement"; |
| - $hasCustomNamedGetter = 1 if $interfaceName eq "DOMWindow"; |
| - $hasCustomNamedGetter = 0 if $interfaceName eq "HTMLDocument"; |
| - |
| if ($hasCustomNamedGetter) { |
| my $hasCustomNamedSetter = $interface->extendedAttributes->{"CustomNamedSetter"}; |
| my $hasDeleter = $interface->extendedAttributes->{"CustomDeleteProperty"}; |
| @@ -3650,7 +3688,7 @@ END |
| $code .= "\n#endif // ${conditionalString}\n" if $conditionalString; |
| } |
| - $code .= GenerateImplementationIndexedProperty($interface, $indexer); |
| + $code .= GenerateImplementationIndexedProperty($interface); |
| $code .= GenerateImplementationNamedPropertyGetter($interface); |
| $code .= GenerateImplementationCustomCall($interface); |
| $code .= GenerateImplementationMasqueradesAsUndefined($interface); |