Chromium Code Reviews| Index: Source/bindings/scripts/CodeGeneratorV8.pm |
| diff --git a/Source/bindings/scripts/CodeGeneratorV8.pm b/Source/bindings/scripts/CodeGeneratorV8.pm |
| index b954532afc63d47fdb988ea5edbaacf48f004cd7..6e746fb94c629c9454366cff8e691e952374b96c 100644 |
| --- a/Source/bindings/scripts/CodeGeneratorV8.pm |
| +++ b/Source/bindings/scripts/CodeGeneratorV8.pm |
| @@ -3082,9 +3082,11 @@ sub GenerateImplementationIndexedPropertyAccessors |
| GenerateImplementationIndexedPropertyGetter($interface, $indexedGetterFunction); |
| } |
| - # FIXME: Support generated indexed setter bindings. |
| my $indexedSetterFunction = GetIndexedSetterFunction($interface); |
| my $hasCustomIndexedSetter = $indexedSetterFunction ? $indexedSetterFunction->signature->extendedAttributes->{"Custom"} : 0; |
| + if ($indexedSetterFunction && !$hasCustomIndexedSetter) { |
| + GenerateImplementationIndexedPropertySetter($interface, $indexedSetterFunction); |
| + } |
| # FIXME: Support generated named deleter bindings. |
| my $indexedDeleterFunction = GetIndexedDeleterFunction($interface); |
| @@ -3170,6 +3172,52 @@ sub GenerateImplementationIndexedPropertyGetter |
| $implementation{nameSpaceWebCore}->add($getterCode); |
| } |
| +sub GenerateImplementationIndexedPropertySetter |
| +{ |
| + my $interface = shift; |
| + my $indexedSetterFunction = shift; |
| + my $implClassName = GetImplName($interface); |
| + my $v8ClassName = GetV8ClassName($interface); |
| + my $methodName = GetImplName($indexedSetterFunction->signature); |
| + |
| + AddToImplIncludes("bindings/v8/V8Collection.h"); |
| + my $type = $indexedSetterFunction->parameters->[1]->type; |
| + my $returnType = $indexedSetterFunction->signature->type; |
| + my $nativeType = GetNativeType($returnType); |
| + my $nativeValue = JSValueToNative($type, $indexedSetterFunction->signature->extendedAttributes, "value", "info.GetIsolate()"); |
| + my $raisesExceptions = $indexedSetterFunction->signature->extendedAttributes->{"RaisesException"}; |
| + my $code = "v8::Handle<v8::Value> ${v8ClassName}::indexedPropertySetter(uint32_t index, v8::Local<v8::Value> value, const v8::AccessorInfo& info)\n"; |
| + $code .= "{\n"; |
| + $code .= " ${implClassName}* collection = toNative(info.Holder());\n"; |
| + my $extraArguments = ""; |
| + if ($raisesExceptions) { |
| + $code .= " ExceptionCode ec = 0;\n"; |
| + $extraArguments = ", ec"; |
| + } |
| + if ($type eq "DOMString") { |
|
kojih
2013/05/28 06:51:28
I'd like to remove this branch by modifying JSValu
|
| + my $nullCheck = ""; |
| + my $treatNullAs = $indexedSetterFunction->parameters->[1]->extendedAttributes->{"TreatNullAs"}; |
| + if ($treatNullAs && $treatNullAs eq "NullString") { |
| + $nullCheck = "WithNullCheck"; |
| + } |
| + $code .= " V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<${nullCheck}>, propertyValue, value);\n"; |
| + } else { |
| + $code .= " $nativeType propertyValue = $nativeValue;\n"; |
| + } |
| + my $passNativeValue = "propertyValue"; |
| + $passNativeValue .= ".release()" if (IsRefPtrType($type)); |
| + $code .= " bool result = collection->${methodName}(index, $passNativeValue, value->IsNull(), value->IsUndefined()$extraArguments);\n"; |
| + $code .= " if (!result)\n"; |
| + $code .= " return v8Undefined();\n"; |
| + if ($raisesExceptions) { |
| + $code .= " if (ec)\n"; |
| + $code .= " return setDOMException(ec, info.GetIsolate());\n"; |
| + } |
| + $code .= " return value;\n"; |
| + $code .= "}\n\n"; |
| + $implementation{nameSpaceWebCore}->add($code); |
| +} |
| + |
| sub GenerateImplementationNamedPropertyAccessors |
| { |
| my $interface = shift; |
| @@ -3355,7 +3403,7 @@ sub GenerateImplementationNamedPropertySetter |
| } else { |
| $code .= " $nativeType propertyValue = $nativeValue;\n"; |
| } |
| - $code .= " bool result = collection->${methodName}(propertyName, propertyValue$extraArguments);\n"; |
| + $code .= " bool result = collection->${methodName}(propertyName, propertyValue, value->IsNull(), value->IsUndefined()$extraArguments);\n"; |
| $code .= " if (!result)\n"; |
| $code .= " return v8Undefined();\n"; |
| if ($raisesExceptions) { |